From 654345af9caa835be5cd514a1b1631c8d32b93f2 Mon Sep 17 00:00:00 2001 From: kiatt210 <40639725+kiatt210@users.noreply.github.com> Date: Sun, 23 Jun 2024 09:50:10 +0200 Subject: [PATCH 001/128] Fix web notification icon not updated once you read all notifications (#31447) Fix #29065 Remove status filtering from GetUIDsAndNotificationCounts sql. --------- Co-authored-by: kiatt210 Co-authored-by: wxiaoguang (cherry picked from commit 6a96deb5898745d957ffd7860b2b6821c673e907) (cherry picked from commit 9d1c72ae7c388f7f588c25d249b44cf2a3d633e4) --- models/activities/notification.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/models/activities/notification.go b/models/activities/notification.go index 8e2b6d6937..09cc640224 100644 --- a/models/activities/notification.go +++ b/models/activities/notification.go @@ -287,13 +287,14 @@ type UserIDCount struct { Count int64 } -// GetUIDsAndNotificationCounts between the two provided times +// GetUIDsAndNotificationCounts returns the unread counts for every user between the two provided times. +// It must return all user IDs which appear during the period, including count=0 for users who have read all. func GetUIDsAndNotificationCounts(ctx context.Context, since, until timeutil.TimeStamp) ([]UserIDCount, error) { - sql := `SELECT user_id, count(*) AS count FROM notification ` + + sql := `SELECT user_id, sum(case when status= ? then 1 else 0 end) AS count FROM notification ` + `WHERE user_id IN (SELECT user_id FROM notification WHERE updated_unix >= ? AND ` + - `updated_unix < ?) AND status = ? GROUP BY user_id` + `updated_unix < ?) GROUP BY user_id` var res []UserIDCount - return res, db.GetEngine(ctx).SQL(sql, since, until, NotificationStatusUnread).Find(&res) + return res, db.GetEngine(ctx).SQL(sql, NotificationStatusUnread, since, until).Find(&res) } // SetIssueReadBy sets issue to be read by given user. From 45deb8bdca8eb74c71610f8332fde2be87f91c71 Mon Sep 17 00:00:00 2001 From: Royce Remer Date: Fri, 28 Jun 2024 01:42:57 -0700 Subject: [PATCH 002/128] Support legacy _links LFS batch responses (#31513) Support legacy _links LFS batch response. Fixes #31512. This is backwards-compatible change to the LFS client so that, upon mirroring from an upstream which has a batch api, it can download objects whether the responses contain the `_links` field or its successor the `actions` field. When Gitea must fallback to the legacy `_links` field a logline is emitted at INFO level which looks like this: ``` ...s/lfs/http_client.go:188:performOperation() [I] is using a deprecated batch schema response! ``` I've only run `test-backend` with this code, but added a new test to cover this case. Additionally I have a fork with this change deployed which I've confirmed syncs LFS from Gitea<-Artifactory (which has legacy `_links`) as well as from Gitea<-Gitea (which has the modern `actions`). Signed-off-by: Royce Remer (cherry picked from commit df805d6ed0458dbec258d115238fde794ed4d0ce) (cherry picked from commit 45181ee9453467b2e9a213888c9018a78894820f) --- modules/lfs/http_client.go | 4 ++++ modules/lfs/http_client_test.go | 16 ++++++++++++++++ modules/lfs/shared.go | 1 + 3 files changed, 21 insertions(+) diff --git a/modules/lfs/http_client.go b/modules/lfs/http_client.go index f5ddd38b09..7ee2449b0e 100644 --- a/modules/lfs/http_client.go +++ b/modules/lfs/http_client.go @@ -180,6 +180,10 @@ func (c *HTTPClient) performOperation(ctx context.Context, objects []Pointer, dc } } else { link, ok := object.Actions["download"] + if !ok { + // no actions block in response, try legacy response schema + link, ok = object.Links["download"] + } if !ok { log.Debug("%+v", object) return errors.New("missing action 'download'") diff --git a/modules/lfs/http_client_test.go b/modules/lfs/http_client_test.go index 7431132f76..ec90f5375d 100644 --- a/modules/lfs/http_client_test.go +++ b/modules/lfs/http_client_test.go @@ -59,6 +59,17 @@ func lfsTestRoundtripHandler(req *http.Request) *http.Response { }, }, } + } else if strings.Contains(url, "legacy-batch-request-download") { + batchResponse = &BatchResponse{ + Transfer: "dummy", + Objects: []*ObjectResponse{ + { + Links: map[string]*Link{ + "download": {}, + }, + }, + }, + } } else if strings.Contains(url, "valid-batch-request-upload") { batchResponse = &BatchResponse{ Transfer: "dummy", @@ -229,6 +240,11 @@ func TestHTTPClientDownload(t *testing.T) { endpoint: "https://unknown-actions-map.io", expectederror: "missing action 'download'", }, + // case 11 + { + endpoint: "https://legacy-batch-request-download.io", + expectederror: "", + }, } for n, c := range cases { diff --git a/modules/lfs/shared.go b/modules/lfs/shared.go index 80f4fed00d..675d2328b7 100644 --- a/modules/lfs/shared.go +++ b/modules/lfs/shared.go @@ -47,6 +47,7 @@ type BatchResponse struct { type ObjectResponse struct { Pointer Actions map[string]*Link `json:"actions,omitempty"` + Links map[string]*Link `json:"_links,omitempty"` Error *ObjectError `json:"error,omitempty"` } From d02592c62268187ad37417cd473dc0b7f2790c3d Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Sat, 29 Jun 2024 08:03:51 +0200 Subject: [PATCH 003/128] docs(release-notes): week 2024-27 cherry pick (cherry picked from commit a2426e2f901ad6bc5b98566ffc6407c5f18d0546) --- release-notes/8.0.0/feat/31513.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 release-notes/8.0.0/feat/31513.md diff --git a/release-notes/8.0.0/feat/31513.md b/release-notes/8.0.0/feat/31513.md new file mode 100644 index 0000000000..3c9baf5d70 --- /dev/null +++ b/release-notes/8.0.0/feat/31513.md @@ -0,0 +1 @@ +- add support for LFS server implementations which have batch API responses in an older/deprecated schema From 0d09acf6697357d7c7503f6b5f15ad2911ed7da9 Mon Sep 17 00:00:00 2001 From: Twenty Panda Date: Fri, 28 Jun 2024 00:37:39 +0200 Subject: [PATCH 004/128] fix(hook): ignore unknown push options instead of failing If a repository has git config --add push.pushOption submit=".sourcehut/*.yml" it failed when pushed because of the unknown submit push option. It will be ignored instead. Filtering out the push options is done in an earlier stage, when the hook command runs, before it submits the options map to the private endpoint. * move all the push options logic to modules/git/pushoptions * add 100% test coverage for modules/git/pushoptions Test coverage for the code paths from which code was moved to the modules/git/pushoptions package: * cmd/hook.go:runHookPreReceive * routers/private/hook_pre_receive.go:validatePushOptions tests/integration/git_push_test.go:TestOptionsGitPush runs through both. The test verifying the option is rejected was removed and, if added again, will fail because the option is now ignored instead of being rejected. * cmd/hook.go:runHookProcReceive * services/agit/agit.go:ProcReceive tests/integration/git_test.go: doCreateAgitFlowPull runs through both. It uses variations of AGit related push options. * cmd/hook.go:runHookPostReceive * routers/private/hook_post_receive.go:HookPostReceive tests/integration/git_test.go:doPushCreate called by TestGit/HTTP/sha1/PushCreate runs through both. Note that although it provides coverage for this code path it does not use push options. Fixes: https://codeberg.org/forgejo/forgejo/issues/3651 (cherry picked from commit 5561e80b04c27fb0685f6164a74b1dcefe13890d) --- cmd/hook.go | 28 +---- cmd/hook_test.go | 15 --- modules/git/pushoptions/pushoptions.go | 113 ++++++++++++++++++ modules/git/pushoptions/pushoptions_test.go | 125 ++++++++++++++++++++ modules/private/hook.go | 28 +---- release-notes/8.0.0/fix/4253.md | 1 + routers/private/hook_post_receive.go | 7 +- routers/private/hook_pre_receive.go | 18 +-- services/agit/agit.go | 9 +- tests/integration/git_push_test.go | 14 +-- 10 files changed, 266 insertions(+), 92 deletions(-) create mode 100644 modules/git/pushoptions/pushoptions.go create mode 100644 modules/git/pushoptions/pushoptions_test.go create mode 100644 release-notes/8.0.0/fix/4253.md diff --git a/cmd/hook.go b/cmd/hook.go index f8184f9697..eec93aece7 100644 --- a/cmd/hook.go +++ b/cmd/hook.go @@ -15,6 +15,7 @@ import ( "time" "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/git/pushoptions" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/private" repo_module "code.gitea.io/gitea/modules/repository" @@ -192,7 +193,7 @@ Forgejo or set your environment appropriately.`, "") GitAlternativeObjectDirectories: os.Getenv(private.GitAlternativeObjectDirectories), GitObjectDirectory: os.Getenv(private.GitObjectDirectory), GitQuarantinePath: os.Getenv(private.GitQuarantinePath), - GitPushOptions: pushOptions(), + GitPushOptions: pushoptions.New().ReadEnv().Map(), PullRequestID: prID, DeployKeyID: deployKeyID, ActionPerm: int(actionPerm), @@ -375,7 +376,7 @@ Forgejo or set your environment appropriately.`, "") GitAlternativeObjectDirectories: os.Getenv(private.GitAlternativeObjectDirectories), GitObjectDirectory: os.Getenv(private.GitObjectDirectory), GitQuarantinePath: os.Getenv(private.GitQuarantinePath), - GitPushOptions: pushOptions(), + GitPushOptions: pushoptions.New().ReadEnv().Map(), PullRequestID: prID, PushTrigger: repo_module.PushTrigger(os.Getenv(repo_module.EnvPushTrigger)), } @@ -488,21 +489,6 @@ func hookPrintResults(results []private.HookPostReceiveBranchResult) { } } -func pushOptions() map[string]string { - opts := make(map[string]string) - if pushCount, err := strconv.Atoi(os.Getenv(private.GitPushOptionCount)); err == nil { - for idx := 0; idx < pushCount; idx++ { - opt := os.Getenv(fmt.Sprintf("GIT_PUSH_OPTION_%d", idx)) - key, value, found := strings.Cut(opt, "=") - if !found { - value = "true" - } - opts[key] = value - } - } - return opts -} - func runHookProcReceive(c *cli.Context) error { ctx, cancel := installSignals() defer cancel() @@ -627,6 +613,7 @@ Forgejo or set your environment appropriately.`, "") hookOptions.GitPushOptions = make(map[string]string) if hasPushOptions { + pushOptions := pushoptions.NewFromMap(&hookOptions.GitPushOptions) for { rs, err = readPktLine(ctx, reader, pktLineTypeUnknown) if err != nil { @@ -636,12 +623,7 @@ Forgejo or set your environment appropriately.`, "") if rs.Type == pktLineTypeFlush { break } - - key, value, found := strings.Cut(string(rs.Data), "=") - if !found { - value = "true" - } - hookOptions.GitPushOptions[key] = value + pushOptions.Parse(string(rs.Data)) } } diff --git a/cmd/hook_test.go b/cmd/hook_test.go index 91731f77c0..36149eb91f 100644 --- a/cmd/hook_test.go +++ b/cmd/hook_test.go @@ -15,7 +15,6 @@ import ( "testing" "time" - "code.gitea.io/gitea/modules/private" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/test" @@ -164,20 +163,6 @@ func TestDelayWriter(t *testing.T) { }) } -func TestPushOptions(t *testing.T) { - require.NoError(t, os.Setenv(private.GitPushOptionCount, "3")) - require.NoError(t, os.Setenv("GIT_PUSH_OPTION_0", "force-push")) - require.NoError(t, os.Setenv("GIT_PUSH_OPTION_1", "option=value")) - require.NoError(t, os.Setenv("GIT_PUSH_OPTION_2", "option-double=another=value")) - require.NoError(t, os.Setenv("GIT_PUSH_OPTION_3", "not=valid")) - - assert.Equal(t, map[string]string{ - "force-push": "true", - "option": "value", - "option-double": "another=value", - }, pushOptions()) -} - func TestRunHookUpdate(t *testing.T) { app := cli.NewApp() app.Commands = []*cli.Command{subcmdHookUpdate} diff --git a/modules/git/pushoptions/pushoptions.go b/modules/git/pushoptions/pushoptions.go new file mode 100644 index 0000000000..9709a8be79 --- /dev/null +++ b/modules/git/pushoptions/pushoptions.go @@ -0,0 +1,113 @@ +// Copyright twenty-panda +// SPDX-License-Identifier: MIT + +package pushoptions + +import ( + "fmt" + "os" + "strconv" + "strings" +) + +type Key string + +const ( + RepoPrivate = Key("repo.private") + RepoTemplate = Key("repo.template") + AgitTopic = Key("topic") + AgitForcePush = Key("force-push") + AgitTitle = Key("title") + AgitDescription = Key("description") + + envPrefix = "GIT_PUSH_OPTION" + EnvCount = envPrefix + "_COUNT" + EnvFormat = envPrefix + "_%d" +) + +type Interface interface { + ReadEnv() Interface + Parse(string) bool + Map() map[string]string + + ChangeRepoSettings() bool + + Empty() bool + + GetBool(key Key, def bool) bool + GetString(key Key) (val string, ok bool) +} + +type gitPushOptions map[string]string + +func New() Interface { + pushOptions := gitPushOptions(make(map[string]string)) + return &pushOptions +} + +func NewFromMap(o *map[string]string) Interface { + return (*gitPushOptions)(o) +} + +func (o *gitPushOptions) ReadEnv() Interface { + if pushCount, err := strconv.Atoi(os.Getenv(EnvCount)); err == nil { + for idx := 0; idx < pushCount; idx++ { + _ = o.Parse(os.Getenv(fmt.Sprintf(EnvFormat, idx))) + } + } + return o +} + +func (o *gitPushOptions) Parse(data string) bool { + key, value, found := strings.Cut(data, "=") + if !found { + value = "true" + } + switch Key(key) { + case RepoPrivate: + case RepoTemplate: + case AgitTopic: + case AgitForcePush: + case AgitTitle: + case AgitDescription: + default: + return false + } + (*o)[key] = value + return true +} + +func (o gitPushOptions) Map() map[string]string { + return o +} + +func (o gitPushOptions) ChangeRepoSettings() bool { + if o.Empty() { + return false + } + for _, key := range []Key{RepoPrivate, RepoTemplate} { + _, ok := o[string(key)] + if ok { + return true + } + } + return false +} + +func (o gitPushOptions) Empty() bool { + return len(o) == 0 +} + +func (o gitPushOptions) GetBool(key Key, def bool) bool { + if val, ok := o[string(key)]; ok { + if b, err := strconv.ParseBool(val); err == nil { + return b + } + } + return def +} + +func (o gitPushOptions) GetString(key Key) (string, bool) { + val, ok := o[string(key)] + return val, ok +} diff --git a/modules/git/pushoptions/pushoptions_test.go b/modules/git/pushoptions/pushoptions_test.go new file mode 100644 index 0000000000..49bf2d275b --- /dev/null +++ b/modules/git/pushoptions/pushoptions_test.go @@ -0,0 +1,125 @@ +// Copyright twenty-panda +// SPDX-License-Identifier: MIT + +package pushoptions + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestEmpty(t *testing.T) { + options := New() + assert.True(t, options.Empty()) + options.Parse(fmt.Sprintf("%v", RepoPrivate)) + assert.False(t, options.Empty()) +} + +func TestToAndFromMap(t *testing.T) { + options := New() + options.Parse(fmt.Sprintf("%v", RepoPrivate)) + actual := options.Map() + expected := map[string]string{string(RepoPrivate): "true"} + assert.EqualValues(t, expected, actual) + assert.EqualValues(t, expected, NewFromMap(&actual).Map()) +} + +func TestChangeRepositorySettings(t *testing.T) { + options := New() + assert.False(t, options.ChangeRepoSettings()) + assert.True(t, options.Parse(fmt.Sprintf("%v=description", AgitDescription))) + assert.False(t, options.ChangeRepoSettings()) + + options.Parse(fmt.Sprintf("%v", RepoPrivate)) + assert.True(t, options.ChangeRepoSettings()) + + options = New() + options.Parse(fmt.Sprintf("%v", RepoTemplate)) + assert.True(t, options.ChangeRepoSettings()) +} + +func TestParse(t *testing.T) { + t.Run("no key", func(t *testing.T) { + options := New() + + val, ok := options.GetString(RepoPrivate) + assert.False(t, ok) + assert.Equal(t, "", val) + + assert.True(t, options.GetBool(RepoPrivate, true)) + assert.False(t, options.GetBool(RepoPrivate, false)) + }) + + t.Run("key=value", func(t *testing.T) { + options := New() + + topic := "TOPIC" + assert.True(t, options.Parse(fmt.Sprintf("%v=%s", AgitTopic, topic))) + val, ok := options.GetString(AgitTopic) + assert.True(t, ok) + assert.Equal(t, topic, val) + }) + + t.Run("key=true", func(t *testing.T) { + options := New() + + assert.True(t, options.Parse(fmt.Sprintf("%v=true", RepoPrivate))) + assert.True(t, options.GetBool(RepoPrivate, false)) + assert.True(t, options.Parse(fmt.Sprintf("%v=TRUE", RepoTemplate))) + assert.True(t, options.GetBool(RepoTemplate, false)) + }) + + t.Run("key=false", func(t *testing.T) { + options := New() + + assert.True(t, options.Parse(fmt.Sprintf("%v=false", RepoPrivate))) + assert.False(t, options.GetBool(RepoPrivate, true)) + }) + + t.Run("key", func(t *testing.T) { + options := New() + + assert.True(t, options.Parse(fmt.Sprintf("%v", RepoPrivate))) + assert.True(t, options.GetBool(RepoPrivate, false)) + }) + + t.Run("unknown keys are ignored", func(t *testing.T) { + options := New() + + assert.True(t, options.Empty()) + assert.False(t, options.Parse("unknown=value")) + assert.True(t, options.Empty()) + }) +} + +func TestReadEnv(t *testing.T) { + t.Setenv(envPrefix+"_0", fmt.Sprintf("%v=true", AgitForcePush)) + t.Setenv(envPrefix+"_1", fmt.Sprintf("%v", RepoPrivate)) + t.Setenv(envPrefix+"_2", fmt.Sprintf("%v=equal=in string", AgitTitle)) + t.Setenv(envPrefix+"_3", "not=valid") + t.Setenv(envPrefix+"_4", fmt.Sprintf("%v=description", AgitDescription)) + t.Setenv(EnvCount, "5") + + options := New().ReadEnv() + + assert.True(t, options.GetBool(AgitForcePush, false)) + assert.True(t, options.GetBool(RepoPrivate, false)) + assert.False(t, options.GetBool(RepoTemplate, false)) + + { + val, ok := options.GetString(AgitTitle) + assert.True(t, ok) + assert.Equal(t, "equal=in string", val) + } + { + val, ok := options.GetString(AgitDescription) + assert.True(t, ok) + assert.Equal(t, "description", val) + } + { + _, ok := options.GetString(AgitTopic) + assert.False(t, ok) + } +} diff --git a/modules/private/hook.go b/modules/private/hook.go index 1d0ef4e3a9..93cbcd469d 100644 --- a/modules/private/hook.go +++ b/modules/private/hook.go @@ -7,10 +7,10 @@ import ( "context" "fmt" "net/url" - "strconv" "time" "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/git/pushoptions" "code.gitea.io/gitea/modules/repository" "code.gitea.io/gitea/modules/setting" ) @@ -20,28 +20,8 @@ const ( GitAlternativeObjectDirectories = "GIT_ALTERNATE_OBJECT_DIRECTORIES" GitObjectDirectory = "GIT_OBJECT_DIRECTORY" GitQuarantinePath = "GIT_QUARANTINE_PATH" - GitPushOptionCount = "GIT_PUSH_OPTION_COUNT" ) -// GitPushOptions is a wrapper around a map[string]string -type GitPushOptions map[string]string - -// GitPushOptions keys -const ( - GitPushOptionRepoPrivate = "repo.private" - GitPushOptionRepoTemplate = "repo.template" -) - -// Bool checks for a key in the map and parses as a boolean -func (g GitPushOptions) Bool(key string, def bool) bool { - if val, ok := g[key]; ok { - if b, err := strconv.ParseBool(val); err == nil { - return b - } - } - return def -} - // HookOptions represents the options for the Hook calls type HookOptions struct { OldCommitIDs []string @@ -52,7 +32,7 @@ type HookOptions struct { GitObjectDirectory string GitAlternativeObjectDirectories string GitQuarantinePath string - GitPushOptions GitPushOptions + GitPushOptions map[string]string PullRequestID int64 PushTrigger repository.PushTrigger DeployKeyID int64 // if the pusher is a DeployKey, then UserID is the repo's org user. @@ -60,6 +40,10 @@ type HookOptions struct { ActionPerm int } +func (o *HookOptions) GetGitPushOptions() pushoptions.Interface { + return pushoptions.NewFromMap(&o.GitPushOptions) +} + // SSHLogOption ssh log options type SSHLogOption struct { IsError bool diff --git a/release-notes/8.0.0/fix/4253.md b/release-notes/8.0.0/fix/4253.md new file mode 100644 index 0000000000..1533c2a734 --- /dev/null +++ b/release-notes/8.0.0/fix/4253.md @@ -0,0 +1 @@ +- unknown git push options are rejected instead of being ignored diff --git a/routers/private/hook_post_receive.go b/routers/private/hook_post_receive.go index b78f19d51e..11d1161e85 100644 --- a/routers/private/hook_post_receive.go +++ b/routers/private/hook_post_receive.go @@ -18,6 +18,7 @@ import ( user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/cache" "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/git/pushoptions" "code.gitea.io/gitea/modules/gitrepo" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/private" @@ -170,7 +171,7 @@ func HookPostReceive(ctx *gitea_context.PrivateContext) { } // Handle Push Options - if len(opts.GitPushOptions) > 0 { + if !opts.GetGitPushOptions().Empty() { // load the repository if repo == nil { repo = loadRepository(ctx, ownerName, repoName) @@ -181,8 +182,8 @@ func HookPostReceive(ctx *gitea_context.PrivateContext) { wasEmpty = repo.IsEmpty } - repo.IsPrivate = opts.GitPushOptions.Bool(private.GitPushOptionRepoPrivate, repo.IsPrivate) - repo.IsTemplate = opts.GitPushOptions.Bool(private.GitPushOptionRepoTemplate, repo.IsTemplate) + repo.IsPrivate = opts.GetGitPushOptions().GetBool(pushoptions.RepoPrivate, repo.IsPrivate) + repo.IsTemplate = opts.GetGitPushOptions().GetBool(pushoptions.RepoTemplate, repo.IsTemplate) if err := repo_model.UpdateRepositoryCols(ctx, repo, "is_private", "is_template"); err != nil { log.Error("Failed to Update: %s/%s Error: %v", ownerName, repoName, err) ctx.JSON(http.StatusInternalServerError, private.HookPostReceiveResult{ diff --git a/routers/private/hook_pre_receive.go b/routers/private/hook_pre_receive.go index 456a288b00..8f7575c1db 100644 --- a/routers/private/hook_pre_receive.go +++ b/routers/private/hook_pre_receive.go @@ -123,23 +123,7 @@ func (ctx *preReceiveContext) canChangeSettings() error { func (ctx *preReceiveContext) validatePushOptions() error { opts := web.GetForm(ctx).(*private.HookOptions) - if len(opts.GitPushOptions) == 0 { - return nil - } - - changesRepoSettings := false - for key := range opts.GitPushOptions { - switch key { - case private.GitPushOptionRepoPrivate, private.GitPushOptionRepoTemplate: - changesRepoSettings = true - case "topic", "force-push", "title", "description": - // Agit options - default: - return fmt.Errorf("unknown option %s", key) - } - } - - if changesRepoSettings { + if opts.GetGitPushOptions().ChangeRepoSettings() { return ctx.canChangeSettings() } diff --git a/services/agit/agit.go b/services/agit/agit.go index e46a5771e1..bd8cc82e55 100644 --- a/services/agit/agit.go +++ b/services/agit/agit.go @@ -13,6 +13,7 @@ import ( repo_model "code.gitea.io/gitea/models/repo" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/git/pushoptions" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/private" notify_service "code.gitea.io/gitea/services/notify" @@ -23,10 +24,10 @@ import ( func ProcReceive(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, opts *private.HookOptions) ([]private.HookProcReceiveRefResult, error) { results := make([]private.HookProcReceiveRefResult, 0, len(opts.OldCommitIDs)) - topicBranch := opts.GitPushOptions["topic"] - _, forcePush := opts.GitPushOptions["force-push"] - title, hasTitle := opts.GitPushOptions["title"] - description, hasDesc := opts.GitPushOptions["description"] + topicBranch, _ := opts.GetGitPushOptions().GetString(pushoptions.AgitTopic) + _, forcePush := opts.GetGitPushOptions().GetString(pushoptions.AgitForcePush) + title, hasTitle := opts.GetGitPushOptions().GetString(pushoptions.AgitTitle) + description, hasDesc := opts.GetGitPushOptions().GetString(pushoptions.AgitDescription) objectFormat := git.ObjectFormatFromName(repo.ObjectFormatName) diff --git a/tests/integration/git_push_test.go b/tests/integration/git_push_test.go index 8a9fe81e24..06d985cff7 100644 --- a/tests/integration/git_push_test.go +++ b/tests/integration/git_push_test.go @@ -225,16 +225,14 @@ func testOptionsGitPush(t *testing.T, u *url.URL) { u.User = url.UserPassword(user.LowerName, userPassword) doGitAddRemote(gitPath, "origin", u)(t) - t.Run("Unknown push options are rejected", func(t *testing.T) { - logChecker, cleanup := test.NewLogChecker(log.DEFAULT, log.TRACE) - logChecker.Filter("unknown option").StopMark("Git push options validation") - defer cleanup() + t.Run("Unknown push options are silently ignored", func(t *testing.T) { branchName := "branch0" doGitCreateBranch(gitPath, branchName)(t) - doGitPushTestRepositoryFail(gitPath, "origin", branchName, "-o", "repo.template=false", "-o", "uknownoption=randomvalue")(t) - logFiltered, logStopped := logChecker.Check(5 * time.Second) - assert.True(t, logStopped) - assert.True(t, logFiltered[0]) + doGitPushTestRepository(gitPath, "origin", branchName, "-o", "uknownoption=randomvalue", "-o", "repo.private=true")(t) + repo, err := repo_model.GetRepositoryByOwnerAndName(db.DefaultContext, user.Name, "repo-to-push") + require.NoError(t, err) + require.True(t, repo.IsPrivate) + require.False(t, repo.IsTemplate) }) t.Run("Owner sets private & template to true via push options", func(t *testing.T) { From 0a31d942a5cea0bc5229aa8878e7688539be459f Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 3 Jul 2024 08:23:00 +0000 Subject: [PATCH 005/128] Update dependency go to v1.22.5 (cherry picked from commit fa1a853db08a4c5707414bb9f66783771da080ee) --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 2791a7f5a4..32d8b9b4d7 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module code.gitea.io/gitea go 1.22.0 -toolchain go1.22.4 +toolchain go1.22.5 require ( code.forgejo.org/f3/gof3/v3 v3.4.0 From 9128268f29d272a2355fb9f054e3a522cf484a01 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Wed, 3 Jul 2024 11:25:45 +0200 Subject: [PATCH 006/128] fix(ci): do not block pull request CI when go-versions lags behind When a new go version is published, it takes about 24h for https://github.com/actions/go-versions to be updated (see https://github.com/actions/go-versions/pull/102 for example). In the meantime the setup-go action that depends on it will install a version of go that fails golang.org/x/vuln/cmd/govulncheck. Move the security check to be the last step of the test job instead of the first. It will still block the PRs from being merged but it will allow the PR authors to keep working and look at the test results in the meantime. Fixes: https://codeberg.org/forgejo/forgejo/issues/4294 (cherry picked from commit ee7f568aed56ee4c4d7e15b9d4c7db22fa768650) --- .forgejo/workflows/testing.yml | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/.forgejo/workflows/testing.yml b/.forgejo/workflows/testing.yml index 7eb40fec8c..154b5806d7 100644 --- a/.forgejo/workflows/testing.yml +++ b/.forgejo/workflows/testing.yml @@ -25,7 +25,7 @@ jobs: go-version: "1.22" check-latest: true - run: make deps-backend deps-tools - - run: make --always-make -j$(nproc) lint-backend checks-backend # ensure the "go-licenses" make target runs + - run: make --always-make -j$(nproc) lint-backend tidy-check swagger-check fmt-check swagger-validate # ensure the "go-licenses" make target runs frontend-checks: if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} runs-on: docker @@ -274,3 +274,22 @@ jobs: RACE_ENABLED: true TEST_TAGS: sqlite sqlite_unlock_notify USE_REPO_TEST_DIR: 1 + security-check: + if: ${{ !startsWith(vars.ROLE, 'forgejo-') }} + runs-on: docker + needs: + - test-sqlite + - test-pgsql + - test-mysql + - test-remote-cacher + - test-unit + container: + image: 'docker.io/node:20-bookworm' + steps: + - uses: https://code.forgejo.org/actions/checkout@v3 + - uses: https://code.forgejo.org/actions/setup-go@v4 + with: + go-version: "1.22" + check-latest: true + - run: make deps-backend deps-tools + - run: make security-check From 9230d787ffaaa484636e2770da8d9184a1fc6532 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Tue, 2 Jul 2024 19:29:04 +0200 Subject: [PATCH 007/128] test(js): false negative in sleep test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It is entirely possible that the difference between the specified sleep time and the actual sleep time is greater than 15 seconds. https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#Notes > Note that in either case, the actual delay may be longer than > intended; see Reasons for delays longer than specified below. It is however an error for the delay to be shorter. ⎯⎯⎯⎯⎯⎯⎯ Failed Tests 1 ⎯⎯⎯⎯⎯⎯⎯ FAIL web_src/js/utils.test.js > sleep AssertionError: expected false to be truthy ❯ testSleep web_src/js/utils.test.js:192:48 190| const endTime = Date.now(); // Record the end time 191| const actualSleepTime = endTime - startTime; 192| expect(Math.abs(actualSleepTime - ms) <= 15).toBeTruthy(); | ^ 193| } 194| ❯ web_src/js/utils.test.js:184:3 (cherry picked from commit a0d9d8d57662f9f166783b4bca64e3292d34cef4) --- web_src/js/utils.test.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/web_src/js/utils.test.js b/web_src/js/utils.test.js index b7691b8d31..c49bb2a110 100644 --- a/web_src/js/utils.test.js +++ b/web_src/js/utils.test.js @@ -177,10 +177,6 @@ test('serializeXml', () => { }); test('sleep', async () => { - // Test 500 ms sleep - await testSleep(500); - - // Test 2000 ms sleep await testSleep(2000); }); @@ -189,5 +185,5 @@ async function testSleep(ms) { await sleep(ms); const endTime = Date.now(); // Record the end time const actualSleepTime = endTime - startTime; - expect(Math.abs(actualSleepTime - ms) <= 15).toBeTruthy(); + expect(actualSleepTime >= ms).toBeTruthy(); } From 33aff7f08556e78c98f071e32b1d19c8af650cd6 Mon Sep 17 00:00:00 2001 From: Codeberg Translate Date: Thu, 4 Jul 2024 06:41:53 +0000 Subject: [PATCH 008/128] [I18N] Translations update from Weblate (#4251) Translations update from [Weblate](https://translate.codeberg.org) for [Forgejo/forgejo](https://translate.codeberg.org/projects/forgejo/forgejo/). Current translation status: ![Weblate translation status](https://translate.codeberg.org/widget/forgejo/forgejo/horizontal-auto.svg) Co-authored-by: 0ko <0ko@users.noreply.translate.codeberg.org> Co-authored-by: Panagiotis \"Ivory\" Vasilopoulos Co-authored-by: ZDev Co-authored-by: Fjuro Co-authored-by: Wuzzy Co-authored-by: fnetX Co-authored-by: hankskyjames777 Co-authored-by: Kita Ikuyo Co-authored-by: Marco Ciampa Co-authored-by: kdh8219 Co-authored-by: emansije Co-authored-by: b1nar10 Co-authored-by: Eryk Michalak Co-authored-by: revi Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/4251 Co-authored-by: Codeberg Translate Co-committed-by: Codeberg Translate (cherry picked from commit 2a643d2136619ad2da3387f01117ad51e4b78625) --- options/locale/locale_cs-CZ.ini | 16 ++ options/locale/locale_de-DE.ini | 28 +++- options/locale/locale_el-GR.ini | 276 +++++++++++++++++++------------- options/locale/locale_eo.ini | 4 + options/locale/locale_fil.ini | 30 +++- options/locale/locale_gl.ini | 4 +- options/locale/locale_it-IT.ini | 87 ++++++---- options/locale/locale_ja-JP.ini | 2 +- options/locale/locale_ko-KR.ini | 32 +++- options/locale/locale_pl-PL.ini | 82 ++++++++++ options/locale/locale_pt-PT.ini | 36 ++++- options/locale/locale_ru-RU.ini | 72 +++++---- 12 files changed, 474 insertions(+), 195 deletions(-) diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index fbfde28fcd..4e85309397 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -160,6 +160,7 @@ filter.clear = Vymazat filtry more_items = Další položky invalid_data = Neplatná data: %v copy_generic = Kopírovat do schránky +test = Test [aria] navbar=Navigační lišta @@ -191,6 +192,8 @@ buttons.ref.tooltip=Odkázat na problém nebo žádost o sloučení buttons.switch_to_legacy.tooltip=Použít starší editor buttons.enable_monospace_font=Zapnout neproporcionální písmo buttons.disable_monospace_font=Vypnout neproporcionální písmo +buttons.unindent.tooltip = Zrušit vnoření položek pod jednu úroveň +buttons.indent.tooltip = Vnořit položky pod jednu úroveň [filter] string.asc=A – Z @@ -2783,6 +2786,8 @@ pulls.edit.already_changed = Nepodařilo se uložit změny v žádosti o slouče comments.edit.already_changed = Nepodařilo se uložit změny v komentáři. Obsah byl nejspíše již změněn jiným uživatelem. Obnovte prosím stránku a zkuste jej znovu upravit, abyste zabránili přepsání změn uživatele subscribe.issue.guest.tooltip = Přihlaste se pro odebírání tohoto problému. subscribe.pull.guest.tooltip = Přihlaste se pro odebírání této žádosti o sloučení. +issues.author.tooltip.pr = Tento uživatel je autorem této žádosti o sloučení. +issues.author.tooltip.issue = Tento uživatel je autorem tohoto problému. [graphs] component_loading_info = Tohle může chvíli trvat… @@ -3471,6 +3476,10 @@ config_settings = Nastavení auths.tip.gitlab_new = Zaregistrujte si novou aplikaci na https://gitlab.com/-/profile/applications auths.default_domain_name = Výchozí doménové jméno použité pro e-mailovou adresu config.app_slogan = Slogan instance +config.cache_test_succeeded = Test mezipaměti byl úspěšný, odpověď byla obdržena za %s. +config.cache_test = Otestovat mezipaměť +config.cache_test_failed = Nepodařilo se prověřit mezipaměť: %v. +config.cache_test_slow = Test mezipaměti byl úspěšný, ale odpověď byla pomalá: %s. [action] create_repo=vytvořil/a repozitář %s @@ -3828,6 +3837,13 @@ need_approval_desc = Potřebovat schválení pro spouštění workflowů pro ž runners.runner_manage_panel = Správa runnerů runs.no_job_without_needs = Workflow musí obsahovat alespoň jednu práci bez závislostí. runs.no_job = Workflow musí obsahovat alespoň jednu úlohu +workflow.dispatch.use_from = Použít workflow z +workflow.dispatch.run = Spustit workflow +workflow.dispatch.input_required = Vyžadovaná hodnota pro vstup „%s“. +workflow.dispatch.invalid_input_type = Neplatný typ vstupu „%s“. +workflow.dispatch.warn_input_limit = Zobrazování prvních %d vstupů. +workflow.dispatch.trigger_found = Tento workflow má spouštěč událostí workflow_dispatch. +workflow.dispatch.success = Žádost o spuštění workflow byla úspěšně odeslána. [projects] type-1.display_name=Samostatný projekt diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 2fdca4f1f1..cfe5dec8bb 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -158,6 +158,7 @@ filter.private = Privat more_items = Mehr Einträge invalid_data = Ungültige Daten: %v copy_generic = In die Zwischenablage kopieren +test = Test [aria] navbar=Navigationsleiste @@ -668,12 +669,12 @@ form.name_reserved=Der Benutzername „%s“ ist reserviert. form.name_pattern_not_allowed=Das Muster „%s“ ist nicht in einem Benutzernamen erlaubt. form.name_chars_not_allowed=Benutzername „%s“ enthält ungültige Zeichen. block_user = Benutzer blockieren -block_user.detail = Bitte beachte, dass andere Maßnahmen ergriffen werden, wenn du diesen Benutzer blockierst, wie: -block_user.detail_2 = Dieser Benutzer kann nicht mit deinem Repository, erstellten Issues und Kommentaren interagieren. -block_user.detail_1 = Dieser Benutzer folgt dir nicht mehr. +block_user.detail = Bitte beachte, dass die Blockierung eines Benutzers auch andere Auswirkungen hat, so wie: +block_user.detail_2 = Dieser Benutzer wird nicht mehr nicht mit deinen Repositorys oder von dir erstellten Issues und Kommentaren interagieren können. +block_user.detail_1 = Ihr werdet euch nicht mehr gegenseitig folgen und könnt euch auch nicht mehr gegenseitig folgen. block = Blockieren follow_blocked_user = Du kannst diesen Benutzer nicht folgen, weil du ihn blockiert hast, oder er dich blockiert hat. -block_user.detail_3 = Dieser Benutzer kann dich nicht als einen Mitarbeiter hinzufügen, und du kannst ihn nicht als Mitarbeiter hinzufügen. +block_user.detail_3 = Ihr werdet nicht mehr in der Lage sein, euch gegenseitig als Repository-Mitarbeiter hinzuzufügen. unblock = Nicht mehr blockieren followers_one = %d Follower following_one = %d Folge ich @@ -681,6 +682,10 @@ followers.title.few = Follower following.title.one = Folgt following.title.few = Folgt followers.title.one = Follower +public_activity.visibility_hint.self_public = Deine Aktivität ist sichtbar für alle, außer für Interaktionen in privaten Räumen. Konfigurieren. +public_activity.visibility_hint.admin_public = Diese Aktivität ist sichtbar für alle, aber als Administrator kannst du außerdem Interaktionen in privaten Räumen sehen. +public_activity.visibility_hint.self_private = Deine Aktivität ist nur sichtbar für dich und den Instanzadministratoren. Konfigurieren. +public_activity.visibility_hint.admin_private = Diese Aktivität ist sichtbar für dich, weil du ein Administrator bist, aber der Benutzer will sie privat halten. [settings] profile=Profil @@ -2750,7 +2755,7 @@ settings.transfer.button = Besitz übertragen settings.transfer.modal.title = Besitz übertragen wiki.no_search_results = Keine Ergebnisse wiki.search = Wiki durchsuchen -n_release_one = %s freigegebn +n_release_one = %s freigegeben n_release_few = %s Veröffentlichungen form.string_too_long = Die Zeichenkette ist länger als %d Zeichen. settings.federation_settings = Föderationseinstellungen @@ -2763,6 +2768,8 @@ issues.edit.already_changed = Die Änderungen an diesem Issue können nicht gesp pulls.edit.already_changed = Die Änderungen an diesem Pull-Request können nicht gespeichert werden. Es scheint, als seien die Inhalte bereits durch einen anderen Benutzer verändert worden. Bitte die Seite neu laden und das Bearbeiten erneut versuchen, um deren Änderungen nicht zu überschreiben subscribe.pull.guest.tooltip = Einloggen, um diesen Pull-Request zu abbonieren. subscribe.issue.guest.tooltip = Einloggen, um dieses Issue zu abbonieren. +issues.author.tooltip.pr = Dieser Benutzer ist der Autor dieses Pull-Requests. +issues.author.tooltip.issue = Dieser Benutzer ist der Autor dieses Issues. [graphs] @@ -3434,6 +3441,10 @@ config_summary = Zusammenfassung auths.tip.gitlab_new = Registriere eine neue Anwendung auf https://gitlab.com/-/profile/applications auths.default_domain_name = Standarddomainname, der für die E-Mail-Adresse benutzt wird config.app_slogan = Instanz-Slogan +config.cache_test_failed = Konnte den Cache nicht untersuchen: %v. +config.cache_test_succeeded = Cache-Test erfolgreich, eine Antwort erhalten in %s. +config.cache_test = Cache testen +config.cache_test_slow = Cache-Test erfolgreich, aber die Antwort ist langsam: %s. [action] @@ -3790,6 +3801,13 @@ variables.id_not_exist = Variable mit ID %d existiert nicht. runs.workflow = Workflow runs.no_job_without_needs = Der Workflow muss mindestens einen Job ohne Abhängigkeiten enthalten. runs.no_job = Der Workflow muss mindestens einen Job enthalten +workflow.dispatch.use_from = Workflow benutzen von +workflow.dispatch.run = Workflow ausführen +workflow.dispatch.input_required = Wert für Eingabe „%s“ erfordern. +workflow.dispatch.invalid_input_type = Ungültiger Eingabetyp „%s“. +workflow.dispatch.warn_input_limit = Es werden nur die ersten %d Eingaben angezeigt. +workflow.dispatch.trigger_found = Dieser Workflow hat einen workflow_dispatch-Event-Trigger. +workflow.dispatch.success = Ausführung des Workflows wurde erfolgreich angefragt. [projects] type-1.display_name=Individuelles Projekt diff --git a/options/locale/locale_el-GR.ini b/options/locale/locale_el-GR.ini index fb15b5b453..842e297aa8 100644 --- a/options/locale/locale_el-GR.ini +++ b/options/locale/locale_el-GR.ini @@ -87,7 +87,7 @@ rerun=Επανεκτέλεση rerun_all=Επανεκτέλεση όλων save=Αποθήκευση add=Προσθήκη -add_all=Προσθήκη Όλων +add_all=Προσθήκη όλων remove=Αφαίρεση remove_all=Αφαίρεση όλων remove_label_str=Αφαίρεση αντικειμένου «%s» @@ -154,12 +154,14 @@ filter.not_fork = Εξαίρεση fork filter.is_mirror = Είδωλα filter.not_mirror = Εξαίρεση ειδώλων filter.not_template = Εξαίρεση προτύπων -filter.is_fork = Forked +filter.is_fork = Forks more_items = Περισσότερα αντικείμενα invalid_data = Τα δεδομένα δεν είναι έγκυρα: %v +test = Τεστ +copy_generic = Αντιγραφή στο πρόχειρο [aria] -navbar=Γραμμή Πλοήγησης +navbar=Μπάρα πλοήγησης footer=Υποσέλιδο footer.software=Σχετικά με το Λογισμικό footer.links=Συνδέσεις @@ -244,7 +246,7 @@ err_admin_name_is_invalid=Το Όνομα Χρήστη του Διαχειρισ general_title=Γενικές ρυθμίσεις app_name=Τίτλος διακομιστή -app_name_helper=Μπορείτε να εισάγετε το όνομα της εταιρείας σας εδώ. +app_name_helper=Γράψτε το όνομα του διακομιστή σας εδώ. Θα εμφανίζεται σε κάθε σελίδα. repo_path=Τοποθεσία αρχείων αποθετηρίων repo_path_helper=Τα απομακρυσμένα αποθετήρια Git θα αποθηκεύονται σε αυτόν τον κατάλογο. lfs_path=Τοποθεσία αρχείων Git LFS @@ -274,22 +276,22 @@ register_confirm=Να απαιτείται η επιβεβαίωση της δι mail_notify=Ενεργοποίηση ειδοποιήσεων email server_service_title=Ρυθμίσεις διακομιστή και υπηρεσιών τρίτων offline_mode=Ενεργοποίηση τοπικής λειτουργίας -offline_mode.description=Απενεργοποιήση των δικτύων διανομής περιεχομένου τρίτων και σερβίρετε όλων των πόρων τοπικά. +offline_mode.description=Τα CDN τρίτων θα απενεργοποιηθούν, και όλα τα αρχεία θα παρέχονται αποκλειστικά από τον διακομιστή. disable_gravatar=Απενεργοποίηση Gravatar disable_gravatar.description=Το Gravatar και άλλες εξωτερικές πηγές εικόνων προφίλ θα απενεργοποιηθούν. Θα χρησιμοποιηθεί μία προεπιλεγμένη εικόνα προφίλ, εκτός αν ο χρήστης ανεβάσει από μόνος του ένα avatar. federated_avatar_lookup=Ενεργοποίηση αποκεντρωμένων εικόνων προφίλ federated_avatar_lookup.description=Ενεργοποίηση αποκεντρωμένης αναζήτησης εικόνων προφίλ μέσω Libravatar. disable_registration=Απενεργοποίηση αυτοεγγραφής -disable_registration.description=Απενεργοποίηση αυτοεγγραφής χρήστη. Μόνο οι διαχειριστές θα μπορούν να δημιουργήσουν νέους λογαριασμούς χρηστών. -allow_only_external_registration.description=Να επιτρέπεται η εγγραφή μόνο μέσω εξωτερικών υπηρεσιών +disable_registration.description=Μόνο οι διαχειριστές θα μπορούν να δημιουργήσουν νέους λογαριασμούς χρηστών. Σας συνιστούμε να απενεργοποιήσετε τις εγγραφές, εκτός αν θέλετε να προσφέρετε τον διακομιστή σας σε ένα ευρύ κοινό και είστε έτοιμος να αφαιρέσετε λογαριασμούς που θα χρησιμοποιηθούν για spam. +allow_only_external_registration.description=Οι χρήστες θα μπορούν να δημιουργήσουν λογαριασμούς μόνο μέσω εξωτερικών υπηρεσιών. openid_signin=Ενεργοποίηση σύνδεσης μέσω OpenID openid_signin.description=Ενεργοποίηση σύνδεσης χρήστη μέσω OpenID. openid_signup=Ενεργοποίηση εγγραφών μέσω OpenID openid_signup.description=Ενεργοποίηση ιδιοεγγραφής χρηστών με βάση το OpenID. enable_captcha=Ενεργοποίηση CAPTCHA στην εγγραφή -enable_captcha.description=Να απαιτείται CAPTCHA για την δημιουργία λογαριασμού. +enable_captcha.description=Να απαιτείται CAPTCHA για την δημιουργία λογαριασμών. require_sign_in_view=Να απαιτείται είσοδος για την προβολή περιεχομένων -require_sign_in_view.description=Περιορισμός της πρόσβασης σε συνδεδεμένους χρήστες. Οι επισκέπτες θα μπορούν μόνο να δουν τις σελίδες εισόδου και εγγραφής. +require_sign_in_view.description=Το περιεχόμενο του διακομιστή σας θα μπορούν να το βλέπουν μόνο συνδεδεμένοι χρήστες. Οι επισκέπτες θα μπορούν μόνο να δουν τις σελίδες εισόδου και εγγραφής. admin_setting.description=Η δημιουργία ενός λογαριασμού διαχειριστή είναι προαιρετική. Ο πρώτος εγγεγραμμένος χρήστης θα γίνει αυτόματα διαχειριστής. admin_title=Ρυθμίσεις λογαριασμού διαχειριστή admin_name=Όνομα χρήστη διαχειριστή @@ -312,9 +314,9 @@ invalid_log_root_path=Η τοποθεσία αρχείων καταγραφής default_keep_email_private=Απόκρυψη διευθύνσεων email από προεπιλογή default_keep_email_private.description=Απόκρυψη διευθύνσεων email των νέων λογαριασμών χρήστη σαν προεπιλογή. default_allow_create_organization=Να επιτρέπεται η δημιουργία οργανισμών από προεπιλογή -default_allow_create_organization.description=Επιτρέψτε σε νέους λογαριασμούς χρηστών να δημιουργούν οργανισμούς σαν προεπιλογή. +default_allow_create_organization.description=Να επιτρέπεται στους χρήστες να δημιουργούν οργανισμούς από προεπιλογή. Αν απενεργοποιήσετε αυτήν την ρύθμιση, τότε ο χρήστης θα μπορεί να δημιουργήσει οργανισμούς μόνο με την έγκριση ενός διαχειριστή. default_enable_timetracking=Ενεργοποίηση καταγραφής χρόνου από προεπιλογή -default_enable_timetracking.description=Ενεργοποίηση καταγραφής χρόνου για νέα αποθετήρια σαν προεπιλογή. +default_enable_timetracking.description=Να ενεργοποιείται η λειτουργία καταγραφής χρόνου σε νέα αποθετήρια από προεπιλογή. no_reply_address=Domain κρυφών email no_reply_address_helper=Όνομα τομέα (domain) για χρήστες με μια κρυφή διεύθυνση email. Για παράδειγμα, το όνομα χρήστη 'nikos' θα συνδεθεί στο Git ως 'nikos@noreply.example.org' αν ο κρυφός τομέας email έχει οριστεί ως 'noreply.example.org'. password_algorithm=Αλγόριθμος hash για κωδικούς @@ -327,19 +329,22 @@ allow_dots_in_usernames = Επιτρέπει την χρήση τελείων σ enable_update_checker_helper_forgejo = Θα γίνεται τακτικά έλεγχος για νέες εκδόσεις του Forgejo ελέγχοντας μία εγγραφή DNS TXT στο release.forgejo.org. smtp_from_invalid = Η διεύθυνση του πεδίου «Αποστολή email ως» δεν είναι έγκυρη config_location_hint = Αυτές οι ρυθμίσεις θα αποθηκευτούν στην ακόλουθη τοποθεσία: +allow_only_external_registration = Να επιτρέπονται οι εγγραφές μόνο μέσω εξωτερικών υπηρεσιών +app_slogan = Slogan διακομιστή +app_slogan_helper = Γράψτε το slogan του διακομιστή σας εδώ. Αφήστε κενό για να το απενεργοποιήσετε. [home] uname_holder=Όνομα χρήστη ή διεύθυνση email password_holder=Κωδικός Πρόσβασης -switch_dashboard_context=Εναλλαγή Περιεχομένων Αρχικού Πίνακα +switch_dashboard_context=Εναλλαγή περιεχομένων αρχικού πίνακα my_repos=Αποθετήρια show_more_repos=Περισσότερα αποθετήρια… -collaborative_repos=Συνεργατικά Αποθετήρια +collaborative_repos=Συνεργατικά αποθετήρια my_orgs=Οργανισμοί my_mirrors=Τα Αντίγραφα Μου view_home=Προβολή %s search_repos=Βρείτε ένα αποθετήριο… -filter=Άλλα Φίλτρα +filter=Άλλα φίλτρα filter_by_team_repositories=Φιλτράρισμα ανά αποθετήρια ομάδας feed_of=Ροή (feed) του «%s» @@ -382,7 +387,7 @@ forks_one = %d fork forks_few = %d forks [auth] -create_new_account=Δημιουργία Λογαριασμού +create_new_account=Δημιουργία λογαριασμού register_helper_msg=Έχετε ήδη λογαριασμό; Συνδεθείτε τώρα! social_register_helper_msg=Έχετε ήδη λογαριασμό; Συνδέστε το τώρα! disable_register_prompt=Οι εγγραφές είναι απενεργοποιημένες. Παρακαλούμε να επικοινωνήσετε με το διαχειριστή του ιστοτόπου. @@ -398,7 +403,7 @@ confirmation_mail_sent_prompt=Ένα νέο email επιβεβαίωσης έχ must_change_password=Ενημερώστε τον κωδικό πρόσβασης σας allow_password_change=Απαιτείται από το χρήστη να αλλάξει τον κωδικό πρόσβασης (συνιστόμενο) reset_password_mail_sent_prompt=Ένα email επιβεβαίωσης έχει σταλεί στο %s. Για την ολοκλήρωση της διαδικασίας ανάκτησης του λογαριασμού σας, παρακαλώ ελέγξτε τα εισερχόμενα σας στις επόμενες %s. -active_your_account=Ενεργοποιήστε Το Λογαριασμό Σας +active_your_account=Ενεργοποίηση λογαριασμού account_activated=Ο λογαριασμός έχει ενεργοποιηθεί prohibit_login=Δεν επιτρέπεται η σύνδεση prohibit_login_desc=Δεν επιτρέπεται η σύνδεση στον λογαριασμό σας, παρακαλούμε επικοινωνήστε με το διαχειριστή σας. @@ -406,8 +411,8 @@ resent_limit_prompt=Έχετε ήδη ζητήσει ένα email ενεργοπ has_unconfirmed_mail=Γειά %s, η διεύθυνση ηλεκτρονικού ταχυδρομείου σας (%s) δεν έχει επιβεβαιωθεί ακόμα. Εάν δεν έχετε λάβει κάποιο email επιβεβαίωσης ή αν χρειάζεστε ένα νέο email επιβεβαίωσης, παρακαλώ πατήστε το παρακάτω κουμπί. resend_mail=Κάντε κλικ εδώ για να στείλετε ξανά το email ενεργοποίησης email_not_associate=Η διεύθυνση ηλεκτρονικού ταχυδρομείου δεν είναι συσχετισμένη με κάποιο λογαριασμό. -send_reset_mail=Αποστολή Email Ανάκτησης Λογαριασμού -reset_password=Ανάκτηση Λογαριασμού +send_reset_mail=Αποστολή email ανάκτησης λογαριασμού +reset_password=Ανάκτηση λογαριασμού invalid_code=Ο κωδικός επιβεβαίωσης δεν είναι έγκυρος ή έχει λήξει. invalid_code_forgot_password=Ο κωδικός επιβεβαίωσης έχει λήξει ή δεν είναι έγκυρος. Πατήστε εδώ για να ξαναξεκινήσετε την διαδικασία. invalid_password=Ο κωδικός πρόσβασης σας δεν ταιριάζει με τον κωδικό που χρησιμοποιήθηκε για τη δημιουργία του λογαριασμού. @@ -424,11 +429,11 @@ twofa_scratch_token_incorrect=Ο κωδικός μιας χρήσης είναι login_userpass=Είσοδος tab_openid=OpenID oauth_signup_tab=Δημιουργία νέου λογαριασμού -oauth_signup_title=Ολοκλήρωση Νέου Λογαριασμού -oauth_signup_submit=Ολοκληρωμένος Λογαριασμός +oauth_signup_title=Ολοκλήρωση νέου λογαριασμού +oauth_signup_submit=Ολοκλήρωση λογαριασμού oauth_signin_tab=Σύνδεση με υπάρχων λογαριασμό -oauth_signin_title=Συνδεθείτε για να εγκρίνετε τον Συνδεδεμένο Λογαριασμό -oauth_signin_submit=Σύνδεση Λογαριασμού +oauth_signin_title=Συνδεθείτε για να εγκρίνετε τον συνδεδεμένο λογαριασμό +oauth_signin_submit=Σύνδεση λογαριασμού oauth.signin.error=Παρουσιάστηκε σφάλμα κατά την επεξεργασία του αιτήματος εξουσιοδότησης. Εάν αυτό το σφάλμα επιμένει, παρακαλούμε επικοινωνήστε με το διαχειριστή του ιστοτόπου. oauth.signin.error.access_denied=Η αίτηση εξουσιοδότησης απορρίφθηκε. oauth.signin.error.temporarily_unavailable=Η εξουσιοδότηση απέτυχε επειδή ο διακομιστής ταυτοποίησης δεν είναι διαθέσιμος προσωρινά. Παρακαλώ προσπαθήστε ξανά αργότερα. @@ -444,7 +449,7 @@ email_domain_blacklisted=Δεν μπορείτε να εγγραφείτε με authorize_application=Εξουσιοδότηση Εφαρμογής authorize_redirect_notice=Θα μεταφερθείτε στο %s εάν εξουσιοδοτήσετε αυτήν την εφαρμογή. authorize_application_created_by=Αυτή η εφαρμογή δημιουργήθηκε από %s. -authorize_application_description=Εάν παραχωρήσετε την πρόσβαση, θα μπορεί να έχει πρόσβαση και να γράφει σε όλες τις πληροφορίες του λογαριασμού σας, συμπεριλαμβανομένων των ιδιωτικών αποθετηρίων και οργανισμών. +authorize_application_description=Αν παραχωρήσετε την πρόσβαση, θα μπορεί να διαβάσει και να επεξεργαστεί όλες τις πληροφορίες του λογαριασμού σας, συμπεριλαμβανομένων των ιδιωτικών αποθετηρίων και οργανισμών. authorize_title=Είστε βέβαιοι πως θέλετε να δώσετε πρόσβαση στον λογαριασμό σας στην εφαρμογή «%s»; authorization_failed=Αποτυχία εξουσιοδότησης authorization_failed_desc=Η εξουσιοδότηση απέτυχε επειδή εντοπίστηκε μια μη έγκυρη αίτηση. Παρακαλούμε επικοινωνήστε με το συντηρητή της εφαρμογής που προσπαθήσατε να εξουσιοδοτήσετε. @@ -555,7 +560,7 @@ TreeName=Διαδρομή αρχείου Content=Περιεχόμενο SSPISeparatorReplacement=Διαχωριστικό -SSPIDefaultLanguage=Προεπιλεγμένη Γλώσσα +SSPIDefaultLanguage=Προεπιλεγμένη γλώσσα require_error=` δεν μπορεί να είναι κενό.` alpha_dash_error=`: Πρέπει να περιέχει μόνο αλφαριθμητικά, παύλες ('-') και κάτω παύλες ('_').` @@ -629,6 +634,14 @@ admin_cannot_delete_self = Δεν μπορείτε να διαγράψετε τ unset_password = Ο χρήστης δεν έχει ορίσει κάποιον κωδικό. unsupported_login_type = Η μέθοδος με την οποίο γίνεται η σύνδεση δεν υποστηρίζει την διαγραφή λογαριασμών. required_prefix = Το εισαγώμενο κείμενο πρέπει να ξεκινά με «%s» +To = Όνομα κλάδου +AccessToken = Διακριτικό πρόσβασης (token) +FullName = Πλήρες όνομα +Description = Περιγραφή +Pronouns = Αντωνυμίες +Biography = Βιογραφία +Website = Ιστοσελίδα +Location = Τοποθεσία [user] @@ -659,12 +672,20 @@ follow_blocked_user = Δεν μπορείτε να ακολουθήσετε το unblock = Άρση αποκλεισμού block = Αποκλεισμός block_user = Αποκλεισμός χρήστη -block_user.detail_1 = Ο χρήστης δεν θα ακολουθεί πια τον λογαριασμό σας. -block_user.detail_2 = Ο χρήστης δεν θα μπορεί να αλληλεπιδράσει με τα αποθετήριά σας, να δημιουργήσει ζητήματα ή να αφήσει σχόλια. -block_user.detail_3 = Ο χρήστης δεν θα μπορέσει να σας προσθέσει στα αποθετήριά του ως συνεργάτη και αντίστοιχα δεν θα μπορείτε να τον προσθέσετε στα δικά σας αποθετήρια. -block_user.detail = Επισημαίνεται πως αν αποκλείσετε αυτόν τον χρήστη, θα προκύψουν ταυτόχρονα και άλλες ενέργειες. Μερικές από αυτές: +block_user.detail_1 = Ο χρήστης θα πάψει να ακολουθεί τον λογαριασμό σας. +block_user.detail_2 = Ο χρήστης δεν θα μπορεί να αλληλεπιδράσει με τα αποθετήριά, τα ζητήματα και τα σχόλια σας. +block_user.detail_3 = Δεν θα μπορείτε να προσθέσετε ο ένας τον άλλον στα αποθετήριά σας ως συνεργάτη. +block_user.detail = Επισημαίνεται πως αν αποκλείσετε αυτόν τον χρήστη, θα προκύψουν ταυτόχρονα και άλλες ενέργειες, όπως: followers_one = %d ακόλουθος following_one = ακολουθεί %d +public_activity.visibility_hint.admin_private = Αν και ο χρήστης προτιμά να κρατά την δραστηριότητά του ιδιωτική, είναι ορατή σε εσάς επειδή είστε ένας διαχειριστής. +followers.title.one = ακόλουθος +followers.title.few = ακόλουθοι +following.title.few = ακολουθεί +following.title.one = ακολουθεί +public_activity.visibility_hint.admin_public = Η δραστηριότητα είναι ορατή σε όλους, αλλά ως διαχειριστής μπορείτε να δείτε και τις αλληλεπιδράσεις σε ιδιωτικούς χώρους. +public_activity.visibility_hint.self_public = Η δραστηριότητά σου είναι ορατή σε όλους, πλην τις αλληλεπιδράσεις σας σε ιδιωτικούς χώρους. Αλλαγή ορατότητας. +public_activity.visibility_hint.self_private = Η δραστηριότητά σας είναι ορατή μόνο σε εσάς και στους διαχειριστές. Αλλαγή ορατότητας. [settings] profile=Προφίλ @@ -680,7 +701,7 @@ orgs=Διαχείριση οργανισμών repos=Αποθετήρια delete=Διαγραφή λογαριασμού twofa=Πιστοποίηση δύο παραγόντων (TOTP) -account_link=Συνδεδεμένοι Λογαριασμοί +account_link=Συνδεδεμένοι λογαριασμοί organization=Οργανισμοί uid=UID webauthn=Πιστοποίηση δύο παραγόντων (Κλειδιά Ασφαλείας) @@ -750,19 +771,19 @@ password_change_disabled=Οι μη τοπικοί χρήστες δεν μπορ emails=Διευθύνσεις Email manage_emails=Διαχείριση διευθύνσεων email -manage_themes=Επιλέξτε προεπιλεγμένο θέμα διεπαφής -manage_openid=Διαχείριση διευθύνσεων OpenID +manage_themes=Προεπιλεγμένο θέμα +manage_openid=Διευθύνσεις OpenID email_desc=Η κύρια διεύθυνση ηλεκτρονικού ταχυδρομείου σας θα χρησιμοποιηθεί για ειδοποιήσεις, ανάκτηση του κωδικού πρόσβασης και, εφόσον δεν είναι κρυμμένη, λειτουργίες Git στον ιστότοπο. theme_desc=Αυτό θα είναι το προεπιλεγμένο θέμα διεπαφής σας σε όλη την ιστοσελίδα. primary=Κύριο activated=Ενεργό requires_activation=Απαιτείται ενεργοποίηση -primary_email=Αλλαγή κυριότητας -activate_email=Αποστολή Ενεργοποίησης -activations_pending=Εκκρεμούν Ενεργοποιήσεις +primary_email=Προεπιλογή +activate_email=Αποστολή ενεργοποίησης +activations_pending=Εκκρεμεί ενεργοποίηση can_not_add_email_activations_pending=Εκκρεμεί μια ενεργοποίηση, δοκιμάστε ξανά σε λίγα λεπτά αν θέλετε να προσθέσετε ένα νέο email. delete_email=Αφαίρεση -email_deletion=Αφαίρεση Διεύθυνσης Email +email_deletion=Αφαίρεση διεύθυνσης email email_deletion_desc=Η διεύθυνση ηλεκτρονικού ταχυδρομείου και οι σχετικές πληροφορίες θα αφαιρεθούν από τον λογαριασμό σας. Οι υποβολές Git από αυτή τη διεύθυνση email θα παραμείνουν αμετάβλητες. Συνέχεια; email_deletion_success=Η διεύθυνση email σας έχει καταργηθεί. theme_update_success=Το θέμα διεπαφής σας ενημερώθηκε. @@ -771,7 +792,7 @@ openid_deletion=Αφαίρεση Διεύθυνσης OpenID openid_deletion_desc=Η κατάργηση αυτής της διεύθυνσης OpenID από τον λογαριασμό σας θα σας εμποδίσει να συνδέεστε με αυτό. Συνέχεια; openid_deletion_success=Η διεύθυνση OpenID αφαιρέθηκε. add_new_email=Προσθήκη νέας διεύθυνσης email -add_new_openid=Προσθήκη Νέου OpenID URI +add_new_openid=Προσθήκη νέου OpenID URI add_email=Προσθήκη διεύθυνσης email add_openid=Προσθήκη OpenID URI add_email_confirmation_sent=Ένα email επιβεβαίωσης έχει σταλεί στην διεύθυνση «%s». Για να επιβεβαιώσετε τη διεύθυνση email σας, παρακαλώ ελέγξτε τα εισερχόμενα σας μέσα σε %s. @@ -795,7 +816,7 @@ add_new_key=Προσθήκη κλειδιού SSH add_new_gpg_key=Προσθήκη κλειδιού GPG key_content_ssh_placeholder=Αρχίζει με «ssh-ed25519», «ssh-rsa», «ecdsa-sha2-nistp256», «ecdsa-sha2-nistp384», «ecdsa-sha2-nistp521», «sk-ecdsa-sha2-nistp256@openssh.com», ή «sk-ssh-ed25519@openssh.com» key_content_gpg_placeholder=Αρχίζει με «-----BEGIN PGP PUBLIC KEY BLOCK-----» -add_new_principal=Προσθήκη Αρχής (Principal) +add_new_principal=Προσθήκη αρχής (Principal) ssh_key_been_used=Αυτό το κλειδί SSH έχει ήδη προστεθεί στο διακομιστή. ssh_key_name_used=Υπάρχει ήδη ένα SSH κλειδί με το ίδιο όνομα στο λογαριασμό σας. ssh_principal_been_used=Αυτή η αρχή πιστοποίησης (principal) έχει ήδη προστεθεί στο διακομιστή. @@ -854,7 +875,7 @@ token_state_desc=Αυτό το διακριτικό έχει χρησιμοπο principal_state_desc=Αυτή η αρχή πιστοποιητικού έχει χρησιμοποιηθεί τις τελευταίες 7 ημέρες show_openid=Εμφάνιση στο προφίλ hide_openid=Απόκρυψη από το προφίλ -ssh_disabled=SSH Απενεργοποιημένο +ssh_disabled=Το SSH είναι απενεργοποιημένο ssh_signonly=Το SSH είναι απενεργοποιημένο αυτή τη στιγμή, έτσι αυτά τα κλειδιά είναι μόνο για την επαλήθευση υπογραφής των υποβολών. ssh_externally_managed=Αυτό το κλειδί SSH διαχειρίζεται εξωτερικά για αυτόν το χρήστη manage_social=Διαχείριση Συσχετιζόμενων Λογαριασμών Κοινωνικών Δικτύων @@ -897,7 +918,7 @@ create_oauth2_application_button=Δημιουργία εφαρμογής create_oauth2_application_success=Δημιουργήσατε επιτυχώς μια νέα εφαρμογή OAuth2. update_oauth2_application_success=Ενημερώσατε την εφαρμογή OAuth2 επιτυχώς. oauth2_application_name=Όνομα εφαρμογής -oauth2_confidential_client=Εμπιστευτικός Πελάτης. Επιλέξτε το για εφαρμογές που διατηρούν το μυστικό κωδικό κρυφό, όπως πχ οι εφαρμογές ιστού. Μην επιλέγετε για εγγενείς εφαρμογές, συμπεριλαμβανομένων εφαρμογών επιφάνειας εργασίας και εφαρμογών για κινητά. +oauth2_confidential_client=Εμπιστευτικός πελάτης (client). Επιλέξτε το για εφαρμογές που διατηρούν το μυστικό κωδικό κρυφό, όπως π.χ. εφαρμογές ιστού. Μην επιλέγετε για εγγενείς εφαρμογές, συμπεριλαμβανομένων εφαρμογών επιφάνειας εργασίας και εφαρμογών για κινητά. oauth2_redirect_uris=URI Ανακατεύθυνσης. Χρησιμοποιήστε μια νέα γραμμή για κάθε URI. save_application=Αποθήκευση oauth2_client_id=Ταυτότητα Πελάτη @@ -944,10 +965,10 @@ webauthn_delete_key_desc=Αν αφαιρέσετε ένα κλειδί ασφα webauthn_key_loss_warning=Αν χάσετε τα κλειδιά ασφαλείας σας, θα χάσετε την πρόσβαση στο λογαριασμό σας. webauthn_alternative_tip=Μπορεί να θέλετε να ρυθμίσετε μια πρόσθετη μέθοδο ταυτοποίησης. -manage_account_links=Διαχείριση Συνδεδεμένων Λογαριασμών +manage_account_links=Διαχείριση συνδεδεμένων λογαριασμών manage_account_links_desc=Αυτοί οι εξωτερικοί λογαριασμοί είναι συνδεδεμένοι στον λογαριασμό Forgejo σας. account_links_not_available=Προς το παρόν δεν υπάρχουν εξωτερικοί λογαριασμοί συνδεδεμένοι με τον λογαριασμό σας στο Forgejo. -link_account=Σύνδεση Λογαριασμού +link_account=Σύνδεση λογαριασμού remove_account_link=Αφαίρεση συνδεδεμένου λογαριασμού remove_account_link_desc=Η κατάργηση ενός συνδεδεμένου λογαριασμού θα ανακαλέσει την πρόσβασή του στο λογαριασμό σας στο Forgejo. Συνέχεια; remove_account_link_success=Ο συνδεδεμένος λογαριασμός έχει αφαιρεθεί. @@ -983,7 +1004,7 @@ user_unblock_success = Η άρση αποκλεισμού του χρήστη ή change_password = Αλλαγή κωδικού blocked_users = Αποκλεισμένοι χρήστες user_block_success = Ο αποκλεισμός του χρήστη ήταν επιτυχής. -additional_repo_units_hint = Να γίνεται ενθάρρυνση προσθήκης μονάδων σε αποθετήρια +additional_repo_units_hint = Να συνιστάται η προσθήκη μονάδων αποθετηρίων pronouns = Αντωνυμίες pronouns_custom = κάτι άλλο pronouns_unspecified = Απροσδιόριστες @@ -991,6 +1012,7 @@ hints = Συμβουλές additional_repo_units_hint_description = Εμφάνιση κουμπιού «Προσθήκη μονάδων...» σε αποθετήρια που δεν έχουν ενεργοποιημένες όλες τις διαθέσιμες μονάδες. update_hints = Ενημέρωση συμβουλών update_hints_success = Οι συμβουλές ενημερώθηκαν. +language.title = Προεπιλεγμένη γλώσσα [repo] new_repo_helper=Ένα αποθετήριο περιέχει όλα τα αρχεία έργου, συμπεριλαμβανομένου του ιστορικού εκδόσεων. Ήδη φιλοξενείται αλλού; Μετεγκατάσταση αποθετηρίου. @@ -1153,7 +1175,7 @@ migrate.failed=Η μεταφορά απέτυχε: %v migrate.migrate_items_options=Το διακριτικό πρόσβασης (token) είναι απαραίτητο για τη μεταφορά πρόσθετων στοιχείων migrated_from=Μεταφέρθηκε από %[2]s migrated_from_fake=Μεταφέρθηκε από %[1]s -migrate.migrate=Μεταφορά από το %s +migrate.migrate=Μεταφορά από %s migrate.migrating=Γίνεται μεταφορά από το %s... migrate.migrating_failed=Η μεταφορά από το %s απέτυχε. migrate.migrating_failed.error=Αποτυχία μεταφοράς: %s @@ -1238,8 +1260,8 @@ invisible_runes_header=`Αυτό το αρχείο περιέχει αόρατο invisible_runes_description=`Αυτό το αρχείο περιέχει αόρατους χαρακτήρες Unicode που δεν διακρίνονται από ανθρώπους, αλλά μπορεί να επεξεργάζονται διαφορετικά από έναν υπολογιστή. Αν νομίζετε ότι αυτό είναι σκόπιμο, μπορείτε να αγνοήσετε με ασφάλεια αυτή την προειδοποίηση. Χρησιμοποιήστε το κουμπί Escape για να τους αποκαλύψετε.` ambiguous_runes_header=`Αυτό το αρχείο περιέχει ασαφείς χαρακτήρες Unicode ` ambiguous_runes_description=`Αυτό το αρχείο περιέχει χαρακτήρες Unicode που μπορεί να συγχέονται με άλλους χαρακτήρες. Αν νομίζετε ότι αυτό είναι σκόπιμο, μπορείτε να αγνοήσετε με ασφάλεια αυτή την προειδοποίηση. Χρησιμοποιήστε το κουμπί Escape για να τους αποκαλύψετε.` -invisible_runes_line=`Αυτή η γραμμή έχει αόρατους χαρακτήρες unicode ` -ambiguous_runes_line=`Αυτή η γραμμή έχει ασαφείς χαρακτήρες unicode ` +invisible_runes_line=`Αυτή η γραμμή έχει αόρατους χαρακτήρες Unicode` +ambiguous_runes_line=`Αυτή η γραμμή έχει ασαφείς χαρακτήρες Unicode` ambiguous_character=`ο %[1]c [U+%04[1]X] μπορεί να μπερδευτεί με τον %[2]c [U+%04[2]X]` escape_control_characters=Escape @@ -1290,10 +1312,10 @@ editor.add_tmpl=Προσθήκη «» editor.add=Προσθήκη %s editor.update=Ενημέρωση %s editor.delete=Διαγραφή %s -editor.patch=Εφαρμογή Διόρθωσης +editor.patch=Εφαρμογή patch editor.patching=Επιδιόρθωση: editor.fail_to_apply_patch=`Αδυναμία εφαρμογής της επιδιόρθωσης "%s"` -editor.new_patch=Νέα Διόρθωση +editor.new_patch=Νέο patch editor.commit_message_desc=Προσθήκη προαιρετικής εκτενούς περιγραφής… editor.signoff_desc=Προσθέστε ένα πρόσθετο Signed-off-by στο τέλος του μηνύματος καταγραφής της υποβολής. editor.commit_directly_to_this_branch=Υποβολή απευθείας στο κλάδο %s. @@ -1318,10 +1340,10 @@ editor.commit_empty_file_header=Υποβολή ενός κενού αρχείο editor.commit_empty_file_text=Το αρχείο που πρόκειται να υποβληθεί είναι κενό. Συνέχεια; editor.no_changes_to_show=Δεν υπάρχουν αλλαγές για εμφάνιση. editor.fail_to_update_file=Αποτυχία ενημέρωσης/δημιουργίας του αρχείου «%s». -editor.fail_to_update_file_summary=Μήνυμα Σφάλματος: +editor.fail_to_update_file_summary=Μήνυμα σφάλματος: editor.push_rejected_no_message=Η αλλαγή απορρίφθηκε από τον διακομιστή και δεν γνωρίζουμε τον λόγο. Παρακαλώ ελέγξτε τα Git hooks σας. editor.push_rejected=Η αλλαγή απορρίφθηκε από τον διακομιστή. Παρακαλώ ελέγξτε τα Git hook σας. -editor.push_rejected_summary=Μήνυμα Πλήρους Απόρριψης: +editor.push_rejected_summary=Μήνυμα πλήρους απόρριψης: editor.add_subdir=Προσθήκη φακέλου… editor.unable_to_upload_files=Αποτυχία αποστολής αρχείων στο «%s» με το σφάλμα: %v editor.upload_file_is_locked=Το αρχείο «%s» είναι κλειδωμένο από %s. @@ -1419,7 +1441,7 @@ issues.filter_reviewers=Φιλτράρισμα Εξεταστή issues.new=Νέο ζήτημα issues.new.title_empty=Ο τίτλος δεν μπορεί να είναι κενός issues.new.labels=Σήματα -issues.new.no_label=Χωρίς Σήμα +issues.new.no_label=Χωρίς σήμανση issues.new.clear_labels=Καθαρισμός σημάτων issues.new.projects=Έργα issues.new.clear_projects=Εκκαθάριση έργων @@ -1449,8 +1471,8 @@ issues.new_label=Νέο σήμα issues.new_label_placeholder=Όνομα σήματος issues.new_label_desc_placeholder=Περιγραφή issues.create_label=Δημιουργία σήματος -issues.label_templates.title=Χρήση ενός προκαθορισμένου συνόλου σημάτων -issues.label_templates.info=Δεν υπάρχουν σήματα ακόμα. Δημιουργήστε ένα σήμα με το κουμπί «Νέο Σήμα» ή χρησιμοποιήστε ένα σετ προκαθορισμένων σημάτων: +issues.label_templates.title=Χρήση προκαθορισμένου συνόλου σημάνσεων +issues.label_templates.info=Δεν υπάρχουν σημάνσεις ακόμα. Δημιουργήστε ένα σήμα με το κουμπί «Νέα σήμανση» ή χρησιμοποιήστε ένα σετ προκαθορισμένων σημάνσεων: issues.label_templates.helper=Επιλέξτε ένα σύνολο προεπιλεγμένων σημάτων issues.label_templates.use=Χρήση συνόλου προεπιλεγμένων σημάτων issues.label_templates.fail_to_load_file=Αποτυχία φόρτωσης των προτύπων σημάτων από το αρχείο «%s»: %v @@ -1572,7 +1594,7 @@ issues.role.collaborator_helper=Ο χρήστης έλαβε πρόσκληση issues.role.first_time_contributor=Συντελεστής για πρώτη φορά issues.role.first_time_contributor_helper=Αυτή είναι η πρώτη συνεισφορά αυτού του χρήστη στο αποθετήριο. issues.role.contributor=Συντελεστής -issues.role.contributor_helper=Αυτός ο χρήστης έχει προηγούμενές υποβολές στο αποθετήριο. +issues.role.contributor_helper=Αυτός ο χρήστης έχει προηγούμενές υποβολές (commits) στο αποθετήριο. issues.re_request_review=Επαναίτηση ανασκόπησης issues.is_stale=Έχουν υπάρξει αλλαγές σε αυτό το PR από αυτή την αναθεώρηση issues.remove_request_review=Αφαίρεση αιτήματος αναθεώρησης @@ -1837,17 +1859,17 @@ pulls.merge_commit_id=Το ID της υποβολής συγχώνευσης pulls.require_signed_wont_sign=Ο κλάδος απαιτεί υπογεγραμμένες υποβολές αλλά αυτή η συγχώνευση δεν θα υπογραφεί pulls.invalid_merge_option=Δεν μπορείτε να χρησιμοποιήσετε αυτήν την επιλογή συγχώνευσης για αυτό το pull request. -pulls.merge_conflict=Η Συγχώνευση Απέτυχε: Υπήρξε μια διένεξη κατά τη συγχώνευση. Υπόδειξη: Δοκιμάστε μια διαφορετική στρατηγική -pulls.merge_conflict_summary=Μήνυμα Σφάλματος -pulls.rebase_conflict=Η Συγχώνευση Απέτυχε: Υπήρξε μια σύγκρουση κατά την αλλαγή βάσης της υποβολής: %[1]s. Υπόδειξη: Δοκιμάστε μια διαφορετική στρατηγική -pulls.rebase_conflict_summary=Μήνυμα Σφάλματος -pulls.unrelated_histories=H Συγχώνευση Απέτυχε: Η κεφαλή και η βάση της συγχώνευσης δεν μοιράζονται μια κοινή ιστορία. Συμβουλή: Δοκιμάστε μια διαφορετική στρατηγική +pulls.merge_conflict=Η συγχώνευση απέτυχε: Υπήρξε μια σύγκρουση κατά τη συγχώνευση. Συμβουλή: Δοκιμάστε μια διαφορετική στρατηγική +pulls.merge_conflict_summary=Μήνυμα σφάλματος +pulls.rebase_conflict=Η συγχώνευση απέτυχε: Υπήρξε μια σύγκρουση κατά την αλλαγή βάσης της υποβολής: %[1]s. Συμβουλή: Δοκιμάστε μια διαφορετική στρατηγική +pulls.rebase_conflict_summary=Μήνυμα σφάλματος +pulls.unrelated_histories=H συγχώνευση απέτυχε: Η κεφαλή και η βάση της συγχώνευσης δεν έχουν κοινή ιστορία. Συμβουλή: Δοκιμάστε μια διαφορετική στρατηγική pulls.merge_out_of_date=Η συγχώνευση απέτυχε: Κατά τη δημιουργία της συγχώνευσης, η βάση ενημερώθηκε. Συμβουλή: Δοκιμάστε ξανά. pulls.head_out_of_date=Η συγχώνευση απέτυχε: Κατά τη δημιουργία της συγχώνευσης, το HEAD ενημερώθηκε. Συμβουλή: Δοκιμάστε ξανά. pulls.has_merged=Αποτυχία: Το pull request έχει συγχωνευθεί, δεν είναι δυνατή η συγχώνευση ξανά ή να αλλάξει ο κλάδος προορισμού. -pulls.push_rejected=Αποτυχία ώθησης: Η ώθηση απορρίφθηκε. Ελέγξτε τα Git hooks του αποθετήριο. -pulls.push_rejected_summary=Μήνυμα Πλήρους Απόρριψης -pulls.push_rejected_no_message=Αποτυχία ώθησης: Η ώθηση απορρίφθηκε, αλλά δεν λάβαμε κάποιο μήνυμα. Ελέγξτε τα Git hooks του αποθετηρίου +pulls.push_rejected=Η ώθηση απέτυχε: Η ώθηση απορρίφθηκε. Ελέγξτε τα Git hooks του αποθετηρίου. +pulls.push_rejected_summary=Μήνυμα πλήρους απόρριψης +pulls.push_rejected_no_message=Η ώθηση απέτυχε: Η ώθηση απορρίφθηκε, αλλά δεν λάβαμε κάποιο μήνυμα. Ελέγξτε τα Git hooks του αποθετηρίου pulls.open_unmerged_pull_exists=`Δεν μπορείτε να ανοίξετε εκ νέου, επειδή υπάρχει ένα εκκρεμές pull request (#%d) με πανομοιότυπες ιδιότητες.` pulls.status_checking=Μερικοί έλεγχοι εκκρεμούν pulls.status_checks_success=Όλοι οι έλεγχοι ήταν επιτυχείς @@ -1925,7 +1947,7 @@ milestones.filter_sort.least_issues=Λιγότερα ζητήματα signing.will_sign=Αυτή η υποβολή θα υπογραφεί με το κλειδί «%s». signing.wont_sign.error=Παρουσιάστηκε σφάλμα κατά τον έλεγχο για το αν η υποβολή μπορεί να υπογραφεί. -signing.wont_sign.nokey=Δεν υπάρχει διαθέσιμο κλειδί για να υπογραφεί αυτή η υποβολή. +signing.wont_sign.nokey=Ο διακομιστής δεν παρέχει κάποιο κλειδί για την υπογραφή αυτής της υποβολής (commit). signing.wont_sign.never=Οι υποβολές δεν υπογράφονται ποτέ. signing.wont_sign.always=Οι υποβολές υπογράφονται πάντα. signing.wont_sign.pubkey=Η υποβολή δε θα υπογραφεί επειδή δεν υπάρχει δημόσιο κλειδί που να συνδέεται με το λογαριασμό σας. @@ -1944,21 +1966,21 @@ wiki=Wiki wiki.welcome=Καλώς ήρθατε στο Wiki. wiki.welcome_desc=Το wiki σας επιτρέπει να γράψετε και να μοιραστείτε τεκμηριώσεις (documentation) με άλλους συνεργάτες. wiki.desc=Γράψτε και μοιραστείτε τεκμηριώσεις με συνεργάτες. -wiki.create_first_page=Δημιουργία πρώτης σελίδας +wiki.create_first_page=Δημιουργία αρχικής σελίδας wiki.page=Σελίδα wiki.filter_page=Φιλτράρισμα σελίδας wiki.new_page=Σελίδα wiki.page_title=Τίτλος σελίδας wiki.page_content=Περιεχόμενο σελίδας wiki.default_commit_message=Γράψτε μια σημείωση σχετικά με αυτή την ενημέρωση σελίδας (προαιρετικό). -wiki.save_page=Αποθήκευση Σελίδας +wiki.save_page=Αποθήκευση σελίδας wiki.last_commit_info=%s επεξεργάστηκε αυτή τη σελίδα %s wiki.edit_page_button=Επεξεργασία -wiki.new_page_button=Νέα Σελίδα -wiki.file_revision=Αναθεώρηση Σελίδας -wiki.wiki_page_revisions=Αναθεωρήσεις Σελίδας Wiki +wiki.new_page_button=Νέα σελίδα +wiki.file_revision=Έκδοση σελίδας +wiki.wiki_page_revisions=Αναθεωρήσεις σελίδας wiki wiki.back_to_wiki=Πίσω στη σελίδα wiki -wiki.delete_page_button=Διαγραφή Σελίδας +wiki.delete_page_button=Διαγραφή σελίδας wiki.delete_page_notice_1=Η διαγραφή της σελίδας wiki «%s» δεν μπορεί να αναιρεθεί. Συνέχεια; wiki.page_already_exists=Υπάρχει ήδη μια σελίδα wiki με το ίδιο όνομα. wiki.reserved_page=Το όνομα σελίδας wiki «%s» είναι δεσμευμένο. @@ -2081,11 +2103,11 @@ settings.mirror_settings.push_mirror.remote_url=URL απομακρυσμένου settings.mirror_settings.push_mirror.add=Προσθήκη είδωλου ώθησης settings.mirror_settings.push_mirror.edit_sync_time=Επεξεργασία διαστήματος συγχρονισμού ειδώλου -settings.sync_mirror=Συγχρονισμός Τώρα +settings.sync_mirror=Να γίνει συγχρονισμός τώρα settings.pull_mirror_sync_in_progress=Έλκονται αλλαγές από την απομακρυσμένη τοποθεσία %s αυτή τη στιγμή. settings.push_mirror_sync_in_progress=Ώθηση αλλαγών στο απομακρυσμένο %s αυτή τη στιγμή. settings.site=Ιστοσελίδα -settings.update_settings=Ενημέρωση ρυθμίσεων +settings.update_settings=Αποθήκευση ρυθμίσεων settings.update_mirror_settings=Ενημέρωση ρυθμίσεων ειδώλου settings.branches.switch_default_branch=Αλλαγή προεπιλεγμένου κλάδου settings.branches.update_default_branch=Ενημέρωση προεπιλεγμένου κλάδου @@ -2126,9 +2148,9 @@ settings.projects_desc=Ενεργοποίηση έργων αποθετηρίο settings.actions_desc=Ενεργοποίηση actions αποθετηρίου settings.admin_settings=Ρυθμίσεις διαχειριστή settings.admin_enable_health_check=Ενεργοποίηση ελέγχων υγείας αποθετηρίων (git fsck) -settings.admin_code_indexer=Indexer Κώδικα -settings.admin_stats_indexer=Indexer Στατιστικών Κώδικα -settings.admin_indexer_commit_sha=Τελευταίο Indexed SHA +settings.admin_code_indexer=Indexer κώδικα +settings.admin_stats_indexer=Indexer στατιστικών κώδικα +settings.admin_indexer_commit_sha=Τελευταίο indexed SHA settings.admin_indexer_unindexed=Unindexed settings.reindex_button=Προσθήκη στην ουρά Reindex settings.reindex_requested=Αιτήθηκε reindex @@ -2346,7 +2368,7 @@ settings.protected_branch.delete_rule=Διαγραφή κανόνα settings.protected_branch_can_push=Επιτρέψτε ώθηση; settings.protected_branch_can_push_yes=Μπορείτε να ωθήσετε settings.protected_branch_can_push_no=Δεν μπορείτε να ωθήσετε -settings.branch_protection=Κανόνες προστασίας για τον κλάδο «%s» +settings.branch_protection=Κανόνες προστασίας του κλάδου «%s» settings.protect_this_branch=Ενεργοποίηση προστασίας κλάδου settings.protect_this_branch_desc=Αποτρέπει τη διαγραφή και περιορίζει το Git push και συγχώνευση στον κλάδο. settings.protect_disable_push=Απενεργοποίηση ωθήσεων @@ -2388,7 +2410,7 @@ settings.protect_branch_name_pattern=Μοτίβο προστατευμένου settings.protect_branch_name_pattern_desc=Μοτίβα ονόματος προστατευμένων κλάδων. Συμβολευτείτε την τεκμηρίωση για την σύνταξη ενός μοτίβου. Παραδείγματα: main, release/** settings.protect_patterns=Μοτίβα settings.protect_protected_file_patterns=Μοτίβα προστατευμένων αρχείων (διαχωρισμός με semicolon «;» και ΟΧΙ το ελληνικό ερωτηματικό): -settings.protect_protected_file_patterns_desc=Τα προστατευόμενα αρχεία δεν επιτρέπεται να αλλάξουν άμεσα, ακόμη και αν ο χρήστης έχει δικαιώματα να προσθέσει, να επεξεργαστεί ή να διαγράψει αρχεία σε αυτόν τον κλάδο. Επιπλέων μοτίβα μπορούν να διαχωριστούν με ερωτηματικό (';'). Δείτε την τεκμηρίωση github.com/gobwas/glob για τη σύνταξη του μοτίβου. Πχ: .drone.yml, /docs/**/*.txt. +settings.protect_protected_file_patterns_desc=Τα προστατευόμενα αρχεία δεν επιτρέπεται να αλλάξουν άμεσα, ακόμη και αν ο χρήστης έχει δικαιώματα να προσθέσει, να επεξεργαστεί ή να διαγράψει αρχεία σε αυτόν τον κλάδο. Επιπλέων μοτίβα μπορούν να διαχωριστούν με semicolon («;») (ΟΧΙ ερωτηματικό). Για να συντάξετε μοτίβα, συμβουλευτείται την τεκμηρίωση github.com/gobwas/glob. Παράδειγμα: .drone.yml, /docs/**/*.txt. settings.protect_unprotected_file_patterns=Μοτίβα μη προστατευμένων αρχείων (διαχωρισμένα με semicolon «;» και ΟΧΙ το ελληνικό ερωτηματικό): settings.protect_unprotected_file_patterns_desc=Μη προστατευμένα αρχεία που επιτρέπεται να αλλάξουν απευθείας εάν ο χρήστης έχει πρόσβαση εγγραφής, παρακάμπτοντας τον περιορισμό ώθησης. Επιπλέων μοτίβα μπορούν να διαχωριστούν με ερωτηματικό (';'). Δείτε την τεκμηρίωση github.com/gobwas/glob για τη σύνταξη του μοτίβου. Πχ: .drone.yml, /docs/**/*.txt. settings.add_protected_branch=Ενεργοποίηση προστασίας @@ -2458,15 +2480,15 @@ settings.lfs_invalid_lock_directory=Αδυναμία κλειδώματος φα settings.lfs_lock_already_exists=Το κλείδωμα υπάρχει ήδη: %s settings.lfs_lock=Κλείδωμα settings.lfs_lock_path=Διαδρομή αρχείου για να κλειδωθεί... -settings.lfs_locks_no_locks=Χωρίς Κλειδώματα +settings.lfs_locks_no_locks=Χωρίς κλειδώματα settings.lfs_lock_file_no_exist=Το κλειδωμένο αρχείο δεν υπάρχει στον προεπιλεγμένο κλάδο -settings.lfs_force_unlock=Εξαναγκασμός Ξεκλειδώματος +settings.lfs_force_unlock=Εξαγκαναστικό ξεκλείδωμα settings.lfs_pointers.found=Βρέθηκαν %d δείκτης(ες) blob - %d συσχετίστηκαν, %d δεν συσχετίστηκαν (%d λείπουν από το χώρο αποθήκευσης) -settings.lfs_pointers.sha=Blob SHA +settings.lfs_pointers.sha=Blob hash settings.lfs_pointers.oid=OID -settings.lfs_pointers.inRepo=Στο Αποθετήριο +settings.lfs_pointers.inRepo=Στο αποθετήριο settings.lfs_pointers.exists=Υπάρχει στο χώρο αποθήκευσης -settings.lfs_pointers.accessible=Προσβάσιμο στο Χρήστη +settings.lfs_pointers.accessible=Προσβάσιμο στον χρήστη settings.lfs_pointers.associateAccessible=Συσχετισμός προσιτών %d OID settings.rename_branch_failed_exist=Αδυναμία μετονομασίας του κλάδου, επειδή ο κλάδος προορισμού %s υπάρχει ήδη. settings.rename_branch_failed_not_exist=Αδυναμία μετονομασίας του κλάδου %s επειδή δεν υπάρχει. @@ -2515,7 +2537,7 @@ diff.comment.add_single_comment=Προσθέστε ένα σχόλιο diff.comment.add_review_comment=Προσθήκη σχολίου diff.comment.start_review=Έναρξη αξιολόγησης diff.comment.reply=Απάντηση -diff.review=Αξιολόγηση +diff.review=Ολοκλήρωση αξιολόγησης diff.review.header=Υποβολή αξιολόγησης diff.review.placeholder=Σχόλιο αξιολόγησης diff.review.comment=Σχόλιο @@ -2536,16 +2558,16 @@ releases.desc=Παρακολούθηση εκδόσεων έργου και λή release.releases=Κυκλοφορίες release.detail=Λεπτομέρειες κυκλοφορίας release.tags=Ετικέτες -release.new_release=Νέα Κυκλοφορία +release.new_release=Νέα κυκλοφορία release.draft=Προσχέδιο -release.prerelease=Προ-Κυκλοφορία +release.prerelease=Προδημοσίευση release.stable=Σταθερή release.compare=Σύγκριση release.edit=επεξεργασία release.ahead.commits=%d υποβολές release.ahead.target=σε %s από αυτή την έκδοση tag.ahead.target=μέχρι το %s από αυτή την ετικέτα -release.source_code=Πηγαίος Κώδικας +release.source_code=Πηγαίος κώδικας release.new_subheader=Οι Κυκλοφορίες οργανώνουν εκδόσεις έργων. release.edit_subheader=Οι Κυκλοφορίες οργανώνουν εκδόσεις έργων. release.tag_name=Όνομα ετικέτας @@ -2556,15 +2578,15 @@ release.tag_helper_existing=Υπάρχουσα ετικέτα. release.title=Τίτλος κυκλοφορίας release.title_empty=Ο τίτλος δεν μπορεί να είναι κενός. release.message=Περιγράψτε αυτήν την κυκλοφορία -release.prerelease_desc=Σήμανση ως Προ-Κυκλοφορία +release.prerelease_desc=Σήμανση ως προδημοσίευση release.prerelease_helper=Σημείωση αυτής της κυκλοφορίας ως ακατάλληλη για χρήση στη παραγωγή. release.cancel=Ακύρωση -release.publish=Δημοσίευση Κυκλοφορίας -release.save_draft=Αποθήκευση Προχείρου -release.edit_release=Ενημέρωση Κυκλοφορίας -release.delete_release=Διαγραφή Κυκλοφορίας -release.delete_tag=Διαγραφή Ετικέτας -release.deletion=Διαγραφή Κυκλοφορίας +release.publish=Δημοσίευση κυκλοφορίας +release.save_draft=Αποθήκευση προχείρου +release.edit_release=Ενημέρωση κυκλοφορίας +release.delete_release=Διαγραφή κυκλοφορίας +release.delete_tag=Διαγραφή ετικέτας +release.deletion=Διαγραφή κυκλοφορίας release.deletion_desc=Διαγράφοντας μια κυκλοφορία, αυτή αφαιρείται μόνο από το Gitea. Δε θα επηρεάσει την ετικέτα Git, τα περιεχόμενα του αποθετηρίου σας ή το ιστορικό της. Συνέχεια; release.deletion_success=Η κυκλοφορία έχει διαγραφεί. release.deletion_tag_desc=Θα διαγράψει αυτή την ετικέτα από το αποθετήριο. Τα περιεχόμενα του αποθετηρίου και το ιστορικό παραμένουν αμετάβλητα. Συνέχεια; @@ -2576,7 +2598,7 @@ release.tag_already_exist=Αυτό το όνομα ετικέτας υπάρχε release.downloads=Λήψεις release.download_count=Λήψεις: %s release.add_tag_msg=Χρησιμοποιήστε τον τίτλο και το περιεχόμενο της έκδοσης ως μήνυμα ετικέτας. -release.add_tag=Δημιουργία Ετικέτας Μόνο +release.add_tag=Δημιουργία ετικέτας release.releases_for=Κυκλοφορίες για %s release.tags_for=Ετικέτες για %s @@ -2709,7 +2731,7 @@ release.system_generated = Αυτό το αρχείο παράγεται αυτ pulls.ready_for_review = Έτοιμο για αξιολόγηση; settings.rename_branch_failed_protected = Δεν είναι δυνατή η μετονομασία του κλάδου %s, επειδή είναι προστατευόμενος. settings.event_pull_request_enforcement = Εξαναγκασμός -editor.commit_id_not_matching = Το αναγνωριστικό της υποβολής δεν ταιριάζει με την υποβολή που επεξεργαστήκατε. Θα πρέπει να υποβάλετε τις αλλαγές σας σε έναν νέο κλάδο και μετά να τις συγχωνεύσετε. +editor.commit_id_not_matching = Το αρχείο άλλαξε όσο το επεξεργαζόσασταν. Θα πρέπει να υποβάλετε τις αλλαγές σας σε έναν νέο κλάδο και μετά να τις συγχωνεύσετε. settings.sourcehut_builds.visibility = Ορατότητα εργασιών object_format = Μορφή αντικειμένων («object format») settings.ignore_stale_approvals_desc = Οι εγκρίσεις, οι οποίες αναφέρονται σε παλαιότερες υποβολές, δεν θα προσμετρούνται στο σύνολο των απαιτούμενων εγκρίσεων του pull request. Εφόσον αυτές οι εγκρίσεις έχουν ήδη ανακληθεί, τότε αυτή η ρύθμιση δεν θα παίξει κάποιον ρόλο. @@ -2722,6 +2744,30 @@ file_follow = Ακολούθηση συνδέσμου (symlink) settings.sourcehut_builds.secrets_helper = Παραχώρηση πρόσβασης του job στα μυστικά ενός build (απαιτείται η άδεια SECRETS:RO) generated = Παραγμένο editor.push_out_of_date = Η αλλαγή φαίνεται να είναι παρωχημένη. +issues.author.tooltip.issue = Αυτό το ζήτημα δημιουργήθηκε από αυτόν τον χρήστη. +issues.author.tooltip.pr = Αυτό το pull request δημιουργήθηκε από αυτόν τον χρήστη. +settings.federation_settings = Ρυθμίσεις διαλειτουργικότητας +settings.federation_apapiurl = Το Federation URL (URL διαλειτουργικότητας) του αποθετηρίου. Κάντε το copy-paste στις ρυθμίσεις διαλειτουργικότητας ενός άλλου αποθετηρίου ως το URL ενός ακολουθούμενου αποθετηρίου. +form.string_too_long = Το κείμενο είναι μεγαλύτερο από %d χαρακτήρες. +release.hide_archive_links = Απόκρυψη αυτόματα δημιουργημένων archive +settings.graphql_url = URL του GraphQL +issues.edit.already_changed = Δεν ήταν δυνατή η αποθήκευση των αλλαγών στο ζήτημα αυτό, επειδή το περιεχόμενο έχει ήδη αλλαχθεί από κάποιον άλλο χρήστη. Για να μην χαθούν οι αλλαγές του, παρακαλείσθε να ανανεώσετε την σελίδα και προσπαθήστε να το επεξεργαστείτε ξανά. +project = Έργα +settings.sourcehut_builds.access_token_helper = Διακριτικό πρόσβασης (token) που έχει άδεια JOBS:RW. Δημιουργήστε ένα διακριτκό πρόσβασης για το build.sr.ht ή ένα διακριτικό πρόσβασης build.sr.ht με πρόσβαση ιδιωτικών περιεχομένων στο meta.sr.ht. +settings.federation_not_enabled = Οι λειτουργίες διαλειτουργικότητας δεν είναι ενεργοποιημένες στον διακομιστή σας. +settings.federation_following_repos = URL ακουλουθούμενων αποθετηρίων. Διαχωρίζονται με «;», χωρίς κενά. +subscribe.issue.guest.tooltip = Συνδεθείτε για να λάβετε ενημερώσεις για το ζήτημα αυτό. +subscribe.pull.guest.tooltip = Συνδεθείτε για να λάβετε ενημερώσεις για το pull request αυτό. +pulls.edit.already_changed = Δεν ήταν δυνατή η αποθήκευση των αλλαγών στο pull request αυτό, επειδή το περιεχόμενο έχει ήδη αλλαχθεί από κάποιον άλλο χρήστη. Για να μην χαθούν οι αλλαγές του, παρακαλείσθε να ανανεώσετε την σελίδα και προσπαθήστε να το επεξεργαστείτε ξανά. +comments.edit.already_changed = Δεν ήταν δυνατή η αποθήκευση των αλλαγών σε αυτό το σχόλιο, επειδή το περιεχόμενο έχει ήδη αλλαχθεί από κάποιον άλλο χρήστη. Για να μην χαθούν οι αλλαγές του, παρακαλείσθε να ανανεώσετε την σελίδα και προσπαθήστε να το επεξεργαστείτε ξανά. +settings.matrix.access_token_helper = Για τον σκοπό αυτό, σας συνιστούμε να δημιουργήσετε έναν ξεχωριστό λογαριασμό Matrix. Μπορείτε να αποκτήσετε το διακριτικό πρόσβασης μέσα στο Element. +settings.transfer.modal.title = Παραχώρηση ιδιοκτησίας +settings.transfer.button = Παραχώρηση ιδιοκτησίας +settings.matrix.room_id_helper = Το ID δωματίου μπορείτε να το βρείτε στο πρόγραμμα Element > Room Settings > Advanced > Internal room ID. Παράδειγμα: %s. +wiki.search = Αναζήτηση wiki +wiki.no_search_results = Κανένα αποτέλεσμα +n_release_one = %s κυκλοφορία +n_release_few = %s κυκλοφορίες [graphs] component_loading_failed = Δεν ήταν δυνατή η φόρτωση του %s @@ -2791,7 +2837,7 @@ settings.labels_desc=Προσθήκη σημάτων που μπορούν να members.membership_visibility=Ορατότητα μέλους: members.public=Ορατό -members.public_helper=κάνε το κρυφό +members.public_helper=κάνε κρυφό members.private=Κρυφό members.private_helper=κάνε ορατό members.member_role=Ρόλος μέλους: @@ -2855,7 +2901,8 @@ teams.all_repositories_admin_permission_desc=Αυτή η ομάδα παρέχε teams.invite.title=Έχετε προσκληθεί να συμμετάσχετε στην ομάδα %s του οργανισμού %s. teams.invite.by=Προσκλήθηκε από %s teams.invite.description=Παρακαλώ κάντε κλικ στον παρακάτω σύνδεσμο για συμμετοχή στην ομάδα. -follow_blocked_user = Δεν μπορείτε να ακολουθήσετε αυτόν τον οργανισμό, επειδή ο οργανισμός σας έχει αποκλείσει. +follow_blocked_user = Δεν μπορείτε να ακολουθήσετε τον οργανισμό, επειδή σας έχει αποκλείσει. +open_dashboard = Δημιουργία πίνακα δραστηριότητας [admin] dashboard=Πίνακας Ελέγχου @@ -2999,7 +3046,7 @@ users.delete_account=Διαγραφή λογαριασμού χρήστη users.cannot_delete_self=Δεν μπορείτε να διαγράψετε τον εαυτό σας users.still_own_repo=Αυτός ο χρήστης εξακολουθεί να κατέχει ένα ή περισσότερα αποθετήρια. Διαγράψτε ή μεταφέρετε αυτά τα αποθετήρια πρώτα. users.still_has_org=Αυτός ο χρήστης είναι μέλος ενός οργανισμού. Αφαιρέστε πρώτα τον χρήστη από οποιονδήποτε οργανισμό. -users.purge=Εκκαθάριση Χρήστη +users.purge=Διαγραφή χρήστη users.purge_help=Εξαναγκαστική διαγραφή χρήστη καθώς και των αποθετηρίων, οργανισμών και πακέτων που του ανήκουν. Όλα τα σχόλια και τα ζητήματα του χρήστη θα διαγραφούν επίσης. users.still_own_packages=Αυτός ο χρήστης εξακολουθεί να κατέχει ένα ή περισσότερα πακέτα, διαγράψτε αυτά τα πακέτα πρώτα. users.deletion_success=Ο λογαριασμός χρήστη έχει διαγραφεί. @@ -3009,14 +3056,14 @@ users.list_status_filter.reset=Επαναφορά users.list_status_filter.is_active=Ενεργό users.list_status_filter.not_active=Ανενεργό users.list_status_filter.is_admin=Διαχειριστής -users.list_status_filter.not_admin=Μη Διαχειριστής +users.list_status_filter.not_admin=Χωρίς δικαιώματα διαχειριστή users.list_status_filter.is_restricted=Περιορισμένος -users.list_status_filter.not_restricted=Μη Περιορισμένος -users.list_status_filter.is_prohibit_login=Απαγόρευση Σύνδεσης -users.list_status_filter.not_prohibit_login=Επιτρέπεται η Σύνδεση -users.list_status_filter.is_2fa_enabled=2FA Ενεργοποιημένο -users.list_status_filter.not_2fa_enabled=2FA Απενεργοποιημένο -users.details=Λεπτομέρειες Χρήστη +users.list_status_filter.not_restricted=Χωρίς περιορισμούς +users.list_status_filter.is_prohibit_login=Απαγορευμένη σύνδεση +users.list_status_filter.not_prohibit_login=Επιτρέπεται η σύνδεση +users.list_status_filter.is_2fa_enabled=Με ενεργοποιημένο 2FA +users.list_status_filter.not_2fa_enabled=Χωρίς 2FA +users.details=Λεπτομέρειες χρήστη emails.email_manage_panel=Διαχείριση email χρηστών emails.primary=Κύριο @@ -3051,8 +3098,8 @@ repos.size=Μέγεθος repos.lfs_size=Μέγεθος LFS packages.package_manage_panel=Διαχείριση πακέτων -packages.total_size=Συνολικό Μέγεθος: %s -packages.unreferenced_size=Μέγεθος Χωρίς Αναφορά: %s +packages.total_size=Συνολικό μέγεθος: %s +packages.unreferenced_size=Μέγεθος χωρίς αναφορά: %s packages.cleanup=Εκκαθάριση ληγμένων δεδομένων packages.cleanup.success=Επιτυχής εκκαθάριση δεδομένων που έχουν λήξει packages.owner=Ιδιοκτήτης @@ -3122,7 +3169,7 @@ auths.allowed_domains_helper=Αφήστε κενό για να επιτρέψε auths.skip_tls_verify=Παράλειψη επαλήθευσης TLS auths.force_smtps=Αναγκαστικό SMTPS auths.force_smtps_helper=Το SMTPS χρησιμοποιείται συνήθως στη θύρα 465. Ορίστε αυτό το πεδίο για χρήση του SMTPS σε άλλες θύρες. (Αλλιώς το STARTTLS θα χρησιμοποιηθεί σε άλλες θύρες αν υποστηρίζεται από τον διακομιστή.) -auths.helo_hostname=Όνομα διακομιστή στο HELO +auths.helo_hostname=Όνομα διακομιστή HELO auths.helo_hostname_helper=Όνομα διακομιστή που αποστέλλεται με το HELO. Αφήστε κενό για να στείλετε το τρέχον όνομα του διακομιστή. auths.disable_helo=Απενεργοποίηση HELO auths.pam_service_name=Όνομα υπηρεσίας PAM @@ -3162,7 +3209,7 @@ auths.sspi_separator_replacement_helper=Ο χαρακτήρας που θα χρ auths.sspi_default_language=Προεπιλεγμένη γλώσσα χρήστη auths.sspi_default_language_helper=Προεπιλεγμένη γλώσσα για τους χρήστες που δημιουργούνται αυτόματα με τη μέθοδο ταυτοποίησης SSPI. Αφήστε κενό αν προτιμάτε η γλώσσα να εντοπιστεί αυτόματα. auths.tips=Συμβουλές -auths.tips.oauth2.general=Ταυτοποίηση OAuth2 +auths.tips.oauth2.general=Ταυτοποίηση μέσω OAuth2 auths.tips.oauth2.general.tip=Κατά την εγγραφή μιας νέας ταυτοποίησης OAuth2, το URL κλήσης/ανακατεύθυνσης πρέπει να είναι: auths.tip.oauth2_provider=Πάροχος OAuth2 auths.tip.bitbucket=Καταχωρήστε έναν νέο καταναλωτή OAuth στο https://bitbucket.org/account/user//oauth-consumers/new και προσθέστε το δικαίωμα 'Account' - 'Read' @@ -3218,7 +3265,7 @@ config.ssh_start_builtin_server=Χρήση ενσωματωμένου διακο config.ssh_domain=Domain διακομιστή SSH config.ssh_port=Θύρα config.ssh_listen_port=Θύρα ακρόασης (Listen port) -config.ssh_root_path=Ριζική Διαδρομή +config.ssh_root_path=Τοποθεσία root config.ssh_key_test_path=Διαδρομή δοκιμής κλειδιού config.ssh_keygen_path=Διαδρομή keygen («ssh-keygen») config.ssh_minimum_key_size_check=Έλεγχος ελάχιστου μεγέθους κλειδιού @@ -3242,7 +3289,7 @@ config.service_config=Ρυθμίσεις υπηρεσίας config.register_email_confirm=Να απαιτείται η επιβεβαίωση της διεύθυνσης email για την δημιουργία ενός λογαριασμού config.disable_register=Απενεργοποίηση αυτο-εγγραφής config.allow_only_internal_registration=Να επιτρέπονται εγγραφές μόνο μέσω του Forgejo -config.allow_only_external_registration=Να επιτρέπονται εγγραφές μόνο με την χρήση εξωτερικών υπηρεσιών +config.allow_only_external_registration=Να επιτρέπονται οι εγγραφές μόνο μέσω εξωτερικών υπηρεσιών config.enable_openid_signup=Ενεργοποίηση αυτο-εγγραφής OpenID config.enable_openid_signin=Ενεργοποίηση σύνδεσης μέσω OpenID config.show_registration_button=Εμφάνιση κουμπιού εγγραφής @@ -3397,6 +3444,12 @@ config.open_with_editor_app_help = Οι επεξεργαστές κειμένο auths.tip.gitlab_new = Μπορείτε να δημιουργήσετε μία νέα εφαρμογή στο https://gitlab.com/-/profile/applications self_check.database_collation_mismatch = Η βάση δεδομένων αναμένεται να χρησιμοποιεί το collation: %s self_check.database_collation_case_insensitive = Η βάση δεδομένων χρησιμοποιεί το collation %s, το οποίο δεν ξεχωρίζει κεφαλαία και πεζά γράμματα. Αν και το Forgejo μπορεί να δουλέψει με αυτό, ίσως να προκύψουν κάποιες σπάνιες περιπτώσεις όπου κάτι δεν θα δουλέψει όπως αναμένεται. +config.cache_test_failed = Η δοκιμή cache απέτυχε: %v. +config.cache_test_succeeded = Η δοκιμή cache πέτυχε, λάβαμε απάντηση σε %s. +config.cache_test = Δοκιμή cache +config.cache_test_slow = Η δοκιμή cache πέτυχε, αλλά καθυστέρησε: %s. +config.app_slogan = Slogan διακομιστή +auths.default_domain_name = Προεπιλεγμένο domain name που χρησιμοποιείται για την διεύθυνση email [action] @@ -3749,6 +3802,7 @@ runs.no_workflows.documentation = Για περισσότερες πληροφο runs.no_workflows.quick_start = Δεν ξέρετε από που να πρωτοξεκινήσετε με το Forgejo Actions; Για μια γρήγορη αρχή, συμβουλευτείτε τον οδηγό μας. runs.workflow = Ροή εργασίας runs.no_job_without_needs = Η ροή εργασίας πρέπει να περιέχει τουλάχιστον ένα έργο που δεν εξαρτάται από κάποιο άλλο έργο. +runs.no_job = Η ροή εργασιών πρέπει να περιέχει τουλάχιστον μία εργασία (job) [projects] type-1.display_name=Ατομικό έργο @@ -3787,6 +3841,10 @@ user_kind = Αναζήτηση χρηστών... org_kind = Αναζήτηση οργανισμών... team_kind = Αναζήτηση ομαδών... code_kind = Αναζήτηση κώδικα... +exact_tooltip = Να συμπεριληφθούν μόνο αποτελέσματα που ταιριάζουν με τον όρο αναζήτησης +issue_kind = Αναζήτηση ζητημάτων... +pull_kind = Αναζήτηση pull... +exact = Ακριβής [munits.data] mib = MiB diff --git a/options/locale/locale_eo.ini b/options/locale/locale_eo.ini index 275fc069f5..f8d3f7f2d0 100644 --- a/options/locale/locale_eo.ini +++ b/options/locale/locale_eo.ini @@ -135,6 +135,10 @@ toggle_menu = Baskuli menuon access_token = Alira ĵetono remove_all = Forigi ĉion remove_label_str = Forigi «%s» +test = Provo +invalid_data = Nevalidaj datumoj: %v +more_items = Pli da eroj +copy_generic = Kopii al tondujo [editor] buttons.list.ordered.tooltip = Aldoni nombran liston diff --git a/options/locale/locale_fil.ini b/options/locale/locale_fil.ini index b9e6dd8f34..0f29bcf7f8 100644 --- a/options/locale/locale_fil.ini +++ b/options/locale/locale_fil.ini @@ -141,6 +141,7 @@ dashboard = Dashboard more_items = Higit pang mga item invalid_data = Hindi wastong datos: %v copy_generic = Kopyahin sa clipboard +test = Subukan [home] search_repos = Maghanap ng Repository… @@ -640,6 +641,10 @@ following.title.few = Sinusundan 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.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. [settings] profile = Profile @@ -1080,7 +1085,7 @@ delete_preexisting = Burahin ang mga dating umiiral na file delete_preexisting_content = Burahin ang mga file sa %s 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 pagtulak +migrate_items_pullrequests = Mga hiling sa paghila archive.pull.nocomment = Naka-archive ang repo na ito. Hindi ka makakakomento sa mga pull request. archive.title = Naka-archive ang repo na ito. Maari mong itignan ang mga file at i-clone ito, pero hindi makaka-push o magbukas ng mga isyu o mga pull request. archive.title_date = Naka-archive ang repositoryo na ito noong %s. Maari mong itignan ang mga file at i-clone ito, pero hindi makaka-push o magbukas ng mga isyu o mga pull request. @@ -1287,7 +1292,7 @@ issues.cancel = Kanselahin issues.save = IImbak issues.label_title = Pangalan issues.delete.title = Burahin ang isyung ito? -settings.pulls_desc = Paganahin ang mga hiling sa paghatak para sa repositoryo +settings.pulls_desc = Paganahin ang mga hiling sa paghila para sa repositoryo editor.branch_does_not_exist = Walang natagpuang [branch] na "%s" sa [repository] na ito. commits.nothing_to_compare = Magkapareho ang mga branch na ito. commits.search_all = Lahat na mga branch @@ -1331,7 +1336,7 @@ issues.filter_type.assigned_to_you = Itinalaga sa iyo issues.filter_type.all_issues = Lahat ng mga isyu issues.author_helper = May-akda ang tagagamit na ito. issues.role.owner = May-ari -activity.title.prs_n = %d mga kahilingan sa paghatak +activity.title.prs_n = %d mga kahilingan sa paghila issues.label_color = Kulay pulls.nothing_to_compare = Magkapareho ang mga branch na ito. Hindi na kailangang gumawa ng hiling sa paghila. projects.column.assigned_to = Itinalaga sa/kay @@ -1395,7 +1400,7 @@ pulls.reopen_failed.base_branch = Hindi mabuksang muli ang hiling sa paghatak na issues.reopened_at = `binuksang muli ang isyung ito %[2]s` pulls.reopen_failed.head_branch = Hindi mabuksang muli ang [pull request] na ito dahil nabura ang punong [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 paghatak +activity.opened_prs_count_n = Mga inimungkahing hiling sa paghila editor.filename_is_invalid = Hindi wasto ang pangalan ng file: "%s". activity.title.prs_opened_by = %s inimungkahi ni/ng %s pulls.cant_reopen_deleted_branch = Hindi mabuksang muli ang hiling sa paghatak na ito dahil nabura ang branch. @@ -1803,7 +1808,7 @@ issues.edit.already_changed = Hindi maimbak ang mga pagbabago sa isyu. Mukhang n signing.wont_sign.not_signed_in = Hindi ka naka-sign in. activity.new_issues_count_n = Bagong mga isyu activity.git_stats_files_changed_n = mga nabago -activity.git_stats_files_changed_1 = nabago +activity.git_stats_files_changed_1 = ang nabago issues.dependency.remove = Tanggalin pulls.edit.already_changed = Hindi maimbak ang mga pagbabago sa [pull request]. 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.filter_sort.most_complete = Pinakakumpleto @@ -1826,9 +1831,9 @@ activity.git_stats_deletion_n = %d mga pagbura activity.navbar.code_frequency = Dalas ng [code] pulls.switch_head_and_base = Ilipat ang ulo at base activity.git_stats_push_to_all_branches = sa lahat ng mga [branch]. -activity.git_stats_pushed_n = mga itinulak +activity.git_stats_pushed_n = itinulak ang issues.reference_link = Pagsangguni: %s -activity.git_stats_pushed_1 = itinulak +activity.git_stats_pushed_1 = ang itinulak activity.git_stats_commit_n = %d mga [commit] issues.dependency.add = Magdagdag ng dependency… issues.dependency.cancel = Kanselahin @@ -1860,6 +1865,15 @@ pulls.showing_specified_commit_range = Ipinapakita lamang ang mga pagbabago sa p wiki.pages = Mga pahina activity.unresolved_conv_label = Nakabukas settings.pull_mirror_sync_in_progress = Inihatak ang mga pagbabago mula sa [malayuang] %s sa ngayon. +issues.dependency.setting = Paganahin ang mga [dependency] para sa mga isyu at mga hiling sa paghila +activity.navbar.pulse = Pulso +settings.protect_enable_merge_desc = Pinapayagan ang sinumang may [access] sa pagsulat upang isama ang mga hiling sa paghila sa [branch] na ito. +activity.git_stats_commit_1 = %d commit +activity.git_stats_file_n = %d mga file +activity.git_stats_file_1 = %d file +pulls.desc = Paganahin ang mga hiling sa paghila at mga pagsuri sa [code]. +activity.git_stats_exclude_merges = Maliban sa mga pagsali, +activity.active_prs_count_n = %d aktibong mga hiling sa paghila [search] commit_kind = Maghanap ng mga commit... @@ -2151,7 +2165,7 @@ config.ssh_listen_port = Listen port config.ssh_keygen_path = Path ng keygen ("ssh-keygen") config.ssh_key_test_path = Path ng key test auths.verify_group_membership = Patunayan ang membership ng grupo sa LDAP (iwanang walang laman ang filter para i-skip) -config.allow_only_external_registration = Payagan lamang ang pagrehistro sa pamamagitan ng mga panlabas na Serbisyo +config.allow_only_external_registration = Payagan lamang ang pagrehistro sa pamamagitan ng mga panlabas na serbisyo config.allow_only_internal_registration = Payagan lamang ang pagrehistro sa pamamagitan ng Forgejo auths.search_page_size = Laki ng pahina auths.filter = Filter ng user diff --git a/options/locale/locale_gl.ini b/options/locale/locale_gl.ini index 673486f6c0..a3fbc2988d 100644 --- a/options/locale/locale_gl.ini +++ b/options/locale/locale_gl.ini @@ -221,4 +221,6 @@ log_root_path = Ruta de rexistro log_root_path_helper = Os ficheiros de rexistro escribiranse neste directorio. sqlite_helper = Ruta do ficheiro para a base de datos SQLite3.
Introduza unha ruta absoluta se executa Forgejo como servizo. reinstall_confirm_message = A reinstalación cunha base de datos Forgejo existente pode causar varios problemas. Na maioría dos casos, deberías usar o teu "app.ini" existente para executar Forgejo. Se sabes o que estás facendo, confirma o seguinte: -reinstall_confirm_check_1 = É posible que se perdan os datos cifrados pola SECRET_KEY en app.ini: é posible que os usuarios non poidan iniciar sesión con 2FA/OTP e que os espellos non funcionen correctamente. Ao marcar esta caixa, confirmas que o ficheiro app.ini actual contén a SECRET_KEY correcta. \ No newline at end of file +reinstall_confirm_check_1 = É posible que se perdan os datos cifrados pola SECRET_KEY en app.ini: é posible que os usuarios non poidan iniciar sesión con 2FA/OTP e que os espellos non funcionen correctamente. Ao marcar esta caixa, confirmas que o ficheiro app.ini actual contén a SECRET_KEY correcta. +disable_gravatar.description = Desactiva o uso de Gravatar ou outras fontes de avatares de terceiros. As imaxes predeterminadas utilizaranse para os avatares dos usuarios a menos que carguen o seu propio avatar na instancia. +federated_avatar_lookup = Activar avatares federados \ No newline at end of file diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index fe93ea51da..3f3d7e8ffc 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -16,9 +16,9 @@ page=Pagina template=Template language=Lingua notifications=Notifiche -active_stopwatch=Tracker Tempo Attivo +active_stopwatch=Attiva cronometro create_new=Crea… -user_profile_and_more=Profilo ed Impostazioni… +user_profile_and_more=Profilo ed impostazioni… signed_in_as=Accesso effettuato come toc=Indice dei contenuti licenses=Licenze @@ -82,7 +82,7 @@ save=Salva add=Aggiungi add_all=Aggiungi tutti remove=Rimuovi -remove_all=Rimuovi Tutti +remove_all=Rimuovi tutti edit=Modifica enabled=Attivo @@ -142,13 +142,13 @@ download_logs = Scarica logs confirm_delete_selected = Confermare l'eliminazione di tutti gli elementi selezionati? sign_in_with_provider = Accedi con %s new_project_column = Nuova colonna -toggle_menu = Mostra/Nascondi Menu +toggle_menu = Mostra/Nascondi menu filter.not_fork = Non da fork filter = Filtro filter.clear = Rimuovi filtri filter.is_archived = Archiviato filter.not_archived = Non archiviato -filter.is_fork = Da Fork +filter.is_fork = Da fork filter.is_mirror = Mirror filter.not_mirror = Non mirror filter.is_template = Modello @@ -157,12 +157,14 @@ filter.public = Pubblico filter.private = Privato more_items = Più elementi invalid_data = Dati non validi: %v +copy_generic = Copia negli appunti +test = Prova [aria] footer.links = Collegamenti -navbar = Barra di Navigazione +navbar = Barra di navigazione footer = Piè di Pagina -footer.software = A proposito del Software +footer.software = A proposito di questo software [heatmap] more = Più @@ -184,7 +186,7 @@ buttons.list.unordered.tooltip = Aggiungi un elenco puntato buttons.list.ordered.tooltip = Aggiungi un elenco numerato buttons.list.task.tooltip = Aggiungi un elenco di attività buttons.mention.tooltip = Menziona un utente o team -buttons.ref.tooltip = Fai riferimento ad un problema o pull request +buttons.ref.tooltip = Fa riferimento a una segnalazione o pull request buttons.switch_to_legacy.tooltip = Passa all'editor classico buttons.enable_monospace_font = Attiva font monospace buttons.disable_monospace_font = Disattiva font monospace @@ -199,7 +201,7 @@ missing_csrf=Richiesta errata: nessun token CSRF presente invalid_csrf=Richiesta errata: token CSRF non valido not_found=Il bersaglio non è stato trovato. network_error=Errore di rete -report_message = Se credi che questo sia un errore di Forgejo, per favore controlla le segnalazioni su Codeberg o aprine una nuova se necessario. +report_message = Se si pensa che questo sia un errore di Forgejo, controllare le segnalazioni su Codeberg o aprine una nuova se necessario. server_internal = Errore interno del server [startpage] @@ -280,13 +282,13 @@ federated_avatar_lookup=Attiva le immagini profilo federate federated_avatar_lookup.description=Enable federated avatars lookup to use federated open source service based on libravatar. disable_registration=Disattiva auto-registrazione disable_registration.description=Disattiva la user self-registration. Solo gli amministratori saranno in grado di creare account. -allow_only_external_registration.description=Attiva la registrazione solo tramite servizi esterni +allow_only_external_registration.description=Gli utenti potranno creare nuovi account usando i servizi esterni configurati. openid_signin=Attiva l'accesso con OpenID -openid_signin.description=Attiva registrazione utente via OpenID. +openid_signin.description=Permetti agli utenti di registrarsi via OpenID. openid_signup=Attiva auto-registrazione con OpenID openid_signup.description=Attiva OpenID-based user self-registration. enable_captcha=Abilita CAPTCHA per registrazione -enable_captcha.description=Richiedi convalida captcha per i nuovi utenti. +enable_captcha.description=Richiedi convalida CAPTCHA per i nuovi utenti. require_sign_in_view=Richiedi l'accesso per visualizzare il contenuto dell'istanza admin_setting.description=Creare un account amministratore è opzionale. Il primo utente registrato sarà automaticamente un amministratore. admin_title=Impostazioni profilo amministratore @@ -307,11 +309,11 @@ save_config_failed=Salvataggio della configurazione non riuscito: %v invalid_admin_setting=Le impostazioni dell'account amministratore sono invalide: %v invalid_log_root_path=Il percorso del log non è valido: %v default_keep_email_private=Nascondi Indirizzo e-mail come impostazione predefinita -default_keep_email_private.description=Nasconi l'indirizzo email dei nuovi account utente di default. +default_keep_email_private.description=Nascondi l'indirizzo email dei nuovi utenti di default cosicché questa informazione non venga subito rivelata dopo la registrazione. default_allow_create_organization=Consenti la creazione di organizzazioni come impostazione predefinita default_allow_create_organization.description=Consenti ai nuovi account utente di creare organizzazioni di default. default_enable_timetracking=Attiva il cronografo come impostazione predefinita -default_enable_timetracking.description=Attiva il cronografo per le nuove repositories di default. +default_enable_timetracking.description=Attiva di default il cronografo per i nuovi repository. no_reply_address=Dominio e-mail nascosto no_reply_address_helper=Nome di dominio per utenti con un indirizzo email nascosto. Ad esempio, il nome utente "joe" accederà a Git come "joe@noreply.example.org" se il dominio email nascosto è impostato a "noreply.example.org". password_algorithm=Algoritmo per hash delle password @@ -327,19 +329,22 @@ password_algorithm_helper = Imposta l'algoritmo di hashing della password. Gli a require_sign_in_view.description = Limita l'accesso ad utenti autenticati. I visitatori vedranno solo le pagine di accesso e registrazione. allow_dots_in_usernames = Consenti l'uso del punto nel nome utente. Non impatta i profili già esistenti. config_location_hint = Queste opzioni di configurazione saranno salvate in: +allow_only_external_registration = Permetti la registrazione solo tramite servizi esterni +app_slogan = Slogan istanza +app_slogan_helper = Inserire qui lo slogan dell'istanza. Lasciare vuoto per disabilitare. [home] uname_holder=Nome utente o indirizzo e-mail password_holder=Password -switch_dashboard_context=Cambia Dashboard Context +switch_dashboard_context=Cambia dashboard context my_repos=Repositories show_more_repos=Mostra altre repositories… -collaborative_repos=Repository Condivisi +collaborative_repos=Repository condivisi my_orgs=Organizzazioni my_mirrors=I miei Mirror view_home=Vedi %s search_repos=Trova un repository… -filter=Altro filtri +filter=Altri filtri filter_by_team_repositories=Filtra per repository del team feed_of=`Feed di "%s"` @@ -389,21 +394,21 @@ disable_register_prompt=La registrazione è disabilitata. Si prega di contattare disable_register_mail=Email di conferma per la registrazione disabilitata. manual_activation_only=Contatta l'amministratore del sito per completare l'attivazione. remember_me=Ricorda questo dispositivo -forgot_password_title=Password Dimenticata +forgot_password_title=Password dimenticata forgot_password=Password dimenticata? sign_up_now=Hai bisogno di un account? Registrati adesso. confirmation_mail_sent_prompt=Una nuova email di conferma è stata inviata a %s. Per favore controlla la tua posta in arrivo nelle prossime %s per completare il processo di registrazione. must_change_password=Aggiorna la tua password allow_password_change=Richiede all'utente di cambiare la password (scelta consigliata) reset_password_mail_sent_prompt=Una email di conferma è stata inviata a %s. Per favore controlla la tua posta in arrivo nelle prossime %s per completare il processo di reset della password. -active_your_account=Attiva il tuo Account +active_your_account=Attiva il tuo account account_activated=L'account è stato attivato prohibit_login=L'accesso è proibito resent_limit_prompt=Hai già richiesto un'e-mail d'attivazione recentemente. Si prega di attenere 3 minuti e poi riprovare. has_unconfirmed_mail=Ciao %s, hai un indirizzo di posta elettronica non confermato (%s). Se non hai ricevuto una e-mail di conferma o vuoi riceverla nuovamente, fare clic sul pulsante qui sotto. resend_mail=Clicca qui per inviare nuovamente l'e-mail di attivazione email_not_associate=L'indirizzo email non è associato ad alcuna conta. -send_reset_mail=Inviare email di recupero account +send_reset_mail=Invia email di recupero reset_password=Recupero account invalid_code=Il tuo codice di conferma è invalido oppure è scaduto. reset_password_helper=Recuperare account @@ -417,12 +422,12 @@ twofa_passcode_incorrect=Il tuo passcode non è corretto. Se hai smarrito il tuo twofa_scratch_token_incorrect=I tuo codice scratch non è corretto. login_userpass=Accedi tab_openid=OpenID -oauth_signup_tab=Creare nuovo account -oauth_signup_title=Completa Nuovo Account -oauth_signup_submit=Completa l'Account -oauth_signin_tab=Collegamento ad un Account Esistente -oauth_signin_title=Accedi per autorizzare l' Account collegato -oauth_signin_submit=Collega Account +oauth_signup_tab=Crea nuovo account +oauth_signup_title=Completa il nuovo account +oauth_signup_submit=Completa l'account +oauth_signin_tab=Collega ad un account esistente +oauth_signin_title=Accedi per autorizzare l'account collegato +oauth_signin_submit=Collega account oauth.signin.error=Si è verificato un errore nell'elaborazione della richiesta di autorizzazione. Se questo errore persiste, si prega di contattare l'amministratore del sito. oauth.signin.error.access_denied=La richiesta di autorizzazione è stata negata. oauth.signin.error.temporarily_unavailable=Autorizzazione non riuscita perché il server di autenticazione non è temporaneamente disponibile. Riprova più tardi. @@ -672,6 +677,14 @@ form.name_pattern_not_allowed = La sequenza "%s" non è consentita in un nome ut follow_blocked_user = Non puoi seguire questo utente perchè hai bloccato questo utente o perchè questo utente ha bloccato te. followers_one = %d seguace following_one = %d seguito +public_activity.visibility_hint.self_public = L'attività è visibile a tutti, tranne che per le interazioni negli spazi privati. Configura. +public_activity.visibility_hint.admin_public = Questa attività è visibile a tutti, ma come amministratore, si possono vedere anche le interazioni negli spazi privati. +public_activity.visibility_hint.self_private = L'attività è visibile solo a te e agli amministratori dell'istanza. Configura. +public_activity.visibility_hint.admin_private = Questa attività è visibile a te perché sei un amministratore, ma l'utente desidera che rimanga privata. +followers.title.one = Seguace +followers.title.few = Seguaci +following.title.one = Seguito +following.title.few = Osservato [settings] @@ -999,6 +1012,7 @@ hints = Suggerimenti pronouns = Pronomi pronouns_custom = Personalizzato pronouns_unspecified = Non specificato +language.title = Lingua predefinita [repo] owner=Proprietario @@ -1358,13 +1372,13 @@ issues.new.no_items=Nessun elemento issues.new.milestone=Traguardo issues.new.no_milestone=Nessuna pietra miliare issues.new.clear_milestone=Milestone pulita -issues.new.open_milestone=Apri pietra miliare -issues.new.closed_milestone=Pietre miliari chiuse +issues.new.open_milestone=Apri traguardi +issues.new.closed_milestone=Traguardi chiusi issues.new.assignees=Assegnatari issues.new.clear_assignees=Cancella assegnatari issues.new.no_assignees=Nessun assegnatario issues.new.no_reviewers=Nessun revisore -issues.choose.get_started=Inizia +issues.choose.get_started=Cominciare issues.choose.open_external_link=Apri issues.choose.blank=Default issues.choose.blank_about=Crea un problema dal modello predefinito. @@ -2733,6 +2747,14 @@ settings.matrix.room_id_helper = L'ID della Stanza può essere ricavato dal web settings.graphql_url = URL GraphQL settings.sourcehut_builds.access_token_helper = Token di accesso con grant JOBS:RW. Genera un token builds.sr.ht o un token builds.sr.ht con accesso ai segreti su meta.sr.ht. settings.matrix.access_token_helper = È consigliata l'impostazione di un account Matrix dedicato per questa funzione. Il token di accesso può essere prelevato dal web client Element (in una pagina privata/incognito) > Menu utente (in alto a sinistra) > Tutte le impostazioni > Aiuto e informazioni > Avanzato > Token di accesso (sotto all'URL del Homeserver). Chiudi la pagina privata/incognito (La disconnessione invaliderebbe il token). +issues.author.tooltip.issue = Questo utente è l'autore di questa segnalazione. +form.string_too_long = La stringa data è più lunga di %d caratteri. +project = Progetti +issues.edit.already_changed = Impossibile salvare le modifiche al problema. Sembra che il contenuto sia già stato modificato da un altro utente. Aggiornare la pagina e provare a modificare nuovamente per evitare di sovrascrivere le modifiche +subscribe.pull.guest.tooltip = Accedere per sottoscrivere questa richiesta di pull. +subscribe.issue.guest.tooltip = Accedere per sottoscrivere questo problema. +n_release_one = rilascio %s +n_release_few = rilasci %s [graphs] contributors.what = contribuzioni @@ -3310,7 +3332,7 @@ monitor.start=Orario Avvio monitor.execute_time=Tempo di Esecuzione monitor.last_execution_result=Risultato monitor.process.cancel=Annulla processo -monitor.process.cancel_desc=L'annullamento di un processo potrebbe causare la perdita di dati +monitor.process.cancel_desc=Annullare un processo potrebbe causare una perdita di dati monitor.process.cancel_notices=Annulla: %s? monitor.process.children=Figli @@ -3434,7 +3456,7 @@ mirror_sync_create=ha sincronizzato un nuovo riferimento %[3]s%[2]s a %[3]s dal mirror approve_pull_request=`ha approvato %[3]s#%[2]s` reject_pull_request=`ha suggerito modifiche per %[3]s#%[2]s` -publish_release=`ha rilasciato "%[4]s" su %[3]s` +publish_release=`ha rilasciato %[4]s su %[3]s` review_dismissed=`respinta la recensione da %[4]s per %[3]s#%[2]s` review_dismissed_reason=Motivo: create_branch=ha creato il ramo %[3]s in %[4]s @@ -3798,6 +3820,9 @@ match_tooltip = Includi solo risultati che corrispondono precisamente al termine fuzzy_tooltip = Includi anche risultati che corrispondono approssimativamente al termine di ricerca user_kind = Cerca utenti... repo_kind = Cerca repository... +exact_tooltip = Includi solo i risultati che corrispondono esattamente al termine di ricerca +issue_kind = Cerca segnalazioni... +pull_kind = Ricerca pull... [munits.data] gib = GiB diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index ac0e855e06..a91a481112 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -2668,7 +2668,7 @@ issues.blocked_by_user = あなたはこのリポジトリの所有者からブ pulls.nothing_to_compare_have_tag = 選択されたブランチまたはタグは同一です。 pulls.blocked_by_user = あなたはこのリポジトリの所有者からブロックされているため、プルリクエストを作成できません。 rss.must_be_on_branch = RSSフィードを見るためには、ブランチを閲覧する必要があります。 -migrate.forgejo.description = codeberge.orgまたは他のインスタンスからデータを移行する。 +migrate.forgejo.description = codeberg.orgまたは他のインスタンスからデータを移行する。 commits.browse_further = もっと見る issues.comment.blocked_by_user = あなたはこのリポジトリの所有者か、Issueの投稿者からブロックされているため、このIssueにコメントできません。 pulls.reopen_failed.head_branch = ブランチがもう存在しないため、このプルリクエストはreopenできません。 diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini index 7c8cd2e960..074efa6a11 100644 --- a/options/locale/locale_ko-KR.ini +++ b/options/locale/locale_ko-KR.ini @@ -43,7 +43,7 @@ admin_panel=사이트 관리 account_settings=계정 설정 settings=설정 your_profile=프로필 -your_starred=즐겨찾기 +your_starred=좋아한 저장소 your_settings=설정 all=전체 @@ -158,6 +158,7 @@ filter.private = 비공개 filter.not_template = 템플릿이 아님 view = 보기 never = 안함 +test = 테스트 [aria] navbar = 내비게이션 바 @@ -180,10 +181,15 @@ buttons.heading.tooltip = 헤딩 추가 buttons.bold.tooltip = 두꺼운 텍스트 추가 buttons.code.tooltip = 코드 추가 buttons.link.tooltip = 링크 추가 +buttons.quote.tooltip = 인용구 추가 [filter] +string.desc = 하 - 가 +string.asc = 가 - 하 [error] +network_error = 네트워크 오류 +server_internal = 내부 서버 오류 [startpage] app_desc=편리한 설치형 Git 서비스 @@ -215,7 +221,7 @@ err_admin_name_is_invalid=관리자 사용자 이름이 올바르지 않습니 general_title=기본설정 app_name=인스턴스 제목 -app_name_helper=회사이름을 넣으세요. +app_name_helper=인스턴스 이름을 입력하세요. 입력한 내용은 모든 페이지에 표시됩니다. repo_path=저장소 최상위 경로 repo_path_helper=Git 원격 저장소는 이 디렉터리에 저장 됩니다. lfs_path=Git LFS 루트 경로 @@ -242,16 +248,16 @@ register_confirm=가입시 이메일 확인 필수 mail_notify=이메일 알림 켜기 server_service_title=서버 및 기타 서비스 설정 offline_mode=로컬 모드 켜기 -offline_mode.description=타사 콘텐츠 전송 네트워크를 사용하지 않도록 설정하고 모든 리소스를 로컬로 제공하십시오. +offline_mode.description=타사 콘텐츠 전송 네트워크를 사용하지 않도록 설정하고 모든 리소스를 로컬에서 제공합니다. disable_gravatar=Gravatar 사용안함 disable_gravatar.description=Gravatar 및 타사 아바타 소스를 사용하지 않도록 설정합니다. 사용자가 로컬로 아바타를 업로드하지 않는 한 기본 아바타가 사용됩니다. federated_avatar_lookup=탈중앙화 아바타 사용 federated_avatar_lookup.description=libravatar 기반 오픈소스 연합 아바타 조회를 허용합니다. disable_registration=사용자 등록 비활성화 -disable_registration.description=사용자가 직접 등록할 수 없게 합니다. 관리자만이 추가할 수 있습니다. -allow_only_external_registration.description=외부 서비스를 통한 등록을 허용 +disable_registration.description=인스턴스 관리자만이 새 사용자 계정을 추가할 수 있게 됩니다. 공개 인스턴스를 제공할 예정이고 많은 양의 스팸 계정을 감당할 준비가 되어 있지 않다면 사용자 등록을 비활성화 할 것을 강력히 권고합니다. +allow_only_external_registration.description=새 계정을 등록하려는 사용자는 설정된 외부 서비스를 이용해야만 새 계정을 등록할 수 있습니다. openid_signin=OpenID 로그인 사용 -openid_signin.description=OpenID 를 이용한 로그인을 허용합니다. +openid_signin.description=OpenID를 이용한 로그인을 허용합니다. openid_signup=OpenID 가입 허용 openid_signup.description=OpenID를 통한 가입을 허용합니다. enable_captcha.description=사용자 등록시 캡차를 요구합니다. @@ -279,6 +285,12 @@ default_enable_timetracking=시간 추적 사용을 기본값으로 설정 default_enable_timetracking.description=신규 레포지토리에 대한 시간 추적 사용을 기본값으로 설정합니다. no_reply_address=가려진 이메일 도메인 no_reply_address_helper=가려진 이메일을 가진 사용자에게 적용될 이메일 도메인입니다. 예를 들어, 사용자 'joe'의 가려잔 이메일 도메인이 'noreply.example.org'로 설정되어 있으면 'joe@noreply.example.org'로 처리 됩니다. +db_schema_helper = 데이터베이스 기본값 ("공개")를 사용하려면 빈 칸으로 두세요. +require_db_desc = Forgejo를 사용하려면 MySQL, PostgreSQL, SQLite3 또는 TiDB (MySQL 프로토콜) 이 설치되어 있어야 합니다. +domain = 서버 도메인 +smtp_from_invalid = "이메일 발신인" 주소가 유효하지 않습니다 +enable_captcha = 등록 시 CAPTCHA 활성화 +allow_only_external_registration = 외부 서비스를 통한 등록만 허용 [home] uname_holder=사용자 이름 또는 이메일 주소 @@ -307,6 +319,8 @@ repo_no_results=일치하는 레포지토리가 없습니다. user_no_results=일치하는 사용자가 없습니다. org_no_results=일치하는 조직이 없습니다. code_no_results=검색어와 일치하는 소스코드가 없습니다. +stars_one = %d 좋아요 +stars_few = %d 좋아요 [auth] create_new_account=계정 등록 @@ -452,7 +466,7 @@ change_avatar=아바타 변경… repositories=저장소 activity=공개 활동 followers_few=%d 팔로워 -starred=관심있는 저장소 +starred=좋아하는 저장소 overview=개요 following_few=%d 팔로우 중 follow=추적하기 @@ -1321,6 +1335,9 @@ issues.dependency.no_permission_1 = %d개의 전제조건을 읽을 권한이 issues.dependency.no_permission.can_remove = 이 전제조건을 읽을 권한이 없지만 지울 수 있음 issues.dependency.removed_dependency = `님이 %s 전제조건 삭제` issues.dependency.pr_close_blocked = 병합하기 전에 이 풀 리퀘스트을 제한하는 모든 이슈를 종료해야 합니다. +stars = 좋아요 +stars_remove_warning = 이 작업은 이 저장소에 대한 모든 좋아요를 제거할것입니다. +star_guest_user = 로그인하여 이 저장소에 좋아요 하세요. @@ -1695,6 +1712,7 @@ rename_repo=저장소 이름을 %[1]s에서에서 transfer_repo=저장소가 %s에서 %s로 이동됨 compare_commits=%d 커밋들 비교 watched_repo = %[2]s에대한 주시를 시작함 +starred_repo = %[2]s를 좋아함 [tool] now=현재 diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index f2bc34d711..a295a8cde1 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -157,6 +157,7 @@ filter.is_archived = Zarchiwizowane filter.is_mirror = Kopie lustrzane more_items = Więcej elementów filter.is_fork = Forki +test = Test [aria] navbar = Pasek nawigacji @@ -523,6 +524,7 @@ yes=Tak no=Nie cancel=Anuluj modify=Aktualizuj +confirm = Potwierdź [form] UserName=Nazwa użytkownika @@ -613,6 +615,7 @@ follow=Obserwuj unfollow=Przestań obserwować user_bio=Biografia disabled_public_activity=Ten użytkownik wyłączył publiczne wyświetlanie jego aktywności. +code = Kod [settings] @@ -845,6 +848,17 @@ visibility=Widoczność użytkownika visibility.public=Publiczny visibility.limited=Ograniczony visibility.private=Prywatny +uid = UID +comment_type_group_label = Etykieta +comment_type_group_milestone = Kamień milowy +comment_type_group_assignee = Przypisanie +comment_type_group_branch = Gałąź +comment_type_group_deadline = Termin +comment_type_group_project = Projekt +comment_type_group_reference = Odniesienie +webauthn_nickname = Pseudonim +comment_type_group_dependency = Zależność +permissions_list = Uprawnienia: [repo] owner=Właściciel @@ -2025,6 +2039,39 @@ topic.count_prompt=Nie możesz wybrać więcej, niż 25 tematów error.csv.too_large=Nie można wyświetlić tego pliku, ponieważ jest on zbyt duży. error.csv.unexpected=Nie można renderować tego pliku, ponieważ zawiera nieoczekiwany znak w wierszu %d i kolumnie %d. error.csv.invalid_field_count=Nie można renderować tego pliku, ponieważ ma nieprawidłową liczbę pól w wierszu %d. +settings.admin_indexer_unindexed = Nieindeksowane +settings.web_hook_name_forgejo = Forgejo +issues.filter_poster = Autor +issues.content_history.options = Opcje +issues.content_history.deleted = usunięto +issues.content_history.created = utworzono +editor.patching = Łatanie: +settings.web_hook_name_gogs = Gogs +desc.sha256 = SHA256 +commitstatus.failure = Awaria +settings.protect_status_check_matched = Dopasowano +settings.web_hook_name_slack = Slack +settings.web_hook_name_dingtalk = DingTalk +commitstatus.success = Sukces +wiki.cancel = Anuluj +settings.web_hook_name_packagist = Packagist +settings.web_hook_name_telegram = Telegram +settings.event_package = Pakiet +settings.web_hook_name_discord = Discord +settings.web_hook_name_matrix = Matrix +settings.protect_patterns = Szablony +default_branch_label = domyślnie +issues.author = Autor +commit.operations = Operacje +commit.revert = Odwróć +pull.deleted_branch = (usunięto):%s +diff.vendored = dostarczono +from_comment = (komentarz) +issues.filter_project = Projekt +mirror_sync = zsynchronizowano +settings.web_hook_name_gitea = Gitea +packages = Pakiety +actions = Akcje [graphs] @@ -2133,6 +2180,8 @@ teams.all_repositories_helper=Zespół ma dostęp do wszystkich repozytoriów. W teams.all_repositories_read_permission_desc=Ten zespół nadaje uprawnienie Odczytu do wszystkich repozytoriów: jego członkowie mogą wyświetlać i klonować repozytoria. teams.all_repositories_write_permission_desc=Ten zespół nadaje uprawnienie Zapisu do wszystkich repozytoriów: jego członkowie mogą odczytywać i przesyłać do repozytoriów. teams.all_repositories_admin_permission_desc=Ten zespół nadaje uprawnienia Administratora do wszystkich repozytoriów: jego członkowie mogą odczytywać, przesyłać oraz dodawać innych współtwórców do repozytoriów. +teams.write_access = Zapis +code = Kod [admin] dashboard=Pulpit @@ -2553,6 +2602,20 @@ notices.type_2=Zadanie notices.desc=Opis notices.op=Operacja notices.delete_success=Powiadomienia systemu zostały usunięte. +monitor.last_execution_result = Wynik +monitor.process.children = Dzieci +integrations = Integracje +users.bot = Bot +users.list_status_filter.menu_text = Filtr +packages.version = Wersja +packages.creator = Twórca +users.list_status_filter.not_active = Nieaktywne +notices.operations = Operacje +config.send_test_mail_submit = Wyślij +packages.published = Opublikowane +config.mailer_protocol = Protokół +monitor.stats = Statystyki +users.remote = Zdalnie [action] @@ -2603,6 +2666,7 @@ pin=Przypnij powiadomienie mark_as_read=Oznacz jako przeczytane mark_as_unread=Oznacz jak nieprzeczytane mark_all_as_read=Oznacz wszystkie jako przeczytane +subscriptions = Subskrybcje [gpg] default_key=Podpisano domyślnym kluczem @@ -2618,6 +2682,7 @@ error.probable_bad_default_signature=OSTRZEŻENIE! Pomimo, że domyślny klucz p [units] error.no_unit_allowed_repo=Nie masz uprawnień do żadnej sekcji tego repozytorium. error.unit_not_allowed=Nie masz uprawnień do tej sekcji repozytorium. +unit = Jednostka [packages] filter.type=Typ @@ -2625,6 +2690,23 @@ alpine.repository.branches=Gałęzie alpine.repository.repositories=Repozytoria conan.details.repository=Repozytorium owner.settings.cleanuprules.enabled=Włączone +alpine.repository.architectures = Architektury +container.details.platform = Platforma +requirements = Wymagania +keywords = Słowa kluczowe +versions = Wersje +dependency.id = ID +dependency.version = Wersja +details.author = Autor +filter.type.all = Wszystko +filter.container.tagged = Oznaczone +details.license = Licencja +installation = Instalacja +composer.dependencies = Zależności +filter.container.untagged = Nieoznaczone +title = Pakiety +dependencies = Zależności +details = Szczegóły [secrets] diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index f4ab925dd0..6a89b64262 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -158,6 +158,7 @@ filter.not_template = Não modelos toggle_menu = Comutar menu filter = Filtro copy_generic = Copiar para a área de transferência +test = Testar [aria] navbar=Barra de navegação @@ -245,7 +246,7 @@ err_admin_name_is_invalid=O nome de utilizador do administrador é inválido general_title=Configurações gerais app_name=Título do sítio -app_name_helper=Pode escrever aqui o nome da sua companhia. +app_name_helper=Escreva aqui o nome da sua instância. Será mostrado em todas as páginas. repo_path=Localização dos repositórios repo_path_helper=Os repositórios Git remotos serão guardados nesta pasta. lfs_path=Localização do Git LFS @@ -671,12 +672,20 @@ block = Bloquear unblock = Desbloquear followers_one = %d seguidor following_one = %d seguindo -block_user.detail = Note que se bloquear este utilizador, serão executadas outras operações, tais como: -block_user.detail_1 = Está a deixar de ser seguido/a por este utilizador. -block_user.detail_2 = Este utilizador não pode interagir com os seus repositórios, questões criadas e comentários. -block_user.detail_3 = Este/a utilizador/a não o/a pode adicionar como colaborador/a nem você pode o/a adicionar como colaborador/a. +block_user.detail = Repare que bloquear um utilizador tem outros efeitos, tais como: +block_user.detail_1 = Irão deixar de seguir um ao outro e deixarão de poder seguir um ao outro. +block_user.detail_2 = Este/a utilizador/a deixará de poder interagir com os seus repositórios ou com as questões e comentários criados por si. +block_user.detail_3 = Não poderão adicionar um ao outro como colaboradores do repositório. follow_blocked_user = Não pode seguir este/a utilizador/a porque você o/a bloqueou ou este/a utilizador/a bloqueou-o/a a si. block_user = Bloquear utilizador +followers.title.one = Seguidor +followers.title.few = Seguidores +following.title.one = Seguindo +following.title.few = Seguindo +public_activity.visibility_hint.self_public = O seu trabalho está visível para todos, salvo o que é feito em espaços privados. Configurar. +public_activity.visibility_hint.admin_public = Este trabalho está visível para todos, mas como administrador/a pode também ver o que consta em espaços privados. +public_activity.visibility_hint.self_private = O seu trabalho apenas está visível para si e para os administradores da instância. Configurar. +public_activity.visibility_hint.admin_private = Este trabalho está visível para si porque é um/a administrador/a, mas o/a utilizador/a quer permanecer privado/a. [settings] profile=Perfil @@ -2756,6 +2765,8 @@ settings.federation_following_repos = URLs de repositórios que estão a ser seg settings.federation_not_enabled = A federação não está a habilitada na sua instância. n_release_one = %s lançamento n_release_few = %s lançamentos +issues.author.tooltip.issue = Este/a utilizador/a é o/a autor/a desta questão. +issues.author.tooltip.pr = Este/a utilizador/a é o/a autor/a deste pedido de integração. [graphs] component_loading=A carregar %s... @@ -3435,6 +3446,10 @@ config.open_with_editor_app_help = Os editores da opção "Abrir com" do menu da config.allow_dots_in_usernames = Permitir que os utilizadores usem pontos no seu nome de utilizador. Não altera as contas existentes. auths.default_domain_name = Nome de domínio predefinido usado para o endereço de email config.app_slogan = Lema da instância +config.cache_test = Testar a cache +config.cache_test_slow = O teste da cache foi bem sucedido, mas a resposta é lenta: %s. +config.cache_test_succeeded = O teste da cache foi bem sucedido, o tempo de resposta foi de %s. +config.cache_test_failed = Falhou a sondagem da cache: %v. [action] create_repo=criou o repositório %s @@ -3788,6 +3803,13 @@ runs.no_workflows.quick_start = Não sabe como começar com o Forgejo Action? Ve runs.no_job_without_needs = A sequência de trabalho tem de conter pelo menos um trabalho sem dependências. runs.workflow = Sequência de trabalho runs.no_job = A sequência de trabalho tem de conter pelo menos um trabalho +workflow.dispatch.use_from = Usar sequência de trabalho de +workflow.dispatch.run = Executar sequência de trabalho +workflow.dispatch.input_required = Exigir valor para a entrada "%s". +workflow.dispatch.warn_input_limit = Apresentando apenas as %d primeiras entradas. +workflow.dispatch.trigger_found = Esta sequência de trabalho é despoletada pelo evento workflow_dispatch. +workflow.dispatch.success = A execução da sequência de trabalho foi pedida com sucesso. +workflow.dispatch.invalid_input_type = Tipo de entrada "%s" inválido. [projects] type-1.display_name=Planeamento individual @@ -3826,6 +3848,10 @@ user_kind = Pesquisar utilizadores... team_kind = Pesquisar equipas... code_kind = Pesquisar código... code_search_unavailable = A pesquisa de código não está disponível, neste momento. Entre em contacto com o administrador. +exact = Fiel +exact_tooltip = Incluir somente os resultados que correspondam rigorosamente ao termo de pesquisa +issue_kind = Procurar questões... +pull_kind = Procurar puxadas... [munits.data] kib = KiB diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 30cb893fa0..0cce5b57ad 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -152,12 +152,13 @@ filter.is_mirror = Зеркала filter.is_template = Шаблоны filter.not_template = Не шаблоны filter.public = Публичные -filter.private = Приватные +filter.private = Частные filter.is_archived = Архивированные filter.not_mirror = Не зеркала more_items = Больше элементов invalid_data = Неверные данные: %v copy_generic = Копировать в буфер обмена +test = Проверить [aria] navbar=Панель навигации @@ -189,6 +190,8 @@ buttons.ref.tooltip=Сослаться на задачу или запрос с buttons.switch_to_legacy.tooltip=Использовать старый редактор buttons.enable_monospace_font=Включить моноширинный шрифт buttons.disable_monospace_font=Выключить моноширинный шрифт +buttons.unindent.tooltip = Уменьшить вложенность на 1 +buttons.indent.tooltip = Увеличить вложенность на 1 [filter] string.asc=A - Я @@ -352,7 +355,7 @@ show_both_archived_unarchived=Показаны архивированные и show_only_archived=Показаны только архивированные show_only_unarchived=Показаны только разархивированные -show_private=Приватный +show_private=Частные show_both_private_public=Показаны как публичные, так и частные show_only_private=Показаны только приватные show_only_public=Показаны только публичные @@ -707,7 +710,7 @@ webauthn=Двухфакторная аутентификация (ключами public_profile=Публичный профиль biography_placeholder=Расскажите немного о себе! (Можно использовать Markdown) -location_placeholder=Поделитесь своим приблизительным местоположением с другими +location_placeholder=Пусть все знают, откуда вы profile_desc=Как ваш профиль будет отображаться для других пользователей. Ваш основной адрес эл. почты будет использоваться для уведомлений, восстановления пароля и веб-операций с Git. password_username_disabled=Нелокальным пользователям запрещено изменение их имени пользователя. Для получения более подробной информации обратитесь к администратору сайта. full_name=Полное имя @@ -745,7 +748,7 @@ comment_type_group_pull_request_push=Добавленные коммиты comment_type_group_project=Проект comment_type_group_issue_ref=Ссылка на задачу saved_successfully=Ваши настройки успешно сохранены. -privacy=Приватность +privacy=Конфиденциальность keep_activity_private=Скрыть активность со страницы профиля keep_activity_private_popup=Ваша активность будет видна только вам и администраторам сервера @@ -916,7 +919,7 @@ create_oauth2_application_button=Создать приложение create_oauth2_application_success=Вы успешно создали новое приложение OAuth2. update_oauth2_application_success=Изменения настроек приложения OAuth2 успешно применены. oauth2_application_name=Имя приложения -oauth2_redirect_uris=URI для перенаправления. Используйте новую строку для каждого URI. +oauth2_redirect_uris=URI перенаправлений. Размещайте URI на отдельных строках. save_application=Сохранить oauth2_client_id=ИД клиента oauth2_client_secret=Клиентский ключ @@ -972,7 +975,7 @@ orgs_none=Вы не состоите ни в одной организации. repos_none=Вы не владеете ни одним репозиторием. delete_account=Удаление учётной записи -delete_prompt=Эта операция навсегда удалит вашу учётную запись. Это НЕВОЗМОЖНО будет отменить. +delete_prompt=Эта операция навсегда удалит вашу учётную запись. Её НЕВОЗМОЖНО отменить. delete_with_all_comments=Ваша учётная запись младше %s. Чтобы избежать комментариев к плану, все комментарии к ней будут удалены. confirm_delete_account=Подтвердить удаление delete_account_title=Удалить эту учётную запись @@ -984,13 +987,13 @@ email_notifications.disable=Отключить уведомления по по email_notifications.submit=Задать настройку уведомлений email_notifications.andyourown=И ваши собственные уведомления -visibility=Видимость пользователя +visibility=Видимость профиля visibility.public=Публичный -visibility.public_tooltip=Видимый для всех +visibility.public_tooltip=Виден всем, кто может открыть этот сайт visibility.limited=Ограниченный -visibility.limited_tooltip=Виден только выполнившим вход пользователям -visibility.private=Приватный -visibility.private_tooltip=Видно только участникам организаций, к которым вы присоединились +visibility.limited_tooltip=Виден только зарегистрированным пользователям сайта +visibility.private=Частный +visibility.private_tooltip=Виден только участникам организаций, в которых вы состоите blocked_users_none = Заблокированных пользователей нет. user_block_success = Пользователь заблокирован. oauth2_application_locked = Forgejo предварительно регистрирует некоторые приложения OAuth2 при запуске, если это включено в конфигурации. Для избежания неожиданного поведения их нельзя удалять или редактировать. Ознакомиться с подробностями можно в документации OAuth2. @@ -1109,7 +1112,7 @@ transfer.accept_desc=Переместить в «%s» transfer.reject=Отказаться от передачи transfer.reject_desc=Отменить перемещение в «%s» -desc.private=Приватный +desc.private=Частный desc.public=Публичный desc.template=Шаблон desc.internal=Внутренний @@ -1423,25 +1426,25 @@ issues.filter_milestones=Фильтр этапов issues.filter_projects=Фильтровать проекты issues.filter_labels=Фильтр меток issues.filter_reviewers=Фильтр рецензентов -issues.new=Добавить задачу +issues.new=Создать задачу issues.new.title_empty=Заголовок не может быть пустым issues.new.labels=Метки issues.new.no_label=Нет меток issues.new.clear_labels=Очистить метки issues.new.projects=Проекты -issues.new.clear_projects=Очистить проекты +issues.new.clear_projects=Удалить из проектов issues.new.no_projects=Нет проекта issues.new.open_projects=Открытые проекты issues.new.closed_projects=Закрытые проекты issues.new.no_items=Нет элементов issues.new.milestone=Этап issues.new.no_milestone=Нет этапа -issues.new.clear_milestone=Очистить этап +issues.new.clear_milestone=Удалить из этапа issues.new.open_milestone=Открытые этапы issues.new.closed_milestone=Завершённые этапы issues.new.assignees=Назначенные -issues.new.clear_assignees=Убрать ответственных -issues.new.no_assignees=Нет назначенных лиц +issues.new.clear_assignees=Снять назначения +issues.new.no_assignees=Нет назначенных issues.new.no_reviewers=Нет рецензентов issues.choose.get_started=Начать issues.choose.open_external_link=Открыть @@ -1449,7 +1452,7 @@ issues.choose.blank=По умолчанию issues.choose.blank_about=Создать запрос из шаблона по умолчанию. issues.choose.ignore_invalid_templates=Некорректные шаблоны были проигнорированы issues.choose.invalid_templates=Найден(ы) %v неверный(х) шаблон(ов) -issues.choose.invalid_config=Конфигурация задачи содержит ошибки: +issues.choose.invalid_config=Ошибки в конфигурации задачи: issues.no_ref=Нет связанной ветки или тега issues.create=Создать задачу issues.new_label=Новая метка @@ -1494,7 +1497,7 @@ issues.filter_milestone_open=Открытые этапы issues.filter_milestone_closed=Завершённые этапы issues.filter_project=Проект issues.filter_project_all=Все проекты -issues.filter_project_none=Нет проекта +issues.filter_project_none=Без проекта issues.filter_assignee=Назначено issues.filter_assginee_no_select=Все назначения issues.filter_assginee_no_assignee=Нет ответственного @@ -1525,9 +1528,9 @@ issues.action_open=Открыть issues.action_close=Закрыть issues.action_label=Метка issues.action_milestone=Этап -issues.action_milestone_no_select=Нет этапа -issues.action_assignee=Ответственный -issues.action_assignee_no_select=Нет ответственного +issues.action_milestone_no_select=Без этапа +issues.action_assignee=Назначенный +issues.action_assignee_no_select=Без назначенного issues.action_check=Выбрать/отменить выбор issues.action_check_all=Выбрать/отменить выбор всех элементов issues.opened_by=открыта %[1]s %[3]s @@ -1756,7 +1759,7 @@ pulls.desc=Включить запросы на слияние и проверк pulls.new=Создать запрос pulls.view=Просмотр запроса на слияние pulls.compare_changes=Новый запрос на слияние -pulls.allow_edits_from_maintainers=Разрешить редактирование сопровождающими +pulls.allow_edits_from_maintainers=Разрешить правки от сопровождающих pulls.allow_edits_from_maintainers_desc=Пользователи с доступом на запись в основную ветку могут отправлять изменения и в эту ветку pulls.allow_edits_from_maintainers_err=Не удалось обновить pulls.compare_changes_desc=Сравнить две ветки и создать запрос на слияние для изменений. @@ -2087,13 +2090,13 @@ settings.use_internal_wiki=Использовать встроенную вик settings.use_external_wiki=Использовать внешнюю вики settings.external_wiki_url=Ссылка на внешнюю вики settings.external_wiki_url_error=URL внешней вики не является корректным URL. -settings.external_wiki_url_desc=Посетители будут перенаправлены на URL, когда они кликнут по вкладке. +settings.external_wiki_url_desc=Посетители будут перенаправлены по указанному адресу вики при открытии вкладки. settings.issues_desc=Включить систему задач settings.use_internal_issue_tracker=Использовать встроенную систему задач settings.use_external_issue_tracker=Использовать внешнюю систему задач settings.external_tracker_url=Ссылка на внешнюю систему отслеживания задач settings.external_tracker_url_error=URL внешнего баг-трекера не является корректным URL. -settings.external_tracker_url_desc=Посетители будут перенаправлены на URL, когда они кликнут по вкладке. +settings.external_tracker_url_desc=Посетители будут перенаправлены по указанному адресу трекера задач при открытии вкладки. settings.tracker_url_format=Формат ссылки внешней системы отслеживания задач settings.tracker_url_format_error=Формат URL внешнего баг-трекера некорректен. settings.tracker_issue_style=Формат нумерации во внешней системе задач @@ -2447,7 +2450,7 @@ settings.lfs_locks_no_locks=Нет блокировки settings.lfs_lock_file_no_exist=Заблокированный файл не существует в ветке по умолчанию settings.lfs_force_unlock=Принудительная разблокировка settings.lfs_pointers.found=Найдено %d указатель(ей) блоков - присоединено %d, %d не привязано (%d отсутствует в хранилище) -settings.lfs_pointers.sha=Blob SHA +settings.lfs_pointers.sha=Хеш blob'а settings.lfs_pointers.oid=OID settings.lfs_pointers.inRepo=В репозитории settings.lfs_pointers.exists=Существуют в хранилище @@ -2767,6 +2770,8 @@ n_release_one = %s выпуск n_release_few = %s выпусков subscribe.issue.guest.tooltip = Войдите, чтобы подписаться на эту задачу. subscribe.pull.guest.tooltip = Войдите, чтобы подписаться на это слияние. +issues.author.tooltip.issue = Автор этой задачи. +issues.author.tooltip.pr = Автор этого запроса слияния. [graphs] @@ -3438,6 +3443,10 @@ auths.tip.gitlab_new = Создайте новое приложение в https monitor.queue.review_add = Подробности / добавить обработчики auths.default_domain_name = Домен по умолчанию для адресов эл. почты config.app_slogan = Лозунг сервера +config.cache_test = Проверить кэш +config.cache_test_slow = Кэш проверен успешно, но ответ был медленным: %s. +config.cache_test_failed = Не удалось проверить кэш: %v. +config.cache_test_succeeded = Кэш был проверен успешно, ответ получен за %v. [action] @@ -3503,7 +3512,7 @@ pib = ПиБ eib = ЭиБ [dropzone] -default_message=Перетащите файл или кликните сюда для загрузки. +default_message=Перетащите сюда файлы или нажмите для загрузки. invalid_input_type=Вы не можете загружать файлы этого типа. file_too_big=Размер файла ({{filesize}} МБ) больше чем максимальный размер ({{maxFilesize}} МБ). remove_file=Удалить файл @@ -3525,7 +3534,7 @@ no_subscriptions=Нет подписок [gpg] default_key=Подписано ключом по умолчанию error.extract_sign=Не удалось извлечь подпись -error.generate_hash=Не удалось создать хэш коммита +error.generate_hash=Не удалось создать хеш коммита error.no_committer_account=Учётная запись с эл. почтой этого коммитера не найдена error.no_gpg_keys_found=Не найден ключ, соответствующий данной подписи error.not_signed_commit=Неподписанный коммит @@ -3803,6 +3812,13 @@ runs.status_no_select = Любое состояние runs.no_matching_online_runner_helper = Нет работающего исполнителя с меткой: %s runs.no_job_without_needs = Рабочий поток должен содержать хотя бы одну задачу без зависимостей. runs.no_job = Рабочий поток должен включать хотя бы одну задачу +workflow.dispatch.trigger_found = Этот рабочий поток срабатывает на события workflow_dispatch. +workflow.dispatch.use_from = Использовать рабочий поток из +workflow.dispatch.run = Выполнить рабочий поток +workflow.dispatch.success = Выполнение рабочего потока запрошено успешно. +workflow.dispatch.input_required = Требовать значение для поля «%s». +workflow.dispatch.invalid_input_type = Неизвестный тип поля «%s». +workflow.dispatch.warn_input_limit = Отображаются только первые %d полей. [projects] type-1.display_name=Индивидуальный проект From dfef354f777616c4bf932f90082db5155d570132 Mon Sep 17 00:00:00 2001 From: Michael Kriese Date: Thu, 4 Jul 2024 13:56:38 +0200 Subject: [PATCH 009/128] build(go-licenses): support go toolchain mismatch (cherry picked from commit b31e21d80eb0baf8d55ae3e2bf39fc8a2dc1e1a8) --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 464c86e3b9..986d8253e3 100644 --- a/Makefile +++ b/Makefile @@ -581,7 +581,7 @@ tidy-check: tidy go-licenses: $(GO_LICENSE_FILE) $(GO_LICENSE_FILE): go.mod go.sum - -$(GO) run $(GO_LICENSES_PACKAGE) save . --force --save_path=$(GO_LICENSE_TMP_DIR) 2>/dev/null + -$(shell $(GO) env GOROOT)/bin/go run $(GO_LICENSES_PACKAGE) save . --force --save_path=$(GO_LICENSE_TMP_DIR) 2>/dev/null $(GO) run build/generate-go-licenses.go $(GO_LICENSE_TMP_DIR) $(GO_LICENSE_FILE) @rm -rf $(GO_LICENSE_TMP_DIR) From 31ad8ea2da15eee2010cbeb23789a4bfddcfa6a7 Mon Sep 17 00:00:00 2001 From: Otto Richter Date: Fri, 5 Jul 2024 05:03:45 +0000 Subject: [PATCH 010/128] test: issue sidebar testing using playwright (#4319) Conclusion of https://codeberg.org/forgejo/forgejo/issues/3499 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/4319 Co-authored-by: Otto Richter Co-committed-by: Otto Richter (cherry picked from commit fafc4f6ad9b13cf386e057835c38149e10a34800) --- tests/e2e/README.md | 26 +++++++++ tests/e2e/issue-sidebar.test.e2e.js | 86 +++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 tests/e2e/issue-sidebar.test.e2e.js diff --git a/tests/e2e/README.md b/tests/e2e/README.md index a0a9fc9ec9..7d63c38777 100644 --- a/tests/e2e/README.md +++ b/tests/e2e/README.md @@ -19,6 +19,32 @@ make clean frontend npx playwright install-deps ``` +## Interactive testing + +You can make use of Playwright's integrated UI mode to run individual tests, +get feedback and visually trace what your browser is doing. + +To do so, launch the debugserver using: + +``` +make test-e2e-debugserver +``` + +Then launch the Playwright UI: + +``` +npx playwright test --ui +``` + +You can also run individual tests while the debugserver using: + +``` +npx playwright test actions.test.e2e.js:9 +``` + +First, specify the complete test filename, +and after the colon you can put the linenumber where the test is defined. + ## Run all tests via local act_runner ``` diff --git a/tests/e2e/issue-sidebar.test.e2e.js b/tests/e2e/issue-sidebar.test.e2e.js new file mode 100644 index 0000000000..41b1b2064a --- /dev/null +++ b/tests/e2e/issue-sidebar.test.e2e.js @@ -0,0 +1,86 @@ +// @ts-check +import {test, expect} from '@playwright/test'; +import {login_user, load_logged_in_context} from './utils_e2e.js'; + +test.beforeAll(async ({browser}, workerInfo) => { + await login_user(browser, workerInfo, 'user2'); +}); + +async function login({browser}, workerInfo) { + const context = await load_logged_in_context(browser, workerInfo, 'user2'); + return await context.newPage(); +} + +// belongs to test: Pull: Toggle WIP +const prTitle = 'pull5'; + +async function click_toggle_wip({page}) { + await page.locator('.toggle-wip>a').click(); + await page.waitForLoadState('networkidle'); +} + +async function check_wip({page}, is) { + const elemTitle = '#issue-title-display'; + const stateLabel = '.issue-state-label'; + await expect(page.locator(elemTitle)).toContainText(prTitle); + await expect(page.locator(elemTitle)).toContainText('#5'); + if (is) { + await expect(page.locator(elemTitle)).toContainText('WIP'); + await expect(page.locator(stateLabel)).toContainText('Draft'); + } else { + await expect(page.locator(elemTitle)).not.toContainText('WIP'); + await expect(page.locator(stateLabel)).toContainText('Open'); + } +} + +test('Pull: Toggle WIP', async ({browser}, workerInfo) => { + test.skip(workerInfo.project.name === 'Mobile Safari', 'Unable to get tests working on Safari Mobile, see https://codeberg.org/forgejo/forgejo/pulls/3445#issuecomment-1789636'); + const page = await login({browser}, workerInfo); + const response = await page.goto('/user2/repo1/pulls/5'); + await expect(response?.status()).toBe(200); // Status OK + // initial state + await check_wip({page}, false); + // toggle to WIP + await click_toggle_wip({page}); + await check_wip({page}, true); + // remove WIP + await click_toggle_wip({page}); + await check_wip({page}, false); + + // manually edit title to another prefix + await page.locator('#issue-title-edit-show').click(); + await page.locator('#issue-title-editor input').fill(`[WIP] ${prTitle}`); + await page.getByText('Save').click(); + await page.waitForLoadState('networkidle'); + await check_wip({page}, true); + // remove again + await click_toggle_wip({page}); + await check_wip({page}, false); +}); + +test('Issue: Labels', async ({browser}, workerInfo) => { + test.skip(workerInfo.project.name === 'Mobile Safari', 'Unable to get tests working on Safari Mobile, see https://codeberg.org/forgejo/forgejo/pulls/3445#issuecomment-1789636'); + const page = await login({browser}, workerInfo); + // select label list in sidebar only + const labelList = page.locator('.issue-content-right .labels-list a'); + const response = await page.goto('/user2/repo1/issues/1'); + await expect(response?.status()).toBe(200); + // preconditions + await expect(labelList.filter({hasText: 'label1'})).toBeVisible(); + await expect(labelList.filter({hasText: 'label2'})).not.toBeVisible(); + // add label2 + await page.locator('.select-label').click(); + // label search could be tested this way: + // await page.locator('.select-label input').fill('label2'); + await page.locator('.select-label .item').filter({hasText: 'label2'}).click(); + await page.locator('.select-label').click(); + await page.waitForLoadState('networkidle'); + await expect(labelList.filter({hasText: 'label2'})).toBeVisible(); + // test removing label again + await page.locator('.select-label').click(); + await page.locator('.select-label .item').filter({hasText: 'label2'}).click(); + await page.locator('.select-label').click(); + await page.waitForLoadState('networkidle'); + await expect(labelList.filter({hasText: 'label2'})).not.toBeVisible(); + await expect(labelList.filter({hasText: 'label1'})).toBeVisible(); +}); From 41763bbb065ce562d01cba364729d44eef8b9c24 Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Fri, 5 Jul 2024 05:49:10 +0000 Subject: [PATCH 011/128] [v8.0/forgejo] ui(blame): remove broken padding Backport: https://codeberg.org/forgejo/forgejo/pulls/4318. This padding causes visual bug, because it only applies to the first line and not to the rest in case the line is broken into multiple. I don't think it's actually needed here for good look, so I decided to remove it. In case decreased padding looks worse, the padding can be grown back via other element so it wouldn't cause this bug. Preview: https://codeberg.org/attachments/56fd2ee8-4955-409d-998f-1feba987b9af. Co-authored-by: 0ko <0ko@noreply.codeberg.org> Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/4321 Reviewed-by: Gusted Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- templates/repo/blame.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/repo/blame.tmpl b/templates/repo/blame.tmpl index 691f75dcad..58be0b17e1 100644 --- a/templates/repo/blame.tmpl +++ b/templates/repo/blame.tmpl @@ -78,7 +78,7 @@ {{end}} - {{$row.Code}} + {{$row.Code}} {{end}} From d9b6adffc5a28fda8c6af8cdaf702f732515e7de Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 5 Jul 2024 11:01:38 +0000 Subject: [PATCH 012/128] Lock file maintenance --- package-lock.json | 177 +++++++++++++++++------------ web_src/fomantic/package-lock.json | 18 +-- 2 files changed, 112 insertions(+), 83 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6c628bd836..17ed901277 100644 --- a/package-lock.json +++ b/package-lock.json @@ -484,9 +484,9 @@ } }, "node_modules/@csstools/css-tokenizer": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.3.2.tgz", - "integrity": "sha512-0xYOf4pQpAaE6Sm2Q0x3p25oRukzWQ/O8hWVvhIt9Iv98/uu053u2CGm/g3kJ+P0vOYTAYzoU8Evq2pg9ZPXtw==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.3.3.tgz", + "integrity": "sha512-fTaF0vRcXVJ4cmwg8nHofydDjitKMDBzC8cCu+O/Lg13C4PdkC15GVjGpbmWauOOnhomVSTg5I5LpLJFJE2Hfw==", "dev": true, "funding": [ { @@ -2557,17 +2557,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.14.1.tgz", - "integrity": "sha512-aAJd6bIf2vvQRjUG3ZkNXkmBpN+J7Wd0mfQiiVCJMu9Z5GcZZdcc0j8XwN/BM97Fl7e3SkTXODSk4VehUv7CGw==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.15.0.tgz", + "integrity": "sha512-uiNHpyjZtFrLwLDpHnzaDlP3Tt6sGMqTCiqmxaN4n4RP0EfYZDODJyddiFDF44Hjwxr5xAcaYxVKm9QKQFJFLA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.14.1", - "@typescript-eslint/type-utils": "7.14.1", - "@typescript-eslint/utils": "7.14.1", - "@typescript-eslint/visitor-keys": "7.14.1", + "@typescript-eslint/scope-manager": "7.15.0", + "@typescript-eslint/type-utils": "7.15.0", + "@typescript-eslint/utils": "7.15.0", + "@typescript-eslint/visitor-keys": "7.15.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -2591,16 +2591,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.14.1.tgz", - "integrity": "sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.15.0.tgz", + "integrity": "sha512-k9fYuQNnypLFcqORNClRykkGOMOj+pV6V91R4GO/l1FDGwpqmSwoOQrOHo3cGaH63e+D3ZiCAOsuS/D2c99j/A==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "7.14.1", - "@typescript-eslint/types": "7.14.1", - "@typescript-eslint/typescript-estree": "7.14.1", - "@typescript-eslint/visitor-keys": "7.14.1", + "@typescript-eslint/scope-manager": "7.15.0", + "@typescript-eslint/types": "7.15.0", + "@typescript-eslint/typescript-estree": "7.15.0", + "@typescript-eslint/visitor-keys": "7.15.0", "debug": "^4.3.4" }, "engines": { @@ -2620,14 +2620,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.14.1.tgz", - "integrity": "sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.15.0.tgz", + "integrity": "sha512-Q/1yrF/XbxOTvttNVPihxh1b9fxamjEoz2Os/Pe38OHwxC24CyCqXxGTOdpb4lt6HYtqw9HetA/Rf6gDGaMPlw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.14.1", - "@typescript-eslint/visitor-keys": "7.14.1" + "@typescript-eslint/types": "7.15.0", + "@typescript-eslint/visitor-keys": "7.15.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2638,14 +2638,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.14.1.tgz", - "integrity": "sha512-/MzmgNd3nnbDbOi3LfasXWWe292+iuo+umJ0bCCMCPc1jLO/z2BQmWUUUXvXLbrQey/JgzdF/OV+I5bzEGwJkQ==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.15.0.tgz", + "integrity": "sha512-SkgriaeV6PDvpA6253PDVep0qCqgbO1IOBiycjnXsszNTVQe5flN5wR5jiczoEoDEnAqYFSFFc9al9BSGVltkg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "7.14.1", - "@typescript-eslint/utils": "7.14.1", + "@typescript-eslint/typescript-estree": "7.15.0", + "@typescript-eslint/utils": "7.15.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -2666,9 +2666,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.14.1.tgz", - "integrity": "sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.15.0.tgz", + "integrity": "sha512-aV1+B1+ySXbQH0pLK0rx66I3IkiZNidYobyfn0WFsdGhSXw+P3YOqeTq5GED458SfB24tg+ux3S+9g118hjlTw==", "dev": true, "license": "MIT", "engines": { @@ -2680,14 +2680,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.14.1.tgz", - "integrity": "sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.15.0.tgz", + "integrity": "sha512-gjyB/rHAopL/XxfmYThQbXbzRMGhZzGw6KpcMbfe8Q3nNQKStpxnUKeXb0KiN/fFDR42Z43szs6rY7eHk0zdGQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "7.14.1", - "@typescript-eslint/visitor-keys": "7.14.1", + "@typescript-eslint/types": "7.15.0", + "@typescript-eslint/visitor-keys": "7.15.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2709,16 +2709,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.14.1.tgz", - "integrity": "sha512-CMmVVELns3nak3cpJhZosDkm63n+DwBlDX8g0k4QUa9BMnF+lH2lr3d130M1Zt1xxmB3LLk3NV7KQCq86ZBBhQ==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.15.0.tgz", + "integrity": "sha512-hfDMDqaqOqsUVGiEPSMLR/AjTSCsmJwjpKkYQRo1FNbmW4tBwBspYDwO9eh7sKSTwMQgBw9/T4DHudPaqshRWA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.14.1", - "@typescript-eslint/types": "7.14.1", - "@typescript-eslint/typescript-estree": "7.14.1" + "@typescript-eslint/scope-manager": "7.15.0", + "@typescript-eslint/types": "7.15.0", + "@typescript-eslint/typescript-estree": "7.15.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2732,13 +2732,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.14.1.tgz", - "integrity": "sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.15.0.tgz", + "integrity": "sha512-Hqgy/ETgpt2L5xueA/zHHIl4fJI2O4XUE9l4+OIfbJIRSnTJb/QscncdqqZzofQegIJugRIF57OJea1khw2SDw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/types": "7.15.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -3284,9 +3284,9 @@ } }, "node_modules/acorn": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", - "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -3950,9 +3950,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001639", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001639.tgz", - "integrity": "sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg==", + "version": "1.0.30001640", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz", + "integrity": "sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==", "funding": [ { "type": "opencollective", @@ -5442,9 +5442,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.815", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.815.tgz", - "integrity": "sha512-OvpTT2ItpOXJL7IGcYakRjHCt8L5GrrN/wHCQsRB4PQa1X9fe+X9oen245mIId7s14xvArCGSTIq644yPUKKLg==", + "version": "1.4.816", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.816.tgz", + "integrity": "sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw==", "license": "ISC" }, "node_modules/elkjs": { @@ -8248,9 +8248,9 @@ } }, "node_modules/istanbul-lib-source-maps": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.4.tgz", - "integrity": "sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -10513,14 +10513,14 @@ } }, "node_modules/pkg-types": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.1.tgz", - "integrity": "sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.3.tgz", + "integrity": "sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==", "dev": true, "license": "MIT", "dependencies": { "confbox": "^0.1.7", - "mlly": "^1.7.0", + "mlly": "^1.7.1", "pathe": "^1.1.2" } }, @@ -13184,9 +13184,9 @@ } }, "node_modules/typescript": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz", - "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", "devOptional": true, "license": "Apache-2.0", "peer": true, @@ -13270,9 +13270,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "funding": [ { "type": "opencollective", @@ -13390,14 +13390,14 @@ "license": "MIT" }, "node_modules/vite": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.2.tgz", - "integrity": "sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.3.tgz", + "integrity": "sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.38", + "postcss": "^8.4.39", "rollup": "^4.13.0" }, "bin": { @@ -13927,6 +13927,35 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/vite/node_modules/postcss": { + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "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.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/vite/node_modules/rollup": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", @@ -14081,9 +14110,9 @@ } }, "node_modules/vue-component-type-helpers": { - "version": "2.0.24", - "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.0.24.tgz", - "integrity": "sha512-Jr5N8QVYEcbQuMN1LRgvg61758G8HTnzUlQsAFOxx6Y6X8kmhJ7C+jOvWsQruYxi3uHhhS6BghyRlyiwO99DBg==", + "version": "2.0.26", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.0.26.tgz", + "integrity": "sha512-sO9qQ8oC520SW6kqlls0iqDak53gsTVSrYylajgjmkt1c0vcgjsGSy1KzlDrbEx8pm02IEYhlUkU5hCYf8rwtg==", "dev": true, "license": "MIT" }, diff --git a/web_src/fomantic/package-lock.json b/web_src/fomantic/package-lock.json index ad3d88988f..a79faa6121 100644 --- a/web_src/fomantic/package-lock.json +++ b/web_src/fomantic/package-lock.json @@ -1219,9 +1219,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001639", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001639.tgz", - "integrity": "sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg==", + "version": "1.0.30001640", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz", + "integrity": "sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==", "funding": [ { "type": "opencollective", @@ -1962,9 +1962,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.815", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.815.tgz", - "integrity": "sha512-OvpTT2ItpOXJL7IGcYakRjHCt8L5GrrN/wHCQsRB4PQa1X9fe+X9oen245mIId7s14xvArCGSTIq644yPUKKLg==", + "version": "1.4.816", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.816.tgz", + "integrity": "sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -8250,9 +8250,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "funding": [ { "type": "opencollective", From 57c6c9ca9c5e546abc5e75675b6f7b52bb5d7190 Mon Sep 17 00:00:00 2001 From: Mai-Lapyst Date: Sat, 6 Jul 2024 05:30:58 +0000 Subject: [PATCH 013/128] Fixes an visual bug where the info box to dispatch a workflow is shown even for users that lack permissions to actualy run the workflow. (#4305) Example: Visit https://v8.next.forgejo.org/Mai-Lapyst/test/actions?workflow=dispatch.yaml&actor=0&status=0 without being logged in. ![image](/attachments/98e74104-4d60-4f7f-b17c-7e76467cd397) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/4305 Reviewed-by: Earl Warren Reviewed-by: Gusted Co-authored-by: Mai-Lapyst Co-committed-by: Mai-Lapyst (cherry picked from commit 98c8d45f0b60202ab35e5b0a3837f2ad6d7037f9) --- routers/web/repo/actions/actions.go | 4 +++- tests/e2e/actions.test.e2e.js | 11 ++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/routers/web/repo/actions/actions.go b/routers/web/repo/actions/actions.go index 90d3226f2d..ff3b16159b 100644 --- a/routers/web/repo/actions/actions.go +++ b/routers/web/repo/actions/actions.go @@ -95,6 +95,8 @@ func List(ctx *context.Context) { allRunnerLabels.AddMultiple(r.AgentLabels...) } + canRun := ctx.Repo.CanWrite(unit.TypeActions) + workflows = make([]Workflow, 0, len(entries)) for _, entry := range entries { workflow := Workflow{Entry: *entry} @@ -146,7 +148,7 @@ func List(ctx *context.Context) { } workflows = append(workflows, workflow) - if workflow.Entry.Name() == curWorkflow { + if canRun && workflow.Entry.Name() == curWorkflow { config := wf.WorkflowDispatchConfig() if config != nil { keys := util.KeysOfMap(config.Inputs) diff --git a/tests/e2e/actions.test.e2e.js b/tests/e2e/actions.test.e2e.js index d7ca75bfc6..dcbd123e0b 100644 --- a/tests/e2e/actions.test.e2e.js +++ b/tests/e2e/actions.test.e2e.js @@ -6,6 +6,8 @@ test.beforeAll(async ({browser}, workerInfo) => { await login_user(browser, workerInfo, 'user2'); }); +const workflow_trigger_notification_text = 'This workflow has a workflow_dispatch event trigger.'; + test('Test workflow dispatch present', async ({browser}, workerInfo) => { const context = await load_logged_in_context(browser, workerInfo, 'user2'); /** @type {import('@playwright/test').Page} */ @@ -13,7 +15,7 @@ test('Test workflow dispatch present', async ({browser}, workerInfo) => { await page.goto('/user2/test_workflows/actions?workflow=test-dispatch.yml&actor=0&status=0'); - await expect(page.getByText('This workflow has a workflow_dispatch event trigger.')).toBeVisible(); + await expect(page.getByText(workflow_trigger_notification_text)).toBeVisible(); const run_workflow_btn = page.locator('#workflow_dispatch_dropdown>button'); await expect(run_workflow_btn).toBeVisible(); @@ -72,3 +74,10 @@ test('Test workflow dispatch success', async ({browser}, workerInfo) => { await expect(page.locator('.run-list>:first-child .run-list-meta', {hasText: 'now'})).toBeVisible(); }); + +test('Test workflow dispatch box not available for unauthenticated users', async ({page}) => { + await page.goto('/user2/test_workflows/actions?workflow=test-dispatch.yml&actor=0&status=0'); + await page.waitForLoadState('networkidle'); + + await expect(page.locator('body')).not.toContainText(workflow_trigger_notification_text); +}); From 4f3726ed134e0103d1815b32fbab14590f99a605 Mon Sep 17 00:00:00 2001 From: Gusted Date: Sat, 6 Jul 2024 22:04:31 +0200 Subject: [PATCH 014/128] [BUG] Use correct SHA in `GetCommitPullRequest` - The param wasn't `sha`, it was `ref`. Use this instead. - Adds new integration tests. - Resolves #4190 - Resolves #4025 (cherry picked from commit a8460bb132f92a6f3c627f8bed42fb728c8e243d) --- routers/api/v1/repo/commits.go | 2 +- tests/integration/api_repo_test.go | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/routers/api/v1/repo/commits.go b/routers/api/v1/repo/commits.go index d06a3b4e49..5e7d10e6c2 100644 --- a/routers/api/v1/repo/commits.go +++ b/routers/api/v1/repo/commits.go @@ -354,7 +354,7 @@ func GetCommitPullRequest(ctx *context.APIContext) { // "404": // "$ref": "#/responses/notFound" - pr, err := issues_model.GetPullRequestByMergedCommit(ctx, ctx.Repo.Repository.ID, ctx.Params(":sha")) + pr, err := issues_model.GetPullRequestByMergedCommit(ctx, ctx.Repo.Repository.ID, ctx.Params("ref")) if err != nil { if issues_model.IsErrPullRequestNotExist(err) { ctx.Error(http.StatusNotFound, "GetPullRequestByMergedCommit", err) diff --git a/tests/integration/api_repo_test.go b/tests/integration/api_repo_test.go index 6e16a12f22..fe5e43eb2f 100644 --- a/tests/integration/api_repo_test.go +++ b/tests/integration/api_repo_test.go @@ -749,3 +749,17 @@ func TestAPIViewRepoObjectFormat(t *testing.T) { DecodeJSON(t, resp, &repo) assert.EqualValues(t, "sha1", repo.ObjectFormatName) } + +func TestAPIRepoCommitPull(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + var pr api.PullRequest + req := NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/1a8823cd1a9549fde083f992f6b9b87a7ab74fb3/pull") + resp := MakeRequest(t, req, http.StatusOK) + + DecodeJSON(t, resp, &pr) + assert.EqualValues(t, 1, pr.ID) + + req = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/not-a-commit/pull") + MakeRequest(t, req, http.StatusNotFound) +} From 64462a69808f18321a1f0446165f3cb03920c934 Mon Sep 17 00:00:00 2001 From: 0ko <0ko@noreply.codeberg.org> Date: Sun, 7 Jul 2024 03:21:58 +0000 Subject: [PATCH 015/128] ui: improve button gap consistency in repos (#4365) Improve UI in a few areas in a similar way to https://codeberg.org/forgejo/forgejo/commit/dc0d3a40ab008f5ff20ad50d8b4a58277595f2fa. Ensure consistent 0.5em gaps in button rows, make buttons have more consistent horizontal paddings for better clickability. Preview: https://codeberg.org/attachments/cfca200a-3b68-4ba8-9876-75cea7822a00 https://codeberg.org/attachments/aaa5d387-919b-45af-8854-6d0f5273125f https://codeberg.org/attachments/989225b7-b1dd-491d-bf76-7e4a962ea54e Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/4365 Reviewed-by: Earl Warren Reviewed-by: Gusted (cherry picked from commit c19222b22f728f3ddad397a3801e10da238ac6c3) --- templates/repo/diff/box.tmpl | 4 ++-- templates/repo/diff/conversation.tmpl | 6 +++--- templates/repo/header.tmpl | 2 +- templates/repo/issue/view_content/conversation.tmpl | 4 ++-- web_src/css/repo.css | 9 ++++----- web_src/css/repo/header.css | 1 - 6 files changed, 12 insertions(+), 14 deletions(-) diff --git a/templates/repo/diff/box.tmpl b/templates/repo/diff/box.tmpl index 71154f9768..230e49752f 100644 --- a/templates/repo/diff/box.tmpl +++ b/templates/repo/diff/box.tmpl @@ -23,7 +23,7 @@ {{end}} -
+
{{if and .PageIsPullFiles $.SignedUserID (not .IsArchived) (not .DiffNotAvailable)}}
-
+
{{if $showFileViewToggle}}
diff --git a/templates/repo/diff/conversation.tmpl b/templates/repo/diff/conversation.tmpl index ef92f3bdfc..c80d999f47 100644 --- a/templates/repo/diff/conversation.tmpl +++ b/templates/repo/diff/conversation.tmpl @@ -37,8 +37,8 @@ {{template "repo/diff/comments" dict "root" $ "comments" .comments}}
-
-
+
+
@@ -56,7 +56,7 @@ {{end}} {{if and $.SignedUserID (not $.Repository.IsArchived)}} - {{end}} diff --git a/templates/repo/header.tmpl b/templates/repo/header.tmpl index d8c53d08be..e81e65bc7d 100644 --- a/templates/repo/header.tmpl +++ b/templates/repo/header.tmpl @@ -35,7 +35,7 @@
{{if not (or .IsBeingCreated .IsBroken)}} -
+
{{if $.RepoTransfer}}
{{$.CsrfTokenHtml}} diff --git a/templates/repo/issue/view_content/conversation.tmpl b/templates/repo/issue/view_content/conversation.tmpl index 8e37b5487f..2526e5c848 100644 --- a/templates/repo/issue/view_content/conversation.tmpl +++ b/templates/repo/issue/view_content/conversation.tmpl @@ -115,7 +115,7 @@
{{end}}
-
+
{{if and $.CanMarkConversation $isNotPending}} {{end}} {{if and $.SignedUserID (not $.Repository.IsArchived)}} - {{end}} diff --git a/web_src/css/repo.css b/web_src/css/repo.css index e90e0ec4fe..1a901e07a2 100644 --- a/web_src/css/repo.css +++ b/web_src/css/repo.css @@ -601,7 +601,7 @@ td .commit-summary { align-items: center; } -.repository.view.issue .button-row, +.issue-title .button-row, .repository.releases .button-row { display: flex; } @@ -610,7 +610,7 @@ td .commit-summary { .repository.view.issue .issue-title { flex-direction: column; } - .repository.view.issue .button-row { + .issue-title .button-row { width: 100%; margin-top: .5rem; justify-content: space-between; @@ -1539,7 +1539,6 @@ td .commit-summary { .diff-detail-actions { display: flex; align-items: center; - gap: 0.25em; justify-content: end; } @@ -1574,7 +1573,7 @@ td .commit-summary { } .repository .diff-detail-box .ui.button { - padding: 0 12px; + padding: 0 1.125em; height: 30px; } @@ -1596,7 +1595,7 @@ td .commit-summary { } .repository .diff-box .header:not(.resolved-placeholder) .button { - padding: 0 12px; + padding: 0 1.125em; flex: 0 0 auto; margin-right: 0; height: 30px; diff --git a/web_src/css/repo/header.css b/web_src/css/repo/header.css index 55e704ed10..9da5fe6acd 100644 --- a/web_src/css/repo/header.css +++ b/web_src/css/repo/header.css @@ -33,7 +33,6 @@ display: flex; flex-flow: row wrap; word-break: keep-all; - gap: 0.25em; } .repo-buttons .ui.labeled.button > .label:hover { From 0700dde04e71ba212e2e6d59bea1ed887dd95f61 Mon Sep 17 00:00:00 2001 From: Gusted Date: Sun, 7 Jul 2024 01:37:38 +0200 Subject: [PATCH 016/128] [BUG] Fix mobile UI for organisation creation - Don't make checkpoints or radio inputs full width on a small screen, these obviously shouldn't try to take up the whole width of a container. - Wrap the label for organisation permission box inside a ``, so it gets a left-margin from the `.inline.field > :first-child` selector. This make the checkboxes and radio buttons groups look indented from the left. - Resolves #4361 (cherry picked from commit 610487eb833da399e22cf81e127fb1865a5d9054) --- templates/org/create.tmpl | 2 +- web_src/css/form.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/org/create.tmpl b/templates/org/create.tmpl index 004cd9be80..92be4a0adb 100644 --- a/templates/org/create.tmpl +++ b/templates/org/create.tmpl @@ -34,7 +34,7 @@
- +
diff --git a/web_src/css/form.css b/web_src/css/form.css index dd2788f542..d8239c5dcf 100644 --- a/web_src/css/form.css +++ b/web_src/css/form.css @@ -466,7 +466,7 @@ textarea:focus, margin-bottom: 1em; width: 100%; } - .new.org .ui.form .field input { + .new.org .ui.form .field input:not([type="checkbox"], [type="radio"]) { width: 100% !important; } } From 3fdf2e691c8239cfc4508b1675594a4ba30d2faa Mon Sep 17 00:00:00 2001 From: Beowulf Date: Sun, 7 Jul 2024 19:59:32 +0200 Subject: [PATCH 017/128] fix branch selector in commit graph Regression from https://codeberg.org/forgejo/forgejo/commit/5ef80ceb6437fa979d4ac567fa4b8c65c7e063d6 (cherry picked from commit 11ff38dd40177ecc151a2984fa7e124cf61ed657) --- .../commit-graph-branch-selector.test.e2e.js | 25 +++++++++++++++++++ web_src/js/features/repo-graph.js | 6 ++--- 2 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 tests/e2e/commit-graph-branch-selector.test.e2e.js diff --git a/tests/e2e/commit-graph-branch-selector.test.e2e.js b/tests/e2e/commit-graph-branch-selector.test.e2e.js new file mode 100644 index 0000000000..b19277c114 --- /dev/null +++ b/tests/e2e/commit-graph-branch-selector.test.e2e.js @@ -0,0 +1,25 @@ +// @ts-check +import {test, expect} from '@playwright/test'; +import {login_user, load_logged_in_context} from './utils_e2e.js'; + +test.beforeAll(async ({browser}, workerInfo) => { + await login_user(browser, workerInfo, 'user2'); +}); + +test('Switch branch', async ({browser}, workerInfo) => { + const context = await load_logged_in_context(browser, workerInfo, 'user2'); + const page = await context.newPage(); + const response = await page.goto('/user2/repo1/graph'); + await expect(response?.status()).toBe(200); + + await page.click('#flow-select-refs-dropdown'); + const input = page.locator('#flow-select-refs-dropdown'); + await input.pressSequentially('develop', {delay: 50}); + await input.press('Enter'); + + await page.waitForLoadState('networkidle'); + + await expect(page.locator('#loading-indicator')).not.toBeVisible(); + await expect(page.locator('#rel-container')).toBeVisible(); + await expect(page.locator('#rev-container')).toBeVisible(); +}); diff --git a/web_src/js/features/repo-graph.js b/web_src/js/features/repo-graph.js index 0086b92021..689b6f1369 100644 --- a/web_src/js/features/repo-graph.js +++ b/web_src/js/features/repo-graph.js @@ -69,9 +69,9 @@ export function initRepoGraphGit() { const html = await response.text(); const div = document.createElement('div'); div.innerHTML = html; - document.getElementById('pagination').innerHTML = div.getElementById('pagination').innerHTML; - document.getElementById('rel-container').innerHTML = div.getElementById('rel-container').innerHTML; - document.getElementById('rev-container').innerHTML = div.getElementById('rev-container').innerHTML; + document.getElementById('pagination').innerHTML = div.querySelector('#pagination').innerHTML; + document.getElementById('rel-container').innerHTML = div.querySelector('#rel-container').innerHTML; + document.getElementById('rev-container').innerHTML = div.querySelector('#rev-container').innerHTML; hideElem('#loading-indicator'); showElem('#rel-container'); showElem('#rev-container'); From 9024b98b3f0353303ee0c8cc37d38b45d411d864 Mon Sep 17 00:00:00 2001 From: banaanihillo Date: Mon, 8 Jul 2024 17:32:59 +0000 Subject: [PATCH 018/128] accessibility: anchor elements' missing href added (#4375) Add an empty hash `href="#"` attribute to anchors that did not yet have any `href` attribute, as a quick work-around to make those elements possible to interact with via keyboard. See discussion on linked issue (https://codeberg.org/forgejo/forgejo/issues/4273) for more information on how the button-like elements like this could eventually be improved even more. Fixes https://codeberg.org/forgejo/forgejo/issues/4273. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/4375 Reviewed-by: Gusted Co-authored-by: banaanihillo Co-committed-by: banaanihillo (cherry picked from commit 099682892b6969d411296a9d8aaf027c20b5f3a3) --- options/locale/locale_en-US.ini | 2 +- .../repo/issue/view_content/pull_merge_instruction.tmpl | 6 +++--- templates/repo/view_file.tmpl | 2 +- web_src/js/features/repo-issue.js | 6 ------ web_src/js/index.js | 2 -- 5 files changed, 5 insertions(+), 13 deletions(-) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index bac0e8515a..1d8da735cf 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1936,7 +1936,7 @@ 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.cmd_instruction_hint = `View command line instructions.` +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. pulls.cmd_instruction_merge_title = Merge diff --git a/templates/repo/issue/view_content/pull_merge_instruction.tmpl b/templates/repo/issue/view_content/pull_merge_instruction.tmpl index d585d36574..42d9c82935 100644 --- a/templates/repo/issue/view_content/pull_merge_instruction.tmpl +++ b/templates/repo/issue/view_content/pull_merge_instruction.tmpl @@ -1,6 +1,6 @@
-
{{ctx.Locale.Tr "repo.pulls.cmd_instruction_hint"}}
-
+
+ {{ctx.Locale.Tr "repo.pulls.cmd_instruction_hint"}}

{{ctx.Locale.Tr "repo.pulls.cmd_instruction_checkout_title"}}

{{ctx.Locale.Tr "repo.pulls.cmd_instruction_checkout_desc"}}
{{$localBranch := .PullRequest.HeadBranch}} {{if ne .PullRequest.HeadRepo.ID .PullRequest.BaseRepo.ID}} @@ -46,4 +46,4 @@
git push origin {{.PullRequest.BaseBranch}}
{{end}} -
+ diff --git a/templates/repo/view_file.tmpl b/templates/repo/view_file.tmpl index dfbc45dd61..d127c2ef24 100644 --- a/templates/repo/view_file.tmpl +++ b/templates/repo/view_file.tmpl @@ -60,7 +60,7 @@ {{end}}
{{svg "octicon-download"}} - {{svg "octicon-copy" 14}} + {{svg "octicon-copy" 14}} {{if .EnableFeed}} {{if .IsViewBranch}} diff --git a/web_src/js/features/repo-issue.js b/web_src/js/features/repo-issue.js index c2867f6f9e..ff8faa94f6 100644 --- a/web_src/js/features/repo-issue.js +++ b/web_src/js/features/repo-issue.js @@ -290,12 +290,6 @@ export function initRepoPullRequestUpdate() { }); } -export function initRepoPullRequestMergeInstruction() { - $('.show-instruction').on('click', () => { - toggleElem($('.instruct-content')); - }); -} - export function initRepoPullRequestAllowMaintainerEdit() { const wrapper = document.getElementById('allow-edits-from-maintainers'); if (!wrapper) return; diff --git a/web_src/js/index.js b/web_src/js/index.js index fc2f6b9b0b..51ff56fdce 100644 --- a/web_src/js/index.js +++ b/web_src/js/index.js @@ -30,7 +30,6 @@ import { initRepoIssueReferenceRepositorySearch, initRepoIssueTimeTracking, initRepoIssueWipTitle, - initRepoPullRequestMergeInstruction, initRepoPullRequestAllowMaintainerEdit, initRepoPullRequestReview, initRepoIssueSidebarList, initArchivedLabelHandler, } from './features/repo-issue.js'; @@ -161,7 +160,6 @@ onDomReady(() => { initRepoMigration(); initRepoMigrationStatusChecker(); initRepoProject(); - initRepoPullRequestMergeInstruction(); initRepoPullRequestAllowMaintainerEdit(); initRepoPullRequestReview(); initRepoRelease(); From 562b6b605e6a3ebb3883b9eccec674f806f7b98d Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Mon, 8 Jul 2024 15:11:29 +0200 Subject: [PATCH 019/128] tests: run JavaScript tests when web_src/js is modified otherwise they are not useful (cherry picked from commit a6a64f1fdcfff580647117bad5378bd89dbc0275) --- .forgejo/workflows/e2e.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.forgejo/workflows/e2e.yml b/.forgejo/workflows/e2e.yml index c1321b0a8e..cda9991027 100644 --- a/.forgejo/workflows/e2e.yml +++ b/.forgejo/workflows/e2e.yml @@ -4,8 +4,10 @@ on: pull_request: paths: - Makefile + - playwright.config.js - .forgejo/workflows/e2e.yml - tests/e2e/** + - web_src/js/** jobs: test-e2e: From 6f7c191c702480e7a0bddc476033e2d318174ca7 Mon Sep 17 00:00:00 2001 From: Codeberg Translate Date: Thu, 11 Jul 2024 06:33:51 +0000 Subject: [PATCH 020/128] i18n: update of translations from Weblate (#4330) Translations update from [Weblate](https://translate.codeberg.org) for [Forgejo/forgejo](https://translate.codeberg.org/projects/forgejo/forgejo/). Current translation status: ![Weblate translation status](https://translate.codeberg.org/widget/forgejo/forgejo/horizontal-auto.svg) Co-authored-by: 0ko <0ko@users.noreply.translate.codeberg.org> Co-authored-by: leana8959 Co-authored-by: emansije Co-authored-by: Salif Mehmed Co-authored-by: Zughy Co-authored-by: EssGeeEich Co-authored-by: Fjuro Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/4330 Reviewed-by: Earl Warren Co-authored-by: Codeberg Translate Co-committed-by: Codeberg Translate (cherry picked from commit 78c5e0b56ce1bb9c1e22186287f98e6e69284a9c) --- options/locale/locale_ar.ini | 2 +- options/locale/locale_bg.ini | 35 ++++++-- options/locale/locale_cs-CZ.ini | 10 ++- options/locale/locale_de-DE.ini | 2 +- options/locale/locale_el-GR.ini | 2 +- options/locale/locale_eo.ini | 2 + options/locale/locale_fil.ini | 2 +- options/locale/locale_fr-FR.ini | 6 +- options/locale/locale_it-IT.ini | 146 +++++++++++++++++++------------- options/locale/locale_ja-JP.ini | 2 +- options/locale/locale_lv-LV.ini | 2 +- options/locale/locale_nl-NL.ini | 2 +- options/locale/locale_pt-BR.ini | 2 +- options/locale/locale_pt-PT.ini | 4 +- options/locale/locale_ru-RU.ini | 34 ++++---- options/locale/locale_tr-TR.ini | 2 +- options/locale/locale_zh-CN.ini | 5 +- options/locale/locale_zh-TW.ini | 68 +++++++-------- 18 files changed, 200 insertions(+), 128 deletions(-) diff --git a/options/locale/locale_ar.ini b/options/locale/locale_ar.ini index 7387bca2a4..6ffcd7d537 100644 --- a/options/locale/locale_ar.ini +++ b/options/locale/locale_ar.ini @@ -1165,7 +1165,7 @@ pulls.status_checks_failure = بعض الفحوص فشلت pulls.status_checks_success = جميع الفحوص ناجحة pulls.status_checks_warning = بعض الفحوص تعطي تحذيرات pulls.commit_ref_at = `أشار إلى طلب الدمج من إيداع %[2]s` -pulls.cmd_instruction_hint = `أظهر شرح استخدام سطر الأوامر.` +pulls.cmd_instruction_hint = `أظهر شرح استخدام سطر الأوامر.` pulls.cmd_instruction_checkout_title = اسحب pulls.cmd_instruction_checkout_desc = من مستودع مشروعك، اسحب (check out) فرعا جديدا واختبر التغييرات. pulls.cmd_instruction_merge_title = ادمج diff --git a/options/locale/locale_bg.ini b/options/locale/locale_bg.ini index 4e03808c38..ed082ddd44 100644 --- a/options/locale/locale_bg.ini +++ b/options/locale/locale_bg.ini @@ -193,7 +193,7 @@ disabled = Изключено licenses = Лицензи sign_in = Вход copy_content = Копиране на съдържанието -user_profile_and_more = Профил и Настройки… +user_profile_and_more = Профил и настройки… view = Преглед your_settings = Настройки mirrors = Огледала @@ -227,7 +227,7 @@ copy = Копиране enabled = Включено new_org = Нова организация milestones = Етапи -rss_feed = RSS Емисия +rss_feed = RSS емисия never = Никога new_project = Нов проект your_starred = Отбелязани @@ -283,6 +283,8 @@ filter.not_mirror = Не огледала copy_hash = Копиране на контролната сума artifacts = Артефакти show_log_seconds = Показване на секундите +remove_all = Премахване на всичко +test = Проба [repo] issues.context.edit = Редактиране @@ -973,7 +975,7 @@ search.results = Резултати от търсенето на "%s" в инструкциите за командния ред.` +pulls.cmd_instruction_hint = `Вижте инструкциите за командния ред.` pulls.showing_only_single_commit = Показани са само промените в подаване %[1]s issues.lock_no_reason = заключи и ограничи обсъждането до сътрудници %s pulls.expand_files = Разгъване на всички файлове @@ -1064,7 +1066,7 @@ diff.review.reject = Поискване на промени diff.bin_not_shown = Двоичният файл не е показан. settings.units.units = Елементи на хранилището settings.delete_notices_fork_1 = - Разклоненията на това хранилище ще станат независими след изтриване. -settings.actions_desc = Включване на интегрираните CI/CD pipelines с Forgejo Действия +settings.actions_desc = Включване на интегрираните CI/CD pipelines с Forgejo Actions settings.packages_desc = Включване на регистъра на пакетите за хранилището settings.units.add_more = Добавяне... settings.use_external_issue_tracker = Използване на външен тракер за задачи @@ -1134,6 +1136,16 @@ pulls.status_checks_failure = Някои проверки са неуспешн issues.review.add_review_request = поиска рецензия от %s %s wiki.no_search_results = Няма резултати wiki.search = Търсене в уикито +issues.author.tooltip.pr = Този потребител е авторът на тази заявка за сливане. +issues.author.tooltip.issue = Този потребител е авторът на тази задача. +issues.review.option.hide_outdated_comments = Скриване на остарели коментари +file.title = %s в %s +issues.review.option.show_outdated_comments = Показване на остарели коментари +issues.content_history.delete_from_history_confirm = Да се изтрие ли от историята? +project = Проекти +issues.content_history.delete_from_history = Изтриване от историята +n_release_few = %s издания +n_release_one = %s издание [modal] confirm = Потвърждаване @@ -1259,7 +1271,7 @@ mailer_password = SMTP парола disable_gravatar = Изключване на Gravatar smtp_addr = SMTP хост smtp_port = SMTP порт -app_name_helper = Можете да въведете името на компанията си тук. +app_name_helper = Въведете името на инстанцията си тук. Ще се показва на всяка страница. admin_title = Настройки на администраторския акаунт err_empty_admin_password = Администраторската парола не може да бъде празна. docker_helper = Ако стартирате Forgejo в Docker, моля, прочетете документацията преди да промените настройки. @@ -1318,13 +1330,17 @@ email_visibility.private = Вашият адрес на ел. поща е вид show_on_map = Показване на това място на картата followers_one = %d последовател following_one = %d следван +followers.title.few = Последователи +followers.title.one = Последовател +following.title.one = Следван +following.title.few = Следвани [home] filter = Други филтри show_archived = Архивирани search_repos = Намиране на хранилище… my_orgs = Организации -uname_holder = Потреб. име или Адрес на ел. поща +uname_holder = Потребителско име или ел. поща my_repos = Хранилища show_both_archived_unarchived = Показване на и архивирани и неархивирани feed_of = Емисия на "%s" @@ -1414,6 +1430,7 @@ orgs.teams = Екипи orgs.members = Участници config_settings = Настройки users.details = Потребителски данни +packages.total_size = Общ размер: %s [error] not_found = Целта не може да бъде намерена. @@ -1509,7 +1526,7 @@ tab_signin = Влизане tab_signup = Регистриране [aria] -footer.software = Относно софтуера +footer.software = Относно този софтуер footer.links = Връзки footer = Долен колонтитул @@ -1622,6 +1639,10 @@ project_kind = Търсене на проекти... package_kind = Търсене на пакети... search = Търсене... branch_kind = Търсене на клонове... +pull_kind = Търсене на заявки за сливане... +issue_kind = Търсене на задачи... +fuzzy = Приблизително +exact = Прецизно [markup] filepreview.lines = Редове от %[1]d до %[2]d в %[3]s diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index 4e85309397..a9ad4a6582 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -466,6 +466,11 @@ change_unconfirmed_email_summary = Změna e-mailové adresy, na kterou bude odes last_admin=Nelze odstranit posledního správce. Musí existovat alespoň jeden správce. tab_signup = Registrace tab_signin = Přihlášení +hint_login = Již máte účet? Přihlaste se! +hint_register = Nemáte účet? Zaregistrujte se nyní. +sign_up_button = Zaregistrujte se nyní. +back_to_sign_in = Zpět na přihlášení +sign_in_openid = Pokračovat s OpenID [mail] view_it_on=Zobrazit na %s @@ -1018,6 +1023,7 @@ pronouns = Zájmena pronouns_custom = Vlastní pronouns_unspecified = Neurčená language.title = Výchozí jazyk +keep_activity_private.description = Vaše veřejná aktivita bude viditelná pouze vám a správcům instance. [repo] new_repo_helper=Repozitář obsahuje všechny projektové soubory, včetně historie revizí. Už jej hostujete jinde? Migrovat repozitář. @@ -1897,7 +1903,7 @@ pulls.outdated_with_base_branch=Tato větev je zastaralá oproti základní vět pulls.close=Zavřít žádost o sloučení pulls.closed_at=`uzavřel/a tento požadavek na natažení %[2]s` pulls.reopened_at=`znovuotevřel/a tento požadavek na natažení %[2]s` -pulls.cmd_instruction_hint=`Zobrazit instrukce příkazové řádky.` +pulls.cmd_instruction_hint=`Zobrazit instrukce příkazové řádky.` pulls.cmd_instruction_checkout_desc=Z vašeho repositáře projektu se podívejte na novou větev a vyzkoušejte změny. pulls.cmd_instruction_merge_title=Sloučit pulls.cmd_instruction_merge_desc=Slučte změny a aktualizujte je na Gitea. @@ -3886,6 +3892,8 @@ exact = Přesné exact_tooltip = Zahrnout pouze výsledky, které přesně odpovídají hledanému výrazu issue_kind = Hledat problémy... pull_kind = Hledat pully... +union = Sdružené +union_tooltip = Zahrnout výsledky, které odpovídají jakýmkoli slovům odděleným mezerami [markup] filepreview.lines = Řádky %[1]d až %[2]d v souboru %[3]s diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index cfe5dec8bb..d478006772 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -2682,7 +2682,7 @@ commits.browse_further = Weiter browsen pulls.nothing_to_compare_have_tag = Der gewählte Branch/Tag ist gleich. pulls.status_checks_hide_all = Alle Prüfungen verbergen pulls.status_checks_show_all = Alle Prüfungen anzeigen -pulls.cmd_instruction_hint = `Anweisungen für die Kommandozeile betrachten.` +pulls.cmd_instruction_hint = `Anweisungen für die Kommandozeile betrachten.` pulls.cmd_instruction_checkout_title = Auschecken wiki.cancel = Abbrechen settings.wiki_globally_editable = Allen erlauben, das Wiki zu bearbeiten diff --git a/options/locale/locale_el-GR.ini b/options/locale/locale_el-GR.ini index 842e297aa8..eb16a4bb6b 100644 --- a/options/locale/locale_el-GR.ini +++ b/options/locale/locale_el-GR.ini @@ -1888,7 +1888,7 @@ pulls.outdated_with_base_branch=Αυτός ο κλάδος δεν είναι ε pulls.close=Κλείσιμο pull request pulls.closed_at=`έκλεισε αυτό το pull request %[2]s` pulls.reopened_at=`άνοιξε ξανά αυτό το pull request %[2]s` -pulls.cmd_instruction_hint=`Δείτε τις οδηγίες γραμμής εντολών.` +pulls.cmd_instruction_hint=`Δείτε τις οδηγίες γραμμής εντολών.` pulls.cmd_instruction_checkout_title=Έλεγχος pulls.cmd_instruction_checkout_desc=Από το αποθετήριο του έργου σας, ελέγξτε έναν νέο κλάδο και δοκιμάστε τις αλλαγές. pulls.cmd_instruction_merge_title=Συγχώνευση diff --git a/options/locale/locale_eo.ini b/options/locale/locale_eo.ini index f8d3f7f2d0..740f528b6e 100644 --- a/options/locale/locale_eo.ini +++ b/options/locale/locale_eo.ini @@ -139,6 +139,8 @@ test = Provo invalid_data = Nevalidaj datumoj: %v more_items = Pli da eroj copy_generic = Kopii al tondujo +confirm_delete_artifact = Ĉu vi certas, ke vi volas forigi la artefakton "%s"? +artifacts = Artefaktoj [editor] buttons.list.ordered.tooltip = Aldoni nombran liston diff --git a/options/locale/locale_fil.ini b/options/locale/locale_fil.ini index 0f29bcf7f8..0f68d58a45 100644 --- a/options/locale/locale_fil.ini +++ b/options/locale/locale_fil.ini @@ -1753,7 +1753,7 @@ pulls.delete.title = Burahin ang [pull request] 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 [pull request] na ito%[2]s` pulls.close = Isara ang [pull request] -pulls.cmd_instruction_hint = `Tingnan ang mga panuto para sa linya ng utos.` +pulls.cmd_instruction_hint = `Tingnan ang mga panuto para sa linya ng utos.` project = Mga proyekto issues.content_history.deleted = binura pulls.no_results = Walang nakitang mga resulta. diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 9566626800..b2f1154b44 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -159,6 +159,7 @@ toggle_menu = Menu va-et-vient more_items = Plus d'éléments invalid_data = Données invalides : %v copy_generic = Copier dans le presse-papiers +test = Test [aria] navbar=Barre de navigation @@ -1887,7 +1888,7 @@ pulls.outdated_with_base_branch=Cette branche est désynchronisée avec la branc 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.cmd_instruction_hint=`Voir les instructions en ligne de commande.` +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. pulls.cmd_instruction_merge_title=Fusionner @@ -3860,6 +3861,9 @@ package_kind = Chercher les paquets... project_kind = Chercher les projets... branch_kind = Chercher les branches... commit_kind = Chercher les commits... +exact = Exact +exact_tooltip = Inclure uniquement les résultats qui correspondent exactement au terme recherché +issue_kind = Rechercher dans les tickets... [munits.data] diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index 3f3d7e8ffc..0721db79a8 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 account +link_account=Collega Profilo register=Registrati version=Versione powered_by=Gestito da %s @@ -20,7 +20,7 @@ active_stopwatch=Attiva cronometro create_new=Crea… user_profile_and_more=Profilo ed impostazioni… signed_in_as=Accesso effettuato come -toc=Indice dei contenuti +toc=Indice dei Contenuti licenses=Licenze return_to_forgejo=Ritorna a Forgejo @@ -35,13 +35,13 @@ twofa_scratch=Codice di recupero per la verifica in due passaggi passcode=Codice di sicurezza webauthn_insert_key=Inserisci la tua chiave di sicurezza -webauthn_sign_in=Premere il pulsante sul tasto di sicurezza. Se il tasto di sicurezza non ha pulsante, reinseriscilo. -webauthn_press_button=Si prega di premere il pulsante sul tasto di sicurezza… +webauthn_sign_in=Premi il pulsante sul tasto di sicurezza. Se il tasto di sicurezza non ha pulsante, reinseriscilo. +webauthn_press_button=Premi il pulsante sulla chiave di sicurezza… webauthn_use_twofa=Usa un codice a due fattori dal tuo telefono webauthn_error=Impossibile leggere la tua chiave di sicurezza. webauthn_unsupported_browser=Il tuo browser al momento non supporta WebAuthn. webauthn_error_unknown=Si è verificato un errore sconosciuto. Riprova. -webauthn_error_insecure=`WebAuthn supporta solo connessioni sicure. Per il test su HTTP, è possibile utilizzare l'origine "localhost" o "127.0.0.1"` +webauthn_error_insecure=WebAuthn supporta solo connessioni sicure. Per il test su HTTP, è possibile utilizzare l'origine "localhost" o "127.0.0.1" webauthn_error_unable_to_process=Il server non può elaborare la richiesta. webauthn_error_duplicated=La chiave di sicurezza non è consentita per questa richiesta. Assicurati che la chiave non sia già registrata. webauthn_error_empty=Devi impostare un nome per questa chiave. @@ -71,16 +71,16 @@ mirrors=Mirror collaborative=Condivisi forks=Fork -activities=Attivitá -pull_requests=Pull request +activities=Attività +pull_requests=Richieste di modifica issues=Segnalazioni -milestones=Milestones +milestones=Traguardi ok=OK cancel=Annulla save=Salva add=Aggiungi -add_all=Aggiungi tutti +add_all=Aggiungi tutto remove=Rimuovi remove_all=Rimuovi tutti edit=Modifica @@ -143,7 +143,7 @@ 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 da fork +filter.not_fork = Non fork filter = Filtro filter.clear = Rimuovi filtri filter.is_archived = Archiviato @@ -151,8 +151,8 @@ filter.not_archived = Non archiviato filter.is_fork = Da fork filter.is_mirror = Mirror filter.not_mirror = Non mirror -filter.is_template = Modello -filter.not_template = Non modello +filter.is_template = Modelli +filter.not_template = Non modelli filter.public = Pubblico filter.private = Privato more_items = Più elementi @@ -190,6 +190,8 @@ buttons.ref.tooltip = Fa riferimento a una segnalazione o pull request buttons.switch_to_legacy.tooltip = Passa all'editor classico buttons.enable_monospace_font = Attiva font monospace buttons.disable_monospace_font = Disattiva font monospace +buttons.indent.tooltip = Annida elementi di un livello +buttons.unindent.tooltip = Disannida elementi di un livello [filter] string.asc = A - Z @@ -219,7 +221,7 @@ install_desc = Semplicemente la documentazione prima di cambiare qualsiasi impostazione. -require_db_desc=Forgejo requires MySQL, PostgreSQL, SQLite3 or TiDB (MySQL protocol). +require_db_desc=Forgejo richiede MySQL, PostgreSQL, SQLite3 o TiDB (protocollo MySQL). db_title=Impostazioni database db_type=Tipo di database host=Host @@ -231,13 +233,13 @@ db_schema_helper=Lascia vuoto per il valore predefinito del database ("public"). ssl_mode=SSL path=Percorso sqlite_helper=Percorso file del database SQLite3.
Inserisci un percorso assoluto se stai usando Forgejo come servizio. -reinstall_error=Stai cercando di installare in un database Forgejo esistente +reinstall_error=Stai cercando di installare Forgejo in una base dati già esistente reinstall_confirm_message=La reinstallazione con una base dati Forgejo esistente può causare vari problemi. Nella maggior parte dei casi, dovresti usare il tuo "app.ini" per eseguire Forgejo. Se sai cosa stai facendo, conferma quanto segue: -reinstall_confirm_check_1=I dati crittografati da SECRET_KEY nell'app. ni potrebbe essere perso: gli utenti potrebbero non essere in grado di accedere con 2FA/OTP & mirror potrebbe non funzionare correttamente. Selezionando questa casella confermi che il file attuale app.ini contiene il corretto SECRET_KEY. -reinstall_confirm_check_2=I repository e le impostazioni potrebbero avere bisogno di essere ri-sincronizzati. Selezionando questa casella confermi che potrai risincronizzare manualmente gli hook per i repository e il file authorized_keys. Confermi che assicurerai che le impostazioni del repository e del mirror siano corrette. -reinstall_confirm_check_3=Confermi di essere assolutamente sicuro che questo Forgejo è in esecuzione con l'app corretta. ni posizione e che sei sicuro di dover reinstallare. Confermi di aver riconosciuto i rischi di cui sopra. +reinstall_confirm_check_1=I dati crittografati da SECRET_KEY nell'app.ini potrebbero essere persi: gli utenti potrebbero non essere in grado di accedere con 2FA/OTP & i mirror potrebbero non funzionare correttamente. Selezionando questa casella confermi che il file attuale app.ini contiene il corretto SECRET_KEY. +reinstall_confirm_check_2=I repository e le impostazioni potrebbero avere bisogno di essere ri-sincronizzati. Selezionando questa casella confermi che potrai risincronizzare manualmente gli hook per i repository e il file authorized_keys. Confermi che assicurerai che le impostazioni dei repository e dei mirror siano corrette. +reinstall_confirm_check_3=Confermi di essere assolutamente sicurə che questo Forgejo è in esecuzione con il file app.ini corretto e che sei sicurə di dover reinstallare. Confermi di aver riconosciuto i rischi di cui sopra. err_empty_db_path=Il percorso del database SQLite3 non può essere vuoto. -no_admin_and_disable_registration=Non puoi disabilitare l'auto-registrazione degli utenti senza creare un account amministratore. +no_admin_and_disable_registration=Non puoi disabilitare l'auto-registrazione degli utenti senza creare un profilo amministratore. err_empty_admin_password=La password dell'amministratore non può essere vuota. err_empty_admin_email=L'email dell'amministratore non può essere vuota. err_admin_name_is_reserved=Nome utente Administrator non valido, nome utente riservato @@ -246,11 +248,11 @@ err_admin_name_is_invalid=Il nome utente Administrator non è valido general_title=Impostazioni generali app_name=Titolo dell'istanza -app_name_helper=Qui puoi inserire il nome della tua società. +app_name_helper=Inserire qui il nome dell'istanza. Verrà visualizzato su ogni pagina. repo_path=Percorso radice dei repository -repo_path_helper=Le Remote Git repositories saranno salvate in questa directory. +repo_path_helper=I repository Git remoti saranno salvati in questa cartella. lfs_path=Percorso radice di git LFS -lfs_path_helper=I file trovati da Git LFS saranno salvati in questa directory. Lasciare vuoto per disattivare. +lfs_path_helper=I file trovati da Git LFS saranno salvati in questa cartella. Lascia vuoto per disattivare. run_user=Nome utente col quale eseguire domain=Dominio server domain_helper=Dominio o indirizzo host per il server. @@ -268,25 +270,25 @@ email_title=Impostazioni e-mail smtp_addr=Host SMTP smtp_port=Porta SMTP smtp_from=Invia e-mail come -smtp_from_helper=Indirizzo Email che Forgejo utilizzerà. Inserisci un indirizzo email o usa il formato "Name" . +smtp_from_helper=Indirizzo e-mail che verrà usato da Forgejo. Inserisci un indirizzo e-mail o usa il formato "Nome" . mailer_user=Nome utente SMTP mailer_password=Password SMTP register_confirm=Richiedi conferma e-mail durante la registrazione mail_notify=Attiva le notifiche e-mail server_service_title=Impostazioni server e servizi di terze parti offline_mode=Attiva modalità in locale -offline_mode.description=Disattiva le reti di distribuzione dei contenuti di terze parti e fornisci tutte le risorse localmente. +offline_mode.description=Disattiva le reti di distribuzione dei contenuti di terze parti e servi tutte le risorse localmente. disable_gravatar=Disattiva Gravatar -disable_gravatar.description=Disattiva Gravatar e le fonti di avatar di terze parti. Verrà usato un avatar predefinito almeno che un utente non carichi un avatar in locale. +disable_gravatar.description=Disabilita l'utilizzo di Gravatar o di altre fonti avatar di terze parti. Le immagini predefinite verranno utilizzate per gli avatar degli utenti a meno che non carichino il proprio avatar sull'istanza. federated_avatar_lookup=Attiva le immagini profilo federate -federated_avatar_lookup.description=Enable federated avatars lookup to use federated open source service based on libravatar. +federated_avatar_lookup.description=Cerca gli avatar utilizzando Libravatar. disable_registration=Disattiva auto-registrazione -disable_registration.description=Disattiva la user self-registration. Solo gli amministratori saranno in grado di creare account. +disable_registration.description=Solo gli amministratori dell'istanza potranno creare nuovi account utente. Si consiglia vivamente di mantenere la registrazione disabilitata a meno che non si intenda ospitare un'istanza pubblica per tutti e siate pronti a gestire grandi quantità di account spam. allow_only_external_registration.description=Gli utenti potranno creare nuovi account usando i servizi esterni configurati. openid_signin=Attiva l'accesso con OpenID openid_signin.description=Permetti agli utenti di registrarsi via OpenID. openid_signup=Attiva auto-registrazione con OpenID -openid_signup.description=Attiva OpenID-based user self-registration. +openid_signup.description=Consenti agli utenti di creare account tramite OpenID se l'autoregistrazione è abilitata. enable_captcha=Abilita CAPTCHA per registrazione enable_captcha.description=Richiedi convalida CAPTCHA per i nuovi utenti. require_sign_in_view=Richiedi l'accesso per visualizzare il contenuto dell'istanza @@ -311,7 +313,7 @@ invalid_log_root_path=Il percorso del log non è valido: %v default_keep_email_private=Nascondi Indirizzo e-mail come impostazione predefinita default_keep_email_private.description=Nascondi l'indirizzo email dei nuovi utenti di default cosicché questa informazione non venga subito rivelata dopo la registrazione. default_allow_create_organization=Consenti la creazione di organizzazioni come impostazione predefinita -default_allow_create_organization.description=Consenti ai nuovi account utente di creare organizzazioni di default. +default_allow_create_organization.description=Consenti ai nuovi utenti di creare organizzazioni per impostazione predefinita. Quando questa opzione è disabilitata, un amministratore dovrà concedere l'autorizzazione per la creazione di organizzazioni ai nuovi utenti. default_enable_timetracking=Attiva il cronografo come impostazione predefinita default_enable_timetracking.description=Attiva di default il cronografo per i nuovi repository. no_reply_address=Dominio e-mail nascosto @@ -326,11 +328,11 @@ env_config_keys = Configurazione Ambiente env_config_keys_prompt = Le seguenti variabili di ambiente saranno anche applicate al tuo file di configurazione: run_user_helper = Il nome utente del sistema operativo con il quale Forgejo viene eseguito. Questo utente deve avere accesso alla cartella principale dei repository. password_algorithm_helper = Imposta l'algoritmo di hashing della password. Gli algoritmi hanno requisiti e punti di forza diversi. L'algoritmo argon2 è relativamente sicuro ma usa un sacco di memoria e potrebbe non essere appropriato a piccoli sistemi. -require_sign_in_view.description = Limita l'accesso ad utenti autenticati. I visitatori vedranno solo le pagine di accesso e registrazione. +require_sign_in_view.description = Limita l'accesso a utenti autenticati. I visitatori vedranno solo le pagine di accesso e registrazione. allow_dots_in_usernames = Consenti l'uso del punto nel nome utente. Non impatta i profili già esistenti. config_location_hint = Queste opzioni di configurazione saranno salvate in: allow_only_external_registration = Permetti la registrazione solo tramite servizi esterni -app_slogan = Slogan istanza +app_slogan = Slogan dell'istanza app_slogan_helper = Inserire qui lo slogan dell'istanza. Lasciare vuoto per disabilitare. [home] @@ -1033,7 +1035,7 @@ fork_repo=Deriva progetto fork_from=Deriva da 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 repository forkato non può essere modificata. +fork_visibility_helper=La visibilità di un repository derivato non può essere modificata. use_template=Usa questo modello clone_in_vsc=Clona nel codice VS download_zip=Scarica ZIP @@ -1134,7 +1136,7 @@ migrate_options_lfs_endpoint.description=La migrazione tenterà di utilizzare il migrate_options_lfs_endpoint.description.local=È supportato anche un percorso server locale. migrate_items=Elementi di migrazione migrate_items_wiki=Wiki -migrate_items_milestones=Milestone +migrate_items_milestones=Traguardi migrate_items_labels=Etichette migrate_items_issues=Issues migrate_items_pullrequests=Richieste di modifica @@ -1166,14 +1168,14 @@ migrate.codebase.description=Migrare i dati da codebasehq.com. migrate.gitbucket.description=Migra i dati dalle istanze di GitBucket. migrate.migrating_git=Migrazione dei dati Git migrate.migrating_topics=Migrazione degli argomenti -migrate.migrating_milestones=Migrazione delle pietre miliari +migrate.migrating_milestones=Migrazione dei traguardi migrate.migrating_labels=Migrazione delle etichette migrate.migrating_releases=Migrazione dei rilasci migrate.migrating_issues=Migrazione delle segnalazioni migrate.migrating_pulls=Migrazione delle richieste di modifica mirror_from=mirror da -forked_from=forkato da +forked_from=derivato da generated_from=generato da fork_from_self=Non puoi effettuare il fork del tuo stesso repository. fork_guest_user=Accedi per effettuare il fork di questo repository. @@ -1183,7 +1185,7 @@ unwatch=Non seguire più watch=Segui unstar=Togli il voto star=Vota -fork=Forka +fork=Deriva download_archive=Scarica progetto no_desc=Nessuna descrizione @@ -1352,9 +1354,9 @@ projects.column.color=Colore projects.open=Apri projects.close=Chiudi -issues.desc=Organizza le segnalazioni di bug, attività e pietre miliari. +issues.desc=Organizza le segnalazioni di bug, attività e traguardi. issues.filter_assignees=Filtra assegnatario -issues.filter_milestones=Filtra traguardo +issues.filter_milestones=Filtra Traguardo issues.filter_projects=Filtra Progetti issues.filter_labels=Filtra etichetta issues.filter_reviewers=Filtra revisore @@ -1372,7 +1374,7 @@ issues.new.no_items=Nessun elemento issues.new.milestone=Traguardo issues.new.no_milestone=Nessuna pietra miliare issues.new.clear_milestone=Milestone pulita -issues.new.open_milestone=Apri traguardi +issues.new.open_milestone=Traguardi aperti issues.new.closed_milestone=Traguardi chiusi issues.new.assignees=Assegnatari issues.new.clear_assignees=Cancella assegnatari @@ -1756,29 +1758,29 @@ pulls.delete.text=Vuoi davvero eliminare questo problema? (Questo rimuoverà per -milestones.new=Nuova pietra miliare +milestones.new=Nuovo traguardo milestones.closed=Chiuso %s milestones.no_due_date=Nessuna data di scadenza milestones.open=Apri milestones.close=Chiudi -milestones.completeness=%d%% Completato -milestones.create=Crea pietra miliare +milestones.completeness=%d%% Completato +milestones.create=Crea traguardo milestones.title=Titolo milestones.desc=Descrizione milestones.due_date=Scadenza (opzionale) milestones.clear=Pulisci milestones.invalid_due_date_format=Il formato della scadenza deve essere 'aaaa-mm-dd'. -milestones.edit=Modifica pietra miliare -milestones.edit_subheader=Le pietre miliari organizzano le issue e tengono conto del progresso. +milestones.edit=Modifica traguardo +milestones.edit_subheader=I traguardi permettono una migliore organizzazione dei problemi e ne tracciano il progresso. milestones.cancel=Annulla -milestones.modify=Aggiorna pietra miliare -milestones.deletion=Elimina pietra miliare -milestones.deletion_desc=Eliminare una pietra miliare la rimuove da tutte le relative issue. Continuare? -milestones.deletion_success=La pietra miliare è stata eliminata. -milestones.filter_sort.least_complete=Meno completato -milestones.filter_sort.most_complete=Più completato -milestones.filter_sort.most_issues=Maggior parte delle segnalazioni -milestones.filter_sort.least_issues=Meno segnalazioni +milestones.modify=Aggiorna traguardo +milestones.deletion=Elimina traguardo +milestones.deletion_desc=L'eliminazione di un traguardo lo rimuoverà da tutte le segnalazioni collegate ad esso. Continuare? +milestones.deletion_success=Il traguardo è stato eliminato. +milestones.filter_sort.least_complete=Completato di meno +milestones.filter_sort.most_complete=Completato di più +milestones.filter_sort.most_issues=Con più segnalazioni +milestones.filter_sort.least_issues=Con meno segnalazioni ext_wiki=Accesso al Wiki esterno @@ -2060,7 +2062,7 @@ settings.event_create_desc=Ramo o etichetta creati. settings.event_delete=Elimina settings.event_delete_desc=Ramo o etichetta eliminati. settings.event_fork=Fork -settings.event_fork_desc=Repository forkato. +settings.event_fork_desc=Repository derivato. settings.event_wiki=Wiki settings.event_release=Release settings.event_release_desc=Release pubblicata, aggiornata o rimossa in una repository. @@ -2421,7 +2423,7 @@ commitstatus.failure = Errore settings.units.overview = Panoramica all_branches = Tutti i rami projects.column.assigned_to = Assegnato a -pulls.cmd_instruction_hint = `Visualizza istruzioni per la riga di comando.` +pulls.cmd_instruction_hint = `Visualizza istruzioni per la riga di comando.` settings.add_collaborator_blocked_them = Non si può aggiungere il collaboratore perché ha bloccato il proprietario del progetto. branch.protected_deletion_failed = Il ramo "%s" è protetto. Non può essere eliminato. branch.default_deletion_failed = Il ramo "%s" è il ramo predefinito. Non può essere eliminato. @@ -2755,6 +2757,19 @@ subscribe.pull.guest.tooltip = Accedere per sottoscrivere questa richiesta di pu subscribe.issue.guest.tooltip = Accedere per sottoscrivere questo problema. n_release_one = rilascio %s n_release_few = rilasci %s +issues.author.tooltip.pr = Questo utente è l'autore di questa richiesta di pull. +release.hide_archive_links = Nascondi automaticamente gli archivi generati +settings.federation_settings = Impostazioni di federazione +settings.federation_apapiurl = URL della federazione di questo repository. Copiarlo e incollarlo nelle Impostazioni della federazione di un altro repository come URL di un repository successivo. +release.hide_archive_links_helper = Nascondi gli archivi del codice sorgente generati automaticamente per questa versione. Ad esempio, se stai caricando i tuoi. +comments.edit.already_changed = Impossibile salvare le modifiche al commento. Sembra che il contenuto sia già stato modificato da un altro utente. Aggiornare la pagina e provare a modificare nuovamente per evitare di sovrascrivere le modifiche +settings.federation_following_repos = URL dei repository successivi. Separati da ";", senza spazi. +settings.federation_not_enabled = La federazione non è abilitata nella tua istanza. +settings.transfer.button = Trasferisci la proprietà +settings.transfer.modal.title = Trasferisci la proprietà +pulls.edit.already_changed = Impossibile salvare le modifiche alla richiesta di pull. Sembra che il contenuto sia già stato modificato da un altro utente. Aggiornare la pagina e provare a modificare nuovamente per evitare di sovrascrivere le modifiche +wiki.search = Cerca nel wiki +wiki.no_search_results = Nessun risultato [graphs] contributors.what = contribuzioni @@ -2889,6 +2904,7 @@ follow_blocked_user = Non puoi seguire questa organizzazione perché ti ha blocc form.name_reserved = Il nome di organizzazione "%s" è riservato. settings.email = Email di contatto settings.visibility.limited = Limitato (visibile solo agli utenti autenticati) +open_dashboard = Apri pannello di controllo [admin] dashboard=Pannello di Controllo @@ -3430,19 +3446,25 @@ auths.tip.gitlab_new = Registra una nuova applicazione su https://gitlab.com/-/p config_summary = Riepilogo config.open_with_editor_app_help = L'editor delle opzioni "Apri con" per il menu di clone. Se lasciato vuoto, verranno usati i default. Espandi per vedere i default. config_settings = Impostazioni +config.cache_test = Controllo cache +config.cache_test_failed = Fallito il controllo della cache: %v. +config.cache_test_succeeded = Successo nel controllo della cache, ottenuta una risposta in %s. +config.cache_test_slow = Successo nel controllo della cache, ma la risposta è lenta: %s. +config.app_slogan = Slogan dell'istanza +auths.default_domain_name = Nome di dominio predefinito utilizzato per l'indirizzo e-mail [action] create_repo=ha creato il repository %s rename_repo=repository rinominato da %[1]s a [3]s -create_issue=`ha aperto il problema %[3]s#%[2]s` +create_issue=`ha aperto la segnalazione %[3]s#%[2]s` close_issue=`ha chiuso il problema %[3]s#%[2]s` reopen_issue=`ha riaperto il problema %[3]s#%[2]s` create_pull_request=`ha creato la pull request %[3]s#%[2]s` close_pull_request=`ha chiuso la pull request %[3]s#%[2]s` reopen_pull_request=`ha riaperto la pull request %[3]s#%[2]s` -comment_issue=`ha commentato sul problema %[3]s#%[2]s` -comment_pull=`ha commentato su pull request %[3]s#%[2]s` +comment_issue=`ha commentato la segnalazione %[3]s#%[2]s` +comment_pull=`ha commentato la richiesta di modifica %[3]s#%[2]s` merge_pull_request=`ha unito il pull request %[3]s#%[2]s` transfer_repo=repository %s trasferito in %s push_tag=ha inviato il tag %[3]s su %[4]s @@ -3462,7 +3484,7 @@ review_dismissed_reason=Motivo: create_branch=ha creato il ramo %[3]s in %[4]s starred_repo=ha salvato come preferito %[2]s watched_repo=ha iniziato a guardare %[2]s -commit_repo = immesso a %[3]s a %[4]s +commit_repo = ha immesso nel ramo %[3]s presso %[4]s auto_merge_pull_request = `richiesta di modifica %[3]s#%[2]s fusa automaticamente` [tool] @@ -3673,6 +3695,7 @@ owner.settings.chef.keypair.description = Per autenticarsi al registro Chef è n owner.settings.cargo.initialize.success = L'indice di Cargo è stato creato correttamente. owner.settings.cargo.rebuild.no_index = Impossibile ricostruire, nessun indice è inizializzato. owner.settings.cargo.rebuild.description = La ricostruzione può essere utile se l'indice non è sincronizzato con i pacchetti Cargo conservati. +npm.dependencies.bundle = Dipendenze raggruppate [secrets] secrets = Segreti @@ -3779,6 +3802,14 @@ runs.no_workflows.quick_start = Non sai come iniziare con le Forgejo Actions? Ve runners.delete_runner_notice = Se un'attività è in esecuzione su questo esecutore sarà terminata ed etichettata fallito. Potrebbe rompere flussi di lavoro di costruzione. runners.task_list = Attività recenti su questo esecutore runs.no_job_without_needs = Il flusso di lavoro deve contenere almeno un incarico senza dipendenze. +workflow.dispatch.trigger_found = Questo flusso di lavoro ha un rilevatore di eventi workflow_dispatch. +workflow.dispatch.run = Esegui flusso di lavoro +workflow.dispatch.success = L'esecuzione del flusso di lavoro è stata richiesta con successo. +workflow.dispatch.input_required = Richiedi valore per l'ingresso "%s". +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 @@ -3823,6 +3854,7 @@ repo_kind = Cerca repository... exact_tooltip = Includi solo i risultati che corrispondono esattamente al termine di ricerca issue_kind = Cerca segnalazioni... pull_kind = Ricerca pull... +exact = Esatto [munits.data] gib = GiB diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index a91a481112..74d8561e00 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -1883,7 +1883,7 @@ pulls.outdated_with_base_branch=このブランチはベースブランチに対 pulls.close=プルリクエストをクローズ pulls.closed_at=`がプルリクエストをクローズ %[2]s` pulls.reopened_at=`がプルリクエストを再オープン %[2]s` -pulls.cmd_instruction_hint=`コマンドラインの手順を表示します。` +pulls.cmd_instruction_hint=`コマンドラインの手順 を表示します。` pulls.cmd_instruction_checkout_title=チェックアウト pulls.cmd_instruction_checkout_desc=プロジェクトリポジトリから新しいブランチをチェックアウトし、変更内容をテストします。 pulls.cmd_instruction_merge_title=マージ diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 460b0d351e..70746f1c2a 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -1801,7 +1801,7 @@ pulls.outdated_with_base_branch=Atzars ir novecojis salīdzinot ar bāzes atzaru 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.cmd_instruction_hint=`Apskatīt komandrindas izmantošanas norādes.` +pulls.cmd_instruction_hint=`Apskatīt komandrindas izmantošanas norādes.` pulls.cmd_instruction_checkout_title=Paņemt pulls.cmd_instruction_checkout_desc=Projekta repozitorijā jāizveido jauns atzars un jāpārbauda izmaiņas. pulls.cmd_instruction_merge_title=Sapludināt diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index 399e42de29..5a9fa78f88 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -2544,7 +2544,7 @@ 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.cmd_instruction_hint = `Bekijk opdrachtregelinstructies.` +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 pulls.reopen_failed.base_branch = De pull request kan niet worden heropend, omdat de base branch niet meer bestaat. diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 1778c865be..9deccb26bf 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -2584,7 +2584,7 @@ issues.role.collaborator = Colaborador(a) issues.label_archived_filter = Mostrar etiquetas arquivadas pulls.status_checks_hide_all = Esconder todas as verificações pulls.status_checks_show_all = Mostrar todas as verificações -pulls.cmd_instruction_hint = `Ver as instruções da linha de comando.` +pulls.cmd_instruction_hint = `Ver as instruções da linha de comando.` wiki.cancel = Cancelar settings.unarchive.success = O repositório foi desarquivado. settings.unarchive.button = Desarquivar repositório diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index 6a89b64262..047206dc5f 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -190,6 +190,8 @@ buttons.ref.tooltip=Referenciar uma questão ou um pedido de integração buttons.switch_to_legacy.tooltip=Usar o editor clássico buttons.enable_monospace_font=Habilitar tipo de letra mono-espaçado buttons.disable_monospace_font=Desabilitar tipo de letra mono-espaçado +buttons.indent.tooltip = Empacotar itens num nível +buttons.unindent.tooltip = Desempacotar itens por um nível [filter] string.asc=A - Z @@ -1896,7 +1898,7 @@ pulls.outdated_with_base_branch=Este ramo é obsoleto em relação ao ramo base pulls.close=Encerrar pedido de integração pulls.closed_at=`fechou este pedido de integração %[2]s` pulls.reopened_at=`reabriu este pedido de integração %[2]s` -pulls.cmd_instruction_hint=`Ver instruções para a linha de comandos.` +pulls.cmd_instruction_hint=`Ver instruções para a linha de comandos.` pulls.cmd_instruction_checkout_title=Conferir pulls.cmd_instruction_checkout_desc=No seu repositório, irá criar um novo ramo para que possa testar as modificações. pulls.cmd_instruction_merge_title=Integrar diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 0cce5b57ad..ea1707615a 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -294,7 +294,7 @@ enable_captcha=CAPTCHA для регистрации enable_captcha.description=Требовать прохождение CAPTCHA для регистрации учётных записей. require_sign_in_view=Требовать авторизацию для просмотра содержимого require_sign_in_view.description=Требовать наличие учётной записи для просмотра содержимого сервера. Посетители увидят лишь страницы входа и регистрации. -admin_setting.description=Создание учётной записи администратора необязательно. Первый зарегистрированный пользователь автоматически становится администратором. +admin_setting.description=Создание учётной записи администратора необязательно. Первый зарегистрировавшийся пользователь автоматически станет администратором. admin_title=Учётная запись администратора admin_name=Логин администратора admin_password=Пароль @@ -433,8 +433,8 @@ tab_signin = Войти tab_signup = Зарегистрироваться tab_openid=OpenID oauth_signup_tab=Зарегистрировать новую учётную запись -oauth_signup_title=Полная новая учётная запись -oauth_signup_submit=Полная учётная запись +oauth_signup_title=Завершение регистрации учётной записи +oauth_signup_submit=Завершить регистрацию oauth_signin_tab=Ссылка на существующую учётную запись oauth_signin_title=Войдите, чтобы авторизовать связанную учётную запись oauth_signin_submit=Привязать учётную запись @@ -699,7 +699,7 @@ avatar=Аватар ssh_gpg_keys=Ключи SSH / GPG social=Учётные записи в соцсетях applications=Приложения -orgs=Управление организациями +orgs=Организации repos=Репозитории delete=Удалить учётную запись twofa=Двухфакторная аутентификация (TOTP) @@ -773,8 +773,8 @@ password_change_disabled=Нелокальные учётные записи не emails=Адреса эл. почты manage_emails=Управление адресами эл. почты -manage_themes=Выберите тему по умолчанию -manage_openid=Управление адресами OpenID +manage_themes=Тема по умолчанию +manage_openid=Адреса OpenID email_desc=Ваш основной адрес эл. почты будет использоваться для уведомлений, восстановления пароля и, если он не скрыт, для действий с Git в веб-интерфейсе. theme_desc=Это будет темой по умолчанию для всего сайта. primary=Основной @@ -782,7 +782,7 @@ activated=Активирован requires_activation=Требуется активация primary_email=Сделать основным activate_email=Отправить активацию -activations_pending=Ожидает активации +activations_pending=Ожидают активации can_not_add_email_activations_pending=Ожидается активация. Если хотите добавить новый почтовый ящик, попробуйте еще раз через несколько минут. delete_email=Удалить email_deletion=Удалить адрес эл. почты @@ -794,7 +794,7 @@ openid_deletion=Удалить OpenID URI openid_deletion_desc=После удаления адреса OpenID вы не сможете войти в вашу учётную запись с его помощью. Вы уверены? openid_deletion_success=Адрес OpenID удален. add_new_email=Добавить адрес эл. почты -add_new_openid=Добавить новый OpenID URI +add_new_openid=Добавить новый URI OpenID add_email=Добавить адрес эл. почты add_openid=Добавить адрес OpenID add_email_confirmation_sent=Письмо для подтверждения отправлено на «%s». Пожалуйста, проверьте ваш почтовый ящик в течение %s, чтобы завершить процесс подтверждения. @@ -884,7 +884,7 @@ social_desc=Эти учётные записи социальных сетей unbind=Удалить связь unbind_success=Учётная запись социальной сети успешно удалена. -manage_access_token=Управление токенами +manage_access_token=Токены доступа generate_new_token=Создать новый токен tokens_desc=Эти токены предоставляют доступ к вашей учётной записи с помощью Forgejo API. token_name=Имя токена @@ -962,11 +962,11 @@ webauthn_delete_key=Удалить ключ безопасности webauthn_delete_key_desc=Если удалить ключ безопасности, его больше не выйдет использовать для входа. Продолжить? webauthn_key_loss_warning=Потеря ключей безопасности приведёт к утрате доступа к учётной записи. -manage_account_links=Управление привязанными учётными записями +manage_account_links=Привязанные учетные записи manage_account_links_desc=Эти сторонние учётные записи привязаны к вашей учётной записи Forgejo. account_links_not_available=У вас нет привязанных сторонних учётных записей. link_account=Привязать учётную запись -remove_account_link=Удалить привязанный аккаунт +remove_account_link=Удалить привязанную учётную запись remove_account_link_desc=Удаление привязанной учётной записи отменит её доступ к вашей учётной записи Forgejo. Продолжить? remove_account_link_success=Привязанная учётная запись удалена. @@ -1301,10 +1301,10 @@ editor.add_tmpl=Добавить «» editor.add=Добавить %s editor.update=Обновить %s editor.delete=Удалить %s -editor.patch=Применить патч +editor.patch=Применить правку editor.patching=Исправление: editor.fail_to_apply_patch=Невозможно применить патч «%s» -editor.new_patch=Новый патч +editor.new_patch=Новая правка editor.commit_message_desc=Добавьте необязательное расширенное описание… editor.signoff_desc=Добавить трейлер Signed-off-by с автором коммита в конце сообщения коммита. editor.commit_directly_to_this_branch=Сделайте коммит напрямую в ветку %s. @@ -1332,7 +1332,7 @@ editor.fail_to_update_file=Не удалось обновить/создать editor.fail_to_update_file_summary=Ошибка: editor.push_rejected_no_message=Изменение отклонено сервером без сообщения. Пожалуйста, проверьте Git-хуки. editor.push_rejected=Изменение отклонено сервером. Пожалуйста, проверьте Git-хуки. -editor.push_rejected_summary=Полное сообщение об отклонении: +editor.push_rejected_summary=Причина отклонения: editor.add_subdir=Добавить каталог… editor.unable_to_upload_files=Не удалось загрузить файлы в «%s» из-за ошибки: %v editor.upload_file_is_locked=Файл «%s» заблокирован %s. @@ -1869,7 +1869,7 @@ pulls.outdated_with_base_branch=Эта ветка отстает от базов pulls.close=Закрыть запрос на слияние pulls.closed_at=`закрыл этот запрос на слияние %[2]s` pulls.reopened_at=`переоткрыл этот запрос на слияние %[2]s` -pulls.cmd_instruction_hint=`Показать инструкции для командной строки.` +pulls.cmd_instruction_hint=`Показать инструкции для командной строки.` pulls.cmd_instruction_merge_title=Слейте изменения pulls.cmd_instruction_merge_desc=Слейте изменения и отправьте их обратно. pulls.clear_merge_message=Очистить сообщение о слиянии @@ -2650,7 +2650,7 @@ archive.title = Этот репозиторий архивирован. Вы м archive.title_date = С %s этот репозиторий архивирован. Вы можете просматривать его содержимое или клонировать, но не добавлять новые комиты, открывать задачи или запросы на слияние. migrate.forgejo.description = Перенести данные с codeberg.org или другого сервера Forgejo. generated = Сгенерированный -pulls.review_only_possible_for_full_diff = Отзыв возможен только при просмотре всех различий +pulls.review_only_possible_for_full_diff = Оставить отзыв можно только при просмотре всех различий diff.comment.add_line_comment = Добавить комментарий к строке tree_path_not_found_tag = Путь %[1]s отсутствует в теге %[2]s migrate_options_lfs_endpoint.placeholder = Если не заполнено, конечная точка будет определена из URL клонирования @@ -3406,7 +3406,7 @@ notices.system_notice_list=Системные оповещения notices.view_detail_header=Подробности уведомления notices.operations=Операции notices.select_all=Выбрать всё -notices.deselect_all=Отменить выделение +notices.deselect_all=Снять выделение notices.inverse_selection=Инверсия выделения notices.delete_selected=Удалить выбранные notices.delete_all=Удалить все уведомления diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini index f3acf9e4da..a6fb2934e3 100644 --- a/options/locale/locale_tr-TR.ini +++ b/options/locale/locale_tr-TR.ini @@ -1815,7 +1815,7 @@ 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.cmd_instruction_hint=`Komut satırı talimatlarını görüntüleyin.` +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. pulls.cmd_instruction_merge_title=Birleştir diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 9dc86d07ee..d8d50052ce 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -158,6 +158,7 @@ toggle_menu = 切换菜单 invalid_data = 无效数据:%v more_items = 显示更多 copy_generic = 复制到剪贴板 +test = 测试 [aria] navbar=导航栏 @@ -189,6 +190,8 @@ buttons.ref.tooltip=引用一个问题或拉取请求 buttons.switch_to_legacy.tooltip=使用旧版编辑器 buttons.enable_monospace_font=启用等宽字体 buttons.disable_monospace_font=禁用等宽字体 +buttons.unindent.tooltip = 解除一级嵌套条目 +buttons.indent.tooltip = 解除一级嵌套条目 [filter] string.asc=A - Z @@ -1887,7 +1890,7 @@ pulls.outdated_with_base_branch=此分支相比基础分支已过期 pulls.close=关闭合并请求 pulls.closed_at=`于 %[2]s 关闭此合并请求 ` pulls.reopened_at=`重新打开此合并请求 %[2]s` -pulls.cmd_instruction_hint=`查看 命令行提示。` +pulls.cmd_instruction_hint=`查看 命令行提示。` pulls.cmd_instruction_checkout_title=检出 pulls.cmd_instruction_checkout_desc=从你的仓库中检出一个新的分支并测试变更。 pulls.cmd_instruction_merge_title=合并 diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index fd73d62c1a..96774e6fe3 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -437,7 +437,7 @@ disable_forgot_password_mail=由於未設定電子郵件功能,帳號復原功 disable_forgot_password_mail_admin=帳號復原功能需要設定電子郵件功能才能使用。請設定電子郵件功能以啟用帳號復原。 email_domain_blacklisted=您無法使用您的電子信箱註冊帳號。 authorize_application=授權應用程式 -authorize_redirect_notice=如果您授權此應用程式,您將會被重新導向至 %s。 +authorize_redirect_notice=如果您授權此應用程式,您將會被轉址至 %s。 authorize_application_created_by=此應用程式是由 %s 建立的。 authorize_application_description=如果您允許,它將能夠讀取和修改您的所有帳號資訊,包括私有儲存庫和組織。 authorize_title=授權「%s」存取您的帳號? @@ -617,10 +617,10 @@ must_use_public_key=您提供的金鑰是私有金鑰,請勿上傳您的私有 unable_verify_ssh_key=無法驗證 SSH 金鑰,請再次檢查是否有錯誤。 auth_failed=授權認證失敗:%v -still_own_repo=您的帳號擁有至少一個儲存庫,請先刪除或轉移它們。 -still_has_org=您的帳號是至少一個組織的成員,請先離開它們。 +still_own_repo=您的帳號擁有一個或多個儲存庫,請先刪除或轉移它們。 +still_has_org=您的帳號是一個或多個組織的成員,請先離開它們。 still_own_packages=您的帳號擁有至少一個軟體包,請先刪除它們。 -org_still_own_repo=此組織仍然擁有一個以上的儲存庫,請先刪除或轉移它們。 +org_still_own_repo=此組織仍然擁有一個或多個的儲存庫,請先刪除或轉移它們。 org_still_own_packages=此組織仍然擁有至少一個軟體包,請先刪除它們。 target_branch_not_exist=目標分支不存在。 @@ -644,13 +644,13 @@ required_prefix = 輸入文字必須以「%s」開頭 change_avatar=更改大頭貼… repositories=儲存庫 activity=公開動態 -followers_few=%d 追蹤者 +followers_few=%d 位追蹤者 starred=已加星號的儲存庫 watched=關注的儲存庫 code=程式碼 projects=專案 overview=概覽 -following_few=%d 追蹤中 +following_few=追蹤 %d 個人 follow=追蹤 unfollow=取消追蹤 user_bio=個人簡介 @@ -667,8 +667,8 @@ settings = 使用者設定 block_user = 封鎖使用者 block_user.detail_1 = 該使用者已停止追踪您。 block_user.detail_2 = 這個使用者無法對您的儲存庫、您提出的問題或發表的留言做出任何操作。 -followers_one = %d 個追踪者 -following_one = 追踪 %d 個人 +followers_one = %d 位追蹤者 +following_one = 追蹤 %d 個人 block_user.detail_3 = 該使用者無法將您加為協作者,您也無法將其加為協作者。 follow_blocked_user = 因為這個使用者封鎖您或被您封鎖,您不能追蹤此使用者。 block = 封鎖 @@ -787,7 +787,7 @@ ssh_helper=需要協助嗎?建議可看看 GitHub 的文件 gpg_helper=需要協助嗎?建議可看看 GitHub 的 about GPG 文件。 add_new_key=新增 SSH 金鑰 add_new_gpg_key=新增 GPG 金鑰 -key_content_ssh_placeholder=以 「ssh-ed25519」、「ssh-rsa」、「ecdsa-sha2-nistp256」、「ecdsa-sha2-nistp384」、「ecdsa-sha2-nistp521」、「sk-ecdsa-sha2-nistp256@openssh.com」、或 「sk-ssh-ed25519@openssh.com」 開頭 +key_content_ssh_placeholder=以 「ssh-ed25519」、「ssh-rsa」、「ecdsa-sha2-nistp256」、「ecdsa-sha2-nistp384」、「ecdsa-sha2-nistp521」、「sk-ecdsa-sha2-nistp256@openssh.com」或 「sk-ssh-ed25519@openssh.com」 開頭 key_content_gpg_placeholder=以 「-----BEGIN PGP PUBLIC KEY BLOCK-----」 開頭 add_new_principal=新增主體 ssh_key_been_used=此 SSH 金鑰早已加入本伺服器。 @@ -853,7 +853,7 @@ unbind=解除連結 manage_access_token=管理存取符記 generate_new_token=產生新的符記 -tokens_desc=這些符記透過 Forgejo API 獲得存取您帳號的權限。 +tokens_desc=這些符記透過 Forgejo API 授予存取您帳號的權限。 token_name=符記名稱 generate_token=產生符記 generate_token_success=已經產生新的符記。請立刻複製它,因為它將不會被再次顯示。 @@ -870,10 +870,10 @@ permission_read=讀取 manage_oauth2_applications=管理 OAuth2 應用程式 edit_oauth2_application=編輯 OAuth2 應用程式 oauth2_applications_desc=OAuth2 應用程式讓您的第三方應用程式安全地驗證此 Forgejo 站點中的使用者。 -remove_oauth2_application=刪除 OAuth2 應用程式 +remove_oauth2_application=移除 OAuth2 應用程式 remove_oauth2_application_desc=刪除 OAuth2 應用程式將會撤銷所有已簽署的存取符記之存取權。是否繼續? -remove_oauth2_application_success=已刪除應用程式。 -create_oauth2_application=新增 OAuth2 應用程式 +remove_oauth2_application_success=已移除應用程式。 +create_oauth2_application=建立新的 OAuth2 應用程式 create_oauth2_application_button=建立應用程式 oauth2_application_name=應用程式名稱 oauth2_confidential_client=機密客戶端 (Confidential Client)。請為能保持機密性的程式勾選,例如網頁應用程式。使用原生程式時不要勾選,包含桌面、行動應用程式。 @@ -915,10 +915,10 @@ webauthn_delete_key_desc=如果您移除安全金鑰,將不能再使用它登 manage_account_links=連結的帳號 manage_account_links_desc=這些外部帳號已連結至您的 Forgejo 帳號。 -account_links_not_available=目前沒有外部帳號連結到您的 Forgejo 帳號。 +account_links_not_available=目前沒有外部帳號連結至您的 Forgejo 帳號。 link_account=連結帳號 remove_account_link=刪除連結的帳號 -remove_account_link_desc=移除連結帳號將撤銷其對 Forgejo 帳號的存取權限。是否繼續? +remove_account_link_desc=移除連結帳號將撤銷其對 Forgejo 帳號的存取權限。要繼續嗎? remove_account_link_success=已移除連結的帳號。 @@ -942,18 +942,18 @@ visibility.public=公開 visibility.public_tooltip=所有人都可以看到 visibility.limited=受限 visibility.private=私有 -blocked_users_none = 您沒有封鎖任何使用者 。 +blocked_users_none = 沒有任何被封鎖的使用者 。 blocked_users = 封鎖的使用者 hints = 提示 update_hints = 更新提示 update_hints_success = 提示已被更改。 added_on = 於 %s 新增 biography_placeholder = 和我們介紹一下您自己吧!(您可以使用 Markdown) -location_placeholder = 與其他人分享您的地理位置 +location_placeholder = 與其他人分享您粗略的地理位置 profile_desc = 管理其他人如何看到您的個人資料。通知、密碼復原和網頁上的 Git 操作會使用您的主要電子信箱。 hidden_comment_types.ref_tooltip = 註記哪些問題/提交/… 提及了此問題 keep_activity_private = 隱藏個人頁面中的活動資料 -uploaded_avatar_is_too_big = 上傳檔案的大小 (%d KiB)超過了上限 (%d KiB )。 +uploaded_avatar_is_too_big = 上傳檔案的大小 (%d KiB)超過了上限 (%d KiB )。 select_permissions = 選擇權限 permission_write = 讀寫 permissions_list = 權限: @@ -970,7 +970,7 @@ social_desc = 這些社群帳號可以被用來登入您的帳號。請確保您 unbind_success = 已成功移除該社群帳號。 create_oauth2_application_success = 您已成功建立一個新的 OAuth2 應用程式。 change_username_prompt = 註:更改您的使用者名稱也會更改您的帳號 URL。 -change_username_redirect_prompt = 舊的使用者名稱在其他使用者認領之前將會轉址到新的使用者名稱。 +change_username_redirect_prompt = 舊的使用者名稱在被其他使用者認領之前將會轉址到新的使用者名稱。 visibility.limited_tooltip = 只有已登入的使用者能看見 visibility.private_tooltip = 只有您加入的組織之成員能看見 keep_email_private_popup = 這將在您的個人資料頁面、合併請求或網頁檔案編輯器中隱藏您的電子信箱地址。已推送的提交不會被修改。在提交中使用 %s 來將其連結至您的帳號。 @@ -980,7 +980,7 @@ pronouns_custom = 自訂 oauth2_client_secret_hint = 這把密鑰在您離開或重新整理此頁面後將不再被顯示。請確保您已儲存它。 additional_repo_units_hint_description = 在沒有啟用所有模組的儲存庫中顯示「新增更多模組…」按鈕。 hidden_comment_types.issue_ref_tooltip = 使用者更改與問題相關分支/標籤的留言 -pronouns = 代名詞 +pronouns = 稱謂語 update_oauth2_application_success = 您已成功更新該 OAuth2 應用程式。 oauth2_redirect_uris = 轉址 URI。每個 URI 應各佔一行。 pronouns_unspecified = 未指定 @@ -997,7 +997,7 @@ webauthn_key_loss_warning = 如果您弄丟了您的安全金鑰,您將無法 user_unblock_success = 已成功解除對此使用者的封鎖。 webauthn_alternative_tip = 您可能想新增一個額外的驗證方法。 user_block_success = 已成功封鎖此使用者。 -access_token_desc = 已選擇的符記僅授權相對應的 API 路徑。請參閱文件來了解更多。 +access_token_desc = 選擇的符記僅授權相對應的 API路徑。請參閱文件來了解更多。 oauth2_application_locked = 可以在組態中設定 Forgejo 預先註冊一些 OAuth2 應用程式。為了避免不可預料的情況,它們無法被編輯或是移除。請參閱 OAuth2 文件來了解更多。 hidden_comment_types_description = 在這裡選取的留言種類將不會顯示於問題頁面中。舉例來說,核取「標籤」將隱藏所有「使用者新增/移除了<標籤>」留言。 authorized_oauth2_applications_description = 您已授權給這些第三方應用程式取用您的 Forgejo 個人帳號的權限。請撤銷您不再使用的應用程式的權限。 @@ -1042,7 +1042,7 @@ license_helper_desc=授權條款定義了他人使用您原始碼的允許和禁 readme=讀我檔案 readme_helper=選擇讀我檔案範本。 readme_helper_desc=這是您能為專案撰寫完整描述的地方。 -auto_init=初始化儲存庫 (加入 .gitignore、授權條款、讀我檔案) +auto_init=初始化儲存庫(加入 .gitignore、授權條款、讀我檔案) trust_model_helper=選擇簽署驗證的信任模型。可用的選項: trust_model_helper_collaborator=協作者: 信任協作者的簽署 trust_model_helper_committer=提交者: 信任與提交者相符的簽署 @@ -1053,7 +1053,7 @@ default_branch=預設分支 default_branch_helper=預設分支是合併請求和提交程式碼的基底分支。 mirror_prune=裁減 mirror_prune_desc=刪除過時的遠端追蹤參考 -mirror_interval=鏡像週期(有效時間單位為「h」、「m」、「s」),設為 0 以停用定期同步。(最小值為:%s) +mirror_interval=鏡像週期(有效時間單位為「h」、「m」、「s」)。設為 0 以停用定期同步。(最小值為:%s) mirror_interval_invalid=鏡像週期無效。 mirror_sync_on_commit=推送提交後進行同步 mirror_address=從 URL Clone @@ -1249,7 +1249,7 @@ editor.add_file=新增檔案 editor.new_file=建立新檔案 editor.upload_file=上傳檔案 editor.edit_file=編輯檔案 -editor.preview_changes=預覽更改 +editor.preview_changes=預覽變更 editor.cannot_edit_lfs_files=無法在 web 介面中編輯 LFS 檔。 editor.cannot_edit_non_text_files=網站介面不能編輯二進位檔案。 editor.edit_this_file=編輯檔案 @@ -1263,7 +1263,7 @@ editor.name_your_file=命名您的檔案… editor.filename_help=輸入名稱和斜線("/") 以新增目錄。在文字框開始處輸入退格鍵以移除目錄。 editor.or=或 editor.cancel_lower=取消 -editor.commit_signed_changes=提交簽署過的變更 +editor.commit_signed_changes=提交簽署的變更 editor.commit_changes=提交變更 editor.add_tmpl=新增「」 editor.add=新增 %s @@ -1286,14 +1286,14 @@ 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=你準備提交的檔案是空白的,是否繼續? editor.no_changes_to_show=沒有可以顯示的變更。 editor.fail_to_update_file=更新/建立檔案「%s」失敗。 editor.fail_to_update_file_summary=錯誤訊息: -editor.push_rejected_no_message=該變更被伺服器拒絕,它未提供其他資訊。請檢查 Git Hook。 +editor.push_rejected_no_message=該變更被伺服器拒絕,它未提供其他訊息。請檢查 Git Hook。 editor.push_rejected=該變更被伺服器拒絕。請檢查 Git Hook。 editor.push_rejected_summary=完整的拒絕訊息: editor.add_subdir=加入目錄… @@ -1979,13 +1979,13 @@ settings.use_internal_wiki=使用內建 Wiki settings.use_external_wiki=使用外部 Wiki settings.external_wiki_url=外部 Wiki 連結 settings.external_wiki_url_error=外部 Wiki 網址不是有效的網址。 -settings.external_wiki_url_desc=點擊問題標籤時,使用者會被導向到外部 Wiki URL。 +settings.external_wiki_url_desc=點擊百科分頁時,使用者會被轉址至外部百科的 URL。 settings.issues_desc=啟用儲存庫問題追蹤器 settings.use_internal_issue_tracker=使用內建問題追蹤器 settings.use_external_issue_tracker=使用外部問題追蹤器 settings.external_tracker_url=外部問題追蹤器 URL settings.external_tracker_url_error=該外部問題追蹤器 URL 無效。 -settings.external_tracker_url_desc=點擊問題頁籤時,使用者會被導向至外部問題追蹤器 URL。 +settings.external_tracker_url_desc=點擊問題頁籤時,使用者會被轉址至外部問題追蹤器 URL。 settings.tracker_url_format=外部問題追蹤器的 URL 格式 settings.tracker_url_format_error=該外部問題追蹤器 URL 格式無效。 settings.tracker_issue_style=外部問題追蹤器的編號格式 @@ -2487,8 +2487,8 @@ mirror_sync = 已同步 commit.contained_in_default_branch = 這個提交是預設分支的一部分 editor.invalid_commit_mail = 用於建立提交的信箱無效。 admin.update_flags = 更新旗標 -admin.failed_to_replace_flags = 儲存庫旗標更新失敗 -admin.flags_replaced = 儲存庫旗標已被更換 +admin.failed_to_replace_flags = 儲存庫旗標替換失敗 +admin.flags_replaced = 已替換儲存庫旗標 default_branch_label = 預設 tree_path_not_found_tag = 路徑 %[1]s 不存在於標籤 %[2]s 中 tree_path_not_found_commit = 路徑 %[1]s 不存在於提交 %[2]s 中 @@ -2513,7 +2513,7 @@ migrate.cancel_migrating_confirm = 您確定要取消這次的遷移嗎? invisible_runes_header = `此檔案內含不可見的 Unicode 字元` ambiguous_runes_header = `這個檔案內含模棱兩可的 Unicode 字元` rss.must_be_on_branch = 您必須在一個分支上才能訂閱 RSS。 -admin.enabled_flags = 該儲存庫的旗標: +admin.enabled_flags = 該儲存庫啟用的旗標: mirror_address_protocol_invalid = 輸入的 URL 無效。只有 https(s):// 或 git:// 連結可以被設定為鏡像來源。 ambiguous_runes_description = `這個檔案內含容易造成混淆的 Unicode 字元。如果您覺得這是檔案作者的本意,您可以安全的忽略這則訊息。按下 Escape 可以顯示這些字元。` commit.contained_in = 這個提交存在於: @@ -2606,7 +2606,7 @@ pulls.commit_ref_at = `在提交 %[2]s 引用了 pulls.cmd_instruction_checkout_desc = 從您的專案儲存庫 checkout 一個新的分支來測試這些更改。 pulls.cmd_instruction_merge_title = 合併 pulls.ready_for_review = 可以開始審閱了嗎? -pulls.cmd_instruction_hint = `檢視命令列指示` +pulls.cmd_instruction_hint = `檢視 命令列指示` file_follow = 跟隨象徵式連結 milestones.filter_sort.earliest_due_data = 最早到期日 size_format = %[1]s:%[2]s,%[3]s:%[4]s @@ -2693,7 +2693,7 @@ settings.visibility.private_shortname=私有 settings.update_settings=更新設定 settings.update_setting_success=組織設定已更新。 -settings.change_orgname_redirect_prompt=舊的名稱被領用前,會重新導向新名稱。 +settings.change_orgname_redirect_prompt=舊的名稱被領用前將會轉址至新名稱。 settings.update_avatar_success=已更新組織的大頭貼。 settings.delete=刪除組織 settings.delete_account=刪除這個組織 From e4c640a27529547b5b9ba9b44503a56eb976e479 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 11 Jul 2024 08:08:39 +0000 Subject: [PATCH 021/128] Lock file maintenance --- package-lock.json | 349 ++++++++++++++--------------- web_src/fomantic/package-lock.json | 71 +++--- 2 files changed, 198 insertions(+), 222 deletions(-) diff --git a/package-lock.json b/package-lock.json index 17ed901277..47c3db86d1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -461,9 +461,9 @@ } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.0.tgz", - "integrity": "sha512-qvBMcOU/uWFCH/VO0MYe0AMs0BGMWAt6FTryMbFIKYtZtVnqTZtT8ktv5o718llkaGZWomJezJZjq3vJDHeJNQ==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz", + "integrity": "sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==", "dev": true, "funding": [ { @@ -480,13 +480,13 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^2.3.2" + "@csstools/css-tokenizer": "^2.4.1" } }, "node_modules/@csstools/css-tokenizer": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.3.3.tgz", - "integrity": "sha512-fTaF0vRcXVJ4cmwg8nHofydDjitKMDBzC8cCu+O/Lg13C4PdkC15GVjGpbmWauOOnhomVSTg5I5LpLJFJE2Hfw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.4.1.tgz", + "integrity": "sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==", "dev": true, "funding": [ { @@ -504,9 +504,9 @@ } }, "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.12.tgz", - "integrity": "sha512-t1/CdyVJzOQUiGUcIBXRzTAkWTFPxiPnoKwowKW2z9Uj78c2bBWI/X94BeVfUwVq1xtCjD7dnO8kS6WONgp8Jw==", + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.13.tgz", + "integrity": "sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==", "dev": true, "funding": [ { @@ -523,8 +523,8 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.7.0", - "@csstools/css-tokenizer": "^2.3.2" + "@csstools/css-parser-algorithms": "^2.7.1", + "@csstools/css-tokenizer": "^2.4.1" } }, "node_modules/@csstools/selector-resolve-nested": { @@ -1337,9 +1337,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { @@ -1583,9 +1583,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", - "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz", + "integrity": "sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==", "cpu": [ "arm" ], @@ -1597,9 +1597,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", - "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz", + "integrity": "sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==", "cpu": [ "arm64" ], @@ -1611,9 +1611,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", - "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz", + "integrity": "sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==", "cpu": [ "arm64" ], @@ -1625,9 +1625,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", - "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz", + "integrity": "sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==", "cpu": [ "x64" ], @@ -1639,9 +1639,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", - "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz", + "integrity": "sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==", "cpu": [ "arm" ], @@ -1653,9 +1653,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", - "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz", + "integrity": "sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==", "cpu": [ "arm" ], @@ -1667,9 +1667,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", - "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz", + "integrity": "sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==", "cpu": [ "arm64" ], @@ -1681,9 +1681,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", - "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz", + "integrity": "sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==", "cpu": [ "arm64" ], @@ -1695,9 +1695,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", - "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz", + "integrity": "sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==", "cpu": [ "ppc64" ], @@ -1709,9 +1709,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", - "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz", + "integrity": "sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==", "cpu": [ "riscv64" ], @@ -1723,9 +1723,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", - "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz", + "integrity": "sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==", "cpu": [ "s390x" ], @@ -1737,9 +1737,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", - "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz", + "integrity": "sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==", "cpu": [ "x64" ], @@ -1751,9 +1751,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", - "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz", + "integrity": "sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==", "cpu": [ "x64" ], @@ -1765,9 +1765,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", - "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz", + "integrity": "sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==", "cpu": [ "arm64" ], @@ -1779,9 +1779,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", - "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz", + "integrity": "sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==", "cpu": [ "ia32" ], @@ -1793,9 +1793,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", - "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz", + "integrity": "sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==", "cpu": [ "x64" ], @@ -2512,9 +2512,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.14.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", - "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", + "version": "20.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", + "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", "license": "MIT", "dependencies": { "undici-types": "~5.26.4" @@ -2557,17 +2557,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.15.0.tgz", - "integrity": "sha512-uiNHpyjZtFrLwLDpHnzaDlP3Tt6sGMqTCiqmxaN4n4RP0EfYZDODJyddiFDF44Hjwxr5xAcaYxVKm9QKQFJFLA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.0.tgz", + "integrity": "sha512-py1miT6iQpJcs1BiJjm54AMzeuMPBSPuKPlnT8HlfudbcS5rYeX5jajpLf3mrdRh9dA/Ec2FVUY0ifeVNDIhZw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.15.0", - "@typescript-eslint/type-utils": "7.15.0", - "@typescript-eslint/utils": "7.15.0", - "@typescript-eslint/visitor-keys": "7.15.0", + "@typescript-eslint/scope-manager": "7.16.0", + "@typescript-eslint/type-utils": "7.16.0", + "@typescript-eslint/utils": "7.16.0", + "@typescript-eslint/visitor-keys": "7.16.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -2591,16 +2591,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.15.0.tgz", - "integrity": "sha512-k9fYuQNnypLFcqORNClRykkGOMOj+pV6V91R4GO/l1FDGwpqmSwoOQrOHo3cGaH63e+D3ZiCAOsuS/D2c99j/A==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.0.tgz", + "integrity": "sha512-ar9E+k7CU8rWi2e5ErzQiC93KKEFAXA2Kky0scAlPcxYblLt8+XZuHUZwlyfXILyQa95P6lQg+eZgh/dDs3+Vw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "7.15.0", - "@typescript-eslint/types": "7.15.0", - "@typescript-eslint/typescript-estree": "7.15.0", - "@typescript-eslint/visitor-keys": "7.15.0", + "@typescript-eslint/scope-manager": "7.16.0", + "@typescript-eslint/types": "7.16.0", + "@typescript-eslint/typescript-estree": "7.16.0", + "@typescript-eslint/visitor-keys": "7.16.0", "debug": "^4.3.4" }, "engines": { @@ -2620,14 +2620,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.15.0.tgz", - "integrity": "sha512-Q/1yrF/XbxOTvttNVPihxh1b9fxamjEoz2Os/Pe38OHwxC24CyCqXxGTOdpb4lt6HYtqw9HetA/Rf6gDGaMPlw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.0.tgz", + "integrity": "sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.15.0", - "@typescript-eslint/visitor-keys": "7.15.0" + "@typescript-eslint/types": "7.16.0", + "@typescript-eslint/visitor-keys": "7.16.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2638,14 +2638,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.15.0.tgz", - "integrity": "sha512-SkgriaeV6PDvpA6253PDVep0qCqgbO1IOBiycjnXsszNTVQe5flN5wR5jiczoEoDEnAqYFSFFc9al9BSGVltkg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.0.tgz", + "integrity": "sha512-j0fuUswUjDHfqV/UdW6mLtOQQseORqfdmoBNDFOqs9rvNVR2e+cmu6zJu/Ku4SDuqiJko6YnhwcL8x45r8Oqxg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "7.15.0", - "@typescript-eslint/utils": "7.15.0", + "@typescript-eslint/typescript-estree": "7.16.0", + "@typescript-eslint/utils": "7.16.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -2666,9 +2666,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.15.0.tgz", - "integrity": "sha512-aV1+B1+ySXbQH0pLK0rx66I3IkiZNidYobyfn0WFsdGhSXw+P3YOqeTq5GED458SfB24tg+ux3S+9g118hjlTw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.0.tgz", + "integrity": "sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==", "dev": true, "license": "MIT", "engines": { @@ -2680,14 +2680,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.15.0.tgz", - "integrity": "sha512-gjyB/rHAopL/XxfmYThQbXbzRMGhZzGw6KpcMbfe8Q3nNQKStpxnUKeXb0KiN/fFDR42Z43szs6rY7eHk0zdGQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.0.tgz", + "integrity": "sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "7.15.0", - "@typescript-eslint/visitor-keys": "7.15.0", + "@typescript-eslint/types": "7.16.0", + "@typescript-eslint/visitor-keys": "7.16.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2709,16 +2709,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.15.0.tgz", - "integrity": "sha512-hfDMDqaqOqsUVGiEPSMLR/AjTSCsmJwjpKkYQRo1FNbmW4tBwBspYDwO9eh7sKSTwMQgBw9/T4DHudPaqshRWA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.0.tgz", + "integrity": "sha512-PqP4kP3hb4r7Jav+NiRCntlVzhxBNWq6ZQ+zQwII1y/G/1gdIPeYDCKr2+dH6049yJQsWZiHU6RlwvIFBXXGNA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.15.0", - "@typescript-eslint/types": "7.15.0", - "@typescript-eslint/typescript-estree": "7.15.0" + "@typescript-eslint/scope-manager": "7.16.0", + "@typescript-eslint/types": "7.16.0", + "@typescript-eslint/typescript-estree": "7.16.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2732,13 +2732,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.15.0.tgz", - "integrity": "sha512-Hqgy/ETgpt2L5xueA/zHHIl4fJI2O4XUE9l4+OIfbJIRSnTJb/QscncdqqZzofQegIJugRIF57OJea1khw2SDw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.0.tgz", + "integrity": "sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.15.0", + "@typescript-eslint/types": "7.16.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -3820,9 +3820,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", + "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", "funding": [ { "type": "opencollective", @@ -3839,10 +3839,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", + "caniuse-lite": "^1.0.30001640", + "electron-to-chromium": "^1.4.820", "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -3950,9 +3950,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001640", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz", - "integrity": "sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==", + "version": "1.0.30001641", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001641.tgz", + "integrity": "sha512-Phv5thgl67bHYo1TtMY/MurjkHhV4EDaCosezRXgZ8jzA/Ub+wjxAvbGvjoFENStinwi5kCyOYV3mi5tOGykwA==", "funding": [ { "type": "opencollective", @@ -5357,9 +5357,9 @@ } }, "node_modules/dompurify": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.5.tgz", - "integrity": "sha512-lwG+n5h8QNpxtyrJW/gJWckL+1/DQiYMX8f7t8Z2AZTPw1esVrqjI63i7Zc2Gz0aKzLVMYC1V1PL/ky+aY/NgA==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.6.tgz", + "integrity": "sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==", "license": "(MPL-2.0 OR Apache-2.0)" }, "node_modules/domutils": { @@ -5442,9 +5442,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.816", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.816.tgz", - "integrity": "sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw==", + "version": "1.4.825", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.825.tgz", + "integrity": "sha512-OCcF+LwdgFGcsYPYC5keEEFC2XT0gBhrYbeGzHCx7i9qRFbzO/AqTmc/C/1xNhJj+JA7rzlN7mpBuStshh96Cg==", "license": "ISC" }, "node_modules/elkjs": { @@ -6631,9 +6631,9 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -8291,16 +8291,13 @@ } }, "node_modules/jackspeak": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", - "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -8375,9 +8372,9 @@ } }, "node_modules/js-beautify/node_modules/glob": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", - "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "license": "ISC", "dependencies": { @@ -8391,9 +8388,6 @@ "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -8953,13 +8947,10 @@ } }, "node_modules/lru-cache": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", - "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" }, "node_modules/magic-string": { "version": "0.25.9", @@ -9071,9 +9062,9 @@ } }, "node_modules/markdownlint-cli/node_modules/glob": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", - "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "license": "ISC", "dependencies": { @@ -9087,9 +9078,6 @@ "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -12511,9 +12499,9 @@ } }, "node_modules/sucrase/node_modules/glob": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", - "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -12526,9 +12514,6 @@ "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -12745,9 +12730,9 @@ "license": "ISC" }, "node_modules/terser": { - "version": "5.31.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", - "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", + "version": "5.31.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.2.tgz", + "integrity": "sha512-LGyRZVFm/QElZHy/CPr/O4eNZOZIzsrQ92y4v9UJe/pFJjypje2yI3C2FmPtvUEnhadlSbmG2nXtdcjHOjCfxw==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -13957,9 +13942,9 @@ } }, "node_modules/vite/node_modules/rollup": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", - "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.1.tgz", + "integrity": "sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==", "dev": true, "license": "MIT", "dependencies": { @@ -13973,22 +13958,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.18.0", - "@rollup/rollup-android-arm64": "4.18.0", - "@rollup/rollup-darwin-arm64": "4.18.0", - "@rollup/rollup-darwin-x64": "4.18.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", - "@rollup/rollup-linux-arm-musleabihf": "4.18.0", - "@rollup/rollup-linux-arm64-gnu": "4.18.0", - "@rollup/rollup-linux-arm64-musl": "4.18.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", - "@rollup/rollup-linux-riscv64-gnu": "4.18.0", - "@rollup/rollup-linux-s390x-gnu": "4.18.0", - "@rollup/rollup-linux-x64-gnu": "4.18.0", - "@rollup/rollup-linux-x64-musl": "4.18.0", - "@rollup/rollup-win32-arm64-msvc": "4.18.0", - "@rollup/rollup-win32-ia32-msvc": "4.18.0", - "@rollup/rollup-win32-x64-msvc": "4.18.0", + "@rollup/rollup-android-arm-eabi": "4.18.1", + "@rollup/rollup-android-arm64": "4.18.1", + "@rollup/rollup-darwin-arm64": "4.18.1", + "@rollup/rollup-darwin-x64": "4.18.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.1", + "@rollup/rollup-linux-arm-musleabihf": "4.18.1", + "@rollup/rollup-linux-arm64-gnu": "4.18.1", + "@rollup/rollup-linux-arm64-musl": "4.18.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.1", + "@rollup/rollup-linux-riscv64-gnu": "4.18.1", + "@rollup/rollup-linux-s390x-gnu": "4.18.1", + "@rollup/rollup-linux-x64-gnu": "4.18.1", + "@rollup/rollup-linux-x64-musl": "4.18.1", + "@rollup/rollup-win32-arm64-msvc": "4.18.1", + "@rollup/rollup-win32-ia32-msvc": "4.18.1", + "@rollup/rollup-win32-x64-msvc": "4.18.1", "fsevents": "~2.3.2" } }, @@ -14532,9 +14517,9 @@ } }, "node_modules/why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", "dependencies": { diff --git a/web_src/fomantic/package-lock.json b/web_src/fomantic/package-lock.json index a79faa6121..09f9bbcde7 100644 --- a/web_src/fomantic/package-lock.json +++ b/web_src/fomantic/package-lock.json @@ -198,9 +198,9 @@ } }, "node_modules/@octokit/core/node_modules/@octokit/request-error": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.1.tgz", - "integrity": "sha512-1mw1gqT3fR/WFvnoVpY/zUM2o/XkMs/2AszUUG9I69xn0JFLv6PGkPhNk5lbfvROs79wiS0bqiJNxfCZcRJJdg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.2.tgz", + "integrity": "sha512-sA0oF7aL5wXbNfl+7zgLYJiFZctei9GaIMJlTraJrlQyFaoIYr4MCqPSakzxxGCfm8fET4vn0cQdRFmD7avlDg==", "license": "MIT", "peer": true, "dependencies": { @@ -304,9 +304,9 @@ } }, "node_modules/@octokit/graphql/node_modules/@octokit/request-error": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.1.tgz", - "integrity": "sha512-1mw1gqT3fR/WFvnoVpY/zUM2o/XkMs/2AszUUG9I69xn0JFLv6PGkPhNk5lbfvROs79wiS0bqiJNxfCZcRJJdg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.2.tgz", + "integrity": "sha512-sA0oF7aL5wXbNfl+7zgLYJiFZctei9GaIMJlTraJrlQyFaoIYr4MCqPSakzxxGCfm8fET4vn0cQdRFmD7avlDg==", "license": "MIT", "peer": true, "dependencies": { @@ -492,9 +492,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.14.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", - "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", + "version": "20.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", + "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", "license": "MIT", "dependencies": { "undici-types": "~5.26.4" @@ -1115,9 +1115,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", + "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", "funding": [ { "type": "opencollective", @@ -1134,10 +1134,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", + "caniuse-lite": "^1.0.30001640", + "electron-to-chromium": "^1.4.820", "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -1219,9 +1219,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001640", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz", - "integrity": "sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==", + "version": "1.0.30001641", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001641.tgz", + "integrity": "sha512-Phv5thgl67bHYo1TtMY/MurjkHhV4EDaCosezRXgZ8jzA/Ub+wjxAvbGvjoFENStinwi5kCyOYV3mi5tOGykwA==", "funding": [ { "type": "opencollective", @@ -1962,9 +1962,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.816", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.816.tgz", - "integrity": "sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw==", + "version": "1.4.825", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.825.tgz", + "integrity": "sha512-OCcF+LwdgFGcsYPYC5keEEFC2XT0gBhrYbeGzHCx7i9qRFbzO/AqTmc/C/1xNhJj+JA7rzlN7mpBuStshh96Cg==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -4912,16 +4912,13 @@ } }, "node_modules/jackspeak": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", - "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -4966,9 +4963,9 @@ } }, "node_modules/js-beautify/node_modules/glob": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", - "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -4981,9 +4978,6 @@ "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -5425,13 +5419,10 @@ } }, "node_modules/lru-cache": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", - "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" }, "node_modules/macos-release": { "version": "2.5.1", From ab23e0159b6ba15fdb8d7046d1efd4b5af8ca353 Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Fri, 12 Jul 2024 13:09:13 +0000 Subject: [PATCH 022/128] [v8.0/forgejo] Improvements to English locale (#4460) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/4453 A few fixes and improvements. Notable changes: - `issues.ref_closing_from` now makes sense. https://codeberg.org/attachments/c091cc42-f0bf-4a14-8e43-8c66ead5ef06 - `pulls.cmd_instruction_hint`: removed full stop. https://codeberg.org/attachments/41fcf979-3a5b-48f8-9e60-bde0b06dd522 - `settings.wiki_rename_branch_main_desc`: fix based on change in stalled 3546 so the sentence makes sense. - `find_file.go_to_file`: better describe what the button does https://codeberg.org/attachments/e181e486-3376-446d-a994-bfe65c125a70 - `repos.unadopted.no_more`: it's also shown when there are no results, not when the server "ran out of results" https://codeberg.org/attachments/9077cbc4-f9e7-4ee5-ad86-6cfff41fec37 - `security.txt`: rephrase to decrease brokenness of English. - `translation_meta`: added a special string, can be used to trigger Weblate to create a PR, which is usable for debugging Co-authors: - https://codeberg.org/Cyborus - https://codeberg.org/toolforger - https://codeberg.org/woutput Co-authored-by: 0ko <0ko@noreply.codeberg.org> Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/4460 Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- options/locale/locale_en-US.ini | 17 ++++++++++------- public/.well-known/security.txt | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 1d8da735cf..a8b1a9c323 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1075,7 +1075,7 @@ license = License license_helper = Select a license file. license_helper_desc = A license governs what others can and can't do with your code. Not sure which one is right for your project? See Choose a license. object_format = Object format -object_format_helper = Object format of the repository. Cannot be changed later. SHA1 is most compatible. +object_format_helper = Object format of the repository. Cannot be changed later. SHA1 is the most compatible. readme = README readme_helper = Select a README file template. readme_helper_desc = This is the place where you can write a complete description for your project. @@ -1614,8 +1614,8 @@ 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 a pull request %[4]s that will close this issue %[2]s` -issues.ref_reopening_from = `referenced a pull request %[4]s that will reopen this issue %[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.ref_from = `from %[1]s` @@ -1936,7 +1936,7 @@ 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.cmd_instruction_hint = `View command line instructions.` +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. pulls.cmd_instruction_merge_title = Merge @@ -2265,7 +2265,7 @@ settings.trust_model.collaboratorcommitter = Collaborator+Committer settings.trust_model.collaboratorcommitter.long = Collaborator+Committer: Trust signatures by collaborators which match the committer settings.trust_model.collaboratorcommitter.desc = Valid signatures by collaborators of this repository will be marked "trusted" if they match the committer. Otherwise, valid signatures will be marked "untrusted" if the signature matches the committer and "unmatched" otherwise. This will force Forgejo to be marked as the committer on signed commits with the actual committer marked as Co-Authored-By: and Co-Committed-By: trailer in the commit. The default Forgejo key must match a User in the database. settings.wiki_rename_branch_main = Normalize the Wiki branch name -settings.wiki_rename_branch_main_desc = Rename the branch used internally by the Wiki to "%s". This is a permanent and cannot be undone. +settings.wiki_rename_branch_main_desc = Rename the branch used internally by the Wiki to "%s". This change is permanent and cannot be undone. settings.wiki_rename_branch_main_notices_1 = This operation CANNOT be undone. settings.wiki_rename_branch_main_notices_2 = This will permanently rename the the internal branch of %s's repository wiki. Existing checkouts will need to be updated. settings.wiki_branch_rename_success = The repository wiki's branch name has been successfully normalized. @@ -2743,7 +2743,7 @@ topic.done = Done topic.count_prompt = You cannot select more than 25 topics topic.format_prompt = Topics must start with a letter or number, can include dashes ("-") and dots ("."), can be up to 35 characters long. Letters must be lowercase. -find_file.go_to_file = Go to file +find_file.go_to_file = Find a file find_file.no_matching = No matching file found error.csv.too_large = Can't render this file because it is too large. @@ -3071,7 +3071,7 @@ orgs.new_orga = New organization repos.repo_manage_panel = Manage repositories repos.unadopted = Unadopted repositories -repos.unadopted.no_more = No more unadopted repositories found +repos.unadopted.no_more = No unadopted repositories found. repos.owner = Owner repos.name = Name repos.private = Private @@ -3815,3 +3815,6 @@ submodule = Submodule filepreview.line = Line %[1]d in %[2]s filepreview.lines = Lines %[1]d to %[2]d in %[3]s filepreview.truncated = Preview has been truncated + +[translation_meta] +test = This is a test string. It is not displayed in Forgejo UI but is used for testing purposes. Feel free to translate it as "ok" to hit the 100% completion :) and save some time diff --git a/public/.well-known/security.txt b/public/.well-known/security.txt index f301a00542..5e7f9b387b 100644 --- a/public/.well-known/security.txt +++ b/public/.well-known/security.txt @@ -1,6 +1,6 @@ # This site is running a Forgejo instance. # Forgejo-related security problems should be reported to the Forgejo security team. -# Site-related security problems should be reported to this site's admin. +# Security problems related to this instance should be reported to its administration. Policy: https://codeberg.org/forgejo/forgejo/src/branch/forgejo/CONTRIBUTING.md Contact: mailto:security@forgejo.org Encryption: https://keys.openpgp.org/vks/v1/by-fingerprint/1B638BDF10969D627926B8D9F585D0F99E1FB56F From 47d6edab1625803a67d4f73c9893affa31573f91 Mon Sep 17 00:00:00 2001 From: Kwonunn Date: Fri, 12 Jul 2024 14:05:43 +0200 Subject: [PATCH 023/128] Fix: Name conan remote forgejo (cherry picked from commit 6efaf155d951c41e3fff667d71238638d2880ffa) --- templates/package/content/conan.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/package/content/conan.tmpl b/templates/package/content/conan.tmpl index 13a7723fe4..8ebc258e31 100644 --- a/templates/package/content/conan.tmpl +++ b/templates/package/content/conan.tmpl @@ -4,7 +4,7 @@
-
conan remote add gitea 
+
conan remote add forgejo 
From cb297a6f6f6fe471b7e38907bfd432cc43677363 Mon Sep 17 00:00:00 2001 From: Beowulf Date: Sat, 13 Jul 2024 18:05:08 +0200 Subject: [PATCH 024/128] Fix AGit checkout instruction The checkout instruction for pull requests created with the AGit workflow where incorrect. (cherry picked from commit 0a5fa31edb7b07fef3d50cb1499564feb3cf39c3) --- .../repo/issue/view_content/pull_merge_instruction.tmpl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/templates/repo/issue/view_content/pull_merge_instruction.tmpl b/templates/repo/issue/view_content/pull_merge_instruction.tmpl index 42d9c82935..e89102802a 100644 --- a/templates/repo/issue/view_content/pull_merge_instruction.tmpl +++ b/templates/repo/issue/view_content/pull_merge_instruction.tmpl @@ -8,11 +8,11 @@ {{end}}
{{if eq .PullRequest.Flow 0}} -
git fetch -u {{if ne .PullRequest.HeadRepo.ID .PullRequest.BaseRepo.ID}}{{else}}origin{{end}} {{.PullRequest.HeadBranch}}:{{$localBranch}}
-
git checkout {{$localBranch}}
+
git fetch -u {{if ne .PullRequest.HeadRepo.ID .PullRequest.BaseRepo.ID}}{{else}}origin{{end}} {{.PullRequest.HeadBranch}}:{{$localBranch}}
{{else}} -
git fetch -u origin {{.GetGitRefName}}:{{$localBranch}}
+
git fetch -u origin +refs/pull/{{.PullRequest.Index}}/head:{{$localBranch}}
{{end}} +
git checkout {{$localBranch}}
{{if .ShowMergeInstructions}}

{{ctx.Locale.Tr "repo.pulls.cmd_instruction_merge_title"}}

{{ctx.Locale.Tr "repo.pulls.cmd_instruction_merge_desc"}}
From 5709359d55cf5a0b1d7d36bdcecf822306ec5f74 Mon Sep 17 00:00:00 2001 From: Gusted Date: Sun, 14 Jul 2024 05:38:45 +0200 Subject: [PATCH 025/128] [UI] Remove unnecessary vertical space in empty labels list - Don't show the labels-list element, if no labels are selected. - The labels-list was taking up vertical space, even if no labels were selected which caused an inconsistency in how the sidebar looked. - Adds integration test (cherry picked from commit 013b89eb13f4a87e521381072853d253137c1da5) --- .../repo/issue/labels/labels_sidebar.tmpl | 18 +++++++----- tests/integration/issue_test.go | 29 +++++++++++++++++++ 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/templates/repo/issue/labels/labels_sidebar.tmpl b/templates/repo/issue/labels/labels_sidebar.tmpl index be30baba92..d39c2133a7 100644 --- a/templates/repo/issue/labels/labels_sidebar.tmpl +++ b/templates/repo/issue/labels/labels_sidebar.tmpl @@ -1,11 +1,13 @@
{{ctx.Locale.Tr "repo.issues.new.no_label"}} - - {{range .root.Labels}} - {{template "repo/issue/labels/label" dict "root" $.root "label" .}} - {{end}} - {{range .root.OrgLabels}} - {{template "repo/issue/labels/label" dict "root" $.root "label" .}} - {{end}} - + {{if .root.HasSelectedLabel}} + + {{range .root.Labels}} + {{template "repo/issue/labels/label" dict "root" $.root "label" .}} + {{end}} + {{range .root.OrgLabels}} + {{template "repo/issue/labels/label" dict "root" $.root "label" .}} + {{end}} + + {{end}}
diff --git a/tests/integration/issue_test.go b/tests/integration/issue_test.go index 2450a1d60f..bb16cbbc44 100644 --- a/tests/integration/issue_test.go +++ b/tests/integration/issue_test.go @@ -1126,3 +1126,32 @@ func TestIssueUnsubscription(t *testing.T) { session.MakeRequest(t, req, http.StatusOK) }) } + +func TestIssueLabelList(t *testing.T) { + defer tests.PrepareTestEnv(t)() + labelListSelector := ".labels.list .labels-list" + hiddenClass := "tw-hidden" + + t.Run("Show label list", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + req := NewRequest(t, "GET", "/user2/repo1/issues/1") + resp := MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + + htmlDoc.AssertElement(t, labelListSelector, true) + htmlDoc.AssertElement(t, ".labels.list .no-select.item."+hiddenClass, true) + }) + + t.Run("Show no label list", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + session := loginUser(t, "user2") + + req := NewRequest(t, "GET", "/user2/repo2/issues/1") + resp := session.MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + + htmlDoc.AssertElement(t, labelListSelector, false) + htmlDoc.AssertElement(t, ".labels.list .no-select.item:not([class*='"+hiddenClass+"'])", true) + }) +} From f3c22b5be1e424460af845dc502b99e2d734ab0d Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Sun, 14 Jul 2024 13:56:32 +0200 Subject: [PATCH 026/128] tests(e2e): only run one test, not all of them each time (cherry picked from commit e3665c30422546d9607d5f758c5b4973f05b53d8) --- tests/e2e/e2e_test.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go index 07f0bf52a3..39974e00c0 100644 --- a/tests/e2e/e2e_test.go +++ b/tests/e2e/e2e_test.go @@ -103,7 +103,9 @@ func TestE2e(t *testing.T) { t.Run(testname, func(t *testing.T) { // Default 2 minute timeout onGiteaRun(t, func(*testing.T, *url.URL) { - cmd := exec.Command(runArgs[0], runArgs...) + thisTest := runArgs + thisTest = append(thisTest, path) + cmd := exec.Command(runArgs[0], thisTest...) cmd.Env = os.Environ() cmd.Env = append(cmd.Env, fmt.Sprintf("GITEA_URL=%s", setting.AppURL)) From d95ce0b6fbf9b455a12c5a5190bf108533a06ffa Mon Sep 17 00:00:00 2001 From: Beowulf Date: Wed, 26 Jun 2024 22:05:18 +0200 Subject: [PATCH 027/128] Fixed link to commit status and tooltip on dashboard Regression introduced by https://codeberg.org/forgejo/forgejo/commit/5a18b7463255e5d1aefdacaeae9b7d0459b34286 (cherry picked from commit 1088c057e042d2c007b18dcb8d53e454f462b335) --- models/fixtures/commit_status.yml | 11 +++++++++++ tests/e2e/dashboard-ci-status.test.e2e.js | 21 +++++++++++++++++++++ web_src/js/components/DashboardRepoList.vue | 2 +- 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 tests/e2e/dashboard-ci-status.test.e2e.js diff --git a/models/fixtures/commit_status.yml b/models/fixtures/commit_status.yml index 6b82e3fd67..0ba6caafe9 100644 --- a/models/fixtures/commit_status.yml +++ b/models/fixtures/commit_status.yml @@ -52,3 +52,14 @@ description: My awesome deploy service context: deploy/awesomeness creator_id: 2 + +- + id: 6 + index: 6 + repo_id: 62 + state: "failure" + sha: "774f93df12d14931ea93259ae93418da4482fcc1" + target_url: "/user2/test_workflows/actions" + description: My awesome deploy service + context: deploy/awesomeness + creator_id: 2 diff --git a/tests/e2e/dashboard-ci-status.test.e2e.js b/tests/e2e/dashboard-ci-status.test.e2e.js new file mode 100644 index 0000000000..fdf868f083 --- /dev/null +++ b/tests/e2e/dashboard-ci-status.test.e2e.js @@ -0,0 +1,21 @@ +// @ts-check +import {test, expect} from '@playwright/test'; +import {login_user, load_logged_in_context} from './utils_e2e.js'; + +test.beforeAll(async ({browser}, workerInfo) => { + await login_user(browser, workerInfo, 'user2'); +}); + +test('Correct link and tooltip', async ({browser}, workerInfo) => { + const context = await load_logged_in_context(browser, workerInfo, 'user2'); + const page = await context.newPage(); + const response = await page.goto('/?repo-search-query=test_workflows'); + await expect(response?.status()).toBe(200); + + await page.waitForLoadState('networkidle'); + + const repoStatus = page.locator('.dashboard-repos .repo-owner-name-list > li:nth-child(1) > a:nth-child(2)'); + + await expect(repoStatus).toHaveAttribute('href', '/user2/test_workflows/actions'); + await expect(repoStatus).toHaveAttribute('data-tooltip-content', 'Failure'); +}); diff --git a/web_src/js/components/DashboardRepoList.vue b/web_src/js/components/DashboardRepoList.vue index 4e79b2f28d..d9c9e35036 100644 --- a/web_src/js/components/DashboardRepoList.vue +++ b/web_src/js/components/DashboardRepoList.vue @@ -415,7 +415,7 @@ export default sfc; // activate the IDE's Vue plugin
- + From c12857d5dda3e59180a71f6a3d7dbff75129e0c9 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Tue, 9 Jul 2024 11:23:33 +0800 Subject: [PATCH 028/128] Use old behavior for telegram webhook (#31588) Fix #31182 (cherry picked from commit 43c63c33aea1b0725ed1fe7b4a55dd85050f0beb) (cherry picked from commit 38dce65dc1e5604f93f86eb5858c08e403067ca3) --- services/webhook/telegram.go | 3 ++- services/webhook/telegram_test.go | 44 +++++++++++++++++++------------ 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/services/webhook/telegram.go b/services/webhook/telegram.go index 724c41012f..74eb133922 100644 --- a/services/webhook/telegram.go +++ b/services/webhook/telegram.go @@ -15,6 +15,7 @@ import ( "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/json" "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/markup" api "code.gitea.io/gitea/modules/structs" webhook_module "code.gitea.io/gitea/modules/webhook" "code.gitea.io/gitea/services/forms" @@ -213,7 +214,7 @@ func (t telegramConvertor) Package(p *api.PackagePayload) (TelegramPayload, erro func createTelegramPayload(message string) TelegramPayload { return TelegramPayload{ - Message: strings.TrimSpace(message), + Message: markup.Sanitize(strings.TrimSpace(message)), ParseMode: "HTML", DisableWebPreview: true, } diff --git a/services/webhook/telegram_test.go b/services/webhook/telegram_test.go index ff6455e16b..65b767f0af 100644 --- a/services/webhook/telegram_test.go +++ b/services/webhook/telegram_test.go @@ -33,7 +33,7 @@ func TestTelegramPayload(t *testing.T) { pl, err := tc.Create(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] branch test created`, pl.Message) + assert.Equal(t, `[test/repo] branch test created`, pl.Message) }) t.Run("Delete", func(t *testing.T) { @@ -42,7 +42,7 @@ func TestTelegramPayload(t *testing.T) { pl, err := tc.Delete(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] branch test deleted`, pl.Message) + assert.Equal(t, `[test/repo] branch test deleted`, pl.Message) }) t.Run("Fork", func(t *testing.T) { @@ -51,7 +51,7 @@ func TestTelegramPayload(t *testing.T) { pl, err := tc.Fork(p) require.NoError(t, err) - assert.Equal(t, `test/repo2 is forked to test/repo`, pl.Message) + assert.Equal(t, `test/repo2 is forked to test/repo`, pl.Message) }) t.Run("Push", func(t *testing.T) { @@ -60,7 +60,9 @@ func TestTelegramPayload(t *testing.T) { pl, err := tc.Push(p) require.NoError(t, err) - assert.Equal(t, "[test/repo:test] 2 new commits\n[2020558] commit message - user1\n[2020558] commit message - user1", pl.Message) + assert.Equal(t, `[test/repo:test] 2 new commits +[2020558] commit message - user1 +[2020558] commit message - user1`, pl.Message) }) t.Run("Issue", func(t *testing.T) { @@ -70,13 +72,15 @@ func TestTelegramPayload(t *testing.T) { pl, err := tc.Issue(p) require.NoError(t, err) - assert.Equal(t, "[test/repo] Issue opened: #2 crash by user1\n\nissue body", pl.Message) + assert.Equal(t, `[test/repo] Issue opened: #2 crash by user1 + +issue body`, pl.Message) p.Action = api.HookIssueClosed pl, err = tc.Issue(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] Issue closed: #2 crash by user1`, pl.Message) + assert.Equal(t, `[test/repo] Issue closed: #2 crash by user1`, pl.Message) }) t.Run("IssueComment", func(t *testing.T) { @@ -85,7 +89,8 @@ func TestTelegramPayload(t *testing.T) { pl, err := tc.IssueComment(p) require.NoError(t, err) - assert.Equal(t, "[test/repo] New comment on issue #2 crash by user1\nmore info needed", pl.Message) + assert.Equal(t, `[test/repo] New comment on issue #2 crash by user1 +more info needed`, pl.Message) }) t.Run("PullRequest", func(t *testing.T) { @@ -94,7 +99,8 @@ func TestTelegramPayload(t *testing.T) { pl, err := tc.PullRequest(p) require.NoError(t, err) - assert.Equal(t, "[test/repo] Pull request opened: #12 Fix bug by user1\nfixes bug #2", pl.Message) + assert.Equal(t, `[test/repo] Pull request opened: #12 Fix bug by user1 +fixes bug #2`, pl.Message) }) t.Run("PullRequestComment", func(t *testing.T) { @@ -103,7 +109,8 @@ func TestTelegramPayload(t *testing.T) { pl, err := tc.IssueComment(p) require.NoError(t, err) - assert.Equal(t, "[test/repo] New comment on pull request #12 Fix bug by user1\nchanges requested", pl.Message) + assert.Equal(t, `[test/repo] New comment on pull request #12 Fix bug by user1 +changes requested`, pl.Message) }) t.Run("Review", func(t *testing.T) { @@ -113,7 +120,8 @@ func TestTelegramPayload(t *testing.T) { pl, err := tc.Review(p, webhook_module.HookEventPullRequestReviewApproved) require.NoError(t, err) - assert.Equal(t, "[test/repo] Pull request review approved: #12 Fix bug\ngood job", pl.Message) + assert.Equal(t, `[test/repo] Pull request review approved: #12 Fix bug +good job`, pl.Message) }) t.Run("Repository", func(t *testing.T) { @@ -122,7 +130,7 @@ func TestTelegramPayload(t *testing.T) { pl, err := tc.Repository(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] Repository created`, pl.Message) + assert.Equal(t, `[test/repo] Repository created`, pl.Message) }) t.Run("Package", func(t *testing.T) { @@ -131,7 +139,7 @@ func TestTelegramPayload(t *testing.T) { pl, err := tc.Package(p) require.NoError(t, err) - assert.Equal(t, `Package created: GiteaContainer:latest by user1`, pl.Message) + assert.Equal(t, `Package created: GiteaContainer:latest by user1`, pl.Message) }) t.Run("Wiki", func(t *testing.T) { @@ -141,19 +149,19 @@ func TestTelegramPayload(t *testing.T) { pl, err := tc.Wiki(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] New wiki page 'index' (Wiki change comment) by user1`, pl.Message) + assert.Equal(t, `[test/repo] New wiki page 'index' (Wiki change comment) by user1`, pl.Message) p.Action = api.HookWikiEdited pl, err = tc.Wiki(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] Wiki page 'index' edited (Wiki change comment) by user1`, pl.Message) + assert.Equal(t, `[test/repo] Wiki page 'index' edited (Wiki change comment) by user1`, pl.Message) p.Action = api.HookWikiDeleted pl, err = tc.Wiki(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] Wiki page 'index' deleted by user1`, pl.Message) + assert.Equal(t, `[test/repo] Wiki page 'index' deleted by user1`, pl.Message) }) t.Run("Release", func(t *testing.T) { @@ -162,7 +170,7 @@ func TestTelegramPayload(t *testing.T) { pl, err := tc.Release(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] Release created: v1.0 by user1`, pl.Message) + assert.Equal(t, `[test/repo] Release created: v1.0 by user1`, pl.Message) }) } @@ -198,5 +206,7 @@ func TestTelegramJSONPayload(t *testing.T) { var body TelegramPayload err = json.NewDecoder(req.Body).Decode(&body) assert.NoError(t, err) - assert.Equal(t, "[test/repo:test] 2 new commits\n[2020558] commit message - user1\n[2020558] commit message - user1", body.Message) + assert.Equal(t, `[test/repo:test] 2 new commits +[2020558] commit message - user1 +[2020558] commit message - user1`, body.Message) } From cb656c3309234fe0ad6577afabab40376b59d937 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Tue, 16 Jul 2024 08:10:58 +0200 Subject: [PATCH 029/128] fix(ci): use 512MB for elasticsearch instead of 32GB It can be observed that when elasticsearch runs in the CI the process uses 32GB of resident memory. Set Xmx and Xms to no more than the threshold that the JVM uses for compressed object pointers (compressed oops); the exact threshold varies but is near 32 GB. You can verify that you are under the threshold by looking for a line in the logs like the following: Refs: https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docker.html Refs: https://www.elastic.co/guide/en/elasticsearch/reference/7.5/heap-size.html (cherry picked from commit d1dadf4e0600185e837b7d50f317b3af301bb70e) --- .forgejo/workflows/testing.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.forgejo/workflows/testing.yml b/.forgejo/workflows/testing.yml index 154b5806d7..71d4735eb3 100644 --- a/.forgejo/workflows/testing.yml +++ b/.forgejo/workflows/testing.yml @@ -49,6 +49,7 @@ jobs: image: elasticsearch:7.17.22 env: discovery.type: single-node + ES_JAVA_OPTS: "-Xms512m -Xmx512m" minio: image: bitnami/minio:2024.3.30 options: >- From dc075fc1c0fb57cdf5207e2fec45389fbd04f4af Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Tue, 16 Jul 2024 11:09:54 +0200 Subject: [PATCH 030/128] Load attachments for `/issues/comments/{id}` The `/repos/{owner}/{repo}/issues/comments/{id}` API endpoint returns an `assets` field, but the route handler did not load attachments, thus, the field was never populated. This patch fixes that, and adds a test to exercise it. The test fails without the fix. This addresses a bug discovered in Codeberg/Community#1607. Signed-off-by: Gergely Nagy (cherry picked from commit fc4f914e71b44bbdf0fee84acf5f540578dc08c7) --- routers/api/v1/repo/issue_comment.go | 5 +++++ tests/integration/api_comment_attachment_test.go | 11 +++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/routers/api/v1/repo/issue_comment.go b/routers/api/v1/repo/issue_comment.go index fbd37e00cb..1ff755c058 100644 --- a/routers/api/v1/repo/issue_comment.go +++ b/routers/api/v1/repo/issue_comment.go @@ -462,6 +462,11 @@ func GetIssueComment(ctx *context.APIContext) { return } + if err := comment.LoadAttachments(ctx); err != nil { + ctx.Error(http.StatusInternalServerError, "LoadAttachments", err) + return + } + ctx.JSON(http.StatusOK, convert.ToAPIComment(ctx, ctx.Repo.Repository, comment)) } diff --git a/tests/integration/api_comment_attachment_test.go b/tests/integration/api_comment_attachment_test.go index 1b3cae91e2..eac9965191 100644 --- a/tests/integration/api_comment_attachment_test.go +++ b/tests/integration/api_comment_attachment_test.go @@ -46,12 +46,19 @@ func TestAPIGetCommentAttachment(t *testing.T) { session := loginUser(t, repoOwner.Name) token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadIssue) - req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues/comments/%d/assets/%d", repoOwner.Name, repo.Name, comment.ID, attachment.ID). + req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues/comments/%d", repoOwner.Name, repo.Name, comment.ID). + AddTokenAuth(token) + resp := session.MakeRequest(t, req, http.StatusOK) + var apiComment api.Comment + DecodeJSON(t, resp, &apiComment) + assert.NotEmpty(t, apiComment.Attachments) + + req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues/comments/%d/assets/%d", repoOwner.Name, repo.Name, comment.ID, attachment.ID). AddTokenAuth(token) session.MakeRequest(t, req, http.StatusOK) req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues/comments/%d/assets/%d", repoOwner.Name, repo.Name, comment.ID, attachment.ID). AddTokenAuth(token) - resp := session.MakeRequest(t, req, http.StatusOK) + resp = session.MakeRequest(t, req, http.StatusOK) var apiAttachment api.Attachment DecodeJSON(t, resp, &apiAttachment) From 8b1027b9a914de90eb415eb17d4c45cab1b67684 Mon Sep 17 00:00:00 2001 From: 0ko <0ko@noreply.codeberg.org> Date: Wed, 17 Jul 2024 12:41:51 +0500 Subject: [PATCH 031/128] ui: fix issue labels (cherry picked from commit 326958316dcbf16a4f73a57e29651aabb34e814a) --- .../issue/labels/labels_selector_field.tmpl | 2 +- .../repo/issue/labels/labels_sidebar.tmpl | 20 +++++++++---------- tests/integration/issue_test.go | 17 +++------------- web_src/css/modules/label.css | 9 +++++++++ 4 files changed, 22 insertions(+), 26 deletions(-) diff --git a/templates/repo/issue/labels/labels_selector_field.tmpl b/templates/repo/issue/labels/labels_selector_field.tmpl index e5f15caca5..b4aee41da5 100644 --- a/templates/repo/issue/labels/labels_selector_field.tmpl +++ b/templates/repo/issue/labels/labels_selector_field.tmpl @@ -5,7 +5,7 @@ {{svg "octicon-gear" 16 "tw-ml-1"}} {{end}} - diff --git a/tests/integration/pull_review_test.go b/tests/integration/pull_review_test.go index 314e614092..e61bf15b4e 100644 --- a/tests/integration/pull_review_test.go +++ b/tests/integration/pull_review_test.go @@ -19,6 +19,7 @@ import ( "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/gitrepo" "code.gitea.io/gitea/modules/test" issue_service "code.gitea.io/gitea/services/issue" repo_service "code.gitea.io/gitea/services/repository" @@ -412,6 +413,12 @@ func TestPullView_GivenApproveOrRejectReviewOnClosedPR(t *testing.T) { // Have user1 create a fork of repo1. testRepoFork(t, user1Session, "user2", "repo1", "user1", "repo1") + baseRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerName: "user2", Name: "repo1"}) + forkedRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerName: "user1", Name: "repo1"}) + baseGitRepo, err := gitrepo.OpenRepository(db.DefaultContext, baseRepo) + require.NoError(t, err) + defer baseGitRepo.Close() + t.Run("Submit approve/reject review on merged PR", func(t *testing.T) { // Create a merged PR (made by user1) in the upstream repo1. testEditFile(t, user1Session, "user1", "repo1", "master", "README.md", "Hello, World (Edited)\n") @@ -420,16 +427,26 @@ func TestPullView_GivenApproveOrRejectReviewOnClosedPR(t *testing.T) { assert.EqualValues(t, "pulls", elem[3]) testPullMerge(t, user1Session, elem[1], elem[2], elem[4], repo_model.MergeStyleMerge, false) + // Get the commit SHA + pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ + BaseRepoID: baseRepo.ID, + BaseBranch: "master", + HeadRepoID: forkedRepo.ID, + HeadBranch: "master", + }) + sha, err := baseGitRepo.GetRefCommitID(pr.GetGitRefName()) + require.NoError(t, err) + // Grab the CSRF token. req := NewRequest(t, "GET", path.Join(elem[1], elem[2], "pulls", elem[4])) resp = user2Session.MakeRequest(t, req, http.StatusOK) htmlDoc := NewHTMLParser(t, resp.Body) // Submit an approve review on the PR. - testSubmitReview(t, user2Session, htmlDoc.GetCSRF(), "user2", "repo1", elem[4], "", "approve", http.StatusUnprocessableEntity) + testSubmitReview(t, user2Session, htmlDoc.GetCSRF(), "user2", "repo1", elem[4], sha, "approve", http.StatusOK) // Submit a reject review on the PR. - testSubmitReview(t, user2Session, htmlDoc.GetCSRF(), "user2", "repo1", elem[4], "", "reject", http.StatusUnprocessableEntity) + testSubmitReview(t, user2Session, htmlDoc.GetCSRF(), "user2", "repo1", elem[4], sha, "reject", http.StatusOK) }) t.Run("Submit approve/reject review on closed PR", func(t *testing.T) { @@ -440,16 +457,26 @@ func TestPullView_GivenApproveOrRejectReviewOnClosedPR(t *testing.T) { assert.EqualValues(t, "pulls", elem[3]) testIssueClose(t, user1Session, elem[1], elem[2], elem[4]) + // Get the commit SHA + pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ + BaseRepoID: baseRepo.ID, + BaseBranch: "master", + HeadRepoID: forkedRepo.ID, + HeadBranch: "a-test-branch", + }) + sha, err := baseGitRepo.GetRefCommitID(pr.GetGitRefName()) + require.NoError(t, err) + // Grab the CSRF token. req := NewRequest(t, "GET", path.Join(elem[1], elem[2], "pulls", elem[4])) resp = user2Session.MakeRequest(t, req, http.StatusOK) htmlDoc := NewHTMLParser(t, resp.Body) // Submit an approve review on the PR. - testSubmitReview(t, user2Session, htmlDoc.GetCSRF(), "user2", "repo1", elem[4], "", "approve", http.StatusUnprocessableEntity) + testSubmitReview(t, user2Session, htmlDoc.GetCSRF(), "user2", "repo1", elem[4], sha, "approve", http.StatusOK) // Submit a reject review on the PR. - testSubmitReview(t, user2Session, htmlDoc.GetCSRF(), "user2", "repo1", elem[4], "", "reject", http.StatusUnprocessableEntity) + testSubmitReview(t, user2Session, htmlDoc.GetCSRF(), "user2", "repo1", elem[4], sha, "reject", http.StatusOK) }) }) } From 502948960e592a326b32ce7c5edfb4f3b0a9e5c8 Mon Sep 17 00:00:00 2001 From: Caesar Schinas Date: Tue, 13 Aug 2024 22:14:46 +0100 Subject: [PATCH 074/128] add release notes (cherry picked from commit 24418da690b378552a2e70849ab0451391be77ea) --- release-notes/4907.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 release-notes/4907.md diff --git a/release-notes/4907.md b/release-notes/4907.md new file mode 100644 index 0000000000..7c6cbdd7fc --- /dev/null +++ b/release-notes/4907.md @@ -0,0 +1 @@ +Reverted a change from Gitea which prevented allow/reject reviews on merged or closed PRs. This change was not considered by the Forgejo UI team and there is a consensus that it feels like a regression, since it interferes with workflows known to be used by Forgejo users without providing a tangible benefit. From 068b80814b976174e0ad968818281130754f8b9e Mon Sep 17 00:00:00 2001 From: Gusted Date: Mon, 12 Aug 2024 15:31:43 +0200 Subject: [PATCH 075/128] [BUG] Make logout event non-blocking - When people click on the logout button, a event is sent to all browser tabs (actually to a shared worker) to notify them of this logout. This is done in a blocking fashion, to ensure every registered channel (which realistically should be one for every user because of the shared worker) for a user receives this message. While doing this, it locks the mutex for the eventsource module. - Codeberg is currently observing a deadlock that's caused by this blocking behavior, a channel isn't receiving the logout event. We currently don't have a good theory of why this is being caused. This in turn is causing that the logout functionality is no longer working and people no longer receive notifications, unless they refresh the page. - This patchs makes this message non-blocking and thus making it consistent with the other messages. We don't see a good reason why this specific event needs to be blocking and the commit introducing it doesn't offer a rationale either. (cherry picked from commit 9c5c08859d8d728da8c5829cf993f4fb308ab1cf) --- modules/eventsource/manager.go | 10 ---------- modules/eventsource/messenger.go | 9 --------- routers/web/auth/auth.go | 2 +- 3 files changed, 1 insertion(+), 20 deletions(-) diff --git a/modules/eventsource/manager.go b/modules/eventsource/manager.go index 7ed2a82903..730cacd940 100644 --- a/modules/eventsource/manager.go +++ b/modules/eventsource/manager.go @@ -77,13 +77,3 @@ func (m *Manager) SendMessage(uid int64, message *Event) { messenger.SendMessage(message) } } - -// SendMessageBlocking sends a message to a particular user -func (m *Manager) SendMessageBlocking(uid int64, message *Event) { - m.mutex.Lock() - messenger, ok := m.messengers[uid] - m.mutex.Unlock() - if ok { - messenger.SendMessageBlocking(message) - } -} diff --git a/modules/eventsource/messenger.go b/modules/eventsource/messenger.go index 6df26716be..378e717126 100644 --- a/modules/eventsource/messenger.go +++ b/modules/eventsource/messenger.go @@ -66,12 +66,3 @@ func (m *Messenger) SendMessage(message *Event) { } } } - -// SendMessageBlocking sends the message to all registered channels and ensures it gets sent -func (m *Messenger) SendMessageBlocking(message *Event) { - m.mutex.Lock() - defer m.mutex.Unlock() - for i := range m.channels { - m.channels[i] <- message - } -} diff --git a/routers/web/auth/auth.go b/routers/web/auth/auth.go index a738de380a..15dad2511a 100644 --- a/routers/web/auth/auth.go +++ b/routers/web/auth/auth.go @@ -408,7 +408,7 @@ func HandleSignOut(ctx *context.Context) { // SignOut sign out from login status func SignOut(ctx *context.Context) { if ctx.Doer != nil { - eventsource.GetManager().SendMessageBlocking(ctx.Doer.ID, &eventsource.Event{ + eventsource.GetManager().SendMessage(ctx.Doer.ID, &eventsource.Event{ Name: "logout", Data: ctx.Session.ID(), }) From 50db6ef5df2644dcfe9a1aa875d090ee5180ab8e Mon Sep 17 00:00:00 2001 From: Gusted Date: Sun, 18 Aug 2024 18:11:48 +0200 Subject: [PATCH 076/128] [UI] Fix misalignment of authors for repo acctivity - Regression of #4571 - We aren't showing the ticks generated by chartjs, because we want to show the avatar of the person instead. You can't *realy* disable that tick, so instead I opted to make them transparent in #4571, however they still affected the generation of ticks so if enough authors were being shown, for some the ticks were being skipped. Adjust the settings to make sure they are always being shown. - Resolves https://codeberg.org/forgejo/forgejo/issues/4982 (cherry picked from commit 72f41306c2108f53f2e5791caa90f9663f657116) --- web_src/js/components/RepoActivityTopAuthors.vue | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/web_src/js/components/RepoActivityTopAuthors.vue b/web_src/js/components/RepoActivityTopAuthors.vue index 52986c0493..3752bc582b 100644 --- a/web_src/js/components/RepoActivityTopAuthors.vue +++ b/web_src/js/components/RepoActivityTopAuthors.vue @@ -68,7 +68,16 @@ const sfc = { display: false, }, ticks: { - color: 'transparent', // Disable drawing of labels on the x-axis. + // Disable the drawing of the labels on the x-asis and force them all + // of them to be 'shown', this avoids them being internally skipped + // for some data points. We rely on the internally generated ticks + // to know where to draw our own ticks. Set rotation to 90 degree + // and disable autoSkip. autoSkip is disabled to ensure no ticks are + // skipped and rotation is set to avoid messing with the width of the chart. + color: 'transparent', + minRotation: 90, + maxRotation: 90, + autoSkip: false, }, }, y: { From 69dfe81d0e9611636e9924d0eea45082a36d3081 Mon Sep 17 00:00:00 2001 From: Gusted Date: Mon, 19 Aug 2024 17:47:59 +0200 Subject: [PATCH 077/128] [UI] Adjust trailing EOL behavior for empty file - Follow up #4835 - Currently for empty files (file size is shown in the file header) the "No EOL" information is being shown, even though it doesn't really make sense to show that for empty files. - Add integration test. - Ref: https://codeberg.org/Codeberg/Community/issues/1612#issuecomment-2169437 (cherry picked from commit e9a89a188e2cbcb264325e4880d0d4664a5b34f0) --- routers/web/repo/view.go | 9 +++--- templates/repo/file_info.tmpl | 2 +- tests/integration/repo_view_test.go | 50 ++++++++++++++++------------- 3 files changed, 33 insertions(+), 28 deletions(-) diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go index d121906575..a649cc9973 100644 --- a/routers/web/repo/view.go +++ b/routers/web/repo/view.go @@ -560,15 +560,16 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) { // empty: 0 lines; "a": 1 line; "a\n": 1 line; "a\nb": 2 lines; // When rendering, the last empty line is not rendered in U and isn't counted towards the number of lines. // To tell users that the file not contains a trailing EOL, text with a tooltip is displayed in the file header. + // Trailing EOL is only considered if the file has content. // This NumLines is only used for the display on the UI: "xxx lines" - hasTrailingEOL := bytes.HasSuffix(buf, []byte{'\n'}) - ctx.Data["HasTrailingEOL"] = hasTrailingEOL - ctx.Data["HasTrailingEOLSet"] = true if len(buf) == 0 { ctx.Data["NumLines"] = 0 } else { + hasNoTrailingEOL := !bytes.HasSuffix(buf, []byte{'\n'}) + ctx.Data["HasNoTrailingEOL"] = hasNoTrailingEOL + numLines := bytes.Count(buf, []byte{'\n'}) - if !hasTrailingEOL { + if hasNoTrailingEOL { numLines++ } ctx.Data["NumLines"] = numLines diff --git a/templates/repo/file_info.tmpl b/templates/repo/file_info.tmpl index 9cf4d28f4c..6ae7c15a26 100644 --- a/templates/repo/file_info.tmpl +++ b/templates/repo/file_info.tmpl @@ -9,7 +9,7 @@ {{.NumLines}} {{ctx.Locale.TrN .NumLines "repo.line" "repo.lines"}}
{{end}} - {{if and .HasTrailingEOLSet (not .HasTrailingEOL)}} + {{if .HasNoTrailingEOL}}
{{ctx.Locale.Tr "repo.no_eol.text"}}
diff --git a/tests/integration/repo_view_test.go b/tests/integration/repo_view_test.go index b653d7f596..cc4084e21c 100644 --- a/tests/integration/repo_view_test.go +++ b/tests/integration/repo_view_test.go @@ -179,43 +179,47 @@ func TestRepoViewFileLines(t *testing.T) { TreePath: "test-4", ContentReader: strings.NewReader("Really two\nlines\n"), }, + { + Operation: "create", + TreePath: "empty", + ContentReader: strings.NewReader(""), + }, + { + Operation: "create", + TreePath: "seemingly-empty", + ContentReader: strings.NewReader("\n"), + }, }) defer f() - t.Run("No EOL", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequest(t, "GET", repo.Link()+"/src/branch/main/test-1") + testEOL := func(t *testing.T, filename string, hasEOL bool) { + t.Helper() + req := NewRequestf(t, "GET", "%s/src/branch/main/%s", repo.Link(), filename) resp := MakeRequest(t, req, http.StatusOK) htmlDoc := NewHTMLParser(t, resp.Body) fileInfo := htmlDoc.Find(".file-info").Text() - assert.Contains(t, fileInfo, "No EOL") + if hasEOL { + assert.NotContains(t, fileInfo, "No EOL") + } else { + assert.Contains(t, fileInfo, "No EOL") + } + } - req = NewRequest(t, "GET", repo.Link()+"/src/branch/main/test-3") - resp = MakeRequest(t, req, http.StatusOK) - htmlDoc = NewHTMLParser(t, resp.Body) + t.Run("No EOL", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() - fileInfo = htmlDoc.Find(".file-info").Text() - assert.Contains(t, fileInfo, "No EOL") + testEOL(t, "test-1", false) + testEOL(t, "test-3", false) }) t.Run("With EOL", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - req := NewRequest(t, "GET", repo.Link()+"/src/branch/main/test-2") - resp := MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - - fileInfo := htmlDoc.Find(".file-info").Text() - assert.NotContains(t, fileInfo, "No EOL") - - req = NewRequest(t, "GET", repo.Link()+"/src/branch/main/test-4") - resp = MakeRequest(t, req, http.StatusOK) - htmlDoc = NewHTMLParser(t, resp.Body) - - fileInfo = htmlDoc.Find(".file-info").Text() - assert.NotContains(t, fileInfo, "No EOL") + testEOL(t, "test-2", true) + testEOL(t, "test-4", true) + testEOL(t, "empty", true) + testEOL(t, "seemingly-empty", true) }) }) } From e827bfa88a3a24d2f64f17df84c9806025c80c15 Mon Sep 17 00:00:00 2001 From: Simon Priet <105607989+SimonPistache@users.noreply.github.com> Date: Tue, 13 Aug 2024 01:36:28 +0200 Subject: [PATCH 078/128] [PORT] Scroll images in project issues separately from the remaining issue (gitea#31683) As discussed in https://github.com/go-gitea/gitea/issues/31667 & https://github.com/go-gitea/gitea/issues/26561, when a card on a Project contains images, they can overflow the card on its containing column. This aims to fix this issue via snapping scrollbars. --- Conflict resolution: none (cherry picked from commit fe7c9416777243264e8482d3af29e30c2b671074) (cherry picked from commit 8e46efef9568a8f1671f30932a1d5d528b99eb5c) --- web_src/css/features/projects.css | 7 ++++++- web_src/css/repo/issue-card.css | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/web_src/css/features/projects.css b/web_src/css/features/projects.css index 9d39306c8d..75bf4b59e7 100644 --- a/web_src/css/features/projects.css +++ b/web_src/css/features/projects.css @@ -78,7 +78,9 @@ .card-attachment-images { display: inline-block; white-space: nowrap; - overflow: hidden; + overflow: scroll; + cursor: default; + scroll-snap-type: x mandatory; text-align: center; } @@ -86,7 +88,10 @@ display: inline-block; max-height: 50px; border-radius: var(--border-radius); + text-align: left; + scroll-snap-align: center; margin-right: 2px; + aspect-ratio: 1; } .card-attachment-images img:only-child { diff --git a/web_src/css/repo/issue-card.css b/web_src/css/repo/issue-card.css index 390bfb6a01..fb832bd05a 100644 --- a/web_src/css/repo/issue-card.css +++ b/web_src/css/repo/issue-card.css @@ -2,7 +2,7 @@ display: flex; flex-direction: column; gap: 4px; - align-items: start; + align-items: stretch; border-radius: var(--border-radius); padding: 8px 10px; border: 1px solid var(--color-secondary); From 4b4613bd9ca9daff3c69785d25d314c7bac535e5 Mon Sep 17 00:00:00 2001 From: Gusted Date: Tue, 20 Aug 2024 16:01:43 +0200 Subject: [PATCH 079/128] [UI] Remove snapping for images on project cards Remove the snapping of the images on the projects cards, the images are way too small to notice that when scrolling you're being snapped to these images and when you do notice it, it doesn't make sense as you wouldn't expect it to be snapped. (cherry picked from commit 0764b7c18b801531441d224ec61c67c851b5bce4) --- web_src/css/features/projects.css | 2 -- 1 file changed, 2 deletions(-) diff --git a/web_src/css/features/projects.css b/web_src/css/features/projects.css index 75bf4b59e7..1401916e73 100644 --- a/web_src/css/features/projects.css +++ b/web_src/css/features/projects.css @@ -80,7 +80,6 @@ white-space: nowrap; overflow: scroll; cursor: default; - scroll-snap-type: x mandatory; text-align: center; } @@ -89,7 +88,6 @@ max-height: 50px; border-radius: var(--border-radius); text-align: left; - scroll-snap-align: center; margin-right: 2px; aspect-ratio: 1; } From cd7d0166f22003d928316f3c0744ae2f505bb6a7 Mon Sep 17 00:00:00 2001 From: Jason Song Date: Sun, 11 Aug 2024 22:48:20 +0800 Subject: [PATCH 080/128] Show lock owner instead of repo owner on LFS setting page (#31788) Fix #31784. Before: image After: image (cherry picked from commit 0470646d46f90c20f40fde718be6ef8d8c84ee2c) (cherry picked from commit 7f1db1df3ee8d620f997b8e70a40c2f48ae96c0f) --- models/git/lfs_lock.go | 45 ++++++++++++++++--- models/git/lfs_lock_list.go | 54 ++++++++++++++++++++++ routers/web/repo/setting/lfs.go | 5 +++ templates/repo/settings/lfs_locks.tmpl | 6 +-- tests/integration/lfs_view_test.go | 62 ++++++++++++++++++++++++++ 5 files changed, 162 insertions(+), 10 deletions(-) create mode 100644 models/git/lfs_lock_list.go diff --git a/models/git/lfs_lock.go b/models/git/lfs_lock.go index 2f65833fe3..07ce7d4abf 100644 --- a/models/git/lfs_lock.go +++ b/models/git/lfs_lock.go @@ -6,6 +6,7 @@ package git import ( "context" "errors" + "fmt" "strings" "time" @@ -21,11 +22,12 @@ import ( // LFSLock represents a git lfs lock of repository. type LFSLock struct { - ID int64 `xorm:"pk autoincr"` - RepoID int64 `xorm:"INDEX NOT NULL"` - OwnerID int64 `xorm:"INDEX NOT NULL"` - Path string `xorm:"TEXT"` - Created time.Time `xorm:"created"` + ID int64 `xorm:"pk autoincr"` + RepoID int64 `xorm:"INDEX NOT NULL"` + OwnerID int64 `xorm:"INDEX NOT NULL"` + Owner *user_model.User `xorm:"-"` + Path string `xorm:"TEXT"` + Created time.Time `xorm:"created"` } func init() { @@ -37,6 +39,35 @@ func (l *LFSLock) BeforeInsert() { l.Path = util.PathJoinRel(l.Path) } +// LoadAttributes loads attributes of the lock. +func (l *LFSLock) LoadAttributes(ctx context.Context) error { + // Load owner + if err := l.LoadOwner(ctx); err != nil { + return fmt.Errorf("load owner: %w", err) + } + + return nil +} + +// LoadOwner loads owner of the lock. +func (l *LFSLock) LoadOwner(ctx context.Context) error { + if l.Owner != nil { + return nil + } + + owner, err := user_model.GetUserByID(ctx, l.OwnerID) + if err != nil { + if user_model.IsErrUserNotExist(err) { + l.Owner = user_model.NewGhostUser() + return nil + } + return err + } + l.Owner = owner + + return nil +} + // CreateLFSLock creates a new lock. func CreateLFSLock(ctx context.Context, repo *repo_model.Repository, lock *LFSLock) (*LFSLock, error) { dbCtx, committer, err := db.TxContext(ctx) @@ -94,7 +125,7 @@ func GetLFSLockByID(ctx context.Context, id int64) (*LFSLock, error) { } // GetLFSLockByRepoID returns a list of locks of repository. -func GetLFSLockByRepoID(ctx context.Context, repoID int64, page, pageSize int) ([]*LFSLock, error) { +func GetLFSLockByRepoID(ctx context.Context, repoID int64, page, pageSize int) (LFSLockList, error) { e := db.GetEngine(ctx) if page >= 0 && pageSize > 0 { start := 0 @@ -103,7 +134,7 @@ func GetLFSLockByRepoID(ctx context.Context, repoID int64, page, pageSize int) ( } e.Limit(pageSize, start) } - lfsLocks := make([]*LFSLock, 0, pageSize) + lfsLocks := make(LFSLockList, 0, pageSize) return lfsLocks, e.Find(&lfsLocks, &LFSLock{RepoID: repoID}) } diff --git a/models/git/lfs_lock_list.go b/models/git/lfs_lock_list.go new file mode 100644 index 0000000000..cab1e61cab --- /dev/null +++ b/models/git/lfs_lock_list.go @@ -0,0 +1,54 @@ +// Copyright 2024 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package git + +import ( + "context" + "fmt" + + "code.gitea.io/gitea/models/db" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/container" +) + +// LFSLockList is a list of LFSLock +type LFSLockList []*LFSLock + +// LoadAttributes loads the attributes for the given locks +func (locks LFSLockList) LoadAttributes(ctx context.Context) error { + if len(locks) == 0 { + return nil + } + + if err := locks.LoadOwner(ctx); err != nil { + return fmt.Errorf("load owner: %w", err) + } + + return nil +} + +// LoadOwner loads the owner of the locks +func (locks LFSLockList) LoadOwner(ctx context.Context) error { + if len(locks) == 0 { + return nil + } + + usersIDs := container.FilterSlice(locks, func(lock *LFSLock) (int64, bool) { + return lock.OwnerID, true + }) + users := make(map[int64]*user_model.User, len(usersIDs)) + if err := db.GetEngine(ctx). + In("id", usersIDs). + Find(&users); err != nil { + return fmt.Errorf("find users: %w", err) + } + for _, v := range locks { + v.Owner = users[v.OwnerID] + if v.Owner == nil { // not exist + v.Owner = user_model.NewGhostUser() + } + } + + return nil +} diff --git a/routers/web/repo/setting/lfs.go b/routers/web/repo/setting/lfs.go index c18cb6a8c8..7e3634375a 100644 --- a/routers/web/repo/setting/lfs.go +++ b/routers/web/repo/setting/lfs.go @@ -95,6 +95,11 @@ func LFSLocks(ctx *context.Context) { ctx.ServerError("LFSLocks", err) return } + if err := lfsLocks.LoadAttributes(ctx); err != nil { + ctx.ServerError("LFSLocks", err) + return + } + ctx.Data["LFSLocks"] = lfsLocks if len(lfsLocks) == 0 { diff --git a/templates/repo/settings/lfs_locks.tmpl b/templates/repo/settings/lfs_locks.tmpl index 98f0e49097..9a18f525e9 100644 --- a/templates/repo/settings/lfs_locks.tmpl +++ b/templates/repo/settings/lfs_locks.tmpl @@ -30,9 +30,9 @@ {{end}} - - {{ctx.AvatarUtils.Avatar $.Owner}} - {{$.Owner.DisplayName}} + + {{ctx.AvatarUtils.Avatar $lock.Owner}} + {{$lock.Owner.DisplayName}} {{TimeSince .Created ctx.Locale}} diff --git a/tests/integration/lfs_view_test.go b/tests/integration/lfs_view_test.go index 8817986b79..791eeac877 100644 --- a/tests/integration/lfs_view_test.go +++ b/tests/integration/lfs_view_test.go @@ -4,12 +4,21 @@ package integration import ( + "context" + "fmt" "net/http" + "strings" "testing" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/lfs" + api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) // check that files stored in LFS render properly in the web UI @@ -103,3 +112,56 @@ func TestLFSRender(t *testing.T) { assert.Equal(t, 1, doc.Find(`.sha.label[href="/user2/lfs/commit/73cf03db6ece34e12bf91e8853dc58f678f2f82d"]`).Length(), "could not find link to commit") }) } + +// TestLFSLockView tests the LFS lock view on settings page of repositories +func TestLFSLockView(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // in org 3 + repo3 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3}) // own by org 3 + session := loginUser(t, user2.Name) + + // create a lock + lockPath := "test_lfs_lock_view.zip" + lockID := "" + { + req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/%s.git/info/lfs/locks", repo3.FullName()), map[string]string{"path": lockPath}) + req.Header.Set("Accept", lfs.AcceptHeader) + req.Header.Set("Content-Type", lfs.MediaType) + resp := session.MakeRequest(t, req, http.StatusCreated) + lockResp := &api.LFSLockResponse{} + DecodeJSON(t, resp, lockResp) + lockID = lockResp.Lock.ID + } + defer func() { + // release the lock + req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/%s.git/info/lfs/locks/%s/unlock", repo3.FullName(), lockID), map[string]string{}) + req.Header.Set("Accept", lfs.AcceptHeader) + req.Header.Set("Content-Type", lfs.MediaType) + session.MakeRequest(t, req, http.StatusOK) + }() + + t.Run("owner name", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + // make sure the display names are different, or the test is meaningless + require.NoError(t, repo3.LoadOwner(context.Background())) + require.NotEqual(t, user2.DisplayName(), repo3.Owner.DisplayName()) + + req := NewRequest(t, "GET", fmt.Sprintf("/%s/settings/lfs/locks", repo3.FullName())) + resp := session.MakeRequest(t, req, http.StatusOK) + + doc := NewHTMLParser(t, resp.Body).doc + + tr := doc.Find("table#lfs-files-locks-table tbody tr") + require.Equal(t, 1, tr.Length()) + + td := tr.First().Find("td") + require.Equal(t, 4, td.Length()) + + // path + assert.Equal(t, lockPath, strings.TrimSpace(td.Eq(0).Text())) + // owner name + assert.Equal(t, user2.DisplayName(), strings.TrimSpace(td.Eq(1).Text())) + }) +} From e442e71e03c5fb83d505874e7cc5fd5db22fe529 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 15 Aug 2024 23:59:01 +0800 Subject: [PATCH 081/128] Fix panic of ssh public key page after deletion of auth source (#31829) Fix #31730 This PR rewrote the function `PublicKeysAreExternallyManaged` with a simple test. The new function removed the loop to make it more readable. (cherry picked from commit b491b2104f83ee8fc4956c099c427b339291b3be) (cherry picked from commit d5500422c926764ce44becdda5d2b70cea0cbbf6) --- models/asymkey/ssh_key.go | 23 +++++++---------------- models/asymkey/ssh_key_test.go | 10 ++++++++++ 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/models/asymkey/ssh_key.go b/models/asymkey/ssh_key.go index a409d8e841..7a18732c32 100644 --- a/models/asymkey/ssh_key.go +++ b/models/asymkey/ssh_key.go @@ -229,35 +229,26 @@ func UpdatePublicKeyUpdated(ctx context.Context, id int64) error { // PublicKeysAreExternallyManaged returns whether the provided KeyID represents an externally managed Key func PublicKeysAreExternallyManaged(ctx context.Context, keys []*PublicKey) ([]bool, error) { - sources := make([]*auth.Source, 0, 5) + sourceCache := make(map[int64]*auth.Source, len(keys)) externals := make([]bool, len(keys)) -keyloop: + for i, key := range keys { if key.LoginSourceID == 0 { externals[i] = false - continue keyloop + continue } - var source *auth.Source - - sourceloop: - for _, s := range sources { - if s.ID == key.LoginSourceID { - source = s - break sourceloop - } - } - - if source == nil { + source, ok := sourceCache[key.LoginSourceID] + if !ok { var err error source, err = auth.GetSourceByID(ctx, key.LoginSourceID) if err != nil { if auth.IsErrSourceNotExist(err) { externals[i] = false - sources[i] = &auth.Source{ + sourceCache[key.LoginSourceID] = &auth.Source{ ID: key.LoginSourceID, } - continue keyloop + continue } return nil, err } diff --git a/models/asymkey/ssh_key_test.go b/models/asymkey/ssh_key_test.go index e4e81f51c4..2625d6ac91 100644 --- a/models/asymkey/ssh_key_test.go +++ b/models/asymkey/ssh_key_test.go @@ -12,6 +12,8 @@ import ( "strings" "testing" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" "code.gitea.io/gitea/modules/setting" "github.com/42wim/sshsig" @@ -501,3 +503,11 @@ func runErr(t *testing.T, stdin []byte, args ...string) { t.Fatal("expected error") } } + +func Test_PublicKeysAreExternallyManaged(t *testing.T) { + key1 := unittest.AssertExistsAndLoadBean(t, &PublicKey{ID: 1}) + externals, err := PublicKeysAreExternallyManaged(db.DefaultContext, []*PublicKey{key1}) + require.NoError(t, err) + assert.Len(t, externals, 1) + assert.False(t, externals[0]) +} From d5fec46de7d8682152312291783889206428328a Mon Sep 17 00:00:00 2001 From: Jason Song Date: Sat, 17 Aug 2024 01:04:54 +0800 Subject: [PATCH 082/128] Avoid returning without written ctx when posting PR (#31843) Fix #31625. If `pull_service.NewPullRequest` return an error which misses each `if` check, `CompareAndPullRequestPost` will return immediately, since it doesn't write the HTTP response, a 200 response with empty body will be sent to clients. ```go if err := pull_service.NewPullRequest(ctx, repo, pullIssue, labelIDs, attachments, pullRequest, assigneeIDs); err != nil { if repo_model.IsErrUserDoesNotHaveAccessToRepo(err) { ctx.Error(http.StatusBadRequest, "UserDoesNotHaveAccessToRepo", err.Error()) } else if git.IsErrPushRejected(err) { // ... ctx.JSONError(flashError) } else if errors.Is(err, user_model.ErrBlockedUser) { // ... ctx.JSONError(flashError) } else if errors.Is(err, issues_model.ErrMustCollaborator) { // ... ctx.JSONError(flashError) } return } ``` Not sure what kind of error can cause it to happen, so this PR just expose it. And we can fix it when users report that creating PRs failed with error responses. It's all my guess since I cannot reproduce the problem, but even if it's not related, the code here needs to be improved. (cherry picked from commit acd7053e9d4968e8b9812ab379be9027ac8e7771) Conflicts: routers/web/repo/pull.go trivial context conflict (cherry picked from commit 385718dd78bf0b398091565494828aef2ec85f44) --- routers/web/repo/pull.go | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index 5c56a6f5ad..21353bae9a 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -1507,13 +1507,12 @@ func CompareAndPullRequestPost(ctx *context.Context) { // instead of 500. if err := pull_service.NewPullRequest(ctx, repo, pullIssue, labelIDs, attachments, pullRequest, assigneeIDs); err != nil { - if errors.Is(err, user_model.ErrBlockedByUser) { + switch { + case errors.Is(err, user_model.ErrBlockedByUser): ctx.JSONError(ctx.Tr("repo.pulls.blocked_by_user")) - return - } else if repo_model.IsErrUserDoesNotHaveAccessToRepo(err) { + case repo_model.IsErrUserDoesNotHaveAccessToRepo(err): ctx.Error(http.StatusBadRequest, "UserDoesNotHaveAccessToRepo", err.Error()) - return - } else if git.IsErrPushRejected(err) { + case git.IsErrPushRejected(err): pushrejErr := err.(*git.ErrPushRejected) message := pushrejErr.Message if len(message) == 0 { @@ -1530,7 +1529,11 @@ func CompareAndPullRequestPost(ctx *context.Context) { return } ctx.JSONError(flashError) - return + default: + // It's an unexpected error. + // If it happens, we should add another case to handle it. + log.Error("Unexpected error of NewPullRequest: %T %s", err, err) + ctx.ServerError("CompareAndPullRequest", err) } ctx.ServerError("NewPullRequest", err) return From 9a142e3fd18190e1af7047de4378f8e0b09191a7 Mon Sep 17 00:00:00 2001 From: Adrian Hirt <13788379+Adrian-Hirt@users.noreply.github.com> Date: Sat, 17 Aug 2024 05:34:27 +0200 Subject: [PATCH 083/128] Fix overflowing content in action run log (#31842) When a long line with characters such as dots is returned by a step in an action (e.g. by the output of the Ruby on Rails test runner), it overflows the log container, causing the page to scroll sideways. This PR adds the CSS `overflow-wrap: anywhere;` to the `.job-step-section .job-step-logs .job-log-line .log-msg` selector, which causes such lines to wrap as well (cherry picked from commit 61aaf3440142d225802e3e9ce3db28bcf71f5a7e) (cherry picked from commit 1dfa11551c1c179bb5b9b4e0257178190a4d331f) --- web_src/js/components/RepoActionView.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/web_src/js/components/RepoActionView.vue b/web_src/js/components/RepoActionView.vue index 4f2af3ac6d..fae4500bde 100644 --- a/web_src/js/components/RepoActionView.vue +++ b/web_src/js/components/RepoActionView.vue @@ -878,6 +878,7 @@ export function initRepositoryActionView() { word-break: break-all; white-space: break-spaces; margin-left: 10px; + overflow-wrap: anywhere; } /* selectors here are intentionally exact to only match fullscreen */ From c5acd4114684e3431bc839fa24034dac4685fd88 Mon Sep 17 00:00:00 2001 From: yp05327 <576951401@qq.com> Date: Fri, 16 Aug 2024 01:34:24 +0900 Subject: [PATCH 084/128] Add missing repository type filter parameters to pager (#31832) Fix #31807 ps: the newly added params's value will be changed. When the first time you selected the filter, the values of params will be `0` or `1` But in pager it will be `true` or `false`. So do we have `boolToInt` function? (cherry picked from commit 7092402a2db255ecde2c20574b973fb632c16d2e) Conflicts: routers/web/org/home.go trivial conflict s/pager.AddParam/pager.AddParamString/ (cherry picked from commit a8e25e907c66140961f28ba92403176c816dfb60) --- routers/web/explore/repo.go | 15 +++++++++++++++ routers/web/org/home.go | 18 +++++++++++++++++- routers/web/user/notification.go | 15 +++++++++++++++ routers/web/user/profile.go | 15 +++++++++++++++ 4 files changed, 62 insertions(+), 1 deletion(-) diff --git a/routers/web/explore/repo.go b/routers/web/explore/repo.go index 4e880660b1..e978385b66 100644 --- a/routers/web/explore/repo.go +++ b/routers/web/explore/repo.go @@ -144,6 +144,21 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { pager.AddParam(ctx, "topic", "TopicOnly") pager.AddParam(ctx, "language", "Language") pager.AddParamString(relevantReposOnlyParam, fmt.Sprint(opts.OnlyShowRelevant)) + if archived.Has() { + pager.AddParamString("archived", fmt.Sprint(archived.Value())) + } + if fork.Has() { + pager.AddParamString("fork", fmt.Sprint(fork.Value())) + } + if mirror.Has() { + pager.AddParamString("mirror", fmt.Sprint(mirror.Value())) + } + if template.Has() { + pager.AddParamString("template", fmt.Sprint(template.Value())) + } + if private.Has() { + pager.AddParamString("private", fmt.Sprint(private.Value())) + } ctx.Data["Page"] = pager ctx.HTML(http.StatusOK, opts.TplName) diff --git a/routers/web/org/home.go b/routers/web/org/home.go index 71d10f3a43..1e04b72cbb 100644 --- a/routers/web/org/home.go +++ b/routers/web/org/home.go @@ -4,6 +4,7 @@ package org import ( + "fmt" "net/http" "path" "strings" @@ -154,7 +155,22 @@ func Home(ctx *context.Context) { pager := context.NewPagination(int(count), setting.UI.User.RepoPagingNum, page, 5) pager.SetDefaultParams(ctx) - pager.AddParam(ctx, "language", "Language") + pager.AddParamString("language", language) + if archived.Has() { + pager.AddParamString("archived", fmt.Sprint(archived.Value())) + } + if fork.Has() { + pager.AddParamString("fork", fmt.Sprint(fork.Value())) + } + if mirror.Has() { + pager.AddParamString("mirror", fmt.Sprint(mirror.Value())) + } + if template.Has() { + pager.AddParamString("template", fmt.Sprint(template.Value())) + } + if private.Has() { + pager.AddParamString("private", fmt.Sprint(private.Value())) + } ctx.Data["Page"] = pager ctx.Data["ShowMemberAndTeamTab"] = ctx.Org.IsMember || len(members) > 0 diff --git a/routers/web/user/notification.go b/routers/web/user/notification.go index 2105cfe5c5..c12cec85b5 100644 --- a/routers/web/user/notification.go +++ b/routers/web/user/notification.go @@ -439,6 +439,21 @@ func NotificationWatching(ctx *context.Context) { // redirect to last page if request page is more than total pages pager := context.NewPagination(total, setting.UI.User.RepoPagingNum, page, 5) pager.SetDefaultParams(ctx) + if archived.Has() { + pager.AddParamString("archived", fmt.Sprint(archived.Value())) + } + if fork.Has() { + pager.AddParamString("fork", fmt.Sprint(fork.Value())) + } + if mirror.Has() { + pager.AddParamString("mirror", fmt.Sprint(mirror.Value())) + } + if template.Has() { + pager.AddParamString("template", fmt.Sprint(template.Value())) + } + if private.Has() { + pager.AddParamString("private", fmt.Sprint(private.Value())) + } ctx.Data["Page"] = pager ctx.Data["Status"] = 2 diff --git a/routers/web/user/profile.go b/routers/web/user/profile.go index a83d7f7333..72aac7e15d 100644 --- a/routers/web/user/profile.go +++ b/routers/web/user/profile.go @@ -335,6 +335,21 @@ func prepareUserProfileTabData(ctx *context.Context, showPrivate bool, profileDb if tab == "activity" { pager.AddParam(ctx, "date", "Date") } + if archived.Has() { + pager.AddParamString("archived", fmt.Sprint(archived.Value())) + } + if fork.Has() { + pager.AddParamString("fork", fmt.Sprint(fork.Value())) + } + if mirror.Has() { + pager.AddParamString("mirror", fmt.Sprint(mirror.Value())) + } + if template.Has() { + pager.AddParamString("template", fmt.Sprint(template.Value())) + } + if private.Has() { + pager.AddParamString("private", fmt.Sprint(private.Value())) + } ctx.Data["Page"] = pager } From 4e5774fef7b6c0f3900e17b20fdf4ee01ed6838a Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Sun, 18 Aug 2024 06:30:08 +0200 Subject: [PATCH 085/128] chore(release-notes): weekly cherry-pick week 2024-34-v8.0 --- release-notes/5050.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 release-notes/5050.md diff --git a/release-notes/5050.md b/release-notes/5050.md new file mode 100644 index 0000000000..02a64161cd --- /dev/null +++ b/release-notes/5050.md @@ -0,0 +1,3 @@ +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/cd7d0166f22003d928316f3c0744ae2f505bb6a7) Show lock owner instead of repo owner on LFS setting page. +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/bd0cb143b117ad2218151a98618406534e551c03) Fix panic of ssh public key page after deletion of auth source. +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/787a08d007c07c92aa28a744e2d701e0933611b5) Add missing repository type filter parameters to pager. From 75fd8f6445c1ddf1fb6e7befe4cf177719b15f41 Mon Sep 17 00:00:00 2001 From: Giteabot Date: Wed, 21 Aug 2024 00:20:58 +0800 Subject: [PATCH 086/128] [PORT] Fix agit automerge (gitea#31881) Backport https://github.com/go-gitea/gitea/pull/31207 by @lunny Fix https://github.com/go-gitea/gitea/issues/31134 Co-authored-by: Lunny Xiao --- Conflict resolution: none Modification: `s/assert.NoError/require.NoError` (cherry picked from commit a0d1630700073785baff4ebc3031b0480d44cc63) --- models/fixtures/repository.yml | 2 +- services/automerge/automerge.go | 18 ++- .../user2/repo1.git/hooks/proc-receive | 7 + .../repo1.git/hooks/proc-receive.d/gitea | 2 + tests/integration/pull_merge_test.go | 129 ++++++++++++++++++ 5 files changed, 154 insertions(+), 4 deletions(-) create mode 100755 tests/gitea-repositories-meta/user2/repo1.git/hooks/proc-receive create mode 100755 tests/gitea-repositories-meta/user2/repo1.git/hooks/proc-receive.d/gitea diff --git a/models/fixtures/repository.yml b/models/fixtures/repository.yml index 845dae7fc1..f783d58187 100644 --- a/models/fixtures/repository.yml +++ b/models/fixtures/repository.yml @@ -26,7 +26,7 @@ fork_id: 0 is_template: false template_id: 0 - size: 7320 + size: 7597 is_fsck_enabled: true close_issues_via_commit_in_any_branch: false diff --git a/services/automerge/automerge.go b/services/automerge/automerge.go index 10f3c28d56..ed7a0141b9 100644 --- a/services/automerge/automerge.go +++ b/services/automerge/automerge.go @@ -245,9 +245,21 @@ func handlePullRequestAutoMerge(pullID int64, sha string) { defer headGitRepo.Close() } - headBranchExist := headGitRepo.IsBranchExist(pr.HeadBranch) - if pr.HeadRepo == nil || !headBranchExist { - log.Warn("Head branch of auto merge %-v does not exist [HeadRepoID: %d, Branch: %s]", pr, pr.HeadRepoID, pr.HeadBranch) + switch pr.Flow { + case issues_model.PullRequestFlowGithub: + headBranchExist := headGitRepo.IsBranchExist(pr.HeadBranch) + if pr.HeadRepo == nil || !headBranchExist { + log.Warn("Head branch of auto merge %-v does not exist [HeadRepoID: %d, Branch: %s]", pr, pr.HeadRepoID, pr.HeadBranch) + return + } + case issues_model.PullRequestFlowAGit: + headBranchExist := git.IsReferenceExist(ctx, baseGitRepo.Path, pr.GetGitRefName()) + if !headBranchExist { + log.Warn("Head branch of auto merge %-v does not exist [HeadRepoID: %d, Branch(Agit): %s]", pr, pr.HeadRepoID, pr.HeadBranch) + return + } + default: + log.Error("wrong flow type %d", pr.Flow) return } diff --git a/tests/gitea-repositories-meta/user2/repo1.git/hooks/proc-receive b/tests/gitea-repositories-meta/user2/repo1.git/hooks/proc-receive new file mode 100755 index 0000000000..af2808b037 --- /dev/null +++ b/tests/gitea-repositories-meta/user2/repo1.git/hooks/proc-receive @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +ORI_DIR=`pwd` +SHELL_FOLDER=$(cd "$(dirname "$0")";pwd) +cd "$ORI_DIR" +for i in `ls "$SHELL_FOLDER/proc-receive.d"`; do + sh "$SHELL_FOLDER/proc-receive.d/$i" +done diff --git a/tests/gitea-repositories-meta/user2/repo1.git/hooks/proc-receive.d/gitea b/tests/gitea-repositories-meta/user2/repo1.git/hooks/proc-receive.d/gitea new file mode 100755 index 0000000000..97521c6211 --- /dev/null +++ b/tests/gitea-repositories-meta/user2/repo1.git/hooks/proc-receive.d/gitea @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +"$GITEA_ROOT/gitea" hook --config="$GITEA_ROOT/$GITEA_CONF" proc-receive diff --git a/tests/integration/pull_merge_test.go b/tests/integration/pull_merge_test.go index b13ae60c45..e874030503 100644 --- a/tests/integration/pull_merge_test.go +++ b/tests/integration/pull_merge_test.go @@ -1020,3 +1020,132 @@ func TestPullAutoMergeAfterCommitStatusSucceedAndApproval(t *testing.T) { unittest.AssertNotExistsBean(t, &pull_model.AutoMerge{PullID: pr.ID}) }) } + +func TestPullAutoMergeAfterCommitStatusSucceedAndApprovalForAgitFlow(t *testing.T) { + onGiteaRun(t, func(t *testing.T, u *url.URL) { + // create a pull request + baseAPITestContext := NewAPITestContext(t, "user2", "repo1", auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) + + dstPath := t.TempDir() + + u.Path = baseAPITestContext.GitPath() + u.User = url.UserPassword("user2", userPassword) + + t.Run("Clone", doGitClone(dstPath, u)) + + err := os.WriteFile(path.Join(dstPath, "test_file"), []byte("## test content"), 0o666) + require.NoError(t, err) + + err = git.AddChanges(dstPath, true) + require.NoError(t, err) + + err = git.CommitChanges(dstPath, git.CommitChangesOptions{ + Committer: &git.Signature{ + Email: "user2@example.com", + Name: "user2", + When: time.Now(), + }, + Author: &git.Signature{ + Email: "user2@example.com", + Name: "user2", + When: time.Now(), + }, + Message: "Testing commit 1", + }) + require.NoError(t, err) + + stderrBuf := &bytes.Buffer{} + + err = git.NewCommand(git.DefaultContext, "push", "origin", "HEAD:refs/for/master", "-o"). + AddDynamicArguments(`topic=test/head2`). + AddArguments("-o"). + AddDynamicArguments(`title="create a test pull request with agit"`). + AddArguments("-o"). + AddDynamicArguments(`description="This PR is a test pull request which created with agit"`). + Run(&git.RunOpts{Dir: dstPath, Stderr: stderrBuf}) + require.NoError(t, err) + + assert.Contains(t, stderrBuf.String(), setting.AppURL+"user2/repo1/pulls/6") + + baseRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerName: "user2", Name: "repo1"}) + pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ + Flow: issues_model.PullRequestFlowAGit, + BaseRepoID: baseRepo.ID, + BaseBranch: "master", + HeadRepoID: baseRepo.ID, + HeadBranch: "user2/test/head2", + }) + + session := loginUser(t, "user1") + // add protected branch for commit status + csrf := GetCSRF(t, session, "/user2/repo1/settings/branches") + // Change master branch to protected + req := NewRequestWithValues(t, "POST", "/user2/repo1/settings/branches/edit", map[string]string{ + "_csrf": csrf, + "rule_name": "master", + "enable_push": "true", + "enable_status_check": "true", + "status_check_contexts": "gitea/actions", + "required_approvals": "1", + }) + session.MakeRequest(t, req, http.StatusSeeOther) + + user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + // first time insert automerge record, return true + scheduled, err := automerge.ScheduleAutoMerge(db.DefaultContext, user1, pr, repo_model.MergeStyleMerge, "auto merge test") + require.NoError(t, err) + assert.True(t, scheduled) + + // second time insert automerge record, return false because it does exist + scheduled, err = automerge.ScheduleAutoMerge(db.DefaultContext, user1, pr, repo_model.MergeStyleMerge, "auto merge test") + require.Error(t, err) + assert.False(t, scheduled) + + // reload pr again + pr = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: pr.ID}) + assert.False(t, pr.HasMerged) + assert.Empty(t, pr.MergedCommitID) + + // update commit status to success, then it should be merged automatically + baseGitRepo, err := gitrepo.OpenRepository(db.DefaultContext, baseRepo) + require.NoError(t, err) + sha, err := baseGitRepo.GetRefCommitID(pr.GetGitRefName()) + require.NoError(t, err) + masterCommitID, err := baseGitRepo.GetBranchCommitID("master") + require.NoError(t, err) + baseGitRepo.Close() + defer func() { + testResetRepo(t, baseRepo.RepoPath(), "master", masterCommitID) + }() + + err = commitstatus_service.CreateCommitStatus(db.DefaultContext, baseRepo, user1, sha, &git_model.CommitStatus{ + State: api.CommitStatusSuccess, + TargetURL: "https://gitea.com", + Context: "gitea/actions", + }) + require.NoError(t, err) + + time.Sleep(2 * time.Second) + + // reload pr again + pr = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: pr.ID}) + assert.False(t, pr.HasMerged) + assert.Empty(t, pr.MergedCommitID) + + // approve the PR from non-author + approveSession := loginUser(t, "user1") + req = NewRequest(t, "GET", fmt.Sprintf("/user2/repo1/pulls/%d", pr.Index)) + resp := approveSession.MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + testSubmitReview(t, approveSession, htmlDoc.GetCSRF(), "user2", "repo1", strconv.Itoa(int(pr.Index)), sha, "approve", http.StatusOK) + + time.Sleep(2 * time.Second) + + // realod pr again + pr = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: pr.ID}) + assert.True(t, pr.HasMerged) + assert.NotEmpty(t, pr.MergedCommitID) + + unittest.AssertNotExistsBean(t, &pull_model.AutoMerge{PullID: pr.ID}) + }) +} From cc4c430adcabf6fd5ca88da151a2e2b249c49265 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Thu, 22 Aug 2024 16:31:00 +0200 Subject: [PATCH 087/128] chore(dependency): use forgejo/act instead of gitea/act The subset of ACT used by Forgejo was the same as Gitea until https://code.forgejo.org/forgejo/act/pulls/45. Since it is now different, use the Forgejo soft-fork instead of the Gitea soft-fork. Refs: https://codeberg.org/forgejo/forgejo/issues/4789 (cherry picked from commit 41d13ee44b52b1411e6b95bbf17a492a20e26caf) Conflicts: go.sum trivial context conflict --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 32d8b9b4d7..5ba0d9015e 100644 --- a/go.mod +++ b/go.mod @@ -302,7 +302,7 @@ 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 => gitea.com/gitea/act v0.261.1 +replace github.com/nektos/act => code.forgejo.org/forgejo/act v1.21.1 exclude github.com/gofrs/uuid v3.2.0+incompatible diff --git a/go.sum b/go.sum index df7c7ccf02..b1e400e25a 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,8 @@ cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2Qx cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= code.forgejo.org/f3/gof3/v3 v3.4.0 h1:60LOo47tAKvr9nVu2qqNjbgRnCKeKx68mRMRBo/hIuA= code.forgejo.org/f3/gof3/v3 v3.4.0/go.mod h1:9v7foN46KlEr5gywOSQPn1k5BVpPeuBozsLKlgOQ3YM= +code.forgejo.org/forgejo/act v1.21.1 h1:y/3KKpG0IG3tHFPhWDrI941zVcLbtwVJCRK3BPI8hpo= +code.forgejo.org/forgejo/act v1.21.1/go.mod h1:UxZWRYqQG2Yj4+4OqfGWW5a3HELwejyWFQyU7F1jUD8= 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/reply v1.0.2 h1:dMhQCHV6/O3L5CLWNTol+dNzDAuyCK88z4J/lCdgFuQ= @@ -22,8 +24,6 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078 h1:cliQ4HHsCo6xi2oWZYKWW4bly/Ory9FuTpFPRxj/mAg= git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078/go.mod h1:g/V2Hjas6Z1UHUp4yIx6bATpNzJ7DYtD0FG3+xARWxs= -gitea.com/gitea/act v0.261.1 h1:iACWLc/k8wct9fCF2WdYKqn2Hxx6NjW9zbOP79HF4H4= -gitea.com/gitea/act v0.261.1/go.mod h1:Pg5C9kQY1CEA3QjthjhlrqOC/QOT5NyWNjOjRHw23Ok= gitea.com/go-chi/binding v0.0.0-20240430071103-39a851e106ed h1:EZZBtilMLSZNWtHHcgq2mt6NSGhJSZBuduAlinMEmso= gitea.com/go-chi/binding v0.0.0-20240430071103-39a851e106ed/go.mod h1:E3i3cgB04dDx0v3CytCgRTTn9Z/9x891aet3r456RVw= gitea.com/go-chi/cache v0.2.0 h1:E0npuTfDW6CT1yD8NMDVc1SK6IeRjfmRL2zlEsCEd7w= From 92cacdcdf8342e65eb57b90615882a5160de3a65 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 24 Aug 2024 05:44:23 +0000 Subject: [PATCH 088/128] Update module code.forgejo.org/forgejo/act to v1.21.2 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5ba0d9015e..eed4793e4f 100644 --- a/go.mod +++ b/go.mod @@ -302,7 +302,7 @@ 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.21.1 +replace github.com/nektos/act => code.forgejo.org/forgejo/act v1.21.2 exclude github.com/gofrs/uuid v3.2.0+incompatible diff --git a/go.sum b/go.sum index b1e400e25a..7fd56970dc 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,8 @@ cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2Qx cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= code.forgejo.org/f3/gof3/v3 v3.4.0 h1:60LOo47tAKvr9nVu2qqNjbgRnCKeKx68mRMRBo/hIuA= code.forgejo.org/f3/gof3/v3 v3.4.0/go.mod h1:9v7foN46KlEr5gywOSQPn1k5BVpPeuBozsLKlgOQ3YM= -code.forgejo.org/forgejo/act v1.21.1 h1:y/3KKpG0IG3tHFPhWDrI941zVcLbtwVJCRK3BPI8hpo= -code.forgejo.org/forgejo/act v1.21.1/go.mod h1:UxZWRYqQG2Yj4+4OqfGWW5a3HELwejyWFQyU7F1jUD8= +code.forgejo.org/forgejo/act v1.21.2 h1:LERMtDNZDFXOYYYSU7Yduyyz7sN0t/Xnc1wFlupweiE= +code.forgejo.org/forgejo/act v1.21.2/go.mod h1:+PcvJ9iv+NTFeJSh79ra9Jbk9l0vvyA9D9me5/dbxYM= 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/reply v1.0.2 h1:dMhQCHV6/O3L5CLWNTol+dNzDAuyCK88z4J/lCdgFuQ= From 41281fc80a588d1f5e46371392b39f55e4764a8f Mon Sep 17 00:00:00 2001 From: Rowan Bohde Date: Mon, 19 Aug 2024 12:58:53 -0500 Subject: [PATCH 089/128] add CfTurnstileSitekey context data to all captcha templates (#31874) In the OpenID flows, the "CfTurnstileSitekey" wasn't populated, which caused those flows to fail if using Turnstile as the Captcha implementation. This adds the missing context variables, allowing Turnstile to be used in the OpenID flows. (cherry picked from commit 0d24c9f383255605d68a92cc5f087c3f16a1d735) --- routers/web/auth/linkaccount.go | 3 +++ routers/web/auth/openid.go | 1 + 2 files changed, 4 insertions(+) diff --git a/routers/web/auth/linkaccount.go b/routers/web/auth/linkaccount.go index f744a57a43..9b0141c14e 100644 --- a/routers/web/auth/linkaccount.go +++ b/routers/web/auth/linkaccount.go @@ -40,6 +40,7 @@ func LinkAccount(ctx *context.Context) { ctx.Data["HcaptchaSitekey"] = setting.Service.HcaptchaSitekey ctx.Data["McaptchaSitekey"] = setting.Service.McaptchaSitekey ctx.Data["McaptchaURL"] = setting.Service.McaptchaURL + ctx.Data["CfTurnstileSitekey"] = setting.Service.CfTurnstileSitekey ctx.Data["DisableRegistration"] = setting.Service.DisableRegistration ctx.Data["AllowOnlyInternalRegistration"] = setting.Service.AllowOnlyInternalRegistration ctx.Data["ShowRegistrationButton"] = false @@ -128,6 +129,7 @@ func LinkAccountPostSignIn(ctx *context.Context) { ctx.Data["HcaptchaSitekey"] = setting.Service.HcaptchaSitekey ctx.Data["McaptchaSitekey"] = setting.Service.McaptchaSitekey ctx.Data["McaptchaURL"] = setting.Service.McaptchaURL + ctx.Data["CfTurnstileSitekey"] = setting.Service.CfTurnstileSitekey ctx.Data["DisableRegistration"] = setting.Service.DisableRegistration ctx.Data["ShowRegistrationButton"] = false @@ -215,6 +217,7 @@ func LinkAccountPostRegister(ctx *context.Context) { ctx.Data["HcaptchaSitekey"] = setting.Service.HcaptchaSitekey ctx.Data["McaptchaSitekey"] = setting.Service.McaptchaSitekey ctx.Data["McaptchaURL"] = setting.Service.McaptchaURL + ctx.Data["CfTurnstileSitekey"] = setting.Service.CfTurnstileSitekey ctx.Data["DisableRegistration"] = setting.Service.DisableRegistration ctx.Data["ShowRegistrationButton"] = false diff --git a/routers/web/auth/openid.go b/routers/web/auth/openid.go index 2143b8096a..83268faacb 100644 --- a/routers/web/auth/openid.go +++ b/routers/web/auth/openid.go @@ -307,6 +307,7 @@ func RegisterOpenID(ctx *context.Context) { ctx.Data["RecaptchaURL"] = setting.Service.RecaptchaURL ctx.Data["McaptchaSitekey"] = setting.Service.McaptchaSitekey ctx.Data["McaptchaURL"] = setting.Service.McaptchaURL + ctx.Data["CfTurnstileSitekey"] = setting.Service.CfTurnstileSitekey ctx.Data["OpenID"] = oid userName, _ := ctx.Session.Get("openid_determined_username").(string) if userName != "" { From bd9edb6fedd22a8135a45e7811627f4958b974df Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 22 Aug 2024 05:05:48 +0800 Subject: [PATCH 090/128] Use correct function name (#31887) (cherry picked from commit 0299bb97f038685aee794a992fa4a9f5cf83652e) --- modules/migration/pullrequest.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/migration/pullrequest.go b/modules/migration/pullrequest.go index 4e7500f0d6..1435991bd2 100644 --- a/modules/migration/pullrequest.go +++ b/modules/migration/pullrequest.go @@ -45,7 +45,7 @@ func (p *PullRequest) GetContext() DownloaderContext { return p.Context } // IsForkPullRequest returns true if the pull request from a forked repository but not the same repository func (p *PullRequest) IsForkPullRequest() bool { - return p.Head.RepoPath() != p.Base.RepoPath() + return p.Head.RepoFullName() != p.Base.RepoFullName() } // GetGitRefName returns pull request relative path to head @@ -62,8 +62,8 @@ type PullRequestBranch struct { OwnerName string `yaml:"owner_name"` } -// RepoPath returns pull request repo path -func (p PullRequestBranch) RepoPath() string { +// RepoFullName returns pull request repo full name +func (p PullRequestBranch) RepoFullName() string { return fmt.Sprintf("%s/%s", p.OwnerName, p.RepoName) } From 930e718afeff3b79abbd9d14f68daea48e9877a3 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Sun, 25 Aug 2024 17:52:38 +0200 Subject: [PATCH 091/128] chore(release-notes): weekly cherry-pick week 2024-35-v8.0 --- release-notes/5112.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 release-notes/5112.md diff --git a/release-notes/5112.md b/release-notes/5112.md new file mode 100644 index 0000000000..76647d967e --- /dev/null +++ b/release-notes/5112.md @@ -0,0 +1 @@ +fix: [Add CfTurnstileSitekey context data to all captcha templates](https://codeberg.org/forgejo/forgejo/commit/bf07064e40472daa22063d0ac1fb3653008497eb). From c13d13f7ccbfcb947c85851af43abb1fb01873e9 Mon Sep 17 00:00:00 2001 From: Codeberg Translate Date: Fri, 16 Aug 2024 07:19:03 +0000 Subject: [PATCH 092/128] i18n: update of translations from Codeberg Translate (#4889) Translations update from [Codeberg Translate](https://translate.codeberg.org) for [Forgejo/forgejo](https://translate.codeberg.org/projects/forgejo/forgejo/). Current translation status: ![Weblate translation status](https://translate.codeberg.org/widget/forgejo/forgejo/horizontal-auto.svg) Co-authored-by: earl-warren Co-authored-by: Outbreak2096 Co-authored-by: Panagiotis \"Ivory\" Vasilopoulos Co-authored-by: dragon Co-authored-by: hoovad Co-authored-by: Gusted Co-authored-by: hankskyjames777 Co-authored-by: emansije Co-authored-by: hugoalh Co-authored-by: zub Co-authored-by: Fjuro Co-authored-by: 0ko <0ko@users.noreply.translate.codeberg.org> Co-authored-by: Kita Ikuyo Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/4889 Reviewed-by: Earl Warren Co-authored-by: Codeberg Translate Co-committed-by: Codeberg Translate (cherry picked from commit 17fa75074d0def68f089e2ee34cc10243a85ce98) --- options/locale/locale_cs-CZ.ini | 21 ++- options/locale/locale_el-GR.ini | 164 ++++++++++++---- options/locale/locale_et.ini | 321 ++++++++++++++++++++++++++++++++ options/locale/locale_fil.ini | 119 +++++++++--- options/locale/locale_fr-FR.ini | 7 + options/locale/locale_nb_NO.ini | 26 +++ options/locale/locale_nl-NL.ini | 11 ++ options/locale/locale_pt-PT.ini | 37 +++- options/locale/locale_ru-RU.ini | 1 + options/locale/locale_zh-CN.ini | 9 +- options/locale/locale_zh-TW.ini | 67 ++++++- 11 files changed, 708 insertions(+), 75 deletions(-) create mode 100644 options/locale/locale_et.ini create mode 100644 options/locale/locale_nb_NO.ini diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index e0ad64fc14..065d66eddb 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -162,6 +162,12 @@ invalid_data = Neplatná data: %v copy_generic = Kopírovat do schránky test = Test error413 = Vyčerpali jste svou kvótu. +new_repo.title = Nový repozitář +new_migrate.title = Nová migrace +new_org.title = Nová organizace +new_repo.link = Nový repozitář +new_migrate.link = Nová migrace +new_org.link = Nová organizace [aria] navbar=Navigační lišta @@ -2824,6 +2830,9 @@ settings.pull_mirror_sync_quota_exceeded = Kvóta překročena, nestahuji změny settings.transfer_quota_exceeded = Nový majitel (%s) překročil kvótu. Repozitář nebyl převeden. release.asset_name = Název přílohy release.invalid_external_url = Neplatná externí URL: „%s“ +no_eol.text = Žádný EOL +no_eol.tooltip = Tento soubor neobsahuje koncový znak ukončení řádku. +pulls.cmd_instruction_merge_warning = Varování: Nastavení „Autodetekce ručního sloučení“ není u tohoto repozitáře povoleno, tuto žádost o sloučení budete muset poté označit jako ručně sloučenou. [graphs] component_loading_info = Tohle může chvíli trvat… @@ -3054,10 +3063,10 @@ dashboard.delete_old_actions.started=Spuštěno odstraňování všech starých dashboard.update_checker=Kontrola aktualizací dashboard.delete_old_system_notices=Odstranit všechna stará systémová upozornění z databáze dashboard.gc_lfs=Úklid LFS meta objektů -dashboard.stop_zombie_tasks=Zastavit zombie úlohy -dashboard.stop_endless_tasks=Zastavit nekonečné úlohy -dashboard.cancel_abandoned_jobs=Zrušit opuštěné úlohy -dashboard.start_schedule_tasks=Spustit naplánované úlohy +dashboard.stop_zombie_tasks=Zastavit akce zombie úloh +dashboard.stop_endless_tasks=Zastavit akce nekonečných úloh +dashboard.cancel_abandoned_jobs=Zrušit akce opuštěných úloh +dashboard.start_schedule_tasks=Spustit akce naplánovaných úloh dashboard.sync_branch.started=Synchronizace větví spuštěna dashboard.sync_tag.started=Synchronizace značek spuštěna dashboard.rebuild_issue_indexer=Znovu sestavit index úkolů @@ -3906,11 +3915,13 @@ workflow.dispatch.invalid_input_type = Neplatný typ vstupu „%s“. workflow.dispatch.warn_input_limit = Zobrazování prvních %d vstupů. workflow.dispatch.trigger_found = Tento workflow má spouštěč událostí workflow_dispatch. workflow.dispatch.success = Žádost o spuštění workflow byla úspěšně odeslána. +runs.expire_log_message = Protokoly byly smazány, protože byly příliš staré. [projects] type-1.display_name=Samostatný projekt type-2.display_name=Projekt repozitíře type-3.display_name=Projekt organizace +deleted.display_name = Smazaný projekt [git.filemode] changed_filemode=%[1]s → %[2]s @@ -3968,4 +3979,4 @@ eib = EiB [translation_meta] -test = ok \ No newline at end of file +test = diky vsem za pomoc :) \ No newline at end of file diff --git a/options/locale/locale_el-GR.ini b/options/locale/locale_el-GR.ini index d32c053ee5..446dcc45db 100644 --- a/options/locale/locale_el-GR.ini +++ b/options/locale/locale_el-GR.ini @@ -159,6 +159,13 @@ more_items = Περισσότερα αντικείμενα invalid_data = Τα δεδομένα δεν είναι έγκυρα: %v test = Τεστ copy_generic = Αντιγραφή στο πρόχειρο +error413 = Έχετε εξαντλήσει τους διαθέσιμους πόρους σας. +new_repo.link = Νέο αποθετήριο +new_migrate.link = Νέα μεταφορά +new_org.link = Νέος οργανισμός +new_migrate.title = Νέα μεταφορά +new_repo.title = Νέο αποθετήριο +new_org.title = Νέος οργανισμός [aria] navbar=Μπάρα πλοήγησης @@ -169,8 +176,8 @@ footer.links=Συνδέσεις [heatmap] number_of_contributions_in_the_last_12_months=%s συνεισφορές τους τελευταίους 12 μήνες contributions_zero=Χωρίς συνεισφορές -less=Λιγότερα -more=Περισσότερα +less=Λιγότερες +more=Περισσότερες contributions_format = {contributions} στις {day} {month} του έτους {year} contributions_one = συνεισφορά contributions_few = συνεισφορές @@ -190,6 +197,8 @@ buttons.ref.tooltip=Μνημόνευση ενός θέματος ή pull request buttons.switch_to_legacy.tooltip=Χρήση του κλασσικού κειμενογράφου buttons.enable_monospace_font=Ενεργοποίηση σταθερής γραμματοσειράς buttons.disable_monospace_font=Απενεργοποίηση σταθερής γραμματοσειράς +buttons.unindent.tooltip = Αναίρεση στοιχείων κατά ένα επίπεδο +buttons.indent.tooltip = Στοιχεία φωλιών κατά ένα επίπεδο [filter] string.asc=A - Z @@ -462,6 +471,11 @@ change_unconfirmed_email = Αν έχετε εισάγει μία λανθασμ change_unconfirmed_email_summary = Αλλαγή της διεύθυνσης email στην οποία θα σταλεί το email επιβεβαίωσης. tab_signin = Είσοδος tab_signup = Εγγραφή +hint_login = Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ! +hint_register = Χρειάζεστε έναν λογαριασμό; Κάντε εγγραφή εδώ! +sign_up_button = Δημιουργία λογαριασμού. +back_to_sign_in = Επιστροφή στην σελίδα εισόδου +sign_in_openid = Συνέχεια με OpenID [mail] view_it_on=Δείτε το στο %s @@ -531,6 +545,21 @@ team_invite.text_3=Σημείωση: Αυτή η πρόσκληση προορι admin.new_user.text = Παρακαλώ πατήστε εδώ για να διαχειριστείτε τον χρήστη μέσω του πίνακα διαχειριστών. admin.new_user.subject = Εγγραφή νέου χρήστη %s admin.new_user.user_info = Πληροφορίες χρήστη +removed_security_key.no_2fa = Δεν έχετε ρυθμίσει κάποια άλλη μέθοδο σύνδεσης δευτέρου παράγοντα (2FA), άρα δεν χρειάζεται να συνδεθείτε στον λογαριασμό σας μέσω 2FA. +account_security_caution.text_2 = Αν δεν ήσασταν εσείς, ο λογαριασμός σας έχει παραβιαστεί. Παρακαλούμε επικοινωνήστε με έναν διαχειριστή. +account_security_caution.text_1 = Αν αυτή η ενέργεια προέκυψε από εσάς, τότε μπορείτε απλά να αγνοήσετε αυτό το email. +password_change.subject = Ο κωδικός σας έχει αλλάξει +password_change.text_1 = Μόλις άλλαξε ο κωδικός πρόσβασης του λογαριασμού σας. +primary_mail_change.subject = Η κύρια διεύθυνση email σας άλλαξε +primary_mail_change.text_1 = Η κύρια διεύθυνση email του λογαριασμού σας μόλις άλλαξε στην %[1]s. Αυτό σημαίνει πως η διεύθυνση στην οποία λαμβάνετε αυτό το μήνυμα δεν θα λαμβάνει ειδοποιήσεις email για τον λογαριασμό σας πια. +totp_disabled.subject = Το TOTP απενεργοποιήθηκε +totp_disabled.text_1 = Το TOTP στο λογαριασμό σας μόλις απενεργοποιήθηκε. +removed_security_key.subject = Καταργήθηκε ένα κλειδί ασφαλείας +removed_security_key.text_1 = Το κλειδί ασφαλείας «%[1]s» μόλις αφαιρέθηκε από τον λογαριασμό σας. +totp_disabled.no_2fa = Δεν έχετε ρυθμίσει κάποια άλλη μέθοδο σύνδεσης δευτέρου παράγοντα (2FA), άρα δεν χρειάζεται να συνδεθείτε στον λογαριασμό σας μέσω 2FA. +totp_enrolled.subject = Έχετε ενεργοποιήσει το TOTP ως μέθοδο σύνδεσης δευτέρου παράγοντα 2FA +totp_enrolled.text_1.no_webauthn = Μόλις ενεργοποιήσατε το TOTP για τον λογαριασμό σας. Αυτό σημαίνει ότι για όλες τις μελλοντικές συνδέσεις στον λογαριασμό σας, θα πρέπει να χρησιμοποιείτε το TOTP ως μέθοδο σύνδεσης δευτέρου παράγοντα (2FA). +totp_enrolled.text_1.has_webauthn = Μόλις ενεργοποιήσατε το TOTP για τον λογαριασμό σας. Αυτό σημαίνει ότι για όλες τις μελλοντικές συνδέσεις στον λογαριασμό σας, θα πρέπει να χρησιμοποιείτε το TOTP ή ένα από τα κλειδιά ασφαλείας σας ως μέθοδο σύνδεσης δευτέρου παράγοντα (2FA). [modal] yes=Ναι @@ -728,7 +757,7 @@ cancel=Ακύρωση language=Γλώσσα ui=Θέμα Διεπαφής hidden_comment_types=Κρυμμένοι τύποι σχολίων -hidden_comment_types_description=Οι τύποι σχολίων που επιλέγονται εδώ δε θα εμφανίζονται μέσα στις σελίδες ζητημάτων. Επιλέγοντας π.χ το "Σήματα", θα αφαιρεθούν όλα τα σχόλια σαν το " πρόσθεσε/αφαίρεσε τα σήματα