From 43fb63a06388160831e97d0ebb858b8498b98b61 Mon Sep 17 00:00:00 2001 From: Beowulf Date: Thu, 29 May 2025 19:55:57 +0200 Subject: [PATCH 001/495] fix(ui): release: name is overridden with tag name on edit Fixes #8001 Regression: f66a6b12cda96807c29f3c6b2fc851c49f24d739 --- templates/repo/release/new.tmpl | 2 +- tests/e2e/release.test.e2e.ts | 170 ++++++++++++++++++-------------- 2 files changed, 97 insertions(+), 75 deletions(-) diff --git a/templates/repo/release/new.tmpl b/templates/repo/release/new.tmpl index 788d7f015c..c5c7eb23fa 100644 --- a/templates/repo/release/new.tmpl +++ b/templates/repo/release/new.tmpl @@ -46,7 +46,7 @@
- +
{{template "shared/combomarkdowneditor" (dict diff --git a/tests/e2e/release.test.e2e.ts b/tests/e2e/release.test.e2e.ts index 044e7b93ab..a4303a7320 100644 --- a/tests/e2e/release.test.e2e.ts +++ b/tests/e2e/release.test.e2e.ts @@ -14,78 +14,100 @@ import {validate_form} from './shared/forms.ts'; test.use({user: 'user2'}); -test.describe.configure({ - timeout: 30000, -}); - -test('External Release Attachments', async ({page, isMobile}) => { - test.skip(isMobile); - - // Click "New Release" - await page.goto('/user2/repo2/releases'); - await page.click('.button.small.primary'); - - // Fill out form and create new release - await expect(page).toHaveURL('/user2/repo2/releases/new'); - await validate_form({page}, 'fieldset'); - const textarea = page.locator('input[name=tag_name]'); - await textarea.pressSequentially('2.0'); - await expect(page.locator('input[name=title]')).toHaveValue('2.0'); - await page.click('#add-external-link'); - await page.click('#add-external-link'); - await page.fill('input[name=attachment-new-name-2]', 'Test'); - await page.fill('input[name=attachment-new-exturl-2]', 'https://forgejo.org/'); - await page.click('.remove-rel-attach'); - await save_visual(page); - await page.click('.button.small.primary'); - - // Validate release page and click edit - await expect(page).toHaveURL('/user2/repo2/releases'); - await expect(page.locator('.download[open] li')).toHaveCount(3); - - await expect(page.locator('.download[open] li:nth-of-type(1)')).toContainText('Source code (ZIP)'); - await expect(page.locator('.download[open] li:nth-of-type(1) span[data-tooltip-content]')).toHaveAttribute('data-tooltip-content', 'This attachment is automatically generated.'); - await expect(page.locator('.download[open] li:nth-of-type(1) a')).toHaveAttribute('href', '/user2/repo2/archive/2.0.zip'); - await expect(page.locator('.download[open] li:nth-of-type(1) a')).toHaveAttribute('type', 'application/zip'); - - await expect(page.locator('.download[open] li:nth-of-type(2)')).toContainText('Source code (TAR.GZ)'); - await expect(page.locator('.download[open] li:nth-of-type(2) span[data-tooltip-content]')).toHaveAttribute('data-tooltip-content', 'This attachment is automatically generated.'); - await expect(page.locator('.download[open] li:nth-of-type(2) a')).toHaveAttribute('href', '/user2/repo2/archive/2.0.tar.gz'); - await expect(page.locator('.download[open] li:nth-of-type(2) a')).toHaveAttribute('type', 'application/gzip'); - - await expect(page.locator('.download[open] li:nth-of-type(3)')).toContainText('Test'); - await expect(page.locator('.download[open] li:nth-of-type(3) a')).toHaveAttribute('href', 'https://forgejo.org/'); - await save_visual(page); - await page.locator('.octicon-pencil').first().click(); - - // Validate edit page and edit the release - await expect(page).toHaveURL('/user2/repo2/releases/edit/2.0'); - await validate_form({page}, 'fieldset'); - await expect(page.locator('.attachment_edit:visible')).toHaveCount(2); - await expect(page.locator('.attachment_edit:visible').nth(0)).toHaveValue('Test'); - await expect(page.locator('.attachment_edit:visible').nth(1)).toHaveValue('https://forgejo.org/'); - await page.locator('.attachment_edit:visible').nth(0).fill('Test2'); - await page.locator('.attachment_edit:visible').nth(1).fill('https://gitea.io/'); - await page.click('#add-external-link'); - await expect(page.locator('.attachment_edit:visible')).toHaveCount(4); - await page.locator('.attachment_edit:visible').nth(2).fill('Test3'); - await page.locator('.attachment_edit:visible').nth(3).fill('https://gitea.com/'); - await save_visual(page); - await page.click('.button.small.primary'); - - // Validate release page and click edit - await expect(page).toHaveURL('/user2/repo2/releases'); - await expect(page.locator('.download[open] li')).toHaveCount(4); - await expect(page.locator('.download[open] li:nth-of-type(3)')).toContainText('Test2'); - await expect(page.locator('.download[open] li:nth-of-type(3) a')).toHaveAttribute('href', 'https://gitea.io/'); - await expect(page.locator('.download[open] li:nth-of-type(4)')).toContainText('Test3'); - await expect(page.locator('.download[open] li:nth-of-type(4) a')).toHaveAttribute('href', 'https://gitea.com/'); - await save_visual(page); - await page.locator('.octicon-pencil').first().click(); - - // Delete release - await expect(page).toHaveURL('/user2/repo2/releases/edit/2.0'); - await page.click('.delete-button'); - await page.click('.button.ok'); - await expect(page).toHaveURL('/user2/repo2/releases'); +test.describe('repo branch protection settings', () => { + test('External Release Attachments', async ({page, isMobile}, workerInfo) => { + test.skip(isMobile || workerInfo.project.name === 'webkit'); + + // Click "New Release" + await page.goto('/user2/repo2/releases'); + await page.click('.button.small.primary'); + + // Fill out form and create new release + await expect(page).toHaveURL('/user2/repo2/releases/new'); + await validate_form({page}, 'fieldset'); + const textarea = page.locator('input[name=tag_name]'); + await textarea.pressSequentially('2.0'); + await expect(page.locator('input[name=title]')).toHaveValue('2.0'); + await page.click('#add-external-link'); + await page.click('#add-external-link'); + await page.fill('input[name=attachment-new-name-2]', 'Test'); + await page.fill('input[name=attachment-new-exturl-2]', 'https://forgejo.org/'); + await page.click('.remove-rel-attach'); + await save_visual(page); + await page.click('.button.small.primary'); + + // Validate release page and click edit + await expect(page).toHaveURL('/user2/repo2/releases'); + await expect(page.locator('.download[open] li')).toHaveCount(3); + + await expect(page.locator('.download[open] li:nth-of-type(1)')).toContainText('Source code (ZIP)'); + await expect(page.locator('.download[open] li:nth-of-type(1) span[data-tooltip-content]')).toHaveAttribute('data-tooltip-content', 'This attachment is automatically generated.'); + await expect(page.locator('.download[open] li:nth-of-type(1) a')).toHaveAttribute('href', '/user2/repo2/archive/2.0.zip'); + await expect(page.locator('.download[open] li:nth-of-type(1) a')).toHaveAttribute('type', 'application/zip'); + + await expect(page.locator('.download[open] li:nth-of-type(2)')).toContainText('Source code (TAR.GZ)'); + await expect(page.locator('.download[open] li:nth-of-type(2) span[data-tooltip-content]')).toHaveAttribute('data-tooltip-content', 'This attachment is automatically generated.'); + await expect(page.locator('.download[open] li:nth-of-type(2) a')).toHaveAttribute('href', '/user2/repo2/archive/2.0.tar.gz'); + await expect(page.locator('.download[open] li:nth-of-type(2) a')).toHaveAttribute('type', 'application/gzip'); + + await expect(page.locator('.download[open] li:nth-of-type(3)')).toContainText('Test'); + await expect(page.locator('.download[open] li:nth-of-type(3) a')).toHaveAttribute('href', 'https://forgejo.org/'); + await save_visual(page); + await page.locator('.octicon-pencil').first().click(); + + // Validate edit page and edit the release + await expect(page).toHaveURL('/user2/repo2/releases/edit/2.0'); + await validate_form({page}, 'fieldset'); + await expect(page.locator('.attachment_edit:visible')).toHaveCount(2); + await expect(page.locator('.attachment_edit:visible').nth(0)).toHaveValue('Test'); + await expect(page.locator('.attachment_edit:visible').nth(1)).toHaveValue('https://forgejo.org/'); + await page.locator('.attachment_edit:visible').nth(0).fill('Test2'); + await page.locator('.attachment_edit:visible').nth(1).fill('https://gitea.io/'); + await page.click('#add-external-link'); + await expect(page.locator('.attachment_edit:visible')).toHaveCount(4); + await page.locator('.attachment_edit:visible').nth(2).fill('Test3'); + await page.locator('.attachment_edit:visible').nth(3).fill('https://gitea.com/'); + await save_visual(page); + await page.click('.button.small.primary'); + + // Validate release page and click edit + await expect(page).toHaveURL('/user2/repo2/releases'); + await expect(page.locator('.download[open] li')).toHaveCount(4); + await expect(page.locator('.download[open] li:nth-of-type(3)')).toContainText('Test2'); + await expect(page.locator('.download[open] li:nth-of-type(3) a')).toHaveAttribute('href', 'https://gitea.io/'); + await expect(page.locator('.download[open] li:nth-of-type(4)')).toContainText('Test3'); + await expect(page.locator('.download[open] li:nth-of-type(4) a')).toHaveAttribute('href', 'https://gitea.com/'); + await save_visual(page); + await page.locator('.octicon-pencil').first().click(); + }); + + test('Release name equals tag name if created from tag', async ({page}) => { + await page.goto('/user2/repo2/releases/new?tag=v1.1'); + + await expect(page.locator('input[name=title]')).toHaveValue('v1.1'); + }); + + test('Release name equals release name if edit', async ({page, isMobile}) => { + test.skip(isMobile); + + await page.goto('/user2/repo2/releases/new'); + + await page.locator('input[name=title]').pressSequentially('v2.0'); + await page.locator('input[name=tag_name]').pressSequentially('2.0'); + await page.click('.button.small.primary'); + + await page.goto('/user2/repo2/releases/edit/2.0'); + + await expect(page.locator('input[name=title]')).toHaveValue('v2.0'); + }); + + test.afterEach(async ({page}) => { + // Delete release + const response = await page.goto('/user2/repo2/releases/edit/2.0'); + test.skip(response.status() === 404, 'No release to delete'); + + await page.locator('.delete-button').dispatchEvent('click'); + await page.locator('.button.ok').click(); + await expect(page).toHaveURL('/user2/repo2/releases'); + }); }); From 7a6b5b6dd9ef5bbaa9a48424639e44791f330e38 Mon Sep 17 00:00:00 2001 From: oliverpool Date: Tue, 17 Jun 2025 15:30:53 +0200 Subject: [PATCH 002/495] blame: count lines without reading blob --- routers/web/repo/blame.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/routers/web/repo/blame.go b/routers/web/repo/blame.go index ccdd59f2dd..f4cc2a2cea 100644 --- a/routers/web/repo/blame.go +++ b/routers/web/repo/blame.go @@ -82,19 +82,19 @@ func RefBlame(ctx *context.Context) { return } - ctx.Data["NumLinesSet"] = true - ctx.Data["NumLines"], err = blob.GetBlobLineCount() - if err != nil { - ctx.ServerError("GetBlobLineCount", err) - return - } - result, err := performBlame(ctx, ctx.Repo.Commit, ctx.Repo.TreePath, ctx.FormBool("bypass-blame-ignore")) if err != nil { ctx.ServerError("performBlame", err) return } + ctx.Data["NumLinesSet"] = true + numLines := 0 + for _, p := range result.Parts { + numLines += len(p.Lines) + } + ctx.Data["NumLines"] = numLines + ctx.Data["UsesIgnoreRevs"] = result.UsesIgnoreRevs ctx.Data["FaultyIgnoreRevsFile"] = result.FaultyIgnoreRevsFile From 744363597d05dab677b94d9754927b9f27e155c6 Mon Sep 17 00:00:00 2001 From: oliverpool Date: Tue, 17 Jun 2025 15:56:53 +0200 Subject: [PATCH 003/495] test: before refatoring count function --- services/gitdiff/gitdiff_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/gitdiff/gitdiff_test.go b/services/gitdiff/gitdiff_test.go index 3d3c8432c4..695b177b8b 100644 --- a/services/gitdiff/gitdiff_test.go +++ b/services/gitdiff/gitdiff_test.go @@ -712,6 +712,8 @@ func TestGetDiffFull(t *testing.T) { assert.Equal(t, ".gitattributes", diff.Files[0].Name) assert.Equal(t, "24139dae656713ba861751fb2c2ac38839349a7a", diff.Files[0].NameHash) + assert.Len(t, diff.Files[0].Sections, 2) + assert.Equal(t, 4, diff.Files[0].Sections[1].Lines[0].SectionInfo.LeftIdx) }) } From 6ed62c14d3d1d9a693ad68262ae5f740f8aa1506 Mon Sep 17 00:00:00 2001 From: oliverpool Date: Tue, 17 Jun 2025 16:06:10 +0200 Subject: [PATCH 004/495] move blobLineCount to disencentive its usage --- modules/git/blob.go | 27 --------------------------- services/gitdiff/gitdiff.go | 22 ++++++++++++++++++++-- 2 files changed, 20 insertions(+), 29 deletions(-) diff --git a/modules/git/blob.go b/modules/git/blob.go index 8c5c275146..30615afe32 100644 --- a/modules/git/blob.go +++ b/modules/git/blob.go @@ -172,33 +172,6 @@ func (b *Blob) GetBlobContent(limit int64) (string, error) { return string(buf), err } -// GetBlobLineCount gets line count of the blob -func (b *Blob) GetBlobLineCount() (int, error) { - reader, err := b.DataAsync() - if err != nil { - return 0, err - } - defer reader.Close() - buf := make([]byte, 32*1024) - count := 1 - lineSep := []byte{'\n'} - - c, err := reader.Read(buf) - if c == 0 && err == io.EOF { - return 0, nil - } - for { - count += bytes.Count(buf[:c], lineSep) - switch { - case err == io.EOF: - return count, nil - case err != nil: - return count, err - } - c, err = reader.Read(buf) - } -} - // GetBlobContentBase64 Reads the content of the blob with a base64 encode and returns the encoded string func (b *Blob) GetBlobContentBase64() (string, error) { dataRc, err := b.DataAsync() diff --git a/services/gitdiff/gitdiff.go b/services/gitdiff/gitdiff.go index 989f69d4f4..6835dfbf36 100644 --- a/services/gitdiff/gitdiff.go +++ b/services/gitdiff/gitdiff.go @@ -440,11 +440,29 @@ func getCommitFileLineCount(commit *git.Commit, filePath string) int { if err != nil { return 0 } - lineCount, err := blob.GetBlobLineCount() + reader, err := blob.DataAsync() if err != nil { return 0 } - return lineCount + defer reader.Close() + buf := make([]byte, 32*1024) + count := 1 + lineSep := []byte{'\n'} + + c, err := reader.Read(buf) + if c == 0 && err == io.EOF { + return 0 + } + for { + count += bytes.Count(buf[:c], lineSep) + switch { + case err == io.EOF: + return count + case err != nil: + return count + } + c, err = reader.Read(buf) + } } // Diff represents a difference between two git trees. From 9e966ac91fb76043f9a3b794027e59b12ec4f6c0 Mon Sep 17 00:00:00 2001 From: forgejo-release-manager Date: Wed, 25 Jun 2025 06:24:12 +0200 Subject: [PATCH 005/495] chore: 12.0 is now stable --- release-notes-published/13.0.0.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 release-notes-published/13.0.0.md diff --git a/release-notes-published/13.0.0.md b/release-notes-published/13.0.0.md new file mode 100644 index 0000000000..e69de29bb2 From 8844b6b8e50826d9a5a33ec986332d594d3c6c84 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Wed, 25 Jun 2025 06:41:35 +0200 Subject: [PATCH 006/495] chore: 12.0 is now stable (take 2) --- release-notes-published/{13.0.0.md => 12.0.0.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename release-notes-published/{13.0.0.md => 12.0.0.md} (100%) diff --git a/release-notes-published/13.0.0.md b/release-notes-published/12.0.0.md similarity index 100% rename from release-notes-published/13.0.0.md rename to release-notes-published/12.0.0.md From 2bca029f6fe0812c2c1b6741a9e8a4ae75e8c0a0 Mon Sep 17 00:00:00 2001 From: oliverpool Date: Wed, 25 Jun 2025 15:58:55 +0200 Subject: [PATCH 007/495] chore(ci): testSleep: show actual times on failures (#8271) I just experienced a spurious error on `testSleep`. The current assertion only showed `expected false to be truthy`. With this PR it should show the actual elapsed time (to be able to knowingly adjust the expected delay). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8271 Reviewed-by: floss4good Reviewed-by: Beowulf Co-authored-by: oliverpool Co-committed-by: oliverpool --- web_src/js/utils.test.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web_src/js/utils.test.js b/web_src/js/utils.test.js index 535aae874a..365eb63e30 100644 --- a/web_src/js/utils.test.js +++ b/web_src/js/utils.test.js @@ -1,3 +1,4 @@ +import {expect, test} from 'vitest'; import { basename, extname, isObject, stripTags, parseIssueHref, parseUrl, translateMonth, translateDay, blobToDataURI, @@ -182,5 +183,5 @@ async function testSleep(ms) { await sleep(ms); const endTime = Date.now(); // Record the end time const actualSleepTime = endTime - startTime; - expect(actualSleepTime >= ms).toBeTruthy(); + expect(actualSleepTime).toBeGreaterThanOrEqual(ms); } From 309ddf6ec703dc0df925600c29dc2c03abeeff9f Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Wed, 25 Jun 2025 16:43:06 +0200 Subject: [PATCH 008/495] [v12.0/forgejo] chore(ci): testSleep: show actual times on failures (#8277) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8271 I just experienced a spurious error on `testSleep`. The current assertion only showed `expected false to be truthy`. With this PR it should show the actual elapsed time (to be able to knowingly adjust the expected delay). Co-authored-by: oliverpool Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8277 Reviewed-by: Beowulf Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- web_src/js/utils.test.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web_src/js/utils.test.js b/web_src/js/utils.test.js index 535aae874a..365eb63e30 100644 --- a/web_src/js/utils.test.js +++ b/web_src/js/utils.test.js @@ -1,3 +1,4 @@ +import {expect, test} from 'vitest'; import { basename, extname, isObject, stripTags, parseIssueHref, parseUrl, translateMonth, translateDay, blobToDataURI, @@ -182,5 +183,5 @@ async function testSleep(ms) { await sleep(ms); const endTime = Date.now(); // Record the end time const actualSleepTime = endTime - startTime; - expect(actualSleepTime >= ms).toBeTruthy(); + expect(actualSleepTime).toBeGreaterThanOrEqual(ms); } From 7ab27a7a7f7444472805da477342d1293469e90f Mon Sep 17 00:00:00 2001 From: Bente Groh Date: Wed, 25 Jun 2025 18:31:03 +0200 Subject: [PATCH 009/495] fix(ui): add missing lazy load attribute to images (#8246) closes #8076 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8246 Reviewed-by: Beowulf Co-authored-by: Bente Groh Co-committed-by: Bente Groh --- modules/markup/markdown/markdown_test.go | 104 +++++++++--------- modules/markup/markdown/transform_image.go | 1 + modules/markup/sanitizer.go | 3 + modules/markup/sanitizer_test.go | 4 + modules/templates/util_render_test.go | 4 +- templates/repo/issue/card.tmpl | 2 +- .../repo/issue/view_content/attachments.tmpl | 2 +- .../repo/issue/view_content/comments.tmpl | 2 +- templates/user/dashboard/feeds.tmpl | 2 +- web_src/js/components/RepoContributors.vue | 2 +- 10 files changed, 67 insertions(+), 59 deletions(-) diff --git a/modules/markup/markdown/markdown_test.go b/modules/markup/markdown/markdown_test.go index e229ee4c65..f7955115e0 100644 --- a/modules/markup/markdown/markdown_test.go +++ b/modules/markup/markdown/markdown_test.go @@ -104,7 +104,7 @@ func TestRender_Images(t *testing.T) { test( "!["+title+"]("+url+")", - `

`+title+`

`) + `

`+title+`

`) test( "[["+title+"|"+url+"]]", @@ -115,7 +115,7 @@ func TestRender_Images(t *testing.T) { test( "!["+title+"]("+url+")", - `

`+title+`

`) + `

`+title+`

`) test( "[["+title+"|"+url+"]]", @@ -412,8 +412,8 @@ func TestRenderSiblingImages_Issue12925(t *testing.T) { testcase := `![image1](/image1) ![image2](/image2) ` - expected := `

image1
-image2

+ expected := `

image1
+image2

` res, err := markdown.RenderRawString(&markup.RenderContext{Ctx: git.DefaultContext}, testcase) require.NoError(t, err) @@ -845,10 +845,10 @@ mail@domain.com remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
@@ -872,10 +872,10 @@ space

remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
@@ -901,10 +901,10 @@ space

remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
@@ -930,10 +930,10 @@ space

remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
@@ -959,10 +959,10 @@ space

remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
@@ -988,10 +988,10 @@ space

remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
@@ -1018,10 +1018,10 @@ space

remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
@@ -1048,10 +1048,10 @@ space

remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
@@ -1078,10 +1078,10 @@ space

remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
@@ -1108,10 +1108,10 @@ space

remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
@@ -1139,10 +1139,10 @@ space

remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
@@ -1170,10 +1170,10 @@ space

remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
diff --git a/modules/markup/markdown/transform_image.go b/modules/markup/markdown/transform_image.go index 0f9c69cae6..b86c9e3d41 100644 --- a/modules/markup/markdown/transform_image.go +++ b/modules/markup/markdown/transform_image.go @@ -44,6 +44,7 @@ func (g *ASTTransformer) transformImage(ctx *markup.RenderContext, v *ast.Image) for _, attr := range v.Attributes() { image.SetAttribute(attr.Name, attr.Value) } + image.SetAttributeString("loading", []byte("lazy")) for child := v.FirstChild(); child != nil; { next := child.NextSibling() image.AppendChild(image, child) diff --git a/modules/markup/sanitizer.go b/modules/markup/sanitizer.go index 384dd1fe94..aacc2536bf 100644 --- a/modules/markup/sanitizer.go +++ b/modules/markup/sanitizer.go @@ -108,6 +108,9 @@ func createDefaultPolicy() *bluemonday.Policy { // Allow classes for emojis policy.AllowAttrs("class").Matching(regexp.MustCompile(`^emoji$`)).OnElements("img") + // Allow attributes for images + policy.AllowAttrs("loading").Matching(regexp.MustCompile(`^lazy$`)).OnElements("img") + // Allow icons, emojis, chroma syntax and keyword markup on span policy.AllowAttrs("class").Matching(regexp.MustCompile(`^((icon(\s+[\p{L}\p{N}_-]+)+)|(emoji)|(language-math display)|(language-math inline))$|^([a-z][a-z0-9]{0,2})$|^` + keywordClass + `$`)).OnElements("span") policy.AllowAttrs("data-alias").Matching(regexp.MustCompile(`^[a-zA-Z0-9-_+]+$`)).OnElements("span") diff --git a/modules/markup/sanitizer_test.go b/modules/markup/sanitizer_test.go index 9805a34910..a0faff0494 100644 --- a/modules/markup/sanitizer_test.go +++ b/modules/markup/sanitizer_test.go @@ -75,6 +75,10 @@ func Test_Sanitizer(t *testing.T) { // Emoji `THUMBS UP`, `THUMBS UP`, `THUMBS UP`, `THUMBS UP`, + + // Images lazy loading + `image1`, `image1`, + `image1`, `image1`, } for i := 0; i < len(testCases); i += 2 { diff --git a/modules/templates/util_render_test.go b/modules/templates/util_render_test.go index b75b061218..62e063213c 100644 --- a/modules/templates/util_render_test.go +++ b/modules/templates/util_render_test.go @@ -192,8 +192,8 @@ func TestRenderMarkdownToHtml(t *testing.T) { remote link local link remote link -local image -remote image +local image +remote image 88fc37a3c0...12fc37a3c0 (hash) diff --git a/templates/repo/issue/card.tmpl b/templates/repo/issue/card.tmpl index 8646562ca8..6d2f441793 100644 --- a/templates/repo/issue/card.tmpl +++ b/templates/repo/issue/card.tmpl @@ -4,7 +4,7 @@ {{if $attachments}}
{{range $attachments}} - {{.Name}} + {{.Name}} {{end}}
{{end}} diff --git a/templates/repo/issue/view_content/attachments.tmpl b/templates/repo/issue/view_content/attachments.tmpl index 79085df3ab..8b5094771a 100644 --- a/templates/repo/issue/view_content/attachments.tmpl +++ b/templates/repo/issue/view_content/attachments.tmpl @@ -31,7 +31,7 @@ {{if FilenameIsImage .Name}} {{if not (StringUtils.Contains (StringUtils.ToString $.RenderedContent) .UUID)}} - {{.Name}} + {{.Name}} {{end}} {{end}} diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl index 2e9ba3dcd7..3bc4cd0773 100644 --- a/templates/repo/issue/view_content/comments.tmpl +++ b/templates/repo/issue/view_content/comments.tmpl @@ -634,7 +634,7 @@
- + {{svg "octicon-x" 16}} diff --git a/templates/user/dashboard/feeds.tmpl b/templates/user/dashboard/feeds.tmpl index d0ecb1fc36..cdf0429714 100644 --- a/templates/user/dashboard/feeds.tmpl +++ b/templates/user/dashboard/feeds.tmpl @@ -90,7 +90,7 @@
{{range $push.Commits}}
- + {{template "repo/shabox" (dict "sha1" .Sha1 "commitLink" (printf "%s/commit/%s" $repoLink .Sha1) diff --git a/web_src/js/components/RepoContributors.vue b/web_src/js/components/RepoContributors.vue index 07ad336cf7..5e03019ef1 100644 --- a/web_src/js/components/RepoContributors.vue +++ b/web_src/js/components/RepoContributors.vue @@ -391,7 +391,7 @@ export default {
#{{ index + 1 }} - +

{{ contributor.name }}

From aa648d74ea17ade0b1617fc1b524fc095e2fd009 Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Wed, 25 Jun 2025 20:42:35 +0200 Subject: [PATCH 010/495] [v12.0/forgejo] fix(ui): add missing lazy load attribute to images (#8282) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8246 closes #8076 Co-authored-by: Bente Groh Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8282 Reviewed-by: Beowulf Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- modules/markup/markdown/markdown_test.go | 104 +++++++++--------- modules/markup/markdown/transform_image.go | 1 + modules/markup/sanitizer.go | 3 + modules/markup/sanitizer_test.go | 4 + modules/templates/util_render_test.go | 4 +- templates/repo/issue/card.tmpl | 2 +- .../repo/issue/view_content/attachments.tmpl | 2 +- .../repo/issue/view_content/comments.tmpl | 2 +- templates/user/dashboard/feeds.tmpl | 2 +- web_src/js/components/RepoContributors.vue | 2 +- 10 files changed, 67 insertions(+), 59 deletions(-) diff --git a/modules/markup/markdown/markdown_test.go b/modules/markup/markdown/markdown_test.go index e229ee4c65..f7955115e0 100644 --- a/modules/markup/markdown/markdown_test.go +++ b/modules/markup/markdown/markdown_test.go @@ -104,7 +104,7 @@ func TestRender_Images(t *testing.T) { test( "!["+title+"]("+url+")", - `

`+title+`

`) + `

`+title+`

`) test( "[["+title+"|"+url+"]]", @@ -115,7 +115,7 @@ func TestRender_Images(t *testing.T) { test( "!["+title+"]("+url+")", - `

`+title+`

`) + `

`+title+`

`) test( "[["+title+"|"+url+"]]", @@ -412,8 +412,8 @@ func TestRenderSiblingImages_Issue12925(t *testing.T) { testcase := `![image1](/image1) ![image2](/image2) ` - expected := `

image1
-image2

+ expected := `

image1
+image2

` res, err := markdown.RenderRawString(&markup.RenderContext{Ctx: git.DefaultContext}, testcase) require.NoError(t, err) @@ -845,10 +845,10 @@ mail@domain.com remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
@@ -872,10 +872,10 @@ space

remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
@@ -901,10 +901,10 @@ space

remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
@@ -930,10 +930,10 @@ space

remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
@@ -959,10 +959,10 @@ space

remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
@@ -988,10 +988,10 @@ space

remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
@@ -1018,10 +1018,10 @@ space

remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
@@ -1048,10 +1048,10 @@ space

remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
@@ -1078,10 +1078,10 @@ space

remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
@@ -1108,10 +1108,10 @@ space

remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
@@ -1139,10 +1139,10 @@ space

remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
@@ -1170,10 +1170,10 @@ space

remote link
local link
remote link
-local image
-local image
-local image
-remote image
+local image
+local image
+local image
+remote image


https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
diff --git a/modules/markup/markdown/transform_image.go b/modules/markup/markdown/transform_image.go index 0f9c69cae6..b86c9e3d41 100644 --- a/modules/markup/markdown/transform_image.go +++ b/modules/markup/markdown/transform_image.go @@ -44,6 +44,7 @@ func (g *ASTTransformer) transformImage(ctx *markup.RenderContext, v *ast.Image) for _, attr := range v.Attributes() { image.SetAttribute(attr.Name, attr.Value) } + image.SetAttributeString("loading", []byte("lazy")) for child := v.FirstChild(); child != nil; { next := child.NextSibling() image.AppendChild(image, child) diff --git a/modules/markup/sanitizer.go b/modules/markup/sanitizer.go index 384dd1fe94..aacc2536bf 100644 --- a/modules/markup/sanitizer.go +++ b/modules/markup/sanitizer.go @@ -108,6 +108,9 @@ func createDefaultPolicy() *bluemonday.Policy { // Allow classes for emojis policy.AllowAttrs("class").Matching(regexp.MustCompile(`^emoji$`)).OnElements("img") + // Allow attributes for images + policy.AllowAttrs("loading").Matching(regexp.MustCompile(`^lazy$`)).OnElements("img") + // Allow icons, emojis, chroma syntax and keyword markup on span policy.AllowAttrs("class").Matching(regexp.MustCompile(`^((icon(\s+[\p{L}\p{N}_-]+)+)|(emoji)|(language-math display)|(language-math inline))$|^([a-z][a-z0-9]{0,2})$|^` + keywordClass + `$`)).OnElements("span") policy.AllowAttrs("data-alias").Matching(regexp.MustCompile(`^[a-zA-Z0-9-_+]+$`)).OnElements("span") diff --git a/modules/markup/sanitizer_test.go b/modules/markup/sanitizer_test.go index 9805a34910..a0faff0494 100644 --- a/modules/markup/sanitizer_test.go +++ b/modules/markup/sanitizer_test.go @@ -75,6 +75,10 @@ func Test_Sanitizer(t *testing.T) { // Emoji `THUMBS UP`, `THUMBS UP`, `THUMBS UP`, `THUMBS UP`, + + // Images lazy loading + `image1`, `image1`, + `image1`, `image1`, } for i := 0; i < len(testCases); i += 2 { diff --git a/modules/templates/util_render_test.go b/modules/templates/util_render_test.go index b75b061218..62e063213c 100644 --- a/modules/templates/util_render_test.go +++ b/modules/templates/util_render_test.go @@ -192,8 +192,8 @@ func TestRenderMarkdownToHtml(t *testing.T) { remote link local link remote link -local image -remote image +local image +remote image 88fc37a3c0...12fc37a3c0 (hash) diff --git a/templates/repo/issue/card.tmpl b/templates/repo/issue/card.tmpl index 8646562ca8..6d2f441793 100644 --- a/templates/repo/issue/card.tmpl +++ b/templates/repo/issue/card.tmpl @@ -4,7 +4,7 @@ {{if $attachments}}
{{range $attachments}} - {{.Name}} + {{.Name}} {{end}}
{{end}} diff --git a/templates/repo/issue/view_content/attachments.tmpl b/templates/repo/issue/view_content/attachments.tmpl index 79085df3ab..8b5094771a 100644 --- a/templates/repo/issue/view_content/attachments.tmpl +++ b/templates/repo/issue/view_content/attachments.tmpl @@ -31,7 +31,7 @@ {{if FilenameIsImage .Name}} {{if not (StringUtils.Contains (StringUtils.ToString $.RenderedContent) .UUID)}} - {{.Name}} + {{.Name}} {{end}} {{end}} diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl index 2e9ba3dcd7..3bc4cd0773 100644 --- a/templates/repo/issue/view_content/comments.tmpl +++ b/templates/repo/issue/view_content/comments.tmpl @@ -634,7 +634,7 @@
- + {{svg "octicon-x" 16}} diff --git a/templates/user/dashboard/feeds.tmpl b/templates/user/dashboard/feeds.tmpl index d0ecb1fc36..cdf0429714 100644 --- a/templates/user/dashboard/feeds.tmpl +++ b/templates/user/dashboard/feeds.tmpl @@ -90,7 +90,7 @@
{{range $push.Commits}}
- + {{template "repo/shabox" (dict "sha1" .Sha1 "commitLink" (printf "%s/commit/%s" $repoLink .Sha1) diff --git a/web_src/js/components/RepoContributors.vue b/web_src/js/components/RepoContributors.vue index 07ad336cf7..5e03019ef1 100644 --- a/web_src/js/components/RepoContributors.vue +++ b/web_src/js/components/RepoContributors.vue @@ -391,7 +391,7 @@ export default {
#{{ index + 1 }} - +

{{ contributor.name }}

From 69bd7a1f1bcd2529f3cea2c49cb9d573ce4c2f85 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 25 Jun 2025 23:58:26 +0200 Subject: [PATCH 011/495] Update dependency mermaid to v11.7.0 (forgejo) (#8249) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8249 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 18 +++++++++--------- package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9de06a8055..e033b28f22 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "idiomorph": "0.3.0", "jquery": "3.7.1", "katex": "0.16.22", - "mermaid": "11.6.0", + "mermaid": "11.7.0", "mini-css-extract-plugin": "2.9.2", "minimatch": "10.0.3", "monaco-editor": "0.52.2", @@ -2088,9 +2088,9 @@ } }, "node_modules/@mermaid-js/parser": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.4.0.tgz", - "integrity": "sha512-wla8XOWvQAwuqy+gxiZqY+c7FokraOTHRWMsbB4AgRx9Sy7zKslNyejy7E+a77qHfey5GXw/ik3IXv/NHMJgaA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.5.0.tgz", + "integrity": "sha512-AiaN7+VjXC+3BYE+GwNezkpjIcCI2qIMB/K4S2/vMWe0q/XJCBbx5+K7iteuz7VyltX9iAK4FmVTvGc9kjOV4w==", "license": "MIT", "dependencies": { "langium": "3.3.1" @@ -10562,14 +10562,14 @@ } }, "node_modules/mermaid": { - "version": "11.6.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.6.0.tgz", - "integrity": "sha512-PE8hGUy1LDlWIHWBP05SFdqUHGmRcCcK4IzpOKPE35eOw+G9zZgcnMpyunJVUEOgb//KBORPjysKndw8bFLuRg==", + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.7.0.tgz", + "integrity": "sha512-/1/5R0rt0Z1Ak0CuznAnCF3HtQgayRXUz6SguzOwN4L+DuCobz0UxnQ+ZdTSZ3AugKVVh78tiVmsHpHWV25TCw==", "license": "MIT", "dependencies": { "@braintree/sanitize-url": "^7.0.4", "@iconify/utils": "^2.1.33", - "@mermaid-js/parser": "^0.4.0", + "@mermaid-js/parser": "^0.5.0", "@types/d3": "^7.4.3", "cytoscape": "^3.29.3", "cytoscape-cose-bilkent": "^4.1.0", @@ -10578,7 +10578,7 @@ "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.11", "dayjs": "^1.11.13", - "dompurify": "^3.2.4", + "dompurify": "^3.2.5", "katex": "^0.16.9", "khroma": "^2.1.0", "lodash-es": "^4.17.21", diff --git a/package.json b/package.json index f7df1b3f38..3d71e94cd3 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "idiomorph": "0.3.0", "jquery": "3.7.1", "katex": "0.16.22", - "mermaid": "11.6.0", + "mermaid": "11.7.0", "mini-css-extract-plugin": "2.9.2", "minimatch": "10.0.3", "monaco-editor": "0.52.2", From 507a12bf82598e29ccfad14211279a5ac5e39307 Mon Sep 17 00:00:00 2001 From: Gusted Date: Thu, 26 Jun 2025 00:36:18 +0200 Subject: [PATCH 012/495] Revert "fix(api): document `is_system_webhook` field (#7784)" (#8286) The field is not part of the struct, it is instead part of the config field. See https://codeberg.org/forgejo/forgejo/pulls/7784#issuecomment-5511212 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8286 Reviewed-by: Beowulf Co-authored-by: Gusted Co-committed-by: Gusted --- modules/structs/hook.go | 3 +-- templates/swagger/v1_json.tmpl | 4 ---- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/modules/structs/hook.go b/modules/structs/hook.go index 5adcad0881..11372ca6e1 100644 --- a/modules/structs/hook.go +++ b/modules/structs/hook.go @@ -53,8 +53,7 @@ type CreateHookOption struct { BranchFilter string `json:"branch_filter" binding:"GlobPattern"` AuthorizationHeader string `json:"authorization_header"` // default: false - Active bool `json:"active"` - IsSystemWebhook bool `json:"is_system_webhook"` + Active bool `json:"active"` } // EditHookOption options when modify one hook diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 3ef712c464..59c13cd9e6 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -22701,10 +22701,6 @@ }, "x-go-name": "Events" }, - "is_system_webhook": { - "type": "boolean", - "x-go-name": "IsSystemWebhook" - }, "type": { "type": "string", "enum": [ From d99cecc1769a2f5eb282276703808fa0fe3de6ff Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Thu, 26 Jun 2025 01:25:37 +0200 Subject: [PATCH 013/495] [v12.0/forgejo] Revert "fix(api): document `is_system_webhook` field (#7784)" (#8288) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8286 The field is not part of the struct, it is instead part of the config field. See https://codeberg.org/forgejo/forgejo/pulls/7784#issuecomment-5511212 Co-authored-by: Gusted Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8288 Reviewed-by: Gusted Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- modules/structs/hook.go | 3 +-- templates/swagger/v1_json.tmpl | 4 ---- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/modules/structs/hook.go b/modules/structs/hook.go index 5adcad0881..11372ca6e1 100644 --- a/modules/structs/hook.go +++ b/modules/structs/hook.go @@ -53,8 +53,7 @@ type CreateHookOption struct { BranchFilter string `json:"branch_filter" binding:"GlobPattern"` AuthorizationHeader string `json:"authorization_header"` // default: false - Active bool `json:"active"` - IsSystemWebhook bool `json:"is_system_webhook"` + Active bool `json:"active"` } // EditHookOption options when modify one hook diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 3ef712c464..59c13cd9e6 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -22701,10 +22701,6 @@ }, "x-go-name": "Events" }, - "is_system_webhook": { - "type": "boolean", - "x-go-name": "IsSystemWebhook" - }, "type": { "type": "string", "enum": [ From d3c712fe2a34446441a97495c2916faacea51f5d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 26 Jun 2025 02:27:54 +0200 Subject: [PATCH 014/495] Lock file maintenance (forgejo) (#8257) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8257 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 380 ++++++++++++++--------------- web_src/fomantic/package-lock.json | 42 ++-- 2 files changed, 211 insertions(+), 211 deletions(-) diff --git a/package-lock.json b/package-lock.json index e033b28f22..604ff38c18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2269,9 +2269,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.43.0.tgz", - "integrity": "sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.0.tgz", + "integrity": "sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==", "cpu": [ "arm" ], @@ -2283,9 +2283,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.43.0.tgz", - "integrity": "sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.0.tgz", + "integrity": "sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==", "cpu": [ "arm64" ], @@ -2297,9 +2297,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.43.0.tgz", - "integrity": "sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.0.tgz", + "integrity": "sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==", "cpu": [ "arm64" ], @@ -2311,9 +2311,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.43.0.tgz", - "integrity": "sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.0.tgz", + "integrity": "sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==", "cpu": [ "x64" ], @@ -2325,9 +2325,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.43.0.tgz", - "integrity": "sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.0.tgz", + "integrity": "sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==", "cpu": [ "arm64" ], @@ -2339,9 +2339,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.43.0.tgz", - "integrity": "sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.0.tgz", + "integrity": "sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==", "cpu": [ "x64" ], @@ -2353,9 +2353,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.43.0.tgz", - "integrity": "sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.0.tgz", + "integrity": "sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==", "cpu": [ "arm" ], @@ -2367,9 +2367,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.43.0.tgz", - "integrity": "sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.0.tgz", + "integrity": "sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==", "cpu": [ "arm" ], @@ -2381,9 +2381,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.43.0.tgz", - "integrity": "sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.0.tgz", + "integrity": "sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==", "cpu": [ "arm64" ], @@ -2395,9 +2395,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.43.0.tgz", - "integrity": "sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.0.tgz", + "integrity": "sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==", "cpu": [ "arm64" ], @@ -2409,9 +2409,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.43.0.tgz", - "integrity": "sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.0.tgz", + "integrity": "sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==", "cpu": [ "loong64" ], @@ -2423,9 +2423,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.43.0.tgz", - "integrity": "sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.0.tgz", + "integrity": "sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==", "cpu": [ "ppc64" ], @@ -2437,9 +2437,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.43.0.tgz", - "integrity": "sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.0.tgz", + "integrity": "sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==", "cpu": [ "riscv64" ], @@ -2451,9 +2451,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.43.0.tgz", - "integrity": "sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.0.tgz", + "integrity": "sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==", "cpu": [ "riscv64" ], @@ -2465,9 +2465,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.43.0.tgz", - "integrity": "sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.0.tgz", + "integrity": "sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==", "cpu": [ "s390x" ], @@ -2479,9 +2479,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.43.0.tgz", - "integrity": "sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.0.tgz", + "integrity": "sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==", "cpu": [ "x64" ], @@ -2493,9 +2493,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.43.0.tgz", - "integrity": "sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.0.tgz", + "integrity": "sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==", "cpu": [ "x64" ], @@ -2507,9 +2507,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.43.0.tgz", - "integrity": "sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.0.tgz", + "integrity": "sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==", "cpu": [ "arm64" ], @@ -2521,9 +2521,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.43.0.tgz", - "integrity": "sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.0.tgz", + "integrity": "sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==", "cpu": [ "ia32" ], @@ -2535,9 +2535,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.43.0.tgz", - "integrity": "sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.0.tgz", + "integrity": "sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==", "cpu": [ "x64" ], @@ -3509,9 +3509,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.19.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.0.tgz", - "integrity": "sha512-hfrc+1tud1xcdVTABC2JiomZJEklMcXYNTVtZLAeqTVWD+qL5jkHKT+1lOtqDdGxt+mB53DTtiz673vfjU8D1Q==", + "version": "20.19.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.1.tgz", + "integrity": "sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -3825,9 +3825,9 @@ } }, "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.9.0.tgz", - "integrity": "sha512-h1T2c2Di49ekF2TE8ZCoJkb+jwETKUIPDJ/nO3tJBKlLFPu+fyd93f0rGP/BvArKx2k2HlRM4kqkNarj3dvZlg==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.9.1.tgz", + "integrity": "sha512-dd7yIp1hfJFX9ZlVLQRrh/Re9WMUHHmF9hrKD1yIvxcyNr2BhQ3xc1upAVhy8NijadnCswAxWQu8MkkSMC1qXQ==", "cpu": [ "arm" ], @@ -3839,9 +3839,9 @@ ] }, "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.9.0.tgz", - "integrity": "sha512-sG1NHtgXtX8owEkJ11yn34vt0Xqzi3k9TJ8zppDmyG8GZV4kVWw44FHwKwHeEFl07uKPeC4ZoyuQaGh5ruJYPA==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.9.1.tgz", + "integrity": "sha512-EzUPcMFtDVlo5yrbzMqUsGq3HnLXw+3ZOhSd7CUaDmbTtnrzM+RO2ntw2dm2wjbbc5djWj3yX0wzbbg8pLhx8g==", "cpu": [ "arm64" ], @@ -3853,9 +3853,9 @@ ] }, "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.9.0.tgz", - "integrity": "sha512-nJ9z47kfFnCxN1z/oYZS7HSNsFh43y2asePzTEZpEvK7kGyuShSl3RRXnm/1QaqFL+iP+BjMwuB+DYUymOkA5A==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.9.1.tgz", + "integrity": "sha512-nB+dna3q4kOleKFcSZJ/wDXIsAd1kpMO9XrVAt8tG3RDWJ6vi+Ic6bpz4cmg5tWNeCfHEY4KuqJCB+pKejPEmQ==", "cpu": [ "arm64" ], @@ -3867,9 +3867,9 @@ ] }, "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.9.0.tgz", - "integrity": "sha512-TK+UA1TTa0qS53rjWn7cVlEKVGz2B6JYe0C++TdQjvWYIyx83ruwh0wd4LRxYBM5HeuAzXcylA9BH2trARXJTw==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.9.1.tgz", + "integrity": "sha512-aKWHCrOGaCGwZcekf3TnczQoBxk5w//W3RZ4EQyhux6rKDwBPgDU9Y2yGigCV1Z+8DWqZgVGQi+hdpnlSy3a1w==", "cpu": [ "x64" ], @@ -3881,9 +3881,9 @@ ] }, "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.9.0.tgz", - "integrity": "sha512-6uZwzMRFcD7CcCd0vz3Hp+9qIL2jseE/bx3ZjaLwn8t714nYGwiE84WpaMCYjU+IQET8Vu/+BNAGtYD7BG/0yA==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.9.1.tgz", + "integrity": "sha512-4dIEMXrXt0UqDVgrsUd1I+NoIzVQWXy/CNhgpfS75rOOMK/4Abn0Mx2M2gWH4Mk9+ds/ASAiCmqoUFynmMY5hA==", "cpu": [ "x64" ], @@ -3895,9 +3895,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.9.0.tgz", - "integrity": "sha512-bPUBksQfrgcfv2+mm+AZinaKq8LCFvt5PThYqRotqSuuZK1TVKkhbVMS/jvSRfYl7jr3AoZLYbDkItxgqMKRkg==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.9.1.tgz", + "integrity": "sha512-vtvS13IXPs1eE8DuS/soiosqMBeyh50YLRZ+p7EaIKAPPeevRnA9G/wu/KbVt01ZD5qiGjxS+CGIdVC7I6gTOw==", "cpu": [ "arm" ], @@ -3909,9 +3909,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.9.0.tgz", - "integrity": "sha512-uT6E7UBIrTdCsFQ+y0tQd3g5oudmrS/hds5pbU3h4s2t/1vsGWbbSKhBSCD9mcqaqkBwoqlECpUrRJCmldl8PA==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.9.1.tgz", + "integrity": "sha512-BfdnN6aZ7NcX8djW8SR6GOJc+K+sFhWRF4vJueVE0vbUu5N1bLnBpxJg1TGlhSyo+ImC4SR0jcNiKN0jdoxt+A==", "cpu": [ "arm" ], @@ -3923,9 +3923,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.9.0.tgz", - "integrity": "sha512-vdqBh911wc5awE2bX2zx3eflbyv8U9xbE/jVKAm425eRoOVv/VseGZsqi3A3SykckSpF4wSROkbQPvbQFn8EsA==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.9.1.tgz", + "integrity": "sha512-Jhge7lFtH0QqfRz2PyJjJXWENqywPteITd+nOS0L6AhbZli+UmEyGBd2Sstt1c+l9C+j/YvKTl9wJo9PPmsFNg==", "cpu": [ "arm64" ], @@ -3937,9 +3937,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.9.0.tgz", - "integrity": "sha512-/8JFZ/SnuDr1lLEVsxsuVwrsGquTvT51RZGvyDB/dOK3oYK2UqeXzgeyq6Otp8FZXQcEYqJwxb9v+gtdXn03eQ==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.9.1.tgz", + "integrity": "sha512-ofdK/ow+ZSbSU0pRoB7uBaiRHeaAOYQFU5Spp87LdcPL/P1RhbCTMSIYVb61XWzsVEmYKjHFtoIE0wxP6AFvrA==", "cpu": [ "arm64" ], @@ -3951,9 +3951,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.9.0.tgz", - "integrity": "sha512-FkJjybtrl+rajTw4loI3L6YqSOpeZfDls4SstL/5lsP2bka9TiHUjgMBjygeZEis1oC8LfJTS8FSgpKPaQx2tQ==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.9.1.tgz", + "integrity": "sha512-eC8SXVn8de67HacqU7PoGdHA+9tGbqfEdD05AEFRAB81ejeQtNi5Fx7lPcxpLH79DW0BnMAHau3hi4RVkHfSCw==", "cpu": [ "ppc64" ], @@ -3965,9 +3965,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.9.0.tgz", - "integrity": "sha512-w/NZfHNeDusbqSZ8r/hp8iL4S39h4+vQMc9/vvzuIKMWKppyUGKm3IST0Qv0aOZ1rzIbl9SrDeIqK86ZpUK37w==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.9.1.tgz", + "integrity": "sha512-fIkwvAAQ41kfoGWfzeJ33iLGShl0JEDZHrMnwTHMErUcPkaaZRJYjQjsFhMl315NEQ4mmTlC+2nfK/J2IszDOw==", "cpu": [ "riscv64" ], @@ -3979,9 +3979,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.9.0.tgz", - "integrity": "sha512-bEPBosut8/8KQbUixPry8zg/fOzVOWyvwzOfz0C0Rw6dp+wIBseyiHKjkcSyZKv/98edrbMknBaMNJfA/UEdqw==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.9.1.tgz", + "integrity": "sha512-RAAszxImSOFLk44aLwnSqpcOdce8sBcxASledSzuFAd8Q5ZhhVck472SisspnzHdc7THCvGXiUeZ2hOC7NUoBQ==", "cpu": [ "riscv64" ], @@ -3993,9 +3993,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.9.0.tgz", - "integrity": "sha512-LDtMT7moE3gK753gG4pc31AAqGUC86j3AplaFusc717EUGF9ZFJ356sdQzzZzkBk1XzMdxFyZ4f/i35NKM/lFA==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.9.1.tgz", + "integrity": "sha512-QoP9vkY+THuQdZi05bA6s6XwFd6HIz3qlx82v9bTOgxeqin/3C12Ye7f7EOD00RQ36OtOPWnhEMMm84sv7d1XQ==", "cpu": [ "s390x" ], @@ -4007,9 +4007,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.9.0.tgz", - "integrity": "sha512-WmFd5KINHIXj8o1mPaT8QRjA9HgSXhN1gl9Da4IZihARihEnOylu4co7i/yeaIpcfsI6sYs33cNZKyHYDh0lrA==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.9.1.tgz", + "integrity": "sha512-/p77cGN/h9zbsfCseAP5gY7tK+7+DdM8fkPfr9d1ye1fsF6bmtGbtZN6e/8j4jCZ9NEIBBkT0GhdgixSelTK9g==", "cpu": [ "x64" ], @@ -4021,9 +4021,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.9.0.tgz", - "integrity": "sha512-CYuXbANW+WgzVRIl8/QvZmDaZxrqvOldOwlbUjIM4pQ46FJ0W5cinJ/Ghwa/Ng1ZPMJMk1VFdsD/XwmCGIXBWg==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.9.1.tgz", + "integrity": "sha512-wInTqT3Bu9u50mDStEig1v8uxEL2Ht+K8pir/YhyyrM5ordJtxoqzsL1vR/CQzOJuDunUTrDkMM0apjW/d7/PA==", "cpu": [ "x64" ], @@ -4035,9 +4035,9 @@ ] }, "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.9.0.tgz", - "integrity": "sha512-6Rp2WH0OoitMYR57Z6VE8Y6corX8C6QEMWLgOV6qXiJIeZ1F9WGXY/yQ8yDC4iTraotyLOeJ2Asea0urWj2fKQ==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.9.1.tgz", + "integrity": "sha512-eNwqO5kUa+1k7yFIircwwiniKWA0UFHo2Cfm8LYgkh9km7uMad+0x7X7oXbQonJXlqfitBTSjhA0un+DsHIrhw==", "cpu": [ "wasm32" ], @@ -4052,9 +4052,9 @@ } }, "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.9.0.tgz", - "integrity": "sha512-rknkrTRuvujprrbPmGeHi8wYWxmNVlBoNW8+4XF2hXUnASOjmuC9FNF1tGbDiRQWn264q9U/oGtixyO3BT8adQ==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.9.1.tgz", + "integrity": "sha512-Eaz1xMUnoa2mFqh20mPqSdbYl6crnk8HnIXDu6nsla9zpgZJZO8w3c1gvNN/4Eb0RXRq3K9OG6mu8vw14gIqiA==", "cpu": [ "arm64" ], @@ -4066,9 +4066,9 @@ ] }, "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.9.0.tgz", - "integrity": "sha512-Ceymm+iBl+bgAICtgiHyMLz6hjxmLJKqBim8tDzpX61wpZOx2bPK6Gjuor7I2RiUynVjvvkoRIkrPyMwzBzF3A==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.9.1.tgz", + "integrity": "sha512-H/+d+5BGlnEQif0gnwWmYbYv7HJj563PUKJfn8PlmzF8UmF+8KxdvXdwCsoOqh4HHnENnoLrav9NYBrv76x1wQ==", "cpu": [ "ia32" ], @@ -4080,9 +4080,9 @@ ] }, "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.9.0.tgz", - "integrity": "sha512-k59o9ZyeyS0hAlcaKFezYSH2agQeRFEB7KoQLXl3Nb3rgkqT1NY9Vwy+SqODiLmYnEjxWJVRE/yq2jFVqdIxZw==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.9.1.tgz", + "integrity": "sha512-rS86wI4R6cknYM3is3grCb/laE8XBEbpWAMSIPjYfmYp75KL5dT87jXF2orDa4tQYg5aajP5G8Fgh34dRyR+Rw==", "cpu": [ "x64" ], @@ -5346,9 +5346,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001723", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001723.tgz", - "integrity": "sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==", + "version": "1.0.30001724", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001724.tgz", + "integrity": "sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==", "funding": [ { "type": "opencollective", @@ -6916,9 +6916,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.167", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.167.tgz", - "integrity": "sha512-LxcRvnYO5ez2bMOFpbuuVuAI5QNeY1ncVytE/KXaL6ZNfzX1yPlAO0nSOyIHx2fVAuUprMqPs/TdVhUFZy7SIQ==", + "version": "1.5.171", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.171.tgz", + "integrity": "sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -7927,9 +7927,9 @@ } }, "node_modules/exsolve": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.5.tgz", - "integrity": "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", + "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", "license": "MIT" }, "node_modules/fast-deep-equal": { @@ -10251,9 +10251,9 @@ "license": "MIT" }, "node_modules/loupe": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", - "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz", + "integrity": "sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==", "dev": true, "license": "MIT" }, @@ -14376,9 +14376,9 @@ } }, "node_modules/terser": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.42.0.tgz", - "integrity": "sha512-UYCvU9YQW2f/Vwl+P0GfhxJxbUGLwd+5QrrGgLajzWAtC/23AX0vcise32kkP7Eu0Wu9VlzzHAXkLObgjQfFlQ==", + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -14611,9 +14611,9 @@ } }, "node_modules/tinypool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.0.tgz", - "integrity": "sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", "dev": true, "license": "MIT", "engines": { @@ -14955,9 +14955,9 @@ } }, "node_modules/unrs-resolver": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.9.0.tgz", - "integrity": "sha512-wqaRu4UnzBD2ABTC1kLfBjAqIDZ5YUTr/MLGa7By47JV1bJDSW7jq/ZSLigB7enLe7ubNaJhtnBXgrc/50cEhg==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.9.1.tgz", + "integrity": "sha512-4AZVxP05JGN6DwqIkSP4VKLOcwQa5l37SWHF/ahcuqBMbfxbpN1L1QKafEhWCziHhzKex9H/AR09H0OuVyU+9g==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -14968,25 +14968,25 @@ "url": "https://opencollective.com/unrs-resolver" }, "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.9.0", - "@unrs/resolver-binding-android-arm64": "1.9.0", - "@unrs/resolver-binding-darwin-arm64": "1.9.0", - "@unrs/resolver-binding-darwin-x64": "1.9.0", - "@unrs/resolver-binding-freebsd-x64": "1.9.0", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.9.0", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.9.0", - "@unrs/resolver-binding-linux-arm64-gnu": "1.9.0", - "@unrs/resolver-binding-linux-arm64-musl": "1.9.0", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.9.0", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.9.0", - "@unrs/resolver-binding-linux-riscv64-musl": "1.9.0", - "@unrs/resolver-binding-linux-s390x-gnu": "1.9.0", - "@unrs/resolver-binding-linux-x64-gnu": "1.9.0", - "@unrs/resolver-binding-linux-x64-musl": "1.9.0", - "@unrs/resolver-binding-wasm32-wasi": "1.9.0", - "@unrs/resolver-binding-win32-arm64-msvc": "1.9.0", - "@unrs/resolver-binding-win32-ia32-msvc": "1.9.0", - "@unrs/resolver-binding-win32-x64-msvc": "1.9.0" + "@unrs/resolver-binding-android-arm-eabi": "1.9.1", + "@unrs/resolver-binding-android-arm64": "1.9.1", + "@unrs/resolver-binding-darwin-arm64": "1.9.1", + "@unrs/resolver-binding-darwin-x64": "1.9.1", + "@unrs/resolver-binding-freebsd-x64": "1.9.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.9.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.9.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.9.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.9.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.9.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.9.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.9.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.9.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.9.1", + "@unrs/resolver-binding-linux-x64-musl": "1.9.1", + "@unrs/resolver-binding-wasm32-wasi": "1.9.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.9.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.9.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.9.1" } }, "node_modules/update-browserslist-db": { @@ -15198,9 +15198,9 @@ "license": "BSD-2-Clause" }, "node_modules/vite/node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, @@ -15248,13 +15248,13 @@ } }, "node_modules/vite/node_modules/rollup": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.43.0.tgz", - "integrity": "sha512-wdN2Kd3Twh8MAEOEJZsuxuLKCsBEo4PVNLK6tQWAn10VhsVewQLzcucMgLolRlhFybGxfclbPeEYBaP6RvUFGg==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.0.tgz", + "integrity": "sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.7" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -15264,26 +15264,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.43.0", - "@rollup/rollup-android-arm64": "4.43.0", - "@rollup/rollup-darwin-arm64": "4.43.0", - "@rollup/rollup-darwin-x64": "4.43.0", - "@rollup/rollup-freebsd-arm64": "4.43.0", - "@rollup/rollup-freebsd-x64": "4.43.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.43.0", - "@rollup/rollup-linux-arm-musleabihf": "4.43.0", - "@rollup/rollup-linux-arm64-gnu": "4.43.0", - "@rollup/rollup-linux-arm64-musl": "4.43.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.43.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.43.0", - "@rollup/rollup-linux-riscv64-gnu": "4.43.0", - "@rollup/rollup-linux-riscv64-musl": "4.43.0", - "@rollup/rollup-linux-s390x-gnu": "4.43.0", - "@rollup/rollup-linux-x64-gnu": "4.43.0", - "@rollup/rollup-linux-x64-musl": "4.43.0", - "@rollup/rollup-win32-arm64-msvc": "4.43.0", - "@rollup/rollup-win32-ia32-msvc": "4.43.0", - "@rollup/rollup-win32-x64-msvc": "4.43.0", + "@rollup/rollup-android-arm-eabi": "4.44.0", + "@rollup/rollup-android-arm64": "4.44.0", + "@rollup/rollup-darwin-arm64": "4.44.0", + "@rollup/rollup-darwin-x64": "4.44.0", + "@rollup/rollup-freebsd-arm64": "4.44.0", + "@rollup/rollup-freebsd-x64": "4.44.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.44.0", + "@rollup/rollup-linux-arm-musleabihf": "4.44.0", + "@rollup/rollup-linux-arm64-gnu": "4.44.0", + "@rollup/rollup-linux-arm64-musl": "4.44.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.44.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.44.0", + "@rollup/rollup-linux-riscv64-gnu": "4.44.0", + "@rollup/rollup-linux-riscv64-musl": "4.44.0", + "@rollup/rollup-linux-s390x-gnu": "4.44.0", + "@rollup/rollup-linux-x64-gnu": "4.44.0", + "@rollup/rollup-linux-x64-musl": "4.44.0", + "@rollup/rollup-win32-arm64-msvc": "4.44.0", + "@rollup/rollup-win32-ia32-msvc": "4.44.0", + "@rollup/rollup-win32-x64-msvc": "4.44.0", "fsevents": "~2.3.2" } }, @@ -15708,9 +15708,9 @@ } }, "node_modules/webpack/node_modules/webpack-sources": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.2.tgz", - "integrity": "sha512-ykKKus8lqlgXX/1WjudpIEjqsafjOTcOJqxnAbMLAu/KCsDCJ6GBtvscewvTkrn24HsnvFwrSCbenFrhtcCsAA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "license": "MIT", "engines": { "node": ">=10.13.0" diff --git a/web_src/fomantic/package-lock.json b/web_src/fomantic/package-lock.json index 7d95ad2e1b..cea707672e 100644 --- a/web_src/fomantic/package-lock.json +++ b/web_src/fomantic/package-lock.json @@ -182,9 +182,9 @@ "peer": true }, "node_modules/@octokit/core/node_modules/@octokit/request": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.2.tgz", - "integrity": "sha512-iYj4SJG/2bbhh+iIpFmG5u49DtJ4lipQ+aPakjL9OKpsGY93wM8w06gvFbEQxcMsZcCvk5th5KkIm2m8o14aWA==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.3.tgz", + "integrity": "sha512-V6jhKokg35vk098iBqp2FBKunk3kMTXlmq+PtbV9Gl3TfskWlebSofU9uunVKhUN7xl+0+i5vt0TGTG8/p/7HA==", "license": "MIT", "peer": true, "dependencies": { @@ -289,9 +289,9 @@ "peer": true }, "node_modules/@octokit/graphql/node_modules/@octokit/request": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.2.tgz", - "integrity": "sha512-iYj4SJG/2bbhh+iIpFmG5u49DtJ4lipQ+aPakjL9OKpsGY93wM8w06gvFbEQxcMsZcCvk5th5KkIm2m8o14aWA==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.3.tgz", + "integrity": "sha512-V6jhKokg35vk098iBqp2FBKunk3kMTXlmq+PtbV9Gl3TfskWlebSofU9uunVKhUN7xl+0+i5vt0TGTG8/p/7HA==", "license": "MIT", "peer": true, "dependencies": { @@ -494,9 +494,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.0.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.1.tgz", - "integrity": "sha512-MX4Zioh39chHlDJbKmEgydJDS3tspMP/lnQC67G3SWsTnb9NeYVWOjkxpOSy4oMfPs4StcWHwBrvUb4ybfnuaw==", + "version": "24.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz", + "integrity": "sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==", "license": "MIT", "dependencies": { "undici-types": "~7.8.0" @@ -1249,9 +1249,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001723", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001723.tgz", - "integrity": "sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==", + "version": "1.0.30001724", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001724.tgz", + "integrity": "sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==", "funding": [ { "type": "opencollective", @@ -2005,9 +2005,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.167", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.167.tgz", - "integrity": "sha512-LxcRvnYO5ez2bMOFpbuuVuAI5QNeY1ncVytE/KXaL6ZNfzX1yPlAO0nSOyIHx2fVAuUprMqPs/TdVhUFZy7SIQ==", + "version": "1.5.171", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.171.tgz", + "integrity": "sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -2017,9 +2017,9 @@ "license": "MIT" }, "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "license": "MIT", "dependencies": { "once": "^1.4.0" @@ -2787,9 +2787,9 @@ } }, "node_modules/get-stream/node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", From a70fa6d8ba5bfa56116b1065b7ef265858634303 Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Thu, 26 Jun 2025 02:36:43 +0200 Subject: [PATCH 015/495] [v12.0/forgejo] fix(ui): release: name is overridden with tag name on edit (#8290) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8002 Fixes #8001 Regression: f66a6b12cda96807c29f3c6b2fc851c49f24d739 (https://codeberg.org/forgejo/forgejo/issues/6645) Co-authored-by: Beowulf Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8290 Reviewed-by: Otto Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- templates/repo/release/new.tmpl | 2 +- tests/e2e/release.test.e2e.ts | 170 ++++++++++++++++++-------------- 2 files changed, 97 insertions(+), 75 deletions(-) diff --git a/templates/repo/release/new.tmpl b/templates/repo/release/new.tmpl index 788d7f015c..c5c7eb23fa 100644 --- a/templates/repo/release/new.tmpl +++ b/templates/repo/release/new.tmpl @@ -46,7 +46,7 @@
- +
{{template "shared/combomarkdowneditor" (dict diff --git a/tests/e2e/release.test.e2e.ts b/tests/e2e/release.test.e2e.ts index 044e7b93ab..a4303a7320 100644 --- a/tests/e2e/release.test.e2e.ts +++ b/tests/e2e/release.test.e2e.ts @@ -14,78 +14,100 @@ import {validate_form} from './shared/forms.ts'; test.use({user: 'user2'}); -test.describe.configure({ - timeout: 30000, -}); - -test('External Release Attachments', async ({page, isMobile}) => { - test.skip(isMobile); - - // Click "New Release" - await page.goto('/user2/repo2/releases'); - await page.click('.button.small.primary'); - - // Fill out form and create new release - await expect(page).toHaveURL('/user2/repo2/releases/new'); - await validate_form({page}, 'fieldset'); - const textarea = page.locator('input[name=tag_name]'); - await textarea.pressSequentially('2.0'); - await expect(page.locator('input[name=title]')).toHaveValue('2.0'); - await page.click('#add-external-link'); - await page.click('#add-external-link'); - await page.fill('input[name=attachment-new-name-2]', 'Test'); - await page.fill('input[name=attachment-new-exturl-2]', 'https://forgejo.org/'); - await page.click('.remove-rel-attach'); - await save_visual(page); - await page.click('.button.small.primary'); - - // Validate release page and click edit - await expect(page).toHaveURL('/user2/repo2/releases'); - await expect(page.locator('.download[open] li')).toHaveCount(3); - - await expect(page.locator('.download[open] li:nth-of-type(1)')).toContainText('Source code (ZIP)'); - await expect(page.locator('.download[open] li:nth-of-type(1) span[data-tooltip-content]')).toHaveAttribute('data-tooltip-content', 'This attachment is automatically generated.'); - await expect(page.locator('.download[open] li:nth-of-type(1) a')).toHaveAttribute('href', '/user2/repo2/archive/2.0.zip'); - await expect(page.locator('.download[open] li:nth-of-type(1) a')).toHaveAttribute('type', 'application/zip'); - - await expect(page.locator('.download[open] li:nth-of-type(2)')).toContainText('Source code (TAR.GZ)'); - await expect(page.locator('.download[open] li:nth-of-type(2) span[data-tooltip-content]')).toHaveAttribute('data-tooltip-content', 'This attachment is automatically generated.'); - await expect(page.locator('.download[open] li:nth-of-type(2) a')).toHaveAttribute('href', '/user2/repo2/archive/2.0.tar.gz'); - await expect(page.locator('.download[open] li:nth-of-type(2) a')).toHaveAttribute('type', 'application/gzip'); - - await expect(page.locator('.download[open] li:nth-of-type(3)')).toContainText('Test'); - await expect(page.locator('.download[open] li:nth-of-type(3) a')).toHaveAttribute('href', 'https://forgejo.org/'); - await save_visual(page); - await page.locator('.octicon-pencil').first().click(); - - // Validate edit page and edit the release - await expect(page).toHaveURL('/user2/repo2/releases/edit/2.0'); - await validate_form({page}, 'fieldset'); - await expect(page.locator('.attachment_edit:visible')).toHaveCount(2); - await expect(page.locator('.attachment_edit:visible').nth(0)).toHaveValue('Test'); - await expect(page.locator('.attachment_edit:visible').nth(1)).toHaveValue('https://forgejo.org/'); - await page.locator('.attachment_edit:visible').nth(0).fill('Test2'); - await page.locator('.attachment_edit:visible').nth(1).fill('https://gitea.io/'); - await page.click('#add-external-link'); - await expect(page.locator('.attachment_edit:visible')).toHaveCount(4); - await page.locator('.attachment_edit:visible').nth(2).fill('Test3'); - await page.locator('.attachment_edit:visible').nth(3).fill('https://gitea.com/'); - await save_visual(page); - await page.click('.button.small.primary'); - - // Validate release page and click edit - await expect(page).toHaveURL('/user2/repo2/releases'); - await expect(page.locator('.download[open] li')).toHaveCount(4); - await expect(page.locator('.download[open] li:nth-of-type(3)')).toContainText('Test2'); - await expect(page.locator('.download[open] li:nth-of-type(3) a')).toHaveAttribute('href', 'https://gitea.io/'); - await expect(page.locator('.download[open] li:nth-of-type(4)')).toContainText('Test3'); - await expect(page.locator('.download[open] li:nth-of-type(4) a')).toHaveAttribute('href', 'https://gitea.com/'); - await save_visual(page); - await page.locator('.octicon-pencil').first().click(); - - // Delete release - await expect(page).toHaveURL('/user2/repo2/releases/edit/2.0'); - await page.click('.delete-button'); - await page.click('.button.ok'); - await expect(page).toHaveURL('/user2/repo2/releases'); +test.describe('repo branch protection settings', () => { + test('External Release Attachments', async ({page, isMobile}, workerInfo) => { + test.skip(isMobile || workerInfo.project.name === 'webkit'); + + // Click "New Release" + await page.goto('/user2/repo2/releases'); + await page.click('.button.small.primary'); + + // Fill out form and create new release + await expect(page).toHaveURL('/user2/repo2/releases/new'); + await validate_form({page}, 'fieldset'); + const textarea = page.locator('input[name=tag_name]'); + await textarea.pressSequentially('2.0'); + await expect(page.locator('input[name=title]')).toHaveValue('2.0'); + await page.click('#add-external-link'); + await page.click('#add-external-link'); + await page.fill('input[name=attachment-new-name-2]', 'Test'); + await page.fill('input[name=attachment-new-exturl-2]', 'https://forgejo.org/'); + await page.click('.remove-rel-attach'); + await save_visual(page); + await page.click('.button.small.primary'); + + // Validate release page and click edit + await expect(page).toHaveURL('/user2/repo2/releases'); + await expect(page.locator('.download[open] li')).toHaveCount(3); + + await expect(page.locator('.download[open] li:nth-of-type(1)')).toContainText('Source code (ZIP)'); + await expect(page.locator('.download[open] li:nth-of-type(1) span[data-tooltip-content]')).toHaveAttribute('data-tooltip-content', 'This attachment is automatically generated.'); + await expect(page.locator('.download[open] li:nth-of-type(1) a')).toHaveAttribute('href', '/user2/repo2/archive/2.0.zip'); + await expect(page.locator('.download[open] li:nth-of-type(1) a')).toHaveAttribute('type', 'application/zip'); + + await expect(page.locator('.download[open] li:nth-of-type(2)')).toContainText('Source code (TAR.GZ)'); + await expect(page.locator('.download[open] li:nth-of-type(2) span[data-tooltip-content]')).toHaveAttribute('data-tooltip-content', 'This attachment is automatically generated.'); + await expect(page.locator('.download[open] li:nth-of-type(2) a')).toHaveAttribute('href', '/user2/repo2/archive/2.0.tar.gz'); + await expect(page.locator('.download[open] li:nth-of-type(2) a')).toHaveAttribute('type', 'application/gzip'); + + await expect(page.locator('.download[open] li:nth-of-type(3)')).toContainText('Test'); + await expect(page.locator('.download[open] li:nth-of-type(3) a')).toHaveAttribute('href', 'https://forgejo.org/'); + await save_visual(page); + await page.locator('.octicon-pencil').first().click(); + + // Validate edit page and edit the release + await expect(page).toHaveURL('/user2/repo2/releases/edit/2.0'); + await validate_form({page}, 'fieldset'); + await expect(page.locator('.attachment_edit:visible')).toHaveCount(2); + await expect(page.locator('.attachment_edit:visible').nth(0)).toHaveValue('Test'); + await expect(page.locator('.attachment_edit:visible').nth(1)).toHaveValue('https://forgejo.org/'); + await page.locator('.attachment_edit:visible').nth(0).fill('Test2'); + await page.locator('.attachment_edit:visible').nth(1).fill('https://gitea.io/'); + await page.click('#add-external-link'); + await expect(page.locator('.attachment_edit:visible')).toHaveCount(4); + await page.locator('.attachment_edit:visible').nth(2).fill('Test3'); + await page.locator('.attachment_edit:visible').nth(3).fill('https://gitea.com/'); + await save_visual(page); + await page.click('.button.small.primary'); + + // Validate release page and click edit + await expect(page).toHaveURL('/user2/repo2/releases'); + await expect(page.locator('.download[open] li')).toHaveCount(4); + await expect(page.locator('.download[open] li:nth-of-type(3)')).toContainText('Test2'); + await expect(page.locator('.download[open] li:nth-of-type(3) a')).toHaveAttribute('href', 'https://gitea.io/'); + await expect(page.locator('.download[open] li:nth-of-type(4)')).toContainText('Test3'); + await expect(page.locator('.download[open] li:nth-of-type(4) a')).toHaveAttribute('href', 'https://gitea.com/'); + await save_visual(page); + await page.locator('.octicon-pencil').first().click(); + }); + + test('Release name equals tag name if created from tag', async ({page}) => { + await page.goto('/user2/repo2/releases/new?tag=v1.1'); + + await expect(page.locator('input[name=title]')).toHaveValue('v1.1'); + }); + + test('Release name equals release name if edit', async ({page, isMobile}) => { + test.skip(isMobile); + + await page.goto('/user2/repo2/releases/new'); + + await page.locator('input[name=title]').pressSequentially('v2.0'); + await page.locator('input[name=tag_name]').pressSequentially('2.0'); + await page.click('.button.small.primary'); + + await page.goto('/user2/repo2/releases/edit/2.0'); + + await expect(page.locator('input[name=title]')).toHaveValue('v2.0'); + }); + + test.afterEach(async ({page}) => { + // Delete release + const response = await page.goto('/user2/repo2/releases/edit/2.0'); + test.skip(response.status() === 404, 'No release to delete'); + + await page.locator('.delete-button').dispatchEvent('click'); + await page.locator('.button.ok').click(); + await expect(page).toHaveURL('/user2/repo2/releases'); + }); }); From aee5e1fb94dda5a49b0b0b155133c2b00c7cb5a7 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 26 Jun 2025 08:49:20 +0200 Subject: [PATCH 016/495] Update module github.com/jhillyerd/enmime/v2 to v2.2.0 (forgejo) (#8254) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [github.com/jhillyerd/enmime/v2](https://github.com/jhillyerd/enmime) | `v2.1.0` -> `v2.2.0` | [![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fjhillyerd%2fenmime%2fv2/v2.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fjhillyerd%2fenmime%2fv2/v2.1.0/v2.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
jhillyerd/enmime (github.com/jhillyerd/enmime/v2) ### [`v2.2.0`](https://github.com/jhillyerd/enmime/releases/tag/v2.2.0) [Compare Source](https://github.com/jhillyerd/enmime/compare/v2.1.0...v2.2.0) #### What's Changed - chore: bump golangci to last 1.x release by [@​jhillyerd](https://github.com/jhillyerd) in https://github.com/jhillyerd/enmime/pull/368 - chore: fix linter warnings by [@​jhillyerd](https://github.com/jhillyerd) in https://github.com/jhillyerd/enmime/pull/370 - chore: bump golangci to 2.x by [@​jhillyerd](https://github.com/jhillyerd) in https://github.com/jhillyerd/enmime/pull/369 - chore: bump go deps by [@​jhillyerd](https://github.com/jhillyerd) in https://github.com/jhillyerd/enmime/pull/371 - build(deps): bump golangci/golangci-lint-action from 7 to 8 by [@​dependabot](https://github.com/dependabot) in https://github.com/jhillyerd/enmime/pull/373 - Switch to fork of html2text for tablewriter 1.0 by [@​jhillyerd](https://github.com/jhillyerd) in https://github.com/jhillyerd/enmime/pull/375 - Release for go 1.23 support by [@​jhillyerd](https://github.com/jhillyerd) in https://github.com/jhillyerd/enmime/pull/376 **Full Changelog**: https://github.com/jhillyerd/enmime/compare/v2.1.0...v2.2.0
--- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Co-authored-by: Gusted Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8254 Reviewed-by: Earl Warren Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- assets/go-licenses.json | 14 ++++++++++++-- go.mod | 12 +++++++----- go.sum | 27 ++++++++++++++------------- routers/web/feed/convert.go | 2 +- services/mailer/mailer.go | 2 +- 5 files changed, 35 insertions(+), 22 deletions(-) diff --git a/assets/go-licenses.json b/assets/go-licenses.json index fb6c201a5e..c3b261320c 100644 --- a/assets/go-licenses.json +++ b/assets/go-licenses.json @@ -595,8 +595,8 @@ "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2015 Huan Du\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n" }, { - "name": "github.com/jaytaylor/html2text", - "path": "github.com/jaytaylor/html2text/LICENSE", + "name": "github.com/inbucket/html2text", + "path": "github.com/inbucket/html2text/LICENSE", "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2015 Jay Taylor\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n" }, { @@ -779,6 +779,16 @@ "path": "github.com/nwaples/rardecode/LICENSE", "licenseText": "Copyright (c) 2015, Nicholas Waples\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" }, + { + "name": "github.com/olekukonko/errors", + "path": "github.com/olekukonko/errors/LICENSE", + "licenseText": "MIT License\n\nCopyright (c) 2025 Oleku Konko\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n" + }, + { + "name": "github.com/olekukonko/ll", + "path": "github.com/olekukonko/ll/LICENSE", + "licenseText": "MIT License\n\nCopyright (c) 2025 Oleku Konko\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n" + }, { "name": "github.com/olekukonko/tablewriter", "path": "github.com/olekukonko/tablewriter/LICENSE.md", diff --git a/go.mod b/go.mod index bb2be827eb..510ec9c3ae 100644 --- a/go.mod +++ b/go.mod @@ -63,8 +63,8 @@ require ( github.com/hashicorp/go-version v1.7.0 github.com/hashicorp/golang-lru/v2 v2.0.7 github.com/huandu/xstrings v1.5.0 - github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056 - github.com/jhillyerd/enmime/v2 v2.1.0 + github.com/inbucket/html2text v0.9.0 + github.com/jhillyerd/enmime/v2 v2.2.0 github.com/json-iterator/go v1.1.12 github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 github.com/klauspost/compress v1.18.0 @@ -158,7 +158,7 @@ require ( github.com/dlclark/regexp2 v1.11.5 // indirect github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43 // indirect github.com/emirpasic/gods v1.18.1 // indirect - github.com/fatih/color v1.16.0 // indirect + github.com/fatih/color v1.18.0 // indirect github.com/fxamacker/cbor/v2 v2.8.0 // indirect github.com/go-ap/errors v0.0.0-20231003111023-183eef4b31b7 // indirect github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect @@ -192,7 +192,7 @@ require ( github.com/libdns/libdns v1.0.0-beta.1 // indirect github.com/mailru/easyjson v0.9.0 // indirect github.com/markbates/going v1.0.3 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mholt/acmez/v3 v3.1.2 // indirect github.com/miekg/dns v1.1.63 // indirect @@ -205,7 +205,9 @@ require ( github.com/mschoch/smat v0.2.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nwaples/rardecode v1.1.3 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/olekukonko/errors v1.1.0 // indirect + github.com/olekukonko/ll v0.0.9 // indirect + github.com/olekukonko/tablewriter v1.0.7 // indirect github.com/onsi/ginkgo v1.16.5 // indirect github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c // indirect github.com/pierrec/lz4/v4 v4.1.21 // indirect diff --git a/go.sum b/go.sum index 639880e2ce..53558fddd7 100644 --- a/go.sum +++ b/go.sum @@ -192,8 +192,8 @@ github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43/go.mod h1:iL2twTe github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594/go.mod h1:aqO8z8wPrjkscevZJFVE1wXJrLpC5LtJG7fqLOsPb2U= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= -github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/fgprof v0.9.5 h1:8+vR6yu2vvSKn08urWyEuxx75NWPEvybbkBirEpsbVY= github.com/felixge/fgprof v0.9.5/go.mod h1:yKl+ERSa++RYOs32d8K6WEXCB4uXdLls4ZaZPpayhMM= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= @@ -341,12 +341,12 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI= github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= -github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056 h1:iCHtR9CQyktQ5+f3dMVZfwD2KWJUgm7M0gdL9NGr8KA= -github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= +github.com/inbucket/html2text v0.9.0 h1:ULJmVcBEMAcmLE+/rN815KG1Fx6+a4HhbUxiDiN+qks= +github.com/inbucket/html2text v0.9.0/go.mod h1:QDaumzl+/OzlSVbNohhmg+yAy5pKjUjzCKW2BMvztKE= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jhillyerd/enmime/v2 v2.1.0 h1:c8Qwi5Xq5EdtMN6byQWoZ/8I2RMTo6OJ7Xay+s1oPO0= -github.com/jhillyerd/enmime/v2 v2.1.0/go.mod h1:EJ74dcRbBcqHSP2TBu08XRoy6y3Yx0cevwb1YkGMEmQ= +github.com/jhillyerd/enmime/v2 v2.2.0 h1:Pe35MB96eZK5Q0XjlvPftOgWypQpd1gcbfJKAt7rsB8= +github.com/jhillyerd/enmime/v2 v2.2.0/go.mod h1:SOBXlCemjhiV2DvHhAKnJiWrtJGS/Ffuw4Iy7NjBTaI= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -389,12 +389,10 @@ github.com/markbates/going v1.0.3 h1:mY45T5TvW+Xz5A6jY7lf4+NLg9D8+iuStIHyR7M8qsE github.com/markbates/going v1.0.3/go.mod h1:fQiT6v6yQar9UD6bd/D4Z5Afbk9J6BBVBtLiyY4gp2o= github.com/markbates/goth v1.80.0 h1:NnvatczZDzOs1hn9Ug+dVYf2Viwwkp/ZDX5K+GLjan8= github.com/markbates/goth v1.80.0/go.mod h1:4/GYHo+W6NWisrMPZnq0Yr2Q70UntNLn7KXEFhrIdAY= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.28 h1:ThEiQrnbtumT+QMknw63Befp/ce/nUPgBPMlRFEum7A= @@ -436,8 +434,12 @@ github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWk github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/olekukonko/errors v1.1.0 h1:RNuGIh15QdDenh+hNvKrJkmxxjV4hcS50Db478Ou5sM= +github.com/olekukonko/errors v1.1.0/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y= +github.com/olekukonko/ll v0.0.9 h1:Y+1YqDfVkqMWuEQMclsF9HUR5+a82+dxJuL1HHSRpxI= +github.com/olekukonko/ll v0.0.9/go.mod h1:En+sEW0JNETl26+K8eZ6/W4UQ7CYSrrgg/EdIYT2H8g= +github.com/olekukonko/tablewriter v1.0.7 h1:HCC2e3MM+2g72M81ZcJU11uciw6z/p82aEnm4/ySDGw= +github.com/olekukonko/tablewriter v1.0.7/go.mod h1:H428M+HzoUXC6JU2Abj9IT9ooRmdq9CxuDmKMtrOCMs= github.com/olivere/elastic/v7 v7.0.32 h1:R7CXvbu8Eq+WlsLgxmKVKPox0oOwAE/2T9Si5BnvK6E= github.com/olivere/elastic/v7 v7.0.32/go.mod h1:c7PVmLe3Fxq77PIfY/bZmxY/TAamBhCzZ8xDOE09a9k= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -645,7 +647,6 @@ golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/routers/web/feed/convert.go b/routers/web/feed/convert.go index 01e663a672..7b09c92ee5 100644 --- a/routers/web/feed/convert.go +++ b/routers/web/feed/convert.go @@ -25,7 +25,7 @@ import ( "forgejo.org/services/context" "github.com/gorilla/feeds" - "github.com/jaytaylor/html2text" + "github.com/inbucket/html2text" ) func toBranchLink(ctx *context.Context, act *activities_model.Action) string { diff --git a/services/mailer/mailer.go b/services/mailer/mailer.go index ca5c645e0c..d8646d9ddd 100644 --- a/services/mailer/mailer.go +++ b/services/mailer/mailer.go @@ -29,7 +29,7 @@ import ( notify_service "forgejo.org/services/notify" ntlmssp "github.com/Azure/go-ntlmssp" - "github.com/jaytaylor/html2text" + "github.com/inbucket/html2text" "gopkg.in/gomail.v2" ) From 414199fc66644cdd8b73c03a11ce09a1ed27d213 Mon Sep 17 00:00:00 2001 From: Codeberg Translate Date: Thu, 26 Jun 2025 10:44:26 +0200 Subject: [PATCH 017/495] i18n: update of translations from Codeberg Translate (#8238) Translations update from [Codeberg Translate](https://translate.codeberg.org) for [Forgejo/forgejo](https://translate.codeberg.org/projects/forgejo/forgejo/). It also includes following components: * [Forgejo/forgejo-next](https://translate.codeberg.org/projects/forgejo/forgejo-next/) Current translation status: ![Weblate translation status](https://translate.codeberg.org/widget/forgejo/forgejo/horizontal-auto.svg) ## Release notes - Localization - [PR](https://codeberg.org/forgejo/forgejo/pulls/8238): i18n: update of translations from Codeberg Translate Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8238 Reviewed-by: Earl Warren Reviewed-by: Robert Wolff Reviewed-by: 0ko <0ko@noreply.codeberg.org> Co-authored-by: Codeberg Translate Co-committed-by: Codeberg Translate --- options/locale/locale_ar.ini | 20 +-- options/locale/locale_bg.ini | 20 +-- options/locale/locale_cs-CZ.ini | 26 ++-- options/locale/locale_da.ini | 20 +-- options/locale/locale_de-DE.ini | 26 ++-- options/locale/locale_el-GR.ini | 20 +-- options/locale/locale_es-ES.ini | 20 +-- options/locale/locale_fa-IR.ini | 18 +-- options/locale/locale_fi-FI.ini | 14 +- options/locale/locale_fil.ini | 93 +++++------ options/locale/locale_fr-FR.ini | 28 ++-- options/locale/locale_ga-IE.ini | 14 +- options/locale/locale_hu-HU.ini | 2 +- options/locale/locale_id-ID.ini | 2 +- options/locale/locale_is-IS.ini | 4 +- options/locale/locale_it-IT.ini | 215 ++++++++++++++++++++++---- options/locale/locale_ja-JP.ini | 20 +-- options/locale/locale_jbo.ini | 10 +- options/locale/locale_ko-KR.ini | 4 +- options/locale/locale_lv-LV.ini | 20 +-- options/locale/locale_nds.ini | 22 +-- options/locale/locale_nl-NL.ini | 20 +-- options/locale/locale_pl-PL.ini | 20 +-- options/locale/locale_pt-BR.ini | 31 ++-- options/locale/locale_pt-PT.ini | 20 +-- options/locale/locale_ru-RU.ini | 22 +-- options/locale/locale_si-LK.ini | 16 +- options/locale/locale_sr-SP.ini | 2 +- options/locale/locale_sv-SE.ini | 14 +- options/locale/locale_tr-TR.ini | 18 +-- options/locale/locale_uk-UA.ini | 39 ++--- options/locale/locale_zh-CN.ini | 31 ++-- options/locale/locale_zh-HK.ini | 2 +- options/locale/locale_zh-TW.ini | 22 +-- options/locale_next/locale_de-DE.json | 7 +- options/locale_next/locale_fil.json | 12 +- options/locale_next/locale_fr-FR.json | 2 +- options/locale_next/locale_it-IT.json | 80 +++++++++- options/locale_next/locale_nds.json | 7 +- options/locale_next/locale_pt-BR.json | 4 +- options/locale_next/locale_ru-RU.json | 11 +- options/locale_next/locale_uk-UA.json | 7 +- options/locale_next/locale_zh-CN.json | 9 +- options/locale_next/locale_zh-TW.json | 7 +- 44 files changed, 654 insertions(+), 367 deletions(-) diff --git a/options/locale/locale_ar.ini b/options/locale/locale_ar.ini index f4ac1a0e3d..15d614e8bc 100644 --- a/options/locale/locale_ar.ini +++ b/options/locale/locale_ar.ini @@ -699,7 +699,7 @@ issues.filter_milestone_all = كل الأهداف issues.unlock.notice_2 = - يمكنك دوما إقفال هذه المسألة من جديد في المستقبل. issues.num_participants_few = %d متحاور release.title = عنوان الإصدار -issues.closed_at = `أغلق هذه المسألة %[2]s` +issues.closed_at = `أغلق هذه المسألة %s` issues.lock.title = إقفال التحاور في هذه المسألة. issues.new.no_label = بلا تصنيف issues.filter_sort.mostforks = الأعلى اشتقاقا @@ -759,7 +759,7 @@ branch.renamed = غُيّر اسم الفرع %s إلى %s. delete_preexisting = احذف الملفات الموجودة سابقا branch.included_desc = هذا الفرع جزء من الفرع المبدئي trust_model_helper_collaborator_committer = مشترك+مودع: ثق بتوقيعات المشتركين التي تطابق المودع -issues.reopened_at = `أعاد فتح هذه المسألة %[2]s` +issues.reopened_at = `أعاد فتح هذه المسألة %s` issues.action_milestone = هدف issues.new.assignees = المكلَّفون release.tag_name_protected = اسم الوسم محمي. @@ -1166,7 +1166,7 @@ pulls.status_checking = في انتظار بعض الفحوص pulls.status_checks_failure = بعض الفحوص فشلت pulls.status_checks_success = جميع الفحوص ناجحة pulls.status_checks_warning = بعض الفحوص تعطي تحذيرات -pulls.commit_ref_at = `أشار إلى طلب الدمج من إيداع %[2]s` +pulls.commit_ref_at = `أشار إلى طلب الدمج من إيداع %s` pulls.cmd_instruction_hint = `أظهر شرح استخدام سطر الأوامر.` pulls.cmd_instruction_checkout_title = اسحب pulls.cmd_instruction_checkout_desc = من مستودع مشروعك، اسحب (check out) فرعا جديدا واختبر التغييرات. @@ -1257,8 +1257,8 @@ pulls.status_checks_details = تفاصيل pulls.status_checks_hide_all = أخفِ كل الفحوص pulls.status_checks_show_all = أظهر كل الفحوص pulls.close = أغلق طلب الدمج -pulls.closed_at = `أغلق طلب الدمج %[2]s` -pulls.reopened_at = `أعاد فتح طلب الدمج %[2]s` +pulls.closed_at = `أغلق طلب الدمج %s` +pulls.reopened_at = `أعاد فتح طلب الدمج %s` milestones.title = العنوان milestones.desc = الوصف milestones.edit = عدّل الهدف @@ -1302,11 +1302,11 @@ issues.closed_by_fake = من %[2]s أُغلقت %[1]s issues.num_comments_1 = %d تعليق issues.num_comments = %d تعليقا issues.commented_at = `علّق %s` -issues.commit_ref_at = `أشار إلى هذه المسألة من إيداع %[2]s` -issues.ref_issue_from = `أشار إلى هذه المسألة %[4]s %[2]s` -issues.ref_pull_from = `أشار إلى هذا الطلب %[4]s %[2]s` -issues.ref_closing_from = `أشار إلى طلب دمج %[4]s سيغلق هذه المسألة %[2]s` -issues.ref_reopening_from = `أشار إلى طلب دمج %[4]s سيعيد فتح هذه المسألة %[2]s` +issues.commit_ref_at = `أشار إلى هذه المسألة من إيداع %s` +issues.ref_issue_from = `أشار إلى هذه المسألة %[3]s %[1]s` +issues.ref_pull_from = `أشار إلى هذا الطلب %[3]s %[1]s` +issues.ref_closing_from = `أشار إلى طلب دمج %[3]s سيغلق هذه المسألة %[1]s` +issues.ref_reopening_from = `أشار إلى طلب دمج %[3]s سيعيد فتح هذه المسألة %[1]s` issues.ref_closed_from = `أغلق هذه المسألة %[4]s %[2]s` issues.ref_reopened_from = `أعاد فتح هذه المسألة %[4]s %[2]s` issues.reference_issue.body = المحتوى diff --git a/options/locale/locale_bg.ini b/options/locale/locale_bg.ini index abce4f1133..1b9767f674 100644 --- a/options/locale/locale_bg.ini +++ b/options/locale/locale_bg.ini @@ -749,7 +749,7 @@ settings.admin_settings = Администраторски настройки issues.role.owner = Притежател settings.transfer.title = Прехвърляне на притежанието issues.author = Автор -issues.closed_at = `затвори тази задача %[2]s` +issues.closed_at = `затвори тази задача %s` settings.collaborator_deletion_desc = Премахването на сътрудник ще отнеме достъпа му до това хранилище. Продължаване? commits.message = Съобщение issues.due_date_not_set = Няма зададен краен срок. @@ -773,9 +773,9 @@ issues.filter_type.all_issues = Всички задачи issues.filter_poster_no_select = Всички автори issues.opened_by = отворена %[1]s от %[3]s issues.action_open = Отваряне -pulls.closed_at = `затвори тази заявка за сливане %[2]s` -pulls.reopened_at = `отвори наново тази заявка за сливане %[2]s` -issues.reopened_at = `отвори наново тази задача %[2]s` +pulls.closed_at = `затвори тази заявка за сливане %s` +pulls.reopened_at = `отвори наново тази заявка за сливане %s` +issues.reopened_at = `отвори наново тази задача %s` projects.column.edit = Редактиране на колоната issues.close = Затваряне на задачата issues.ref_reopened_from = `отвори наново тази задача %[4]s %[2]s` @@ -1205,7 +1205,7 @@ issues.dependency.cancel = Отказ issues.dependency.add_error_dep_exists = Зависимостта вече съществува. issues.dependency.add_error_dep_not_exist = Зависимостта не съществува. issues.remove_ref_at = `премахна препратката %s %s` -issues.ref_pull_from = `спомена тази заявка за сливане %[4]s %[2]s` +issues.ref_pull_from = `спомена тази заявка за сливане %[3]s %[1]s` issues.dependency.pr_no_dependencies = Няма зададени зависимости. issues.dependency.remove_info = Премахване на тази зависимост issues.dependency.removed_dependency = `премахна зависимостта %s` @@ -1230,11 +1230,11 @@ issues.dependency.title = Зависимости issues.dependency.issue_no_dependencies = Няма зададени зависимости. issues.dependency.pr_close_blocked = Трябва да затворите всички задачи, блокиращи тази заявка за сливане, преди да можете да я слеете. issues.dependency.pr_close_blocks = Тази заявка за сливане блокира затварянето на следните задачи -issues.ref_issue_from = `спомена тази задача %[4]s %[2]s` -issues.commit_ref_at = `спомена тази задача в подаване %[2]s` +issues.ref_issue_from = `спомена тази задача %[3]s %[1]s` +issues.commit_ref_at = `спомена тази задача в подаване %s` issues.add_ref_at = `добави препратка %s %s` pulls.merged_info_text = Клонът %s вече може да бъде изтрит. -pulls.commit_ref_at = `спомена тази заявка за сливане в подаване %[2]s` +pulls.commit_ref_at = `спомена тази заявка за сливане в подаване %s` issues.change_ref_at = `промени препратката от %s на %s %s` diff.review.reject = Поискване на промени diff.bin_not_shown = Двоичният файл не е показан. @@ -1299,9 +1299,9 @@ branch.create_new_branch = Създаване на клон от клон: pulls.status_checks_show_all = Показване на всички проверки size_format = %[1]s: %[2]s; %[3]s: %[4]s pulls.filter_changes_by_commit = Филтриране по подаване -issues.ref_closing_from = `спомена тази задача в заявка за сливане %[4]s, която ще я затвори, %[2]s` +issues.ref_closing_from = `спомена тази задача в заявка за сливане %[3]s, която ще я затвори, %[1]s` issues.ref_from = `от %[1]s` -issues.ref_reopening_from = `спомена тази задача в заявка за сливане %[4]s, която ще я отвори наново , %[2]s` +issues.ref_reopening_from = `спомена тази задача в заявка за сливане %[3]s, която ще я отвори наново , %[1]s` issues.draft_title = Чернова pulls.reopen_to_merge = Моля, отворете наново тази заявка за сливане, за да извършите сливане. pulls.cant_reopen_deleted_branch = Тази заявка за сливане не може да бъде отворена наново, защото клонът е изтрит. diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index 9448dd8e7e..830065fb64 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -1633,13 +1633,13 @@ issues.opened_by_fake=otevřeno %[1]s uživatelem %[2]s issues.closed_by_fake=od %[2]s byl uzavřen %[1]s issues.previous=Předchozí issues.next=Další -issues.open_title=Otevřeno -issues.closed_title=Uzavřeno +issues.open_title=Otevřené +issues.closed_title=Uzavřené issues.draft_title=Koncept issues.num_comments_1=%d komentář issues.num_comments=%d komentářů issues.commented_at=`okomentoval/a %s` -issues.delete_comment_confirm=Jste si jist, že chcete smazat tento komentář? +issues.delete_comment_confirm=Opravdu chcete smazat tento komentář? issues.context.copy_link=Kopírovat odkaz issues.context.quote_reply=Citovat odpověď issues.context.reference_issue=Odkázat v novém problému @@ -1653,13 +1653,13 @@ issues.close_comment_issue=Zavřít s komentářem issues.reopen_issue=Znovu otevřít issues.reopen_comment_issue=Znovu otevřít s komentářem issues.create_comment=Komentovat -issues.closed_at=`uzavřel/a tento problém %[2]s` -issues.reopened_at=`znovu otevřel/a tento problém %[2]s` -issues.commit_ref_at=`odkázal/a na tento problém z revize %[2]s` -issues.ref_issue_from=`odkázal/a na tento problém %[4]s %[2]s` -issues.ref_pull_from=`odkázal/a na tuto žádost o sloučení %[4]s %[2]s` -issues.ref_closing_from=`odkazoval/a na tento problém ze žádosti o sloučení %[4]s, která jej uzavře, %[2]s` -issues.ref_reopening_from=`odkazoval/a na tento problém ze žádosti o sloučení %[4]s, která jej znovu otevře, %[2]s` +issues.closed_at=`uzavřel/a tento problém %s` +issues.reopened_at=`znovu otevřel/a tento problém %s` +issues.commit_ref_at=`odkázal/a na tento problém z revize %s` +issues.ref_issue_from=`odkázal/a na tento problém %[3]s %[1]s` +issues.ref_pull_from=`odkázal/a na tuto žádost o sloučení %[3]s %[1]s` +issues.ref_closing_from=`odkázal/a na tento problém ze žádosti o sloučení %[3]s, která jej uzavře, %[1]s` +issues.ref_reopening_from=`odkázal/a na tento problém ze žádosti o sloučení %[3]s, která jej znovu otevře, %[1]s` issues.ref_closed_from=`uzavřel/a tento problém %[4]s %[2]s` issues.ref_reopened_from=`znovu otevřel/a tento problém %[4]s %[2]s` issues.ref_from=`z %[1]s` @@ -1966,8 +1966,8 @@ pulls.update_branch_success=Aktualizace větve byla úspěšná pulls.update_not_allowed=Nemáte oprávnění aktualizovat větev pulls.outdated_with_base_branch=Tato větev je zastaralá oproti základní větvi pulls.close=Zavřít žádost o sloučení -pulls.closed_at=`uzavřel/a tuto žádost o sloučení %[2]s` -pulls.reopened_at=`znovu otevřel/a tuto žádost o sloučení %[2]s` +pulls.closed_at=`uzavřel/a tuto žádost o sloučení %s` +pulls.reopened_at=`znovu otevřel/a tuto žádost o sloučení %s` 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 @@ -2758,7 +2758,7 @@ settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning = Tuto ak settings.new_owner_blocked_doer = Nový majitel vás zablokoval. settings.mirror_settings.pushed_repository = Odeslaný repozitář settings.add_collaborator_blocked_our = Nepodařilo se přidat spolupracovníka, jelikož byl zablokován majitelem repozitáře. -pulls.commit_ref_at = `se odkázal/a na tuto žádost o sloučení z revize %[2]s` +pulls.commit_ref_at = `odkázal/a na tuto žádost o sloučení z revize %s` settings.wiki_rename_branch_main = Normalizovat název větve wiki settings.wiki_rename_branch_main_desc = Přejmenovat větev interně používanou pro wiki na „%s“. Tato změna je trvalá a nelze ji vrátit. pulls.fast_forward_only_merge_pull_request = Pouze zrychlené diff --git a/options/locale/locale_da.ini b/options/locale/locale_da.ini index ea22f49e77..c82779ab60 100644 --- a/options/locale/locale_da.ini +++ b/options/locale/locale_da.ini @@ -1520,15 +1520,15 @@ issues.add_labels = tilføjede %s etiketterne %s issues.add_remove_labels = tilføjede %s og fjernede %s etiketter %s issues.add_milestone_at = `føjede dette til %s milepælen %s` issues.add_project_at = `føjede dette til %s- projektet %s` -issues.ref_reopening_from = `henviste til dette problem fra en pull-anmodning %[4]s, der vil genåbne den, %[2]s` +issues.ref_reopening_from = `henviste til dette problem fra en pull-anmodning %[3]s, der vil genåbne den, %[1]s` issues.ref_closed_from = `lukkede dette problem %[4]s %[2 ]s` issues.ref_reopened_from = `genåbnede dette problem %[4]s %[2 ]s` issues.ref_from = `fra %[1]s` issues.author = Forfatter -issues.commit_ref_at = `henviste til dette problem fra en commit %[2]s` -issues.ref_issue_from = `henviste til dette problem %[4]s %[2 ]s` -issues.ref_pull_from = `henviste til denne pull-anmodning %[4]s %[ 2]s` -issues.ref_closing_from = `henviste til dette problem fra en pull-anmodning %[4]s, der vil lukke det, %[2]s` +issues.commit_ref_at = `henviste til dette problem fra en commit %s` +issues.ref_issue_from = `henviste til dette problem %[3]s %[2 ]s` +issues.ref_pull_from = `henviste til denne pull-anmodning %[3]s %[1]s` +issues.ref_closing_from = `henviste til dette problem fra en pull-anmodning %[3]s, der vil lukke det, %[1]s` issues.author.tooltip.issue = Denne bruger er forfatteren til dette problem. issues.author.tooltip.pr = Denne bruger er forfatteren af denne pull-anmodning. issues.role.owner = Ejer @@ -1564,8 +1564,8 @@ issues.reaction.alt_add = Tilføj %[1]s reaktion til kommentar. issues.context.menu = Kommentar menu issues.reopen_comment_issue = Genåbner med kommentar issues.create_comment = Kommentar -issues.closed_at = `lukkede dette problem %[2]s` -issues.reopened_at = `genåbnede dette problem %[2]s` +issues.closed_at = `lukkede dette problem %s` +issues.reopened_at = `genåbnede dette problem %s` issues.remove_label = fjernede %s etiketten %s issues.remove_labels = fjernede %s etiketterne %s issues.change_project_at = `modificerede projektet fra %s til %s %s` @@ -1911,10 +1911,10 @@ pulls.editable_explanation = Denne pull-anmodning tillader redigeringer fra vedl pulls.auto_merge_button_when_succeed = (Når kontroller lykkes) pulls.status_checks_requested = Påkrævet pulls.close = Luk pull anmodning -pulls.commit_ref_at = `henviste til denne pull-anmodning fra en commit %[2]s` +pulls.commit_ref_at = `henviste til denne pull-anmodning fra en commit %s` pulls.cmd_instruction_hint = Se instruktionerne på kommandolinjen -pulls.reopened_at = `genåbnede denne pull-anmodning %[2]s` -pulls.closed_at = `lukkede denne pull-anmodning %[2]s` +pulls.reopened_at = `genåbnede denne pull-anmodning %s` +pulls.closed_at = `lukkede denne pull-anmodning %s` pulls.cmd_instruction_checkout_desc = Fra dit projektdepot, tjek en ny gren og test ændringerne. pulls.editable = Redigerbar pulls.made_using_agit = AGit diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 829912b3cc..f8bfc9258a 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -1577,7 +1577,7 @@ issues.remove_ref_at=`hat die Referenz %s %s entfernt` issues.add_ref_at=`hat die Referenz %s %s hinzugefügt` issues.delete_branch_at=`löschte den Branch %s %s` issues.filter_label=Label -issues.filter_label_exclude=`Alt + Klick/Enter verwenden, um Labels auszuschließen` +issues.filter_label_exclude=`Verwende Alt + Klick/Enter, um Labels auszuschließen` issues.filter_label_no_select=Alle Labels issues.filter_label_select_no_label=Kein Label issues.filter_milestone=Meilenstein @@ -1651,13 +1651,13 @@ issues.close_comment_issue=Mit Kommentar schließen issues.reopen_issue=Wieder öffnen issues.reopen_comment_issue=Mit Kommentar wieder öffnen issues.create_comment=Kommentieren -issues.closed_at=`hat diesen Issue %[2]s geschlossen` -issues.reopened_at=`hat dieses Issue %[2]s wieder geöffnet` -issues.commit_ref_at=`hat dieses Issue %[2]s aus einem Commit referenziert` -issues.ref_issue_from=`hat %[2]s auf dieses Issue verwiesen %[4]s` -issues.ref_pull_from=`hat %[2]s auf diesen Pull-Request verwiesen %[4]s` -issues.ref_closing_from=`hat %[2]s in einem Pull-Request %[4]s auf dieses Issue verwiesen, welcher es schließen wird` -issues.ref_reopening_from=`hat %[2]s in einem Pull-Request %[4]s auf dieses Issue verwiesen, welcher es erneut öffnen wird` +issues.closed_at=`hat dieses Issue %s geschlossen` +issues.reopened_at=`hat dieses Issue %s wieder geöffnet` +issues.commit_ref_at=`hat dieses Issue %s aus einem Commit referenziert` +issues.ref_issue_from=`hat %[1]s auf dieses Issue verwiesen %[3]s` +issues.ref_pull_from=`referenzierte diesen Pull-Request %[3]s %[1]s` +issues.ref_closing_from=`referenzierte dieses Issue aus einem Pull-Request %[3]s der es schließen wird, %[1]s` +issues.ref_reopening_from=`referenzierte dieses Issue aus einem Pull-Request %[3]s der es wieder öffnen wird, %[1]s` issues.ref_closed_from=`hat dieses Issue %[4]s geschlossen %[2]s` issues.ref_reopened_from=`hat dieses Issue %[4]s %[2]s wieder geöffnet` issues.ref_from=`von %[1]s` @@ -1962,8 +1962,8 @@ pulls.update_branch_success=Branch-Aktualisierung erfolgreich pulls.update_not_allowed=Du hast keine Berechtigung, den Branch zu updaten pulls.outdated_with_base_branch=Dieser Branch enthält nicht die neusten Commits des Basis-Branches pulls.close=Pull-Request schließen -pulls.closed_at=`hat diesen Pull-Request %[2]s geschlossen` -pulls.reopened_at=`hat diesen Pull-Request %[2]s wieder geöffnet` +pulls.closed_at=`hat diesen Pull-Request %s geschlossen` +pulls.reopened_at=`hat diesen Pull-Request %s wieder geöffnet` pulls.clear_merge_message=Merge-Nachricht löschen pulls.clear_merge_message_hint=Das Löschen der Merge-Nachricht wird nur den Inhalt der Commit-Nachricht entfernen und generierte Git-Trailer wie „Co-Authored-By …“ erhalten. @@ -2767,7 +2767,7 @@ settings.wiki_globally_editable = Allen erlauben, das Wiki zu bearbeiten settings.protect_branch_name_pattern_desc = Geschützte Branch-Namens-Patterns. Siehe die Dokumentation für Pattern-Syntax. Beispiele: main, release/** settings.ignore_stale_approvals = Abgestandene Genehmigungen ignorieren settings.ignore_stale_approvals_desc = Genehmigungen, welche für ältere Commits gemacht wurden (abgestandene Reviews), nicht in die Gesamtzahl der Genehmigung des PRs mitzählen. Irrelevant, falls abgestandene Reviews bereits verworfen werden. -pulls.commit_ref_at = `hat sich auf diesen Pull-Request von einem Commit %[2]s bezogen` +pulls.commit_ref_at = `referenzierte diesen Pull-Request aus einem Commit %s` pulls.fast_forward_only_merge_pull_request = Nur Fast-forward pulls.cmd_instruction_checkout_desc = Checke einen neuen Branch aus deinem Projekt-Repository aus und teste die Änderungen. pulls.cmd_instruction_merge_title = Zusammenführen @@ -3061,8 +3061,8 @@ teams.invite.by=Von %s eingeladen teams.invite.description=Bitte klicke auf die folgende Schaltfläche, um dem Team beizutreten. follow_blocked_user = Du kannst dieser Organisation nicht folgen, weil diese Organisation dich blockiert hat. open_dashboard = Übersicht öffnen -settings.change_orgname_redirect_prompt.with_cooldown.one = Der alte Organisationsname ist nach einer Abkühldauer von einem Tag wieder für alle verfügbar. Du kannst den alten Namen während dieser Abkühldauer erneut beanspruchen. -settings.change_orgname_redirect_prompt.with_cooldown.few = Der alte Organisationsname ist nach einer Abkühldauer von %[1]d Tagen wieder für alle verfügbar. Du kannst den alten Namen während dieser Abkühldauer erneut beanspruchen. +settings.change_orgname_redirect_prompt.with_cooldown.one = Der alte Organisationsname ist nach einer Schutzzeit von einem Tag wieder für alle verfügbar. Du kannst den alten Namen während dieser Schutzzeit erneut beanspruchen. +settings.change_orgname_redirect_prompt.with_cooldown.few = Der alte Organisationsname ist nach einer Schutzzeit von %[1]d Tagen wieder für alle verfügbar. Du kannst den alten Namen während dieser Schutzzeit erneut beanspruchen. [admin] dashboard=Übersicht diff --git a/options/locale/locale_el-GR.ini b/options/locale/locale_el-GR.ini index 29085aebf1..398a0d9ce4 100644 --- a/options/locale/locale_el-GR.ini +++ b/options/locale/locale_el-GR.ini @@ -1626,13 +1626,13 @@ issues.close_comment_issue=Αποστολή σχολίου και κλείσιμ issues.reopen_issue=Ανοίξτε ξανά issues.reopen_comment_issue=Αποστολή σχολίου και επανάνοιγμα ζητήματος issues.create_comment=Προσθήκη Σχολίου -issues.closed_at=`αυτό το ζήτημα έκλεισε %[2]s` -issues.reopened_at=`ξανά άνοιξε αυτό το ζήτημα %[2]s` -issues.commit_ref_at=`αναφορά σε αυτό το ζήτημα από την παραπομπή %[2]s` -issues.ref_issue_from=`αναφέρθηκε σε αυτό το ζήτημα %[4]s %[2]s` -issues.ref_pull_from=`αναφέρθηκε σε αυτό το pull request %[4]s %[2]s` -issues.ref_closing_from=`ανέφερε αυτό το ζήτημα σε ένα pull request %[4]s που στοχεύει να κλείσει το ζήτημα %[2]s` -issues.ref_reopening_from=`αναφέρθηκε σε αυτό το ζήτημα σε ένα pull request %[4]s που θα ξαναανοίξει αυτό το ζήτημα %[2]s` +issues.closed_at=`αυτό το ζήτημα έκλεισε %s` +issues.reopened_at=`ξανά άνοιξε αυτό το ζήτημα %s` +issues.commit_ref_at=`αναφορά σε αυτό το ζήτημα από την παραπομπή %s` +issues.ref_issue_from=`αναφέρθηκε σε αυτό το ζήτημα %[3]s %[1]s` +issues.ref_pull_from=`αναφέρθηκε σε αυτό το pull request %[3]s %[1]s` +issues.ref_closing_from=`ανέφερε αυτό το ζήτημα σε ένα pull request %[3]s που στοχεύει να κλείσει το ζήτημα %[1]s` +issues.ref_reopening_from=`αναφέρθηκε σε αυτό το ζήτημα σε ένα pull request %[3]s που θα ξαναανοίξει αυτό το ζήτημα %[1]s` issues.ref_closed_from=`έκλεισε αυτό το ζήτημα %[4]s %[2]s` issues.ref_reopened_from=`άνοιξε ξανά αυτό το ζήτημα %[4]s %[2]s` issues.ref_from=`από %[1]s` @@ -1939,8 +1939,8 @@ pulls.update_branch_success=Η ενημέρωση του κλάδου ήταν pulls.update_not_allowed=Δεν επιτρέπεται να ενημερώσετε τον κλάδο pulls.outdated_with_base_branch=Αυτός ο κλάδος δεν είναι ενημερωμένος με τον βασικό κλάδο pulls.close=Κλείσιμο pull request -pulls.closed_at=`έκλεισε αυτό το pull request %[2]s` -pulls.reopened_at=`άνοιξε ξανά αυτό το pull request %[2]s` +pulls.closed_at=`έκλεισε αυτό το pull request %s` +pulls.reopened_at=`άνοιξε ξανά αυτό το pull request %s` pulls.cmd_instruction_hint=Προβολή οδηγιών γραμμής εντολών pulls.cmd_instruction_checkout_title=Έλεγχος pulls.cmd_instruction_checkout_desc=Από το repository του έργου σας, ελέγξτε έναν νέο κλάδο και δοκιμάστε τις αλλαγές. @@ -2720,7 +2720,7 @@ settings.new_owner_blocked_doer = Ο νέος κάτοχος του αποθετ settings.enter_repo_name = Γράψτε το όνομα του κατόχου και του αποθετηρίου ακριβώς όπως το βλέπετε: settings.confirmation_string = Κείμενο επιβεβαίωσης settings.units.overview = Επισκόπηση -pulls.commit_ref_at = `ανέφερε το pull request στο commit %[2]s` +pulls.commit_ref_at = `ανέφερε το pull request στο commit %s` contributors.contribution_type.filter_label = Είδος συνεισφοράς: settings.wiki_rename_branch_main_notices_1 = Αυτή η ενέργεια ΔΕΝ αναιρείται. activity.navbar.contributors = Συνεισφέροντες diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini index f912409cc9..bdafba93b4 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -1648,13 +1648,13 @@ issues.close_comment_issue=Cerrar con comentario issues.reopen_issue=Reabrir issues.reopen_comment_issue=Reabrir con comentario issues.create_comment=Comentar -issues.closed_at=`cerró esta incidencia %[2]s` -issues.reopened_at=`reabrió esta incidencia %[2]s` -issues.commit_ref_at=`referenció esta incidencia en un commit %[2]s` -issues.ref_issue_from=`referenció esta incidencia %[4]s %[2]s` -issues.ref_pull_from=`referenció este pull request %[4]s %[2]s` -issues.ref_closing_from=`hizo referencia a esta incidencia desde un pull request %[4]s que lo cerrará , %[2]s` -issues.ref_reopening_from=`hizo referencia a esta incidencia desde un pull request %[4]s que lo reabrirá, %[2]s` +issues.closed_at=`cerró esta incidencia %s` +issues.reopened_at=`reabrió esta incidencia %s` +issues.commit_ref_at=`referenció esta incidencia en un commit %s` +issues.ref_issue_from=`referenció esta incidencia %[3]s %[1]s` +issues.ref_pull_from=`referenció este pull request %[3]s %[1]s` +issues.ref_closing_from=`hizo referencia a esta incidencia desde un pull request %[3]s que lo cerrará , %[1]s` +issues.ref_reopening_from=`hizo referencia a esta incidencia desde un pull request %[3]s que lo reabrirá, %[1]s` issues.ref_closed_from=`cerró esta incidencia %[4]s %[2]s` issues.ref_reopened_from=`reabrió esta incidencia %[4]s %[2]s` issues.ref_from=`de %[1]s` @@ -1959,8 +1959,8 @@ pulls.update_branch_success=La actualización de la rama ha finalizado correctam pulls.update_not_allowed=No tiene permisos para actualizar esta rama pulls.outdated_with_base_branch=Esta rama está desactualizada con la rama base pulls.close=Cerrar pull request -pulls.closed_at=`cerró este pull request %[2]s` -pulls.reopened_at=`reabrió este pull request %[2]s` +pulls.closed_at=`cerró este pull request %s` +pulls.reopened_at=`reabrió este pull request %s` pulls.clear_merge_message=Borrar mensaje de fusión pulls.clear_merge_message_hint=Limpiar el mensaje de fusión solo eliminará el contenido del mensaje de commit y mantendrá frases generadas como "Co-Autorizado por …". @@ -2789,7 +2789,7 @@ pulls.status_checks_hide_all = Ocultar todas las verificaciones settings.federation_not_enabled = La federación no está habilitada en tu instancia. wiki.search = Buscar en wiki pulls.status_checks_show_all = Mostrar todas las verificaciones -pulls.commit_ref_at = `hizo referencia a este pull request desde un commit %[2]s` +pulls.commit_ref_at = `hizo referencia a este pull request desde un commit %s` pulls.cmd_instruction_merge_title = Fusionar contributors.contribution_type.deletions = Eliminaciones contributors.contribution_type.filter_label = Tipo de contribución: diff --git a/options/locale/locale_fa-IR.ini b/options/locale/locale_fa-IR.ini index 804b48b2b2..dae0695495 100644 --- a/options/locale/locale_fa-IR.ini +++ b/options/locale/locale_fa-IR.ini @@ -1250,13 +1250,13 @@ issues.close_comment_issue=ثبت دیدگاه و بستن issues.reopen_issue=بازگشایی issues.reopen_comment_issue=ثبت دیدگاه و بازگشایی issues.create_comment=دیدگاه -issues.closed_at=`%[2]s این موضوع را بست` -issues.reopened_at=`%[2]s این موضوع را دوباره باز کرد` -issues.commit_ref_at=`ارجاع این مسئله به کامیت %[2]s` -issues.ref_issue_from=` ارجاعات این مسائله %[4] %[2]s` -issues.ref_pull_from=` ارجاعات این تقاضای ادغام %[4] %[2]s` -issues.ref_closing_from=` ارجاعات این تقاضای واکشی %[4] %[2]s` -issues.ref_reopening_from=` تقاضای واکشی ارجاع شده %[4] که مسائله بازگشایی خواهد کرد %[2] ` +issues.closed_at=`%s این موضوع را بست` +issues.reopened_at=`%s این موضوع را دوباره باز کرد` +issues.commit_ref_at=`ارجاع این مسئله به کامیت %s` +issues.ref_issue_from=` ارجاعات این مسائله %[3] %[1]s` +issues.ref_pull_from=` ارجاعات این تقاضای ادغام %[4] %[1]s` +issues.ref_closing_from=` ارجاعات این تقاضای واکشی %[4] %[1]s` +issues.ref_reopening_from=` تقاضای واکشی ارجاع شده %[3]sکه مسائله بازگشایی خواهد کرد %[2] ` issues.ref_closed_from=` بسته شده این مسائله %[4] %[2]s` issues.ref_reopened_from=` بازگشایی این مسائله %[4] %[2]s` issues.ref_from=`از %[1]` @@ -1493,8 +1493,8 @@ pulls.update_branch_rebase=بروزآوری شاخه با بازسازی مجد pulls.update_branch_success=شاخه به موفقیت بروز شد pulls.update_not_allowed=شما اجازه بروزرسانی شاخه را ندارید pulls.outdated_with_base_branch=این شاخه با شاخه پایه منسوخ شده است -pulls.closed_at=`این درخواست pull بسته شده %[2]s` -pulls.reopened_at=`این درخواست pull را بازگشایی کرد %[2]s` +pulls.closed_at=`این درخواست pull بسته شده %s` +pulls.reopened_at=`این درخواست pull را بازگشایی کرد %s` diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini index cff940a05a..164a60cc8d 100644 --- a/options/locale/locale_fi-FI.ini +++ b/options/locale/locale_fi-FI.ini @@ -1293,9 +1293,9 @@ issues.close_comment_issue=Kommentoi ja sulje issues.reopen_issue=Avaa uudelleen issues.reopen_comment_issue=Kommentoi ja avaa uudelleen issues.create_comment=Kommentoi -issues.closed_at=`sulki tämän ongelman %[2]s` -issues.reopened_at=`uudelleenavasi tämän ongelman %[2]s` -issues.commit_ref_at=`viittasi tähän ongelmaan kommitissa %[2]s` +issues.closed_at=`sulki tämän ongelman %s` +issues.reopened_at=`uudelleenavasi tämän ongelman %s` +issues.commit_ref_at=`viittasi tähän ongelmaan kommitissa %s` issues.author=Tekijä issues.role.owner=Omistaja issues.role.member=Jäsen @@ -2185,7 +2185,7 @@ settings.confirmation_string = Vahvistusteksti settings.delete_notices_2 = - Tämä toiminto poistaa pysyvästi tietovaraston %s mukaan lukien koodin, ongelmat, kommentit, wikidatan ja avustaja-asetukset. issues.filter_assginee_no_select = Kaikki käsittelijät issues.new.assign_to_me = Osoita itselle -pulls.closed_at = `sulki tämän vetopyynnön %[2]s` +pulls.closed_at = `sulki tämän vetopyynnön %s` tree_path_not_found_branch = Polkua %[1]s ei ole olemassa haarassa %[2]s transfer.no_permission_to_reject = Sinulla ei ole oikeutta hylätä tätä siirtoa. generate_repo = Luo tietovarasto @@ -2199,8 +2199,8 @@ issues.new.no_reviewers = Ei katselmoijia issues.add_label = lisäsi nimilapun %s %s issues.due_date_added = lisäsi eräpäivän %s %s issues.review.add_review_request = pyysi katselmointia käyttäjältä %[1]s %[2]s -issues.ref_pull_from = `viittasi tähän vetopyyntöön %[4]s %[2]s` -pulls.commit_ref_at = `viittasi tähän vetopyyntöön kommitista %[2]s` +issues.ref_pull_from = `viittasi tähän vetopyyntöön %[3]s %[1]s` +pulls.commit_ref_at = `viittasi tähän vetopyyntöön kommitista %s` issues.review.comment = katselmoi %s issues.add_labels = lisäsi nimilaput %s %s issues.review.add_review_requests = pyysi katselmointeja käyttäjiltä %[1]s %[2]s @@ -2381,7 +2381,7 @@ wiki.page_name_desc = Kirjoita tämän wikisivun nimi. Joitain erikoisnimiä ova pulls.blocked_by_changed_protected_files_1 = Tämä vetopyyntö sisältää suojatun tiedoston ja on siksi estetty: pulls.status_checks_warning = Jotkin tarkistukset raportoivat varoituksia pulls.status_checks_error = Jotkin tarkistukset raportoivat virheitä -pulls.reopened_at = `avasi uudelleen tämän vetopyynnön %[2]s` +pulls.reopened_at = `avasi uudelleen tämän vetopyynnön %s` pulls.auto_merge_when_succeed = Yhdistä automaatisesti kun kaikki tarkistukset onnistuvat signing.wont_sign.error = Tapahtui virhe tarkistaessa voiko kommitin allekirjoittaa. signing.wont_sign.twofa = Sinulla tulee olla kaksivaiheinen todennus käytössä, jotta kommitit voi allekirjoittaa. diff --git a/options/locale/locale_fil.ini b/options/locale/locale_fil.ini index 7d1405f633..8c9badb04b 100644 --- a/options/locale/locale_fil.ini +++ b/options/locale/locale_fil.ini @@ -365,7 +365,7 @@ table_modal.label.columns = Mga Column link_modal.header = Magdagdag ng link link_modal.url = Url link_modal.description = Deskripsyon -link_modal.paste_reminder = Pahiwatig: Kapag may URL sa clipboard, maari mong direktang i-paste sa editor para gumawa ng link. +link_modal.paste_reminder = Pahiwatig: Kapag may URL sa clipboard, maaari mong direktang i-paste sa editor para gumawa ng link. [filter] string.asc = A - Z @@ -432,7 +432,7 @@ openid_connect_desc = Ang piniling OpenID URI ay hindi alam. Iugnay iyan sa bago invalid_code = Ang iyong confirmation code ay hindi wasto o nag-expire na. oauth_signin_title = Mag-sign in para pahintulutan ang naka-link na account invalid_code_forgot_password = Ang iyong confirmation code ay hindi wasto o nag-expire na. Mag-click dito para magsimula ng bagong session. -confirmation_mail_sent_prompt = Ang isang bagong email na pang-kumpirma ay ipinadala sa %s. Para kumpletuhin ang proseso ng pagrehistro, pakisuri ang iyong inbox at sundan ang ibinigay na link sa loob ng %s. Kung mali ang email, maari kang mag-log in, at humingi ng isa pang email pang-kumpirma na ipapadala sa ibang address. +confirmation_mail_sent_prompt = Ang isang bagong email na pang-kumpirma ay ipinadala sa %s. Para kumpletuhin ang proseso ng pagrehistro, pakisuri ang iyong inbox at sundan ang ibinigay na link sa loob ng %s. Kung mali ang email, maaari kang mag-log in, at humingi ng isa pang email pang-kumpirma na ipapadala sa ibang address. invalid_password = Ang iyong password ay hindi tugma sa password na ginamit para gawin ang account. twofa_scratch_used = Ginamit mo na ang scratch code. Na-redirect ka sa two-factor settings page para tanggalin ang device enrollment o mag-generate ng bagong scratch code. manual_activation_only = Makipag-ugnayan sa tagapangangasiwa ng site para kumpletuhin ang pagrehistro. @@ -484,7 +484,7 @@ admin.new_user.text = Mangyaring mag-click dito para ipamahala register_notify = Maligayang Pagdating sa %s register_notify.title = %[1]s, maligayang pagdating sa %[2]s register_notify.text_1 = ito ang iyong registration confirmation email para sa %s! -register_notify.text_2 = Maari kang mag-sign in sa iyong account gamit ng iyong username: %s +register_notify.text_2 = Maaari kang mag-sign in sa iyong account gamit ng iyong username: %s reset_password = I-recover ang iyong account reset_password.title = %s, nagkaroon kami ng hiling para i-recover ang iyong account reset_password.text = Kung ikaw ito, paki-click ang sumusunod na link para i-recover ang iyong account sa loob ng %s: @@ -535,7 +535,7 @@ totp_disabled.text_1 = Ngayon lang na-disable ang Time-based one-time password ( totp_disabled.no_2fa = Wala nang mga ibang paraan ng 2FA ang naka-configure, nangangahulugan na hindi na kailangang mag-log in sa iyong account gamit ang 2FA. removed_security_key.subject = May tinanggal na security key removed_security_key.text_1 = Tinanggal ngayon lang ang security key na "%[1]s" sa iyong account. -account_security_caution.text_1 = Kung ikaw ito, maari mong ligtas na huwag pansinin ang mail na ito. +account_security_caution.text_1 = Kung ikaw ito, maaari mong ligtas na huwag pansinin ang mail na ito. account_security_caution.text_2 = Kung hindi ito ikaw, nakompromiso ang iyong account. Mangyaring makipag-ugnayan sa mga tagapangasiwa ng site na ito. totp_enrolled.subject = Nag-activate ka ng TOTP bilang paraan ng 2FA totp_enrolled.text_1.has_webauthn = Na-enable mo lang ang TOTP para sa iyong account. Nangangahulugan ito na para sa lahat ng mga hinaharap na pag-login sa iyong account, kailangan mong gumamit ng TOTP bilang paraan ng 2FA o gamitin ang iyong mga security key. @@ -644,7 +644,7 @@ AccessToken = Token ng pag-access Biography = Byograpya Location = Lokasyon visit_rate_limit = Natugunan ang limitasyon sa rate ng malayuang pagbisita. -username_claiming_cooldown = Hindi ma-claim ang username na ito, dahil hindi pa tapos ang panahon ng cooldown. Maari itong i-claim sa %[1]s. +username_claiming_cooldown = Hindi ma-claim ang username na ito, dahil hindi pa tapos ang panahon ng cooldown. Maaari itong i-claim sa %[1]s. email_domain_is_not_allowed = Sumasalungat ang domain ng email address ng user %s sa EMAIL_DOMAIN_ALLOWLIST o EMAIL_DOMAIN_BLOCKLIST. Siguraduhing natakda mo ang email address nang tama. [user] @@ -685,7 +685,7 @@ followers.title.few = Mga tagasunod following.title.one = Sinusundan followers.title.one = Tagasunod public_activity.visibility_hint.self_public = Nakikita ng lahat ang iyong aktibidad, maliban sa mga interaksyon sa pribadong espasyo. I-configure. -public_activity.visibility_hint.admin_public = Nakikita ng lahat ang aktibidad na ito, ngunit bilang tagapangasiwa maari mo ring makita ang mga interaksyon sa mga pribadong espasyo. +public_activity.visibility_hint.admin_public = Nakikita ng lahat ang aktibidad na ito, ngunit bilang tagapangasiwa maaari mo ring makita ang mga interaksyon sa mga pribadong espasyo. public_activity.visibility_hint.self_private = Nakikita mo lang at mga tagapangasiwa ng instansya ang iyong aktibidad. I-configure. public_activity.visibility_hint.admin_private = Nakikita mo ang aktibidad na ito dahil isa kang tagapangasiwa, ngunit gusto ng user na panatilihin itong pribado. public_activity.visibility_hint.self_private_profile = Ikaw lang at ang mga tagapangasiwa ng instansya ang makakakita ng iyong aktibidad dahil pribado ang iyong profile. I-configure. @@ -842,7 +842,7 @@ gpg_key_verify = I-verify gpg_invalid_token_signature = Ang ibinigay na GPG key, signature, at token ay hindi tumutugma o luma. gpg_token_required = Kailangan mong magbigay ng signature para sa token sa ibaba gpg_token = Token -gpg_token_help = Maari kang mag-generate ng signature gamit ng: +gpg_token_help = Maaari kang mag-generate ng signature gamit ng: gpg_token_signature = Naka-armor na GPG signature key_signature_gpg_placeholder = Nagsisimula sa "-----BEGIN PGP SIGNATURE-----" verify_gpg_key_success = Na-verify na ang GPG key na "%s". @@ -851,7 +851,7 @@ ssh_key_verify = I-verify ssh_invalid_token_signature = Ang ibinigay na SSH key, signature, o token ay hindi tumutugma o luma. ssh_token_required = Kailangan mong magbigay ng signature para sa token sa ibaba ssh_token = Token -ssh_token_help = Maari kang mag-generate ng signature gamit ng: +ssh_token_help = Maaari kang mag-generate ng signature gamit ng: ssh_token_signature = Naka-armor na SSH signature key_signature_ssh_placeholder = Nagsisimula sa "-----BEGIN SSH SIGNATURE-----" verify_ssh_key_success = Na-verify na ang SSH key na "%s". @@ -912,10 +912,10 @@ create_oauth2_application_success = Matagumpay kang gumawa ang bagong OAuth2 app oauth2_confidential_client = Kumpidensyal na kliyente. Piliin para sa mga app na pinapatilihing kumpidensyal ang sikreto, tulad ng mga web app. Huwag piliin para sa mga web app kasama ang mga desktop at mobile app. twofa_desc = Para protektahin ang iyong account laban sa pagnanakaw ng password, pwede mo gamitin ang iyong smartphone o ibang device para sa pagtanggap ng time-based one-time password ("TOTP"). twofa_scratch_token_regenerated = Ang iyong isang-beses na paggamit na recovery key ngayon ay %s. Ilagay ito sa ligtas na lugar, dahil hindi na ito ipapakita muli. -regenerate_scratch_token_desc = Kapag nawala mo ang iyong recovery key o ginamit mo na oara mag-sign in, maari mong i-reset dito. +regenerate_scratch_token_desc = Kapag nawala mo ang iyong recovery key o ginamit mo na oara mag-sign in, maaari mong i-reset dito. twofa_disable_desc = Ang pag-disable ng authentikasyong two-factor ay gagawing hindi gaanong ligtas ang iyong account. Magpatuloy? twofa_enrolled = Matagumpay na na-enroll ang iyong account. Ilagay ang iyong isang-beses na paggamit na recovery key (%s) sa isang ligtas na lugar, dahil hindi na ito ipapakita muli. -webauthn_desc = Ang mga security key ay isang hardware device na naglalaman ng mga cryptographic key. Maari silang gamitin para sa authentikasyong two-factor. Ang mga security key ay dapat suportahan ang WebAuthn Authenticator na standard. +webauthn_desc = Ang mga security key ay isang hardware device na naglalaman ng mga cryptographic key. Maaari silang gamitin para sa authentikasyong two-factor. Ang mga security key ay dapat suportahan ang WebAuthn Authenticator na standard. remove_oauth2_application = Tanggalin ang OAuth2 Application remove_oauth2_application_desc = Ang pagtanggal ng OAuth2 application ay babawiin ang access sa lahat ng mga naka-sign na access token. Magpatuloy? remove_oauth2_application_success = Binura na ang application. @@ -931,13 +931,13 @@ oauth2_regenerate_secret = I-regenerate ang sikreto oauth2_regenerate_secret_hint = Nawala mo ang iyong sikreto? oauth2_client_secret_hint = Ang sikreto ay hindi ipapakita muli pagkatapos umalis ka o i-refresh ang page na ito. Mangyaring siguraduhin na na-save mo iyan. oauth2_application_edit = I-edit -twofa_recovery_tip = Kapag mawala mo ang iyong device, maari kang gumamit ng isang isang-beses na paggamit na recovery key para makakuha muli ng access sa iyong account. +twofa_recovery_tip = Kapag mawala mo ang iyong device, maaari kang gumamit ng isang isang-beses na paggamit na recovery key para makakuha muli ng access sa iyong account. twofa_is_enrolled = Ang iyong account ay kasalukuyang naka-enroll sa autentikasyong two-factor. twofa_not_enrolled = Kasalukuyang hindi naka-enroll ang iyong account sa authentikasyong two-factor. twofa_disable = I-disable ang authentikasyong two-factor twofa_scratch_token_regenerate = I-regenerate ang isang-beses na paggamit na recovery key twofa_enroll = Mag-enroll sa authentikasyong two-factor -twofa_disable_note = Maari mong i-disable ang authentikasyong two-factor kapag kinakailangan. +twofa_disable_note = Maaari mong i-disable ang authentikasyong two-factor kapag kinakailangan. twofa_disabled = Na-disable na ang authentikasyong two-factor. scan_this_image = I-scan ang image na ito gamit ng iyong aplikasyong pang-authentikasyon: or_enter_secret = O ilagay ang sikreto: %s @@ -1005,8 +1005,8 @@ language.description = Mase-save ang wika sa iyong account at gagamitin bilang d language.localization_project = Tulungan kaming isalin ang Forgejo sa iyong wika! Matuto pa. pronouns_custom_label = Mga pasadyang pronoun user_block_yourself = Hindi mo maaaring harangan ang sarili mo. -change_username_redirect_prompt.with_cooldown.one = Magiging available ang lumang username sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw, maari mo pa ring ma-claim muli ang lumang username sa panahon ng panahon ng cooldown. -change_username_redirect_prompt.with_cooldown.few = Magiging available ang lumang username sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw, maari mo pa ring ma-claim muli ang lumang username sa panahon ng panahon ng cooldown. +change_username_redirect_prompt.with_cooldown.one = Magiging available ang lumang username sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw. Maaari mo pa ring ma-claim muli ang lumang username sa panahon ng panahon ng cooldown. +change_username_redirect_prompt.with_cooldown.few = Magiging available ang lumang username sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw. Maaari mo pa ring ma-claim muli ang lumang username sa panahon ng panahon ng cooldown. keep_pronouns_private = Ipakita lang ang mga panghalip sa mga naka-authenticate na user keep_pronouns_private.description = Itatago nito ang iyong mga panghalip mula sa mga bisita na hindi naka-log in. quota.applies_to_user = Nag-aapply ang mga sumusunod na panuntunan ng quota sa iyong account @@ -1071,7 +1071,7 @@ readme_helper_desc = Ito ang lugar kung saan makakasulat ka ng kumpletong deskri trust_model_helper_collaborator_committer = Katulong+Committer: I-trust ang mga signature batay sa mga katulong na tumutugma sa committer mirror_interval = Interval ng mirror (ang mga wastong unit ng oras ay "h", "m", "s"). 0 para i-disable ang periodic sync. (Pinakamababang interval: %s) transfer.reject_desc = Kanselahin ang pag-transfer mula sa "%s" -mirror_lfs_endpoint_desc = Ang sync ay susubukang gamitin ang clone url upang matukoy ang LFS server. Maari ka rin tumukoy ng isang custom na endpoint kapag ang LFS data ng repositoryo ay nilalagay sa ibang lugar. +mirror_lfs_endpoint_desc = Ang sync ay susubukang gamitin ang clone url upang matukoy ang LFS server. Maaari ka rin tumukoy ng isang custom na endpoint kapag ang LFS data ng repositoryo ay nilalagay sa ibang lugar. adopt_search = Ilagay ang username para maghanap ng mga unadopted na repositoryo… (iwanang walang laman para hanapin lahat) object_format = Format ng object readme_helper = Pumili ng README file template @@ -1164,8 +1164,8 @@ tree_path_not_found_commit = Hindi umiiral ang path na %[1]s sa commit %[2]s tree_path_not_found_branch = Hindi umiiral ang daanang %[1]s sa branch %[2]s migrate_items_pullrequests = Mga hiling sa paghila archive.pull.nocomment = Naka-archive ang repositoryong ito. Hindi ka makakakomento sa mga pull request. -archive.title = Naka-archive ang repositoryong ito. Maari mong itignan ang mga file at i-clone ito, pero hindi ka makakagawa ng anumang pagbabago sa estado ito, tulad ng pagtulak at paggawa ng mga isyu, pull request o mga komento. -archive.title_date = Naka-archive ang repositoryo na ito noong %s. Maari mong itignan ang mga file at i-clone ito, pero hindi ka makakagawa ng anumang pagbabago sa estado nito, tulad ng pagtulak o paggawa ng mga bagong isyu, mga pull request, o komento. +archive.title = Naka-archive ang repositoryong ito. Maaari mong itignan ang mga file at i-clone ito, pero hindi ka makakagawa ng anumang pagbabago sa estado ito, tulad ng pagtulak at paggawa ng mga isyu, pull request o mga komento. +archive.title_date = Naka-archive ang repositoryo na ito noong %s. Maaari mong itignan ang mga file at i-clone ito, pero hindi ka makakagawa ng anumang pagbabago sa estado nito, tulad ng pagtulak o paggawa ng mga bagong isyu, mga pull request, o komento. pulls = Mga hiling sa paghila activity.merged_prs_count_n = Mga naisamang hiling sa paghila wiki.last_updated = Huling binago %s @@ -1183,7 +1183,7 @@ issues.action_open = Buksan issues.closed_title = Sarado issues.reopen_issue = Buksang muli pulls.merged = Naisama na -pulls.merged_info_text = Maari nang burahin ang branch %s. +pulls.merged_info_text = Maaari nang burahin ang branch %s. milestones.update_ago = Binago %s activity.closed_issue_label = Sarado activity.merged_prs_label = Naisama @@ -1205,7 +1205,7 @@ migrate.clone_address_desc = Ang HTTP(S) o Git "clone" URL ng umiiral na reposit need_auth = Awtorisasyon migrate.github_token_desc = Maaari kang maglagay ng isa o higit pang mga token na hinihiwalay ng kuwit dito upang gawing mas-mabilis ang pagmigrate dahil sa rate limit ng GitHub API. BABALA: Ang pagabuso ng feature na ito ay maaaring maglabag sa patakaran ng tagapagbigay ng serbisyo at maaaring magdulot ng pag-block ng account. template.invalid = Kailangang pumili ng kahit isang template na repositoryo -migrate_options_lfs_endpoint.description = Susubukan ng migration na gamitin ang iyong Git remote upang matukoy ang LFS server. Maari mong magtiyak ng custom na endpoint kapag ang LFS data ng repositoryo ay nakalagay sa ibang lugar. +migrate_options_lfs_endpoint.description = Susubukan ng migration na gamitin ang iyong Git remote upang matukoy ang LFS server. Maaari mong magtiyak ng custom na endpoint kapag ang LFS data ng repositoryo ay nakalagay sa ibang lugar. blame.ignore_revs.failed = Nabigong hindi pansinin ang mga rebisyon sa .git-blame-ignore-revs. tree_path_not_found_tag = Hindi umiiral ang path na %[1]s sa tag %[2]s form.reach_limit_of_creation_n = Naabot na ng may-ari ang limitasyon na %d mga repositoryo. @@ -1471,10 +1471,10 @@ activity.new_issue_label = Nabuksan activity.merged_prs_count_1 = Naisamang hiling sa paghila activity.opened_prs_count_1 = Inimungkahing hiling sa paghila activity.opened_prs_label = Inimungkahi -pulls.reopened_at = `nabuksang muli ang hiling sa paghatak na %[2]s` +pulls.reopened_at = `binuksan muli ang hiling sa paghila %s` issues.opened_by_fake = binuksan ang %[1]s ni/ng %[2]s pulls.reopen_failed.base_branch = Hindi mabuksang muli ang hiling sa paghatak na ito dahil hindi na umiiral ang base branch. -issues.reopened_at = `binuksang muli ang isyung ito %[2]s` +issues.reopened_at = `binuksang muli ang isyung ito %s` pulls.reopen_failed.head_branch = Hindi mabubuksan muli ang hiling sa paghila, dahil hindi na umiiral ang head branch. settings.event_pull_request_desc = Binuksan, sinara, muling binuksan, o binago ang hiling sa paghatak. activity.opened_prs_count_n = Mga inimungkahing hiling sa paghila @@ -1500,7 +1500,7 @@ issues.content_history.created = ginawa editor.patching = Pina-patch: editor.fail_to_apply_patch = Hindi malapat ang patch na "%s" settings.danger_zone = Mapanganib na lugar -issues.closed_at = `isinara ang isyung ito %[2]s` +issues.closed_at = `isinara ang isyung ito %s` settings.collaboration.admin = Tagapangasiwa settings.admin_settings = Mga setting ng tagapangasiwa issues.start_tracking_history = `sinimulan ang trabaho %s` @@ -1627,7 +1627,7 @@ projects.column.edit_title = Pangalan projects.column.new_title = Pangalan projects.card_type.desc = Mga preview ng card commits.desc = I-browse ang history ng pagbabago ng source code. -commits.search.tooltip = Maari kang mag-prefix ng mga keyword gamit ang "author:", "committer:", "after:", o "before:", hal. "revert author:Nijika before:2022-10-09". +commits.search.tooltip = Maaari kang mag-prefix ng mga keyword gamit ang "author:", "committer:", "after:", o "before:", hal. "revert author:Nijika before:2022-10-09". issues.force_push_codes = `puwersahang itinulak ang %[1]s mula %[2]s sa %[4]s %[6]s` issues.push_commit_1 = idinagdag ang %d commit %s issues.push_commits_n = idinagdag ang %d mga commit %s @@ -1707,7 +1707,7 @@ issues.action_milestone = Milestone issues.action_milestone_no_select = Walang milestone issues.delete_branch_at = `binura ang branch na %s %s` issues.filter_label = Label -issues.filter_label_exclude = `Gamitin ang alt + click/enter para hindi isama ang mga label` +issues.filter_label_exclude = `Gamitin ang Alt + Click para hindi isama ang mga label` issues.filter_label_no_select = Lahat ng mga label issues.filter_milestone_closed = Mga nakasarang milestone issues.filter_assignee = Mangangasiwa @@ -1771,7 +1771,7 @@ issues.lock = I-lock ang usapan issues.unlock = I-unlock ang usapan issues.unlock_comment = na-unlock ang usapang ito %s issues.unlock.notice_1 = - Makakakomento muli ang lahat ng mga tao sa isyung ito. -issues.unlock.notice_2 = - Maari mong i-lock muli ang isyung ito sa hinaharap. +issues.unlock.notice_2 = - Maaari mong i-lock muli ang isyung ito sa hinaharap. issues.comment_on_locked = Hindi ka makakakomento sa naka-lock na isyu. issues.closed_by_fake = ni/ng %[2]s ay isinara %[1]s issues.comment_manually_pull_merged_at = manwal na isinama ang commit %[1]s sa %[2]s %[3]s @@ -1787,10 +1787,10 @@ issues.label_archive_tooltip = Ang mga naka-archive na label ay hindi isasama bi issues.is_stale = May mga pagbabago sa PR na ito mula sa pagsuri na ito issues.role.first_time_contributor = Unang-beses na contributor issues.lock.notice_1 = - Hindi makakadagdag ng mga bagong komento ang mga ibang user sa isyu na ito. -issues.lock.notice_3 = - Maari mong i-unlock muli ang isyung ito sa hinaharap. +issues.lock.notice_3 = - Maaari mong i-unlock muli ang isyung ito sa hinaharap. issues.label_deletion_desc = Ang pagbura ng label ay tatanggalin ito sa lahat ng mga isyu. Magpatuloy? -issues.commit_ref_at = `isinangguni ang isyu na ito mula sa commit %[2]s` -issues.ref_issue_from = `isinangguni ang isyu na ito sa %[4]s %[2]s` +issues.commit_ref_at = `isinangguni ang isyu na ito mula sa commit %s` +issues.ref_issue_from = `isinangguni ang isyu na ito sa %[3]s %[1]s` issues.num_participants_one = %d kasali issues.attachment.download = `I-click para i-download ang "%s" ` issues.num_participants_few = %d mga kasali @@ -1815,10 +1815,10 @@ issues.sign_in_require_desc = Mag-sign in upang sumali sa usapa issues.num_comments = %d mga komento issues.role.contributor_helper = Nakaraang nag-commit ang user na ito sa repositoryo na ito. issues.comment_pull_merged_at = isinama ang commit %[1]s sa %[2]s %[3]s -pulls.commit_ref_at = `isinangguni ang hiling sa paghila mula sa isang commit %[2]s` +pulls.commit_ref_at = `isinangguni ang hiling sa paghila mula sa isang commit %s` wiki.last_commit_info = Binago ni %s ang pahinang ito %s issues.content_history.edited = binago -issues.ref_pull_from = `isinangguni ang hiling sa paghila na ito %[4]s %[2]s` +issues.ref_pull_from = `isinangguni ang hiling sa paghila na ito %[3]s %[1]s` pulls.merged_title_desc_few = isinali ang %[1]d mga commit mula sa %[2]s patungong %[3]s %[4]s settings.org_not_allowed_to_be_collaborator = Hindi maaaring idagdag ang mga organisasyon bilang tagatulong. settings.add_collaborator_success = Naidagdag ang tagatulong. @@ -1828,7 +1828,7 @@ pulls.create = Gumawa ng hiling sa paghila issues.dependency.pr_close_blocked = Kailangan mong isara ang lahat ng mga isyu na humaharang sa hiling sa paghila na ito bago mo ito isama. pulls.delete.title = Burahin ang hiling sa paghila na ito? issues.dependency.pr_closing_blockedby = Hinarang ng mga sumusunod na isyu mula sa pagsara ng hiling sa paghila na ito -pulls.closed_at = `isinara ang hiling sa paghila na %[2]s` +pulls.closed_at = `isinara ang hiling sa paghila na ito %s` pulls.close = Isara ang hiling sa paghila pulls.cmd_instruction_hint = Tingnan ang mga panuto para sa command line project = Mga proyekto @@ -1836,8 +1836,8 @@ issues.content_history.deleted = binura pulls.no_results = Walang mga nahanap na resulta. pulls.closed = Sarado ang hiling sa paghila pulls.is_closed = Naisara na ang hiling sa paghila. -issues.ref_closing_from = `nagsangguni ang isyu mula sa hiling sa paghila %[4]s na magsasara sa isyu, %[2]s` -issues.ref_reopening_from = `nagsangguni ang isyu na ito mula sa hiling sa paghila %[4]s na muling bubukas, %[2]s` +issues.ref_closing_from = `nagsangguni ang isyu mula sa hiling sa paghila %[3]s na magsasara sa isyu, %[1]s` +issues.ref_reopening_from = `nagsangguni ang isyu na ito mula sa hiling sa paghila %[3]s na muling bubukas nito, %[1]s` issues.ref_closed_from = `isinara ang isyung ito %[4]s%[2]s` issues.review.wait = hiniling sa pagsuri %s issues.review.reject = hinihiling ang mga pagbago %s @@ -2015,14 +2015,14 @@ wiki.cancel = Kanselahin settings.collaboration.undefined = Hindi Natukoy settings.federation_settings = Mga Setting ng Federation settings = Mga Setting -settings.desc = Ang mga setting ang lugar kung saan maari mong ipamahala ang mga setting para sa repositoryo +settings.desc = Ang mga setting ang lugar kung saan maaari mong ipamahala ang mga setting para sa repositoryo pulls.collapse_files = I-collapse ang lahat ng mga file pulls.add_prefix = Magdagdag ng %s na prefix pulls.still_in_progress = Ginagawa pa? activity.title.prs_1 = %d hiling sa paghila activity.active_issues_count_n = %d mga aktibong isyu pulls.required_status_check_missing = Nawawala ang ilang mga kinakailangang pagsusuri. -pulls.required_status_check_administrator = Bilang tagapangasiwa, maari mo pa ring isama ang hiling sa paghila na ito. +pulls.required_status_check_administrator = Bilang tagapangasiwa, maaari mo pa ring isama ang hiling sa paghila na ito. pulls.blocked_by_approvals = Wala pang sapat na pag-apruba ang hiling sa paghila na ito. %d ng %d na pag-apruba ang ibinigay. settings.options = Repositoryo wiki.back_to_wiki = Bumalik sa pahina ng wiki @@ -2110,7 +2110,7 @@ settings.actions_desc = I-enable ang mga kasamang CI/CD pipeline gamit ang Forge settings.admin_indexer_commit_sha = Huling na-index na commit settings.admin_indexer_unindexed = Hindi naka-index settings.transfer_notices_3 = - Kung pribado ang repositoryo at ilipat sa isang indibidwal na user, ang aksyon na ito ay sinisigurado na ang user ay may pahintulot na basahin (at palitan ang mga pahintulot kung kailangan). -settings.convert_desc = Maari mong i-convert ang repositoryo na ito sa regular na repositoryo. Hindi ito mababawi. +settings.convert_desc = Maaari mong i-convert ang repositoryo na ito sa regular na repositoryo. Hindi ito mababawi. settings.transfer.button = Ilipat ang pagmamay-ari settings.signing_settings = Mga setting sa pagpapatunay ng pag-sign settings.admin_enable_close_issues_via_commit_in_any_branch = Isara ang isyu sa pamamagitan ng commit na ginawa sa hindi default na branch @@ -2137,7 +2137,7 @@ settings.deploy_key_deletion = Tanggalin ang deploy key settings.protect_enable_push = I-enable ang pagtulak settings.discord_icon_url.exceeds_max_length = Kailangang bababa o equal sa 2048 characters ang URL ng icon settings.protected_branch.save_rule = I-save ang rule -settings.mirror_settings.docs.can_still_use = Bagama't na hindi ka makakabago ng mga umiiral na mirror o gumawa ng bago, maari mo pa rin gamitin ang iyong umiiral na mirror. +settings.mirror_settings.docs.can_still_use = Bagama't na hindi ka makakabago ng mga umiiral na mirror o gumawa ng bago, maaari mo pa rin gamitin ang iyong umiiral na mirror. settings.slack_color = Kulay settings.discord_icon_url = URL ng icon settings.convert_fork_confirm = I-convert ang repositoryo @@ -2254,7 +2254,7 @@ settings.pulls.allow_rebase_update = I-enable ang pag-update ng hiling sa paghil settings.admin_enable_health_check = I-enable ang pagsusuri ng kalusugan ng repositoryo (git fsck) settings.new_owner_has_same_repo = Ang bagong may-ari ay may repositoryo na may katulad na pangalan. Mangyaring pumili ng ibang pangalan. settings.convert = I-convert sa regular na repositoryo -settings.convert_fork_desc = Maari mong i-convert ang fork na ito bilang regular na repositoryo. Hindi ito mababawi. +settings.convert_fork_desc = Maaari mong i-convert ang fork na ito bilang regular na repositoryo. Hindi ito mababawi. settings.convert_fork_notices_1 = Ang operasyon na ito ay ico-convert ang fork bilang regular na repositoryo at hindi mababawi. settings.transfer_abort_invalid = Hindi mo makakansela ang isang hindi umiiral na paglipat ng repositoryo. settings.transfer_quota_exceeded = Ang bagong may-ari (%s) ay lumalagpas sa quota. Hindi nailipat ang repositoryo. @@ -2290,8 +2290,8 @@ settings.webhook.headers = Mga header settings.webhook.payload = Nilalaman settings.webhook.body = Katawan settings.webhook.replay.description = I-replay ang webhook na ito. -settings.webhook.delivery.success = May nadagdag na event sa delivery queue. Maari magtagal ng ilang segundo bago makita sa delivery history. -settings.githooks_desc = Pinapagana ng Git ang mga Git hook. Maari mong baguhin ang mga hook file sa ibaba para mag-set up ng mga custom na operasyon. +settings.webhook.delivery.success = May nadagdag na event sa delivery queue. Maaari magtagal ng ilang segundo bago makita sa delivery history. +settings.githooks_desc = Pinapagana ng Git ang mga Git hook. Maaari mong baguhin ang mga hook file sa ibaba para mag-set up ng mga custom na operasyon. settings.githook_name = Pangalan ng hook settings.githook_content = Nilalaman ng hook settings.update_githook = I-update ang hook @@ -2362,7 +2362,7 @@ settings.mirror_settings.docs.pull_mirror_instructions = Para mag-set up ng pull milestones.invalid_due_date_format = Kailangang "yyyy-mm-dd" na format ang takdang petsa. signing.wont_sign.nokey = Walang key ang instansya na ito para i-sign ang commit na ito. activity.title.releases_1 = %d paglabas -settings.mirror_settings.docs.more_information_if_disabled = Maari kang matuto pa tungkol sa mga push at pull na mirror dito: +settings.mirror_settings.docs.more_information_if_disabled = Maaari kang matuto pa tungkol sa mga push at pull na mirror dito: settings.branches.switch_default_branch = Magpalit ng default branch settings.convert_notices_1 = Ang operasyon na ito ay ico-covert ang mirror sa regular na repositoryo at hindi mababawi. settings.convert_fork_succeed = Na-convert na ang fork sa regular na repositoryo. @@ -2732,7 +2732,7 @@ settings.protect_protected_file_patterns = Mga pattern ng nakaprotektang file (h settings.update_protect_branch_success = Binago na ang branch protection rule na "%s". settings.remove_protected_branch_success = Tinanggal ang branch protection rule na "%s". settings.tags.protection.pattern = Pattern ng tag -settings.tags.protection.pattern.description = Maari kang gumamit ng iisang pangalan o glob pattern o regular expression para magtugma ng maraming tag. Magbasa pa sa guide ng mga nakaprotektang tag. +settings.tags.protection.pattern.description = Maaari kang gumamit ng iisang pangalan o glob pattern o regular expression para magtugma ng maraming tag. Magbasa pa sa guide ng mga nakaprotektang tag. settings.thread_id = ID ng thread settings.matrix.room_id = ID ng room diff.has_escaped = May mga nakatagong Unicode character ang linya na ito @@ -2746,7 +2746,7 @@ diff.bin = BIN settings.default_update_style_desc = Ang default na istilio na gagamitin sa pag-update ng mga hiling sa paghila na nalilipas sa base branch. pulls.sign_in_require = Mag-sign in para gumawa ng bagong hiling sa paghila. new_from_template = Gumamit ng template -new_from_template_description = Maari kang pumili ng umiiral na repository template sa instansya na ito at i-apply ang mga setting nito. +new_from_template_description = Maaari kang pumili ng umiiral na repository template sa instansya na ito at i-apply ang mga setting nito. new_advanced = Mga advanced na setting new_advanced_expand = I-click para i-expand auto_init_description = Simulan ang kasaysayan ng Git gamit ang README at opsyonal na magdagdag ng mga lisensya at .gitignore na file. @@ -2780,6 +2780,7 @@ settings.event_action_recover = I-recover settings.event_action_success = Matagumpay settings.event_action_success_desc = Matagumpay na natapos ang Action Run. settings.event_action_recover_desc = Matagumpay na natapos ang Action Run pagkatapos na nabigo ang huling Action Run sa katulad na workflow. +issues.filter_type.all_pull_requests = Lahat ng mga hiling sa paghila [search] commit_kind = Maghanap ng mga commit… @@ -3205,7 +3206,7 @@ self_check.database_collation_mismatch = Inaasahan ang database na gamitin ang c auths.oauth2_admin_group = Group claim value para sa mga tagapangasiwa. (Opsyonal - kinakailangan ang claim name sa itaas) auths.tip.facebook = Magrehistro ng bagong application sa %s at idagdag ang produktong "Facebook Login" users.restricted.description = Payagan lamang ang interaksyon sa mga repositoryo at organisasyon kung saan ang user ay dinagdag bilang tagatulong. Iniiwasan nito ang pag-access sa publikong repositoryo sa instansya na ito. -users.local_import.description = Payagan ang pag-import ng mga repositoryo mula sa local file system ng user. Maari itong maging isyu sa seguridad. +users.local_import.description = Payagan ang pag-import ng mga repositoryo mula sa local file system ng user. Maaari itong maging isyu sa seguridad. emails.delete = Burahin ang Email emails.deletion_success = Binura na ang email address. auths.oauth2_required_claim_value = Kinakailangan na claim value @@ -3450,8 +3451,8 @@ teams.owners_permission_desc = Ang mga owner ay may punong access sa lah teams.add_nonexistent_repo = Hindi pa umiiral ang repositoryo na sinusubukan mong idagdag. Mangyaring gawin iyan muna. teams.all_repositories = Lahat ng mga repositoryo teams.all_repositories_helper = Ang koponan ay may access sa lahat ng mga repositoryo. Ang pagpili nito ay idadagdag ang lahat ng mga umiiral na repositoryo sa koponan. -settings.change_orgname_redirect_prompt.with_cooldown.few = Magiging available ang lumang pangalan ng organisasyon sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw, maari mo pa ring ma-claim muli ang lumang pangalan sa panahon ng cooldown. -settings.change_orgname_redirect_prompt.with_cooldown.one = Magiging available ang lumang pangalan ng organisasyon sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw, maari mo pa ring ma-claim muli ang lumang pangalan ng panahon ng cooldown. +settings.change_orgname_redirect_prompt.with_cooldown.few = Magiging available ang lumang pangalan ng organisasyon sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw. Maaari mo pa ring ma-claim muli ang lumang pangalan sa panahon ng cooldown. +settings.change_orgname_redirect_prompt.with_cooldown.one = Magiging available ang lumang pangalan ng organisasyon sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw. Maaari mo pa ring ma-claim muli ang lumang pangalan ng panahon ng cooldown. [packages] diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 3fcfda18bd..1cb7103bc0 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -1062,8 +1062,8 @@ language.localization_project = Aidez-nous à traduire Forgejo dans votre langue language.description = Cette langue sera enregistrée dans votre compte et utilisée comme langue par défaut après votre connexion. user_block_yourself = Vous ne pouvez pas vous bloquer vous même. pronouns_custom_label = Pronoms personnalisés -change_username_redirect_prompt.with_cooldown.one = L'ancien pseudonyme sera disponible pour n'importe qui après une période d'%[1]d jour, vous pouvez toujours réclamer votre ancien pseudonyme pendant cette période. -change_username_redirect_prompt.with_cooldown.few = L'ancien pseudonyme sera disponible pour n'importe qui après une période de %[1]d jours, vous pouvez toujours réclamer votre ancien pseudonyme pendant cette période. +change_username_redirect_prompt.with_cooldown.one = L'ancien pseudonyme sera disponible pour n'importe qui après une période d'%[1]d jour. Vous pouvez toujours réclamer votre ancien pseudonyme pendant cette période. +change_username_redirect_prompt.with_cooldown.few = L'ancien pseudonyme sera disponible pour n'importe qui après une période de %[1]d jours. Vous pouvez toujours réclamer votre ancien pseudonyme pendant cette période. quota.rule.exceeded = Dépassé regenerate_token = Régénérer access_token_regeneration = Régénérer le token d'accès @@ -1653,13 +1653,13 @@ issues.close_comment_issue=Fermer avec le commentaire issues.reopen_issue=Rouvrir issues.reopen_comment_issue=Réouvrir avec le commentaire issues.create_comment=Commenter -issues.closed_at=`a fermé ce ticket %[2]s.` -issues.reopened_at=`a rouvert ce ticket %[2]s.` -issues.commit_ref_at=`a référencé ce ticket depuis une révision %[2]s.` -issues.ref_issue_from=`a fait référence à %[4]s ce ticket %[2]s.` -issues.ref_pull_from=`a fait référence à cette demande d'ajout %[4]s %[2]s.` -issues.ref_closing_from=`a fait référence à une demande d'ajout %[4]s qui clora ce ticket, %[2]s.` -issues.ref_reopening_from=`a référencé une pull request %[4]s qui va ré-ouvrir ce ticket %[2]s` +issues.closed_at=`a fermé ce ticket %s` +issues.reopened_at=`a rouvert ce ticket %s` +issues.commit_ref_at=`a référencé ce ticket depuis une révision %s` +issues.ref_issue_from=`a fait référence à ce ticket %[3]s %[1]s` +issues.ref_pull_from=`a fait référence à cette demande d'ajout %[3]s %[1]s` +issues.ref_closing_from=`a fait référence à une demande d'ajout %[3]s qui clora ce ticket, %[1]s` +issues.ref_reopening_from=`a référencé ce ticket dans une pull request %[3]s qui va ré-ouvrir ce ticket, %[1]s` issues.ref_closed_from=`a fermé ce ticket %[4]s %[2]s` issues.ref_reopened_from=`a rouvert ce ticket %[4]s %[2]s.` issues.ref_from=`de %[1]s` @@ -1967,8 +1967,8 @@ pulls.update_branch_success=La mise à jour de la branche a réussi pulls.update_not_allowed=Vous n'êtes pas autorisé à mettre à jour la branche pulls.outdated_with_base_branch=Cette branche est désynchronisée avec la branche de base pulls.close=Fermer la demande d’ajout -pulls.closed_at=`a fermé cette demande d'ajout %[2]s.` -pulls.reopened_at=`a rouvert cette demande d'ajout %[2]s.` +pulls.closed_at=`a fermé cette demande d'ajout %s` +pulls.reopened_at=`a rouvert cette demande d'ajout %s` pulls.cmd_instruction_hint=Voir les instructions en ligne de commande pulls.cmd_instruction_checkout_title=Basculer pulls.cmd_instruction_checkout_desc=Depuis votre dépôt, basculer sur une nouvelle branche et tester des modifications. @@ -2762,7 +2762,7 @@ issues.blocked_by_user = Vous ne pouvez pas créer de tickets sur ce dépôt car pulls.blocked_by_user = Vous ne pouvez pas créer une pull request sur ce dépôt car vous êtes bloqué par son propriétaire. wiki.cancel = Annuler settings.wiki_globally_editable = Permettre l'édition du wiki a tout le monde -pulls.commit_ref_at = `a référencé cette pull request depuis le commit %[2]s` +pulls.commit_ref_at = `a référencé cette pull request depuis un commit %s` settings.new_owner_blocked_doer = Le nouveau propriétaire vous a bloqué. settings.enter_repo_name = Confirmez en entrant le propriétaire et le nom du dépôt exactement comme affiché : settings.wiki_rename_branch_main = Normalise le nom de la branche du Wiki @@ -3058,8 +3058,8 @@ teams.invite.by=Invité par %s teams.invite.description=Veuillez cliquer sur le bouton ci-dessous pour rejoindre l’équipe. follow_blocked_user = Vous ne pouvez pas suivre cette organisation car elle vous a bloqué. open_dashboard = Ouvrir le tableau de bord -settings.change_orgname_redirect_prompt.with_cooldown.few = L'ancien nom d'organisation sera disponible pour n'importe qui après une période de %[1]d jours, vous pouvez toujours réclamer votre ancien nom d'organisation pendant cette période. -settings.change_orgname_redirect_prompt.with_cooldown.one = L'ancien nom d'organisation sera disponible pour n'importe qui après une période d'%[1]d jour, vous pouvez toujours réclamer votre ancien nom d'organisation pendant cette période. +settings.change_orgname_redirect_prompt.with_cooldown.few = L'ancien nom d'organisation sera disponible pour n'importe qui après une période de %[1]d jours. Vous pouvez toujours réclamer votre ancien nom d'organisation pendant cette période. +settings.change_orgname_redirect_prompt.with_cooldown.one = L'ancien nom d'organisation sera disponible pour n'importe qui après une période d'%[1]d jour. Vous pouvez toujours réclamer votre ancien nom d'organisation pendant cette période. [admin] dashboard=Tableau de bord diff --git a/options/locale/locale_ga-IE.ini b/options/locale/locale_ga-IE.ini index d2d960b627..3bb06e8c21 100644 --- a/options/locale/locale_ga-IE.ini +++ b/options/locale/locale_ga-IE.ini @@ -1219,11 +1219,11 @@ issues.close_comment_issue = Dún le trácht issues.reopen_issue = Athoscail issues.reopen_comment_issue = Athoscail le trácht issues.create_comment = Trácht -issues.closed_at = `dhún an cheist seo %[2]s` -issues.reopened_at = `athoscail an t-eagrán seo %[2]s` -issues.commit_ref_at = `rinne tagairt don cheist seo ó ghealltanas %[2]s` -issues.ref_issue_from = `rinne dagairt don cheist seo %[4]s %[2]s` -issues.ref_pull_from = `rinne dagairt don iarratas tarraingthe seo %[4]s %[ 2]s` +issues.closed_at = `dhún an cheist seo %s` +issues.reopened_at = `athoscail an t-eagrán seo %s` +issues.commit_ref_at = `rinne tagairt don cheist seo ó ghealltanas %s` +issues.ref_issue_from = `rinne dagairt don cheist seo %[3]s %[1]s` +issues.ref_pull_from = `rinne dagairt don iarratas tarraingthe seo %[3]s %[1]s` issues.ref_closed_from = `dhún an cheist seo %[4]s %[2]s` issues.ref_reopened_from = `d'athoscail an eagrán seo %[4]s %[2]s` issues.ref_from = `ó %[1]s` @@ -1456,8 +1456,8 @@ pulls.update_branch_success = Bhí nuashonrú brainse rathúil pulls.update_not_allowed = Ní cheadaítear duit brainse a nuashonrú pulls.outdated_with_base_branch = Tá an brainse seo as dáta leis an mbunbhrainse pulls.close = Dún Iarratas Tarraing -pulls.closed_at = `dhún an t-iarratas tarraingthe seo %[2]s` -pulls.reopened_at = `athoscail an t-iarratas tarraingthe seo %[2]s` +pulls.closed_at = `dhún an t-iarratas tarraingthe seo %s` +pulls.reopened_at = `athoscail an t-iarratas tarraingthe seo %s` pulls.cmd_instruction_checkout_title = Seiceáil pulls.cmd_instruction_checkout_desc = Ó stór tionscadail, seiceáil brainse nua agus déan tástáil ar na hathruithe. pulls.cmd_instruction_merge_title = Cumaisc diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini index 411bad835a..3e93ee8ba9 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -932,7 +932,7 @@ issues.close_comment_issue=Hozzászólás és lezárás issues.reopen_issue=Újranyitás issues.reopen_comment_issue=Hozzászólás és újranyitás issues.create_comment=Hozzászólás -issues.commit_ref_at=`hivatkozott erre a hibajegyre egy commit-ból %[2]s` +issues.commit_ref_at=`hivatkozott erre a hibajegyre egy commit-ból %s` issues.role.owner=Tulajdonos issues.role.member=Tag issues.re_request_review=Véleményezés újrakérése diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini index 673d1464b1..f1a392105e 100644 --- a/options/locale/locale_id-ID.ini +++ b/options/locale/locale_id-ID.ini @@ -796,7 +796,7 @@ issues.close_comment_issue=Komentar dan Tutup issues.reopen_issue=Buka kembali issues.reopen_comment_issue=Komentar dan Buka Kembali issues.create_comment=Komentar -issues.commit_ref_at=`merujuk masalah dari komit %[2]s` +issues.commit_ref_at=`merujuk masalah dari komit %s` issues.role.owner=Pemilik issues.role.member=Anggota issues.sign_in_require_desc=Masuk untuk bergabung dengan percakapan ini. diff --git a/options/locale/locale_is-IS.ini b/options/locale/locale_is-IS.ini index 9b1d56fed9..baf8286923 100644 --- a/options/locale/locale_is-IS.ini +++ b/options/locale/locale_is-IS.ini @@ -805,8 +805,8 @@ issues.close_comment_issue=Senda ummæli og Loka issues.reopen_issue=Enduropna issues.reopen_comment_issue=Senda ummæli og Enduropna issues.create_comment=Senda Ummæli -issues.closed_at=`lokaði þessu vandamáli %[2]s` -issues.reopened_at=`enduropnaði þetta vandamál %[2]s` +issues.closed_at=`lokaði þessu vandamáli %s` +issues.reopened_at=`enduropnaði þetta vandamál %s` issues.ref_reopened_from=`enduropnaði þetta vandamál %[4]s %[2]s` issues.author=Höfundur issues.role.owner=Eigandi diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index 48995e951f..d46f709cde 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -54,7 +54,7 @@ mirror=Mirror new_repo=Nuovo repository new_migrate=Nuova migrazione new_mirror=Nuovo mirror -new_fork=Nuova derivazione +new_fork=Nuova biforcazione new_org=Nuova organizzazione new_project=Nuovo progetto manage_org=Gestisci le organizzazioni @@ -143,12 +143,12 @@ confirm_delete_selected = Confermare l'eliminazione di tutti gli elementi selezi sign_in_with_provider = Accedi con %s new_project_column = Nuova colonna toggle_menu = Mostra/Nascondi menu -filter.not_fork = Non fork +filter.not_fork = Non biforcazioni filter = Filtro filter.clear = Rimuovi filtri filter.is_archived = Archiviato filter.not_archived = Non archiviato -filter.is_fork = Da fork +filter.is_fork = Biforcazioni filter.is_mirror = Mirror filter.not_mirror = Non mirror filter.is_template = Modelli @@ -209,6 +209,7 @@ table_modal.label.columns = Colonne link_modal.header = Aggiungi collegamento link_modal.url = Url link_modal.description = Descrizione +link_modal.paste_reminder = Suggerimento: se hai già copiato un URL negli appunti, puoi incollarlo direttamente nell’editor per creare un collegamento. [filter] string.asc = A - Z @@ -232,6 +233,7 @@ lightweight_desc=Forgejo ha requisiti minimi bassi e può funzionare su un econo license=Open Source license_desc=Ottieni Forgejo! Partecipa per contribuire a rendere questo progetto ancora più bello. Non aver paura di diventare collaborante! install_desc = Semplicemente avvia l'eseguibile per la tua piattaforma, distribuiscilo con Docker, oppure scarica il pacchetto. +platform_desc = È stato verificato che Forgejo è pienamente compatibile con sistemi operativi liberi, come Linux e FreeBSD, nonché con diverse architetture CPU. Scegli liberamente la piattaforma che preferisci! [install] install=Installazione @@ -396,12 +398,12 @@ go_to = Vai a search.type.tooltip = Tipo di ricerca search.fuzzy.tooltip = Includi anche i risultati che corrispondono parzialmente ai termini di ricerca code_search_results = Risultati di ricerca per "%s" -relevant_repositories_tooltip = I repositori derivati o che non hanno argomento, icona, né descrizione sono nascosti. +relevant_repositories_tooltip = I repositori che sono biforcazioni o che non hanno argomento, icona, né descrizione sono nascosti. relevant_repositories = Sono visibili solo i repositori pertinenti, mostra risultati non filtrati. search.match.tooltip = Includi solo risultati che combaciano perfettamente con i termini di ricerca stars_few = %d stelle -forks_one = %d fork -forks_few = %d fork +forks_one = %d biforcazioni +forks_few = %d biforcazioni stars_one = %d stella [auth] @@ -485,6 +487,8 @@ sign_in_openid = Procedi con OpenID hint_login = Hai già un'utenza? Accedi! hint_register = Non hai un'utenza? Registrati ora. sign_up_button = Registrati ora. +unauthorized_credentials = Le credenziali non sono corrette o sono scadute. Controlla il comando o vedi %s per maggiori informazioni +use_onetime_code = Usa un codice monouso [mail] view_it_on=Visualizza su %s @@ -680,6 +684,8 @@ Location = Posizione AccessToken = Token di accesso FullName = Nome e cognome To = Nome del ramo +email_domain_is_not_allowed = Il dominio dell'indirizzo email dell'utente %s è in conflitto con EMAIL_DOMAIN_ALLOWLIST o EMAIL_DOMAIN_BLOCKLIST. Assicurati di aver inserito correttamente l'indirizzo email. +username_claiming_cooldown = Il nome utente non può essere assegnato, poiché il periodo di attesa non è ancora terminato. Sarà disponibile il %[1]s. [user] @@ -723,6 +729,7 @@ followers.title.one = Seguace followers.title.few = Seguaci following.title.one = Seguito following.title.few = Osservato +public_activity.visibility_hint.self_private_profile = Poiché il tuo profilo è privato, la tua attività è visibile solo a te e agli amministratori dell'istanza. Configura. [settings] @@ -1045,7 +1052,7 @@ added_on = Aggiunto su %s additional_repo_units_hint = Suggerisci l'attivazione di unità aggiuntive nel repositorio update_hints = Aggiorna suggerimenti update_hints_success = I suggerimenti sono stati aggiornati. -additional_repo_units_hint_description = Mostra un pulsante "Aggiungi più sezioni..." per i repositori che non hanno tutte le sezioni disponibili aggiunte. +additional_repo_units_hint_description = Visualizza un suggerimento “Abilita altro” per i repositori che non hanno tutte le unità disponibili abilitate. hints = Suggerimenti pronouns = Pronomi pronouns_custom = Personalizzato @@ -1053,6 +1060,34 @@ pronouns_unspecified = Non specificato language.title = Lingua predefinita language.description = Questa lingua verrà salvata nella tua utenza e verrà usata come predefinita ogni volta che farai l'accesso. language.localization_project = Aiutaci a tradurre Forgejo nella tua lingua! Più informazioni. +quota.sizes.assets.attachments.all = Allegati +quota.rule.no_limit = Illimitato +quota.sizes.assets.attachments.releases = Allegati del rilascio +quota.rule.exceeded = Superato +regenerate_token = Rigenera +access_token_regeneration = Rigenera il token d'accesso +access_token_regeneration_desc = Rigenerare un token comporterà la revoca dell'accesso al tuo account per tutte le applicazioni che lo utilizzano. Questa operazione è irreversibile. Vuoi procedere? +regenerate_token_success = Il token è stato rigenerato. Le applicazioni che lo utilizzano non hanno più accesso alla tua utenza e devono essere aggiornate con il nuovo token. +user_block_yourself = Non puoi bloccare te stesso. +quota.applies_to_user = Le seguenti regole di quota si applicano al tuo account +quota.applies_to_org = Le seguenti regole di quota si applicano a questa organizzazione +quota.rule.exceeded.helper = La dimensione totale degli oggetti per questa regola ha superato la quota. +quota.sizes.all = Tutti +quota.sizes.repos.all = Repositori +quota.sizes.repos.public = Repositori pubblici +quota.sizes.repos.private = Repositori privati +quota.sizes.git.all = Contenuto git +quota.sizes.git.lfs = Git LFS +quota.sizes.assets.all = Risorse +quota.sizes.assets.attachments.issues = Allegati della segnalazione +quota.sizes.assets.artifacts = Artefatti +quota.sizes.assets.packages.all = Pacchetti +quota.sizes.wiki = Wiki +keep_pronouns_private = Mostra i pronomi solo agli utenti che hanno effettuato il login +keep_pronouns_private.description = Questa impostazione nasconderà i tuoi pronomi agli utenti non ancora autenticati. +storage_overview = Panoramica spazio di archiviazione +quota = Quota +change_username_redirect_prompt.with_cooldown.one = Il vecchio nome utente sarà disponibile per tutti dopo un periodo di protezione di %\[1]d giorni. Durante questo periodo di attesa potrai comunque tornare al vecchio nome utente. [repo] owner=Proprietario @@ -1067,10 +1102,10 @@ template_description=I modelli di repositori consentono allɜ utenti di generare visibility=Visibilità visibility_description=Solo il proprietario o i membri dell'organizzazione se hanno diritti, saranno in grado di vederlo. visibility_helper_forced=L'amministratorə del sito impone che i nuovi repositori siano privati. -visibility_fork_helper=(Questa modifica influenzerà la visibilità di tutti i fork.) +visibility_fork_helper=(Questa modifica influenzerà la visibilità di tutte le biforcazioni.) clone_helper=Hai bisogno di aiuto per la clonazione? Visita Help. fork_repo=Deriva repositorio -fork_from=Deriva da +fork_from=Biforcazione di already_forked=Hai già fatto il fork di %s fork_to_different_account=Fai Fork a un account diverso fork_visibility_helper=La visibilità di un repositorio derivato non può essere modificata. @@ -1514,13 +1549,13 @@ issues.close_comment_issue=Commenta e chiudi issues.reopen_issue=Riapri issues.reopen_comment_issue=Commenta e riapri issues.create_comment=Commento -issues.closed_at=`ha chiuso questa segnalazione %[2]s` -issues.reopened_at=`ha riaperto questa segnalazione %[2]s` -issues.commit_ref_at=`ha fatto riferimento a questa segnalazione dal commit %[2]s` -issues.ref_issue_from=`ha fatto riferimento a questa segnalazione %[4]s %[2]s` -issues.ref_pull_from=`ha fatto riferimento a questa richiesta di modifica %[4]s %[2]s` -issues.ref_closing_from=`ha fatto riferimento a questa segnalazione da una richiesta di modifica %[4]s che la chiuderà, %[2]s` -issues.ref_reopening_from=`ha fatto riferimento a questa segnalazione da una richiesta di modifica %[4]s che la riaprirà, %[2]s` +issues.closed_at=`ha chiuso questa segnalazione %s` +issues.reopened_at=`ha riaperto questa segnalazione %s` +issues.commit_ref_at=`ha fatto riferimento a questa segnalazione dal commit %s` +issues.ref_issue_from=`ha fatto riferimento a questa segnalazione %[3]s %[1]s` +issues.ref_pull_from=`ha fatto riferimento a questa richiesta di modifica %[3]s %[1]s` +issues.ref_closing_from=`ha fatto riferimento a questa segnalazione da una richiesta di modifica %[3]s che la chiuderà, %[1]s` +issues.ref_reopening_from=`ha fatto riferimento a questa segnalazione da una richiesta di modifica %[3]s che la riaprirà, %[1]s` issues.ref_closed_from=`chiuso questa segnalazione %[4]s %[2]s` issues.ref_reopened_from=`ha riaperto questa segnalazione %[4]s %[2]s` issues.ref_from=`da %[1]s` @@ -1718,7 +1753,7 @@ pulls.cannot_merge_work_in_progress=Questa richiesta di modifica è contrassegna pulls.still_in_progress=Ancora in corso? pulls.add_prefix=Aggiungi prefisso %s pulls.remove_prefix=Rimuovi il prefisso %s -pulls.data_broken=Questa richiesta di modifica è rovinata a causa di informazioni mancanti riguardo la derivazione. +pulls.data_broken=Questa richiesta di modifica non è valida a causa di informazioni mancanti sulla biforcazione. pulls.files_conflicted=Questa richiesta di modifica va in conflitto con il ramo di destinazione. pulls.is_checking=Verifica dei conflitti di fusione in corso. Riprova tra qualche istante. pulls.is_ancestor=Questo ramo è già incluso nel ramo di destinazione. Non c'è nulla da fondere. @@ -1776,8 +1811,8 @@ pulls.update_branch_rebase=Aggiorna il ramo per cambio base pulls.update_branch_success=Ramo aggiornato con successo pulls.update_not_allowed=Non ti è permesso aggiornare il ramo pulls.outdated_with_base_branch=Questo ramo non è aggiornato con il ramo di base -pulls.closed_at=`ha chiuso questa richiesta di modifica %[2]s` -pulls.reopened_at=`ha riaperto questa richiesta di modifica %[2]s` +pulls.closed_at=`ha chiuso questa richiesta di modifica %s` +pulls.reopened_at=`ha riaperto questa richiesta di modifica %s` pulls.auto_merge_button_when_succeed=(Quando i controlli sono superati) pulls.auto_merge_when_succeed=Unione automatica quando tutti i controlli sono superati @@ -2100,7 +2135,7 @@ settings.event_create_desc=Ramo o etichetta creati. settings.event_delete=Elimina settings.event_delete_desc=Ramo o etichetta eliminati. settings.event_fork=Deriva -settings.event_fork_desc=Repository derivato. +settings.event_fork_desc=Creata una biforcazione del repositorio. settings.event_wiki=Wiki settings.event_release=Release settings.event_release_desc=Release pubblicata, aggiornata o rimossa in una repository. @@ -2137,7 +2172,7 @@ settings.event_pull_request_sync_desc=Pull request sincronizzata. settings.event_package=Pacchetto settings.event_package_desc=Pacchetto creato o eliminato in un repository. settings.branch_filter=Filtro rami -settings.branch_filter_desc=Whitelist dei rami per gli eventi di spinta, creazione dei rami e cancellazione dei rami, specificati come modello globo. Se vuoto o *, gli eventi per tutti i rami sono segnalati. Vedi la documentazione %[2]s per la sintassi. Esempi: master, {master,release*}. +settings.branch_filter_desc=Filtro, scritto come pattern glob, da applicare ai rami per gli eventi di tipo immissione, creazione di rami e rimozione di rami. Se vuoto o *, vengono considerati tutti gli eventi di tutti i rami. Maggiori dettagli sulla sintassi presso %[2]s. Esempi: master, {master,release*}. settings.active=Attivo settings.active_helper=Le informazioni sugli eventi innescati saranno inviate a questo URL del webhook. settings.add_hook_success=Il webhook è stato aggiunto. @@ -2167,8 +2202,8 @@ settings.web_hook_name_packagist=Packagist settings.packagist_username=Nome utente Packagist settings.packagist_api_token=API token settings.packagist_package_url=Url pacchetto pacchetti -settings.deploy_keys=Dispiega chiavi -settings.add_deploy_key=Aggiungi chiave di dispiego +settings.deploy_keys=Chiavi di distribuzione +settings.add_deploy_key=Aggiungi chiave di distribuzione settings.deploy_key_desc=Le deploy key possiedono l'accesso solamente alla lettura di un repository. settings.is_writable=Abilita accesso scrittura settings.is_writable_info=Permetti a questa deploy key di pushare nella repository. @@ -2177,7 +2212,7 @@ settings.title=Titolo settings.deploy_key_content=Contenuto settings.key_been_used=Una deploy key con contenuto identico è già in uso. settings.key_name_used=Esiste già una deploy key con questo nome. -settings.deploy_key_deletion=Rimuovi chiave di dispiego +settings.deploy_key_deletion=Rimuovi chiave di distribuzione settings.deploy_key_deletion_desc=Rimuovere una chiave di distribuzione ne revocherà l'accesso a questo repository. Continuare? settings.deploy_key_deletion_success=La chiave di distribuzione è stata rimossa. settings.branches=Rami @@ -2620,7 +2655,7 @@ issues.filter_type.reviewed_by_you = Revisionati da te projects.edit_success = Il progetto "%s" è stato aggiornato. issues.keyword_search_unavailable = La ricerca per parola chiave non è attualmente disponibile. Contatta l'amministratore del sito. issues.role.collaborator_helper = Quest*utente è statə invitatə a collaborare al progetto. -pulls.commit_ref_at = `ha fatto riferimento a questa richiesta di modifica da un commit %[2]s` +pulls.commit_ref_at = `ha fatto riferimento a questa richiesta di modifica da un commit %s` settings.thread_id = ID della discussione release.title = Titolo del rilascio visibility_helper = Rendi il repositorio privato @@ -2660,7 +2695,7 @@ wiki.page_title = Titolo della pagina wiki.page_content = Contenuto della pagina settings.mirror_settings.pushed_repository = Repositorio immesso settings.mirror_settings.push_mirror.edit_sync_time = Modifica intervallo di sincronizzazione degli specchi -settings.units.units = Unità della repository +settings.units.units = Sezioni del repositorio settings.units.add_more = Aggiungi ancora... settings.wiki_globally_editable = Consenti a tutti di modificare la wiki settings.pull_mirror_sync_in_progress = Prelevando cambiamenti dal progetto remoto %s. @@ -2732,7 +2767,7 @@ pulls.merged_title_desc_one = ha fuso %[1]d commit da %[2]s in Accedi per creare una richiesta di modifica. +settings.mirror_settings.push_mirror.none_ssh = Nessuno +sync_fork.branch_behind_one = Questo ramo è indietro di %[1]d commit rispetto a %[2]s +sync_fork.branch_behind_few = Questo ramo è indietro di %[1]d commit rispetto a %[2]s +no_eol.text = Nessun fine linea +no_eol.tooltip = Questo file non contiene un carattere di fine linea finale. +milestones.filter_sort.name = Nome +settings.protect_new_rule = Crea una nuova regola di protezione dei rami +editor.commit_email = E-mail di commit +mirror_public_key = Chiave SSH pubblica +mirror_denied_combination = Non è possibile utilizzare contemporaneamente l'autenticazione tramite chiave pubblica e password. +release.type_attachment = Allegato +release.invalid_external_url = URL esterno invalido: "%s" +new_from_template = Utilizza un modello +new_from_template_description = Puoi selezionare un modello di repositorio esistente su questa istanza e applicare le sue impostazioni. +new_advanced = Impostazioni avanzate +new_advanced_expand = Clicca per espandere +summary_card_alt = Scheda riepilogativa del repository %s +issues.filter_sort.relevance = Rilevanza +issues.num_reviews_one = %d revisioni +issues.num_reviews_few = %d revisioni +issues.reaction.add = Aggiungi reazione +issues.reaction.alt_many = %[1] e altri %[2]d hanno reagito %[3]s. +issues.reaction.alt_remove = Rimuovi la reazione %[1]s dal commento. +issues.reaction.alt_add = Aggiungi la reazione %[1]s al commento. +issues.review.remove_review_requests = rimosso richieste di revisione per %\[1]s %\[2]s +comment.blocked_by_user = Non è possibile commentare perché sei stato bloccato dal proprietario del repositorio o dall'autore. +issues.summary_card_alt = Scheda riepilogativa di una segnalazione intitolata "%s" nel repositorio %s +pulls.delete_after_merge.head_branch.is_default = Il ramo head che desideri eliminare è il ramo predefinito e non può essere eliminato. +settings.event_action_success = Successo +settings.event_action_success_desc = L'esecuzione dell'azione è andata a buon fine. +diff.git-notes.remove-header = Rimuovi nota +diff.git-notes.remove-body = Questa nota verrà rimossa. +activity.commit = Attività di commit [graphs] contributors.what = contribuzioni @@ -2839,7 +2947,7 @@ team_name_helper=I nomi dei team devono essere brevi e semplici da ricordare. team_desc_helper=Descrivi lo scopo o il ruolo del team. team_access_desc=Accesso al repository team_permission_desc=Autorizzazione -team_unit_desc=Consenti l'accesso a sezioni di progetto +team_unit_desc=Consenti l'accesso alle sezioni del repositorio team_unit_disabled=(Disabilitato) form.create_org_not_allowed=Non disponi dell'autorizzazione per creare un organizzazione. @@ -3493,6 +3601,12 @@ config.cache_test_slow = Successo nel controllo della cache, ma la risposta è l config.app_slogan = Slogan dell'istanza auths.default_domain_name = Nome di dominio predefinito utilizzato per l'indirizzo e-mail users.restricted.description = Permetti di interagire solo con i repositori e le organizzazioni in cui l'utente è aggiuntə come collaborante. Ciò evita l'accesso ai repositori pubblici di quest'istanza. +emails.deletion_success = L'indirizzo e-mail è stato eliminato. +monitor.duration = Durata (s) +emails.delete_desc = Confermare l’eliminazione di questo indirizzo email? +emails.delete_primary_email_error = Non puoi eliminare la e-mail primaria. +emails.delete = Elimina e-mail +users.organization_creation.description = Abilita la creazione di nuove organizzazioni. [action] @@ -3737,6 +3851,31 @@ owner.settings.cargo.initialize.success = L'indice di Cargo è stato creato corr 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 +arch.version.groups = Gruppo +arch.version.conflicts = Va in conflitto con +arch.version.depends = Dipende da +arch.version.makedepends = Dipendenze di build +arch.version.checkdepends = Dipendenze di controllo +arch.version.replaces = Sostituisce +arch.version.optdepends = Dipende opzionalmente da +arch.version.backup = Backup +search_in_external_registry = Cerca in %s +arch.version.provides = Fornisce +arch.pacman.conf = Aggiungi il server con la relativa distribuzione e architettura a /etc/pacman.conf: +alt.setup = Aggiungi il repositorio alla lista dei repositori in rete (seleziona l'architettura necessaria al posto di "_arch_"): +container.images.title = Immagini +arch.version.properties = Proprietà della versione +alt.registry.install = Per installare il pacchetto, esegui il comando seguente: +alt.install = Installa pacchetto +alt.registry = Configura questo registro dalla riga di comando: +arch.pacman.helper.gpg = Aggiungi il certificato a pacman: +arch.pacman.repo.multi = %s ha la stessa versione in diverse distribuzioni. +arch.pacman.repo.multi.item = Configurazione per %s +arch.pacman.sync = Sincronizza il paccketto con pacman: +arch.version.description = Descrizione +alt.repository = Informazioni del repositorio +alt.repository.architectures = Architetture +alt.repository.multiple_groups = Questo pacchetto è disponibile per più gruppi. [secrets] secrets = Segreti @@ -3834,7 +3973,7 @@ runs.empty_commit_message = (messaggio di commit vuoto) runs.no_runs = Il flusso di lavoro non è stato ancora eseguito. variables.creation.success = La variabile "%s" è stata aggiunta. variables.description = Le variabili saranno passate a determinate azioni e non possono essere lette altrimenti. -need_approval_desc = È necessaria l'approvazione per eseguire flussi di lavoro per richieste di modifica da derivazioni. +need_approval_desc = È necessaria l'approvazione per eseguire flussi di lavoro per richieste di modifica da biforcazioni. runs.no_workflows.documentation = Per ulteriori informazioni sulle Forgejo Actions vedi la documentazione. runs.no_workflows.quick_start = Non sai come iniziare con le Forgejo Actions? Vedi la guida rapida. runners.delete_runner_notice = Se un'attività è in esecuzione su questo esecutore sarà terminata ed etichettata fallito. Potrebbe rompere flussi di lavoro di costruzione. @@ -3848,6 +3987,8 @@ workflow.dispatch.invalid_input_type = Tipo ingresso "%s" non valido. workflow.dispatch.warn_input_limit = Visualizzati solo i primi %d ingressi. runs.no_job = Il flusso di lavoro deve contenere almeno un incarico workflow.dispatch.use_from = Usa flusso di lavoro da +variables.not_found = Non è stato possibile trovare la variabile. +runs.expire_log_message = I log sono stati eliminati in quanto troppo vecchi. @@ -3856,6 +3997,7 @@ workflow.dispatch.use_from = Usa flusso di lavoro da type-3.display_name = Progetto dell'organizzazione type-1.display_name = Progetto individuale type-2.display_name = Progetto +deleted.display_name = Progetto eliminato [git.filemode] symbolic_link=Link Simbolico @@ -3896,6 +4038,7 @@ milestone_kind = Ricerca tappe... regexp_tooltip = Interpreta i termini di ricerca come un'espressione regolare regexp = Espressione Regolare union_tooltip = Include i risultati che combaciano con una qualsiasi delle parole chiave separata da spazi +union = Parole chiavi [munits.data] gib = GiB @@ -3914,4 +4057,16 @@ filepreview.line = Linea %[1]d in %[2]s [repo.permissions] issues.write = Scrittura: Chiudere segnalazioni e gestire metadati come etichette, traguardi, assegnatarɜ, scadenze e dipendenze. -pulls.write = Scrittura: Chiudere richieste di modifica e gestire metadati come etichette, traguardi, assegnatarɜ, scadenze e dipendenze. \ No newline at end of file +pulls.write = Scrittura: Chiudere richieste di modifica e gestire metadati come etichette, traguardi, assegnatarɜ, scadenze e dipendenze. +releases.write = Scrittura: Può pubblicare, modificare ed eliminare rilasci e le risorse ad essi allegate. +code.write = Scrittura: Può aggiungere commit al repositorio, creare rami ed etichette. +wiki.read = Lettura: Può leggere la wiki integrata e la sua cronologia. +releases.read = Lettura: Può visualizzare e scaricare i rilasci. +projects.read = Lettura: Può accedere alle board di progetto del repositorio. +code.read = Lettura: Può accedere e clonare il codice del repositorio. +wiki.write = Scrittura: Può creare, aggiornare ed eliminare pagine nella wiki integrata. +issues.read = Lettura: Può leggere e creare segnalazioni e commenti. +pulls.read = Lettura: Può leggere e creare richieste di modifica. + +[translation_meta] +test = daje Roma \ No newline at end of file diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index d4d7024f5d..555f5c6a75 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -1610,13 +1610,13 @@ issues.close_comment_issue=コメントしてクローズ issues.reopen_issue=再オープンする issues.reopen_comment_issue=コメントして再オープン issues.create_comment=コメントする -issues.closed_at=`がイシューをクローズ %[2]s` -issues.reopened_at=`がイシューを再オープン %[2]s` -issues.commit_ref_at=`がコミットでこのイシューを参照 %[2]s` -issues.ref_issue_from=`が%[4]s、このイシューを参照 %[2]s` -issues.ref_pull_from=`が%[4]s、このプルリクエストを参照 %[2]s` -issues.ref_closing_from=`が%[4]s、プルリクエストがこのイシューをクローズするよう参照 %[2]s` -issues.ref_reopening_from=`が%[4]s、プルリクエストがこのイシューを再オープンするよう参照 %[2]s` +issues.closed_at=`がイシューをクローズ %s` +issues.reopened_at=`がイシューを再オープン %s` +issues.commit_ref_at=`がコミットでこのイシューを参照 %s` +issues.ref_issue_from=`が%[3]s、このイシューを参照 %[1]s` +issues.ref_pull_from=`が%[3]s、このプルリクエストを参照 %[1]s` +issues.ref_closing_from=`が%[3]s、プルリクエストがこのイシューをクローズするよう参照 %[1]s` +issues.ref_reopening_from=`が%[3]s、プルリクエストがこのイシューを再オープンするよう参照 %[1]s` issues.ref_closed_from=`が%[4]s、このイシューをクローズ %[2]s` issues.ref_reopened_from=`が%[4]s、このイシューを再オープン %[2]s` issues.ref_from=` %[1]s にて` @@ -1923,8 +1923,8 @@ pulls.update_branch_success=ブランチの更新が成功しました pulls.update_not_allowed=ブランチを更新する権限がありません pulls.outdated_with_base_branch=このブランチはベースブランチに対して最新ではありません pulls.close=プルリクエストをクローズ -pulls.closed_at=`がプルリクエストをクローズ %[2]s` -pulls.reopened_at=`がプルリクエストを再オープン %[2]s` +pulls.closed_at=`がプルリクエストをクローズ %s` +pulls.reopened_at=`がプルリクエストを再オープン %s` pulls.cmd_instruction_hint=コマンドラインの手順を表示 pulls.cmd_instruction_checkout_title=チェックアウト pulls.cmd_instruction_checkout_desc=プロジェクトリポジトリから新しいブランチをチェックアウトし、変更内容をテストします。 @@ -2721,7 +2721,7 @@ settings.wiki_rename_branch_main = wikiのブランチ名を正規化する settings.wiki_rename_branch_main_desc = wikiによって内部的に使われているブランチ名を "%s" に変更します。これは恒久的で元に戻すことはできません。 contributors.contribution_type.additions = 追加 vendored = vendor済み -pulls.commit_ref_at = `このプルリクエストを言及するコミット %[2]s` +pulls.commit_ref_at = `このプルリクエストを言及するコミット %s` pulls.fast_forward_only_merge_pull_request = Fast-forwardのみ admin.manage_flags = フラグ管理 admin.update_flags = フラグを更新 diff --git a/options/locale/locale_jbo.ini b/options/locale/locale_jbo.ini index 6124dc4d22..947bb298de 100644 --- a/options/locale/locale_jbo.ini +++ b/options/locale/locale_jbo.ini @@ -2,4 +2,12 @@ [common] -home = zdani \ No newline at end of file +home = zdani +dashboard = jitypalna +explore = sisku +help = se sidju +logo = se'isni +sign_in = co'a nerkla +sign_in_with_provider = co'a nerka sepi'o la .%s. +sign_out = co'a cliva +sign_up = co'a gumri \ No newline at end of file diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini index 433ec01828..be0400bea4 100644 --- a/options/locale/locale_ko-KR.ini +++ b/options/locale/locale_ko-KR.ini @@ -943,7 +943,7 @@ issues.close_comment_issue=클로즈 및 코멘트 issues.reopen_issue=다시 열기 issues.reopen_comment_issue=다시 오픈 및 코멘트 issues.create_comment=코멘트 -issues.commit_ref_at=` 커밋 %[2]s에서 이 이슈 언급` +issues.commit_ref_at=` 커밋 %s에서 이 이슈 언급` issues.role.owner=소유자 issues.role.member=멤버 issues.sign_in_require_desc=로그인하여 이 대화에 참여하세요. @@ -1378,7 +1378,7 @@ issues.closed_by_fake = %[2]s님이 %[1]s에 닫음 issues.new.closed_projects = 닫힌 프로젝트 pulls.merged_by_fake = %[2]s님이 %[1]s 병합함 issues.closed_by = %[3]s님이 %[1]s에 닫음 -issues.closed_at = `%[2]s`에 이 이슈를 닫음 +issues.closed_at = `%s`에 이 이슈를 닫음 issues.filter_milestone_closed = 닫힌 마일스톤 issues.opened_by_fake = %[2]s님이 %[1]s에 열음 issues.filter_project_none = 프로젝트 없음 diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 789871f3c3..98baff217b 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -1651,13 +1651,13 @@ issues.close_comment_issue=Aizvērt ar piebildi issues.reopen_issue=Atvērt atkārtoti issues.reopen_comment_issue=Atkārtoti atvērt ar piebildi issues.create_comment=Pievienot piebildi -issues.closed_at=`aizvēra šo pieteikumu %[2]s` -issues.reopened_at=`atkārtoti atvēra šo pieteikumu %[2]s` -issues.commit_ref_at=`atsaucās uz šo pieteikumu iesūtījumā %[2]s` -issues.ref_issue_from=`atsaucās uz šo pieteikumu %[4]s %[2]s` -issues.ref_pull_from=`atsaucās uz šo izmaiņu pieprasījumu %[4]s %[2]s` -issues.ref_closing_from=`atsaucās uz šo pieteikumu izmaiņu pieprasījumā %[4]s, kas aizvērs to, %[2]s` -issues.ref_reopening_from=`atsaucās uz šo pieteikumu izmaiņu pieprasījumā %[4]s, kas atkārtoti atvērs to, %[2]s` +issues.closed_at=`aizvēra šo pieteikumu %s` +issues.reopened_at=`atkārtoti atvēra šo pieteikumu %s` +issues.commit_ref_at=`atsaucās uz šo pieteikumu iesūtījumā %s` +issues.ref_issue_from=`atsaucās uz šo pieteikumu %[3]s %[1]s` +issues.ref_pull_from=`atsaucās uz šo izmaiņu pieprasījumu %[3]s %[1]s` +issues.ref_closing_from=`atsaucās uz šo pieteikumu izmaiņu pieprasījumā %[3]s, kas aizvērs to, %[1]s` +issues.ref_reopening_from=`atsaucās uz šo pieteikumu izmaiņu pieprasījumā %[3]s, kas atkārtoti atvērs to, %[1]s` issues.ref_closed_from=`aizvēra pieteikumu %[4]s %[2]s` issues.ref_reopened_from=`atkārtoti atvēra pieteikumu %[4]s %[2]s` issues.ref_from=`no %[1]s` @@ -1964,8 +1964,8 @@ pulls.update_branch_success=Zara atjaunināšana bija sekmīga pulls.update_not_allowed=Nav ļauts atjaunināt zaru pulls.outdated_with_base_branch=Šis zars ir novecojis salīdzinājumā ar pamata zaru pulls.close=Aizvērt izmaiņu pieprasījumu -pulls.closed_at=`aizvēra šo izmaiņu pieprasījumu %[2]s` -pulls.reopened_at=`atkārtoti atvēra šo izmaiņu pieprasījumu %[2]s` +pulls.closed_at=`aizvēra šo izmaiņu pieprasījumu %s` +pulls.reopened_at=`atkārtoti atvēra šo izmaiņu pieprasījumu %s` pulls.cmd_instruction_hint=Apskatīt komandrindas izmantošanas norādes pulls.cmd_instruction_checkout_title=Paņemt pulls.cmd_instruction_checkout_desc=Projekta glabātavā jāizveido jauns zars un jāpārbauda izmaiņas. @@ -2826,7 +2826,7 @@ issues.author.tooltip.pr = Šis lietotājs ir šī izmaiņu pieprasījuma izveid pulls.edit.already_changed = Neizdevās saglabāt izmaiņu pieprasījuma izmaiņas. Izskatās, ka saturu jau ir mainījis kāds cits lietotājs. Lūgums atsvaidzināt lapu un mēģināt labot vēlreiz, lai izvairītos no izmaiņu pārrakstīšanas pulls.blocked_by_user = Tu nevari izveidot izmaiņu pieprasījumu šajā glabātavā, jo tās īpašnieks ir Tevi liedzis. issues.all_title = Visi -pulls.commit_ref_at = ` atsaucāš uz šo izmaiņu pieprasījumu iesūtījumā %[2]s` +pulls.commit_ref_at = ` atsaucās uz šo izmaiņu pieprasījumu iesūtījumā %s` issues.num_participants_one = %d dalībnieks pulls.title_desc_one = vēlas iekļaut %[1]d iesūtījumu no %[2]s %[3]s issues.archived_label_description = (Arhivēts) %s diff --git a/options/locale/locale_nds.ini b/options/locale/locale_nds.ini index 57985942ed..68fe899d6e 100644 --- a/options/locale/locale_nds.ini +++ b/options/locale/locale_nds.ini @@ -1347,7 +1347,7 @@ issues.change_title_at = `hett %[3]s de Titel vun %[1]s issues.change_ref_at = `hett %[3]s de Nömen vun %[1]s to %[2]s ännert` issues.delete_branch_at = `hett %[2]s de Twieg %[1]s lösket` issues.filter_label = Vermark -issues.filter_label_exclude = `Bruuk Alt+Klick/Enter, um Vermarkens uttosluten` +issues.filter_label_exclude = Bruuk Alt + Klick, um Vermarkens uttosluten issues.filter_label_no_select = All Vermarkens issues.filter_label_select_no_label = Keen Vermark issues.filter_milestone = Marksteen @@ -1434,12 +1434,12 @@ issues.comment_pull_merged_at = hett Kommitteren %[1]s in %[2]s %[3]s tosamenfö issues.close_comment_issue = Mit Kommentaar dichtmaken issues.reopen_comment_issue = Mit Kommentaar weer opmaken issues.create_comment = Kommenteren -issues.reopened_at = `hett deeses Gefall %[2]s weer opmaakt` +issues.reopened_at = `hett deeses Gefall %s weer opmaakt` issues.comment_manually_pull_merged_at = hett Kommitteren %[1]s in %[2]s %[3]s vun Hand tosamenföhrt issues.reopen_issue = Weer opmaken -issues.closed_at = `hett deeses Gefall %[2]s dichtmaakt` -issues.commit_ref_at = `hett deeses Gefall %[2]s vun eenem Kommitteren benöömt` -issues.ref_closing_from = `hett deeses Gefall %[2]s vun eenem Haalvörslag, wat ’t %[4]s dichtmaken word, benöömt` +issues.closed_at = `hett deeses Gefall %s dichtmaakt` +issues.commit_ref_at = `hett deeses Gefall %s vun eenem Kommitteren benöömt` +issues.ref_closing_from = `hett deeses Gefall %[1]s vun eenem Haalvörslag, wat ’t %[3]s dichtmaken word, benöömt` issues.ref_closed_from = `hett deeses Gefall %[4]s %[2]s dichtmaakt` issues.ref_reopened_from = `hett deeses Gefall %[4]s %[2]s weer opmaakt` issues.ref_from = `vun %[1]s` @@ -1477,12 +1477,12 @@ issues.label.filter_sort.reverse_alphabetically = Umdreiht na de Alphabeet issues.label.filter_sort.by_size = Lüttste Grött issues.num_participants_one = %d Mitmaker issues.num_participants_few = %d Mitmakers -issues.ref_pull_from = `hett deesen Haalvörslag %[4]s %[2]s benöömt` +issues.ref_pull_from = `hett deesen Haalvörslag %[3]s %[1]s benöömt` issues.label_title = Naam issues.label_archived_filter = Archiveert Vermarkens wiesen issues.archived_label_description = (Archiveert) %s -issues.ref_issue_from = `hett deeses Gefall %[4]s %[2]s benöömt` -issues.ref_reopening_from = `hett deeses Gefall vun eenem Haalvörslag, wat ’t %[4]s weer opmaken word, %[2]s benöömt` +issues.ref_issue_from = `hett deeses Gefall %[3]s %[1]s benöömt` +issues.ref_reopening_from = `hett deeses Gefall vun eenem Haalvörslag, wat ’t %[3]s weer opmaken word, %[1]s benöömt` issues.author.tooltip.issue = Deeser Bruker is de Autor vun deesem Gefall. issues.role.member_helper = Deeser Bruker is een Liddmaat vun de Vereenigung, wat de Eegner vun deesem Repositorium is. issues.role.collaborator_helper = Deeser Bruuker is inladen worden, in deesem Repositorium mittoarbeiden. @@ -1740,8 +1740,8 @@ pulls.status_checks_show_all = All Överprüfens wiesen pulls.update_branch_rebase = Twieg mit Umbaseren vernejen pulls.outdated_with_base_branch = De Twieg is tegen de Grund-Twieg verollt pulls.close = Haalvörslag dichtmaken -pulls.closed_at = `hett deesen Haalvörslag %[2]s dichtmaakt` -pulls.reopened_at = `hett deesen Haalvörslag %[2]s weer opmaakt` +pulls.closed_at = `hett deesen Haalvörslag %s dichtmaakt` +pulls.reopened_at = `hett deesen Haalvörslag %s weer opmaakt` pulls.cmd_instruction_hint = Wies Oorderreeg-Instruksjes pulls.cmd_instruction_checkout_title = Utchecken pulls.cmd_instruction_merge_title = Tosamenföhren @@ -1771,7 +1771,7 @@ milestones.deletion = Marksteen lösken pulls.has_merged = Fehlslagen: De Haalvörslag is tosamenföhrt worden, du kannst nich noch eenmaal tosamenföhren of de Enn-Twieg ännern. pulls.unrelated_histories = Tosamenföhren fehlslagen: De Tosamenföhrens-Kopp un -Grund hebben keene gemeensame Histoorje. Wenk: Versöök eene anner Tosamenföhrens-Aard pulls.update_not_allowed = Du düürst deesen Twieg nich vernejen -pulls.commit_ref_at = `hett deesen Haalvörslag %[2]s vun eenem Kommitteren benöömt` +pulls.commit_ref_at = `hett deesen Haalvörslag %s vun eenem Kommitteren benöömt` pulls.auto_merge_newly_scheduled = De Haalvörslag weer sett, sik tosamentoföhren, wenn all Överprüfens kumpleet sünd. milestones.clear = Leeg maken pulls.push_rejected_no_message = Schuven fehlslagen: Dat Schuven is sünner feerne Naricht oflehnt worden. Bidde överprüüf de Git-Hakens för deeses Repositorium diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index 549718ce23..48442bc39f 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -1554,13 +1554,13 @@ issues.close_comment_issue=Sluit met commentaar issues.reopen_issue=Heropen issues.reopen_comment_issue=Heropen met commentaar issues.create_comment=Reageer -issues.closed_at=`heeft dit probleem gesloten %[2]s` -issues.reopened_at=`heropende dit probleem %[2]s` -issues.commit_ref_at=`verwees naar dit probleem vanuit commit %[2]s'` -issues.ref_issue_from=`refereerde aan dit issue %[4]s %[2]s` -issues.ref_pull_from=`refereerde aan deze pull request %[4]s %[2]s` -issues.ref_closing_from=`verwees naar deze issue van een pull request %[4]s dat het zal sluiten, %[2]s` -issues.ref_reopening_from=`verwees naar een pull request %[4]s dat dit issue heropent %[2]s ` +issues.closed_at=`heeft dit probleem gesloten %s` +issues.reopened_at=`heropende dit probleem %s` +issues.commit_ref_at=`verwees naar dit probleem vanuit commit %s` +issues.ref_issue_from=`refereerde aan dit issue %[3]s %[1]s` +issues.ref_pull_from=`refereerde aan deze pull request %[3]s %[1]s` +issues.ref_closing_from=`verwees naar deze issue van een pull request %[3]s dat het zal sluiten, %[1]s` +issues.ref_reopening_from=`verwees naar een pull request %[3]s dat dit issue heropent %[1]s ` issues.ref_closed_from=`sloot dit issue %[4]s %[2]s` issues.ref_reopened_from=`heropende dit issue %[4]s %[2]s` issues.ref_from=`van %[1]s` @@ -1815,8 +1815,8 @@ pulls.update_branch_rebase=Update branch via herbaseren pulls.update_branch_success=Branch update is geslaagd pulls.update_not_allowed=Je hebt geen toestemming om branch bij te werken pulls.outdated_with_base_branch=Deze branch is verouderd met de basis branch -pulls.closed_at=`heeft deze pull request gesloten %[2]s` -pulls.reopened_at=`heropende deze pull request %[2]s` +pulls.closed_at=`heeft deze pull request gesloten %s` +pulls.reopened_at=`heropende deze pull request %s` pulls.auto_merge_button_when_succeed=(Bij geslaagde controles) pulls.auto_merge_when_succeed=Automatisch samenvoegen wanneer alle controles gelukt zijn @@ -2627,7 +2627,7 @@ projects.column.set_default_desc = Stel deze kolom in als standaard voor ongecat issues.action_check = Aanvinken/uitvinken issues.dependency.issue_batch_close_blocked = Het is niet mogelijk om de issues die u gekozen heeft in bulk te sluiten, omdat issue #%d nog open afhankelijkheden heeft pulls.review_only_possible_for_full_diff = Beoordeling is alleen mogelijk bij het bekijken van de volledige diff -pulls.commit_ref_at = `heeft naar deze pull request verwezen vanuit een commit %[2]s` +pulls.commit_ref_at = `heeft naar deze pull request verwezen vanuit een commit %s` pulls.cmd_instruction_hint = Bekijk opdrachtregelinstructies pulls.cmd_instruction_checkout_desc = Vanuit uw project repository, schakel over naar een nieuwe branch en test de veranderingen. pulls.showing_specified_commit_range = Alleen veranderingen weergeven tussen %[1]s..%[2]s diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index 86a333a886..189e663618 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -1460,13 +1460,13 @@ issues.close_comment_issue=Zamknij z komentarzem issues.reopen_issue=Otwórz ponownie issues.reopen_comment_issue=Otwórz ponownie z komentarzem issues.create_comment=Skomentuj -issues.closed_at=`zamknął(-ęła) to zgłoszenie %[2]s` -issues.reopened_at=`otworzył(-a) ponownie to zgłoszenie %[2]s` -issues.commit_ref_at=`wspomniał(-a) to zgłoszenie z commita %[2]s` -issues.ref_issue_from=`odwołał(-a) się do tego zgłoszenia %[4]s %[2]s` -issues.ref_pull_from=`odwołał(-a) się do tego Pull Requesta %[4]s %[2]s` -issues.ref_closing_from=`odwołał(-a) się do pull requesta %[4]s, który zamknie to zgłoszenie %[2]s` -issues.ref_reopening_from=`odwołał(-a) się z pull requesta %[4]s, który otworzy na nowo to zgłoszenie %[2]s` +issues.closed_at=`zamknął(-ęła) to zgłoszenie %s` +issues.reopened_at=`otworzył(-a) ponownie to zgłoszenie %s` +issues.commit_ref_at=`wspomniał(-a) to zgłoszenie z commita %s` +issues.ref_issue_from=`odwołał(-a) się do tego zgłoszenia %[3]s %[1]s` +issues.ref_pull_from=`odwołał(-a) się do tego Pull Requesta %[3]s %[1]s` +issues.ref_closing_from=`odwołał(-a) się do pull requesta %[3]s, który zamknie to zgłoszenie %[1]s` +issues.ref_reopening_from=`odwołał(-a) się z pull requesta %[3]s, który otworzy na nowo to zgłoszenie %[1]s` issues.ref_closed_from=`zamknął(-ęła) to zgłoszenie %[4]s %[2]s` issues.ref_reopened_from=`ponownie otworzył(-a) to zgłoszenie %[4]s %[2]s` issues.ref_from=`z %[1]s` @@ -1679,8 +1679,8 @@ pulls.update_branch_rebase=Aktualizuj branch przez rebase pulls.update_branch_success=Aktualizacja gałęzi powiodła się pulls.update_not_allowed=Nie masz uprawnień do aktualizacji gałęzi pulls.outdated_with_base_branch=Ta gałąź jest przestarzała w stosunku do gałęzi bazowej -pulls.closed_at=`zamknął(-ęła) ten pull request %[2]s` -pulls.reopened_at=`otworzył(-a) ponownie ten Pull Request %[2]s` +pulls.closed_at=`zamknął(-ęła) ten pull request %s` +pulls.reopened_at=`otworzył(-a) ponownie ten Pull Request %s` @@ -2643,7 +2643,7 @@ pulls.closed = Pull request zamknięty pulls.blocked_by_outdated_branch = Ten pull request jest zablokowany ponieważ jest przedawniony. pulls.blocked_by_changed_protected_files_1 = Ten pull request jest zablokowany ponieważ wprowadza zmiany do chronionego pliku: pulls.push_rejected_no_message = Wypchnięcie nie powiodło się: Wypchnięcie zostało odrzucone, ale nie otrzymano zdalnej wiadomości. Sprawdź hooki Git dla tego repozytorium.= -pulls.commit_ref_at = `odniósł się do tego pull requesta z commita %[2]s` +pulls.commit_ref_at = `odniósł się do tego pull requesta z commita %s` pulls.cmd_instruction_checkout_desc = Ze swojego repozytorium projektu, utwórz nową gałąź i przetestuj zmiany. pulls.clear_merge_message_hint = Wyczyszczenie wiadomości scalenia usunie tylko treść wiadomości commitu pozostawiając wygenerowane przez git dopiski takie jak "Co-Authored-By ...". pulls.delete_after_merge.head_branch.insufficient_branch = Nie masz uprawnień by usunąć head gałęzi. diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 26bdd35420..8de0374eb2 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -1063,8 +1063,8 @@ language.localization_project = Ajude-nos a traduzir Forgejo para o seu idioma! language.description = Essa língua será salva em sua conta e será usada como padrão após você iniciar a sessão. user_block_yourself = Você não pode se bloquear. pronouns_custom_label = Pronomes personalizados -change_username_redirect_prompt.with_cooldown.one = O nome de usuário antigo ficará disponível para qualquer pessoa após um período de espera de %[1]d dia, você ainda pode recuperar o nome de usuário antigo durante este período de espera. -change_username_redirect_prompt.with_cooldown.few = O nome de usuário antigo ficará disponível para qualquer pessoa após um período de espera de %[1]d dias, você ainda pode recuperar o nome de usuário antigo durante este período de espera. +change_username_redirect_prompt.with_cooldown.one = O nome de usuário antigo ficará disponível para qualquer pessoa após um período de proteção de %[1]d dia. Você ainda pode recuperar o nome de usuário antigo durante este período de proteção. +change_username_redirect_prompt.with_cooldown.few = O nome de usuário antigo ficará disponível para qualquer pessoa após um período de proteção de %[1]d dias. Você ainda pode recuperar o nome de usuário antigo durante este período de proteção. quota.applies_to_user = As seguintes regras de cota se aplicam à sua conta quota.rule.exceeded.helper = O tamanho total de objetos para esta regra excedeu a cota. keep_pronouns_private = Mostrar pronomes apenas para usuários autenticados @@ -1568,7 +1568,7 @@ issues.remove_ref_at=`removeu a referência %s %s` issues.add_ref_at=`adicionou a referência %s %s` issues.delete_branch_at=`excluiu branch %s %s` issues.filter_label=Etiqueta -issues.filter_label_exclude=`Use alt + clique/enter para excluir etiquetas` +issues.filter_label_exclude=Use Alt + Clique para excluir etiquetas issues.filter_label_no_select=Todas as etiquetas issues.filter_label_select_no_label=Sem etiqueta issues.filter_milestone=Marco @@ -1642,13 +1642,13 @@ issues.close_comment_issue=Comentar e fechar issues.reopen_issue=Reabrir issues.reopen_comment_issue=Comentar e reabrir issues.create_comment=Comentar -issues.closed_at=`fechou esta issue %[2]s` -issues.reopened_at=`reabriu esta issue %[2]s` -issues.commit_ref_at=`citou esta issue em um commit %[2]s` -issues.ref_issue_from=`referenciado esta issue %[4]s %[2]s` -issues.ref_pull_from=`referenciado este pull request %[4]s %[2]s` -issues.ref_closing_from=`referenciado esta issue de um pull request %[4]s que a fechará %[2]s` -issues.ref_reopening_from=`referenciado esta issue de um pull request %[4]s que a reabrirá %[2]s` +issues.closed_at=`fechou esta issue %s` +issues.reopened_at=`reabriu esta issue %s` +issues.commit_ref_at=`citou esta issue de um commit %s` +issues.ref_issue_from=`citou esta issue %[3]s %[1]s` +issues.ref_pull_from=`citou este pull request %[3]s %[1]s` +issues.ref_closing_from=`citou esta issue de um pull request %[3]s que a fechará %[1]s` +issues.ref_reopening_from=`citou esta issue de um pull request %[3]s que a reabrirá, %[1]s` issues.ref_closed_from=`fechou esta issue %[4]s %[2]s` issues.ref_reopened_from=`reabriu esta issue %[4]s %[2]s` issues.ref_from=`de %[1]s` @@ -1942,8 +1942,8 @@ pulls.update_branch_success=Atualização do branch foi bem-sucedida pulls.update_not_allowed=Você não tem permissão para atualizar o branch pulls.outdated_with_base_branch=Este branch está desatualizado com o branch base pulls.close=Fechar pull request -pulls.closed_at=`fechou este pull request %[2]s` -pulls.reopened_at=`reabriu este pull request %[2]s` +pulls.closed_at=`fechou este pull request %s` +pulls.reopened_at=`reabriu este pull request %s` pulls.clear_merge_message=Limpar mensagem do merge pulls.clear_merge_message_hint=Limpar a mensagem de merge só irá remover o conteúdo da mensagem de commit e manter trailers git gerados, como "Co-Authored-By …". @@ -2719,7 +2719,7 @@ issues.label_archive_tooltip = Etiquetas arquivadas não serão exibidas nas sug activity.navbar.pulse = Recente settings.units.overview = Geral settings.units.add_more = Habilitar mais -pulls.commit_ref_at = `referenciou este pedido de mesclagem no commit %[2]s` +pulls.commit_ref_at = `citou este pull request de um commit %s` pulls.cmd_instruction_merge_title = Mesclar settings.units.units = Unidades vendored = Externo @@ -2920,6 +2920,7 @@ settings.event_action_recover = Recuperar settings.event_action_recover_desc = A execução da Action teve sucesso após a última execução no mesmo workflow ter falhado. settings.event_action_success = Sucesso settings.event_action_success_desc = A execução da Action foi bem sucedida. +issues.filter_type.all_pull_requests = Todos os pull requests [graphs] component_loading = Carregando %s… @@ -3056,8 +3057,8 @@ open_dashboard = Abrir painel settings.change_orgname_prompt = Obs.: Alterar o nome de uma organização resultará na alteração do URL dela e disponibilizará o nome antigo para uso. follow_blocked_user = Não foi possível seguir esta organização porque ela bloqueou-o(a). form.name_pattern_not_allowed = O padrão "%s" não é permitido no nome de uma organização. -settings.change_orgname_redirect_prompt.with_cooldown.one = O nome de organização antigo ficará disponível para qualquer pessoa após um período de proteção de %[1]d dia, você ainda pode recuperar o nome antigo durante este período de proteção. -settings.change_orgname_redirect_prompt.with_cooldown.few = O nome de organização antigo ficará disponível para qualquer pessoa após um período de espera de %[1]d dia, você ainda pode recuperar o nome antigo durante este período de espera. +settings.change_orgname_redirect_prompt.with_cooldown.one = O nome de organização antigo ficará disponível para qualquer pessoa após um período de proteção de %[1]d dia. Você ainda pode recuperar o nome antigo durante este período de proteção. +settings.change_orgname_redirect_prompt.with_cooldown.few = O nome de organização antigo ficará disponível para qualquer pessoa após um período de proteção de %[1]d dia. Você ainda pode recuperar o nome antigo durante este período de proteção. [admin] dashboard=Painel diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index 7f36d164b3..0e8f2d485e 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -1657,13 +1657,13 @@ issues.close_comment_issue=Fechar com comentário issues.reopen_issue=Reabrir issues.reopen_comment_issue=Reabrir com comentário issues.create_comment=Comentar -issues.closed_at=`encerrou esta questão %[2]s` -issues.reopened_at=`reabriu esta questão %[2]s` -issues.commit_ref_at=`referenciou esta questão num cometimento %[2]s` -issues.ref_issue_from=`referiu esta questão %[4]s %[2]s` -issues.ref_pull_from=`referiu este pedido de integração %[4]s %[2]s` -issues.ref_closing_from=`referiu esta questão a partir de um pedido de integração %[4]s que a fechará %[2]s` -issues.ref_reopening_from=`referiu esta questão a partir de um pedido de integração %[4]s que a reabrirá %[2]s` +issues.closed_at=`encerrou esta questão %s` +issues.reopened_at=`reabriu esta questão %s` +issues.commit_ref_at=`referenciou esta questão num cometimento %s` +issues.ref_issue_from=`referiu esta questão %[3]s %[1]s` +issues.ref_pull_from=`referiu este pedido de integração %[3]s %[1]s` +issues.ref_closing_from=`referiu esta questão a partir de um pedido de integração %[3]s que a fechará %[1]s` +issues.ref_reopening_from=`referiu esta questão a partir de um pedido de integração %[3]s que a reabrirá %[1]s` issues.ref_closed_from=`encerrou esta questão %[4]s %[2]s` issues.ref_reopened_from=`reabriu esta questão %[4]s %[2]s` issues.ref_from=`de %[1]s` @@ -1972,8 +1972,8 @@ pulls.update_branch_success=A sincronização do ramo foi bem sucedida pulls.update_not_allowed=Não tem autorização para sincronizar o ramo 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.closed_at=`fechou este pedido de integração %s` +pulls.reopened_at=`reabriu este pedido de integração %s` 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. @@ -2785,7 +2785,7 @@ settings.wiki_rename_branch_main_desc = Renomear o ramo usado internamente pelo settings.add_collaborator_blocked_our = Não foi possível adicionar o/a colaborador/a porque o/a proprietário/a do repositório bloqueou-os. settings.add_webhook.invalid_path = A localização não pode conter "." ou ".." ou ficar em branco. Não pode começar ou terminar com uma barra. settings.graphql_url = URL do GraphQL -pulls.commit_ref_at = `referiu este pedido de integração a partir de um cometimento %[2]s` +pulls.commit_ref_at = `referiu este pedido de integração a partir de um cometimento %s` settings.confirm_wiki_branch_rename = Renomear o ramo do wiki settings.wiki_branch_rename_success = O nome do ramo do wiki do repositório foi normalizado com sucesso. settings.wiki_branch_rename_failure = Falhou a normalização do nome do ramo do wiki do repositório. diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 9158329978..2ef1b868d4 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -1563,7 +1563,7 @@ issues.remove_ref_at=`убрана ссылка на %s %s` issues.add_ref_at=`добавлена ссылка на %s %s` issues.delete_branch_at=`удалена ветвь %s %s` issues.filter_label=Метки -issues.filter_label_exclude=`Исключайте метки с помощью alt + лкм/enter` +issues.filter_label_exclude=Исключайте метки с помощью Alt + ЛКМ issues.filter_label_no_select=Любые метки issues.filter_label_select_no_label=Без меток issues.filter_milestone=Этап @@ -1637,13 +1637,13 @@ issues.close_comment_issue=Закрыть комментарием issues.reopen_issue=Открыть снова issues.reopen_comment_issue=Открыть снова комментарием issues.create_comment=Комментировать -issues.closed_at=`задача была закрыта %[2]s` -issues.reopened_at=`задача была открыта снова %[2]s` -issues.commit_ref_at=`упоминание этой задачи в коммите %[2]s` -issues.ref_issue_from=`упоминание этой задачи %[4]s %[2]s` -issues.ref_pull_from=`упоминание этого запроса слияния %[4]s %[2]s` -issues.ref_closing_from=`упоминание из запроса на слияние %[4]s, который закроет эту задачу %[2]s` -issues.ref_reopening_from=`упоминание из запроса на слияние %[4]s, который повторно откроет эту задачу %[2]s` +issues.closed_at=`задача была закрыта %s` +issues.reopened_at=`задача была открыта снова %s` +issues.commit_ref_at=`упоминание этой задачи в коммите %s` +issues.ref_issue_from=`упоминание этой задачи %[3]s %[1]s` +issues.ref_pull_from=`упоминание этого запроса слияния %[3]s %[1]s` +issues.ref_closing_from=`упоминание из запроса на слияние %[3]s, который закроет эту задачу %[1]s` +issues.ref_reopening_from=`упоминание из запроса на слияние %[3]s, который повторно откроет эту задачу %[1]s` issues.ref_closed_from=`закрыл этот запрос %[4]s %[2]s` issues.ref_reopened_from=`задача была открыта снова %[4]s %[2]s` issues.ref_from=`из %[1]s` @@ -1943,8 +1943,8 @@ pulls.update_branch_success=Ветвь успешно обновлена pulls.update_not_allowed=Недостаточно прав для обновления ветви pulls.outdated_with_base_branch=Эта ветвь отстает от базовой ветви pulls.close=Закрыть запрос слияния -pulls.closed_at=`закрыл этот запрос на слияние %[2]s` -pulls.reopened_at=`переоткрыл этот запрос на слияние %[2]s` +pulls.closed_at=`закрыл этот запрос на слияние %s` +pulls.reopened_at=`переоткрыл этот запрос на слияние %s` pulls.cmd_instruction_hint=Показать инструкции для командной строки pulls.cmd_instruction_merge_title=Слейте изменения pulls.cmd_instruction_merge_desc=Слейте изменения и отправьте их обратно. @@ -2772,7 +2772,7 @@ settings.ignore_stale_approvals = Игнорировать устаревшие contributors.contribution_type.additions = Добавления contributors.contribution_type.deletions = Удаления contributors.contribution_type.filter_label = Вид деятельности: -pulls.commit_ref_at = `упоминание этого запроса слияния в коммите %[2]s` +pulls.commit_ref_at = `сослался на этот запрос слияния в коммите %s` settings.thread_id = ИД обсуждения pulls.made_using_agit = AGit activity.navbar.contributors = Соавторы diff --git a/options/locale/locale_si-LK.ini b/options/locale/locale_si-LK.ini index d55b238b1c..54b0b246db 100644 --- a/options/locale/locale_si-LK.ini +++ b/options/locale/locale_si-LK.ini @@ -1100,12 +1100,12 @@ issues.close_comment_issue=අදහස් දක්වා වසන්න issues.reopen_issue=නැවත විවෘත කරන්න issues.reopen_comment_issue=අදහස් දක්වා විවෘත කරන්න issues.create_comment=අදහස -issues.closed_at=`මෙම ගැටළුව වසා %[2]s` -issues.reopened_at=`මෙම ගැටළුව නැවත විවෘත කරන ලදි %[2]s` -issues.ref_issue_from=`මෙම නිකුතුව %[4]s හි %[2]s` -issues.ref_pull_from=`මෙම අදින්න ඉල්ලීම%[4]s %[2]s` -issues.ref_closing_from=`මෙම ගැටළුව වසා දමනු ඇත%[4]s මෙම ගැටළුව %[2]s` -issues.ref_reopening_from=`මෙම ගැටළුව නැවත විවෘත කරනු ඇත%[4]s මෙම ගැටළුව %[2]s` +issues.closed_at=`මෙම ගැටළුව වසා %s` +issues.reopened_at=`මෙම ගැටළුව නැවත විවෘත කරන ලදි %s` +issues.ref_issue_from=`මෙම නිකුතුව %[3]s හි %[1]s` +issues.ref_pull_from=`මෙම අදින්න ඉල්ලීම%[3]s %[1]s` +issues.ref_closing_from=`මෙම ගැටළුව වසා දමනු ඇත%[3]s මෙම ගැටළුව %[1]s` +issues.ref_reopening_from=`මෙම ගැටළුව නැවත විවෘත කරනු ඇත%[3]s මෙම ගැටළුව %[1]s` issues.ref_closed_from=`මෙම නිකුතුව%[4]s %[2]s` issues.ref_reopened_from=`මෙම නිකුතුව%[4]s %[2]sනැවත විවෘත කරන ලදි` issues.ref_from=`හිම%[1]s` @@ -1342,8 +1342,8 @@ pulls.update_branch_rebase=රිබේස් මගින් ශාඛාව pulls.update_branch_success=ශාඛා යාවත්කාලීන කිරීම සාර්ථක විය pulls.update_not_allowed=ශාඛාව යාවත්කාලීන කිරීමට ඔබට අවසර නැත pulls.outdated_with_base_branch=මෙම ශාඛාව මූලික ශාඛාව සමඟ දිවයයි -pulls.closed_at=`මෙම අදින්න ඉල්ලීම වසා %[2]s` -pulls.reopened_at=`මෙම අදින්න ඉල්ලීම නැවත විවෘත කරන ලදි %[2]s` +pulls.closed_at=`මෙම අදින්න ඉල්ලීම වසා %s` +pulls.reopened_at=`මෙම අදින්න ඉල්ලීම නැවත විවෘත කරන ලදි %s` diff --git a/options/locale/locale_sr-SP.ini b/options/locale/locale_sr-SP.ini index 56c1a7e650..b14fdc1a35 100644 --- a/options/locale/locale_sr-SP.ini +++ b/options/locale/locale_sr-SP.ini @@ -326,7 +326,7 @@ issues.no_content=Још нема садржаја. issues.close_issue=Затвори issues.reopen_issue=Поново отвори issues.create_comment=Коментирај -issues.commit_ref_at=`поменуо овај задатак у комит %[2]s` +issues.commit_ref_at=`поменуо овај задатак у комит %s` issues.poster=Аутор issues.collaborator=Коаутор issues.owner=Власник diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index 541acbf408..8b43cb29b8 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -1157,13 +1157,13 @@ issues.close_comment_issue=Stäng med kommentar issues.reopen_issue=Återöppna issues.reopen_comment_issue=Öppna igen med kommentar issues.create_comment=Kommentera -issues.closed_at=`stängde ärendet %[2]s` -issues.reopened_at=`återöppnade detta ärende %[2]s` -issues.commit_ref_at=`refererade till detta ärende från en incheckning %[2]s` -issues.ref_issue_from=`refererade till detta ärende %[4]s %[2]s` -issues.ref_pull_from=`refererade till denna pull-förfrågan %[4]s %[2]s` -issues.ref_closing_from=`hänvisade till detta ärende från en pull-förfrågan %[4]s som kommer att stänga det %[2]s` -issues.ref_reopening_from=`hänvisade till detta ärende från en pull-förfrågan %[4]s som kommer att öppna ärendet på nytt %[2]s` +issues.closed_at=`stängde ärendet %s` +issues.reopened_at=`återöppnade detta ärende %s` +issues.commit_ref_at=`refererade till detta ärende från en incheckning %s` +issues.ref_issue_from=`refererade till detta ärende %[3]s %[1]s` +issues.ref_pull_from=`refererade till denna pull-förfrågan %[3]s %[1]s` +issues.ref_closing_from=`hänvisade till detta ärende från en pull-förfrågan %[3]s som kommer att stänga det %[1]s` +issues.ref_reopening_from=`hänvisade till detta ärende från en pull-förfrågan %[3]s som kommer att öppna ärendet på nytt %[1]s` issues.ref_closed_from=`stängde detta ärende %[4]s %[2]s` issues.ref_reopened_from=`öpnnade detta ärende igen %[4]s %[2]s` issues.ref_from=`från %[1]s` diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini index 4f51ddcc7e..c07cefdab9 100644 --- a/options/locale/locale_tr-TR.ini +++ b/options/locale/locale_tr-TR.ini @@ -1594,13 +1594,13 @@ issues.close_comment_issue=Yorum Yap ve Kapat issues.reopen_issue=Yeniden aç issues.reopen_comment_issue=Yorum Yap ve Yeniden Aç issues.create_comment=Yorum yap -issues.closed_at=`%[2]s konusunu kapattı` -issues.reopened_at=`%[2]s konusunu yeniden açtı` -issues.commit_ref_at=`%[2]s işlemesinde bu konuyu işaret etti` -issues.ref_issue_from=`bu konuya referansta bulundu %[4]s %[2]s` -issues.ref_pull_from=`bu değişiklik isteğine referansta bulundu %[4]s %[2]s` -issues.ref_closing_from=`bir değişiklik isteğine referansta bulundu %[4]s bu konu kapatılacak %[2]s` -issues.ref_reopening_from=`bir değişiklik isteğine referansta bulundu %[4]s bu konu yeniden açılacak %[2]s` +issues.closed_at=`%s konusunu kapattı` +issues.reopened_at=`%s konusunu yeniden açtı` +issues.commit_ref_at=`%s işlemesinde bu konuyu işaret etti` +issues.ref_issue_from=`bu konuya referansta bulundu %[3]s %[1]s` +issues.ref_pull_from=`bu değişiklik isteğine referansta bulundu %[3]s %[1]s` +issues.ref_closing_from=`bir değişiklik isteğine referansta bulundu %[3]s bu konu kapatılacak %[1]s` +issues.ref_reopening_from=`bir değişiklik isteğine referansta bulundu %[3]s bu konu yeniden açılacak %[1]s` issues.ref_closed_from=`bu konuyu kapat%[4]s %[2]s` issues.ref_reopened_from=`konuyu yeniden aç%[4]s %[2]s` issues.ref_from=`%[1]s'den` @@ -1907,8 +1907,8 @@ pulls.update_branch_success=Dal güncellemesi başarıyla gerçekleştirildi pulls.update_not_allowed=Dalı güncelleme izniniz yok pulls.outdated_with_base_branch=Bu dal, temel dal ile güncel değil pulls.close=Değişiklik İsteğini Kapat -pulls.closed_at=`%[2]s değişiklik isteğini kapattı` -pulls.reopened_at=`%[2]s değişiklik isteğini yeniden açtı` +pulls.closed_at=`%s değişiklik isteğini kapattı` +pulls.reopened_at=`%s değişiklik isteğini yeniden açtı` pulls.cmd_instruction_hint=`Komut satırı talimatlarını görüntüleyin.` pulls.cmd_instruction_checkout_title=Çekme pulls.cmd_instruction_checkout_desc=Proje deponuzdan yeni bir dalı çekin ve değişiklikleri test edin. diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 2e536c3d1a..faa3f2a56e 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -694,7 +694,7 @@ disabled_public_activity=Цей користувач вимкнув публіч joined_on = Реєстрація %s email_visibility.private = Ваш email видно лише вам і адміністраторам email_visibility.limited = Вашу е-пошту видно всім авторизованим -settings = Користувацькі параметри +settings = Користувацькі налаштування block_user.detail_3 = Ви не зможете додати один одного в якості співавтора репозиторію. show_on_map = Показати це місце на мапі block_user.detail_2 = Цей користувач не зможе взаємодіяти з репозиторіями, власником яких є ви, а також із задачами та коментарями, які ви створили. @@ -1447,7 +1447,7 @@ issues.remove_ref_at=`видалив посилання %s %s` issues.add_ref_at=`додав посилання %s %s` issues.delete_branch_at=`видалена гілка %s %s` issues.filter_label=Мітка -issues.filter_label_exclude=`Використовуйте Alt + клік/Enter для виключення міток` +issues.filter_label_exclude=Використовуйте Alt + клік для виключення міток issues.filter_label_no_select=Всі мітки issues.filter_milestone=Етап issues.filter_project=Проєкт @@ -1496,17 +1496,17 @@ issues.context.quote_reply=Цитувати відповідь issues.context.reference_issue=Послатися в новій задачі issues.context.edit=Редагувати issues.context.delete=Видалити -issues.close_comment_issue=Прокоментувати і закрити +issues.close_comment_issue=Закрити з коментарем issues.reopen_issue=Відкрити знову -issues.reopen_comment_issue=Прокоментувати та відкрити знову +issues.reopen_comment_issue=Відкрити знову з коментарем issues.create_comment=Коментар -issues.closed_at=`закрив цю задачу %[2]s` -issues.reopened_at=`повторно відкрив цю задачу %[2]s` -issues.commit_ref_at=`згадано цю задачу в коміті %[2]s` -issues.ref_issue_from=`посилається на цю задачу %[4]s %[2]s` -issues.ref_pull_from=`послався на цей запит злиття %[4]s %[2]s` -issues.ref_closing_from=`згадав запит на злиття %[4]s, які закриють цю задачу %[2]s` -issues.ref_reopening_from=`згадав запит на злиття %[4]s, які повторно відкриють цю задачу %[2]s` +issues.closed_at=`закриває цю задачу %s` +issues.reopened_at=`повторно відкриває цю задачу %s` +issues.commit_ref_at=`посилається на цю задачу в коміті %s` +issues.ref_issue_from=`посилається на цю задачу %[3]s %[1]s` +issues.ref_pull_from=`посилається на цей запит злиття %[3]s %[1]s` +issues.ref_closing_from=`посилається в запиті на злиття %[3]s, який закриє цю задачу, %[1]s` +issues.ref_reopening_from=`посилається в запиті на злиття %[3]s, який повторно відкриє цю задачу, %[1]s` issues.ref_closed_from=`закрив цю задачу %[4]s %[2]s` issues.ref_reopened_from=`повторно відкрито цю задачу %[4]s %[2]s` issues.ref_from=`із %[1]s` @@ -1743,8 +1743,8 @@ pulls.update_branch_rebase=Оновити гілку перебазування pulls.update_branch_success=Оновлення гілки пройшло успішно pulls.update_not_allowed=Ви не можете оновити гілку pulls.outdated_with_base_branch=Ця гілка застаріла відносно базової гілки -pulls.closed_at=`закрив цей запит на злиття %[2]s` -pulls.reopened_at=`повторно відкрив цей запит на злиття %[2]s` +pulls.closed_at=`закриває цей запит на злиття %s` +pulls.reopened_at=`повторно відкриває цей запит на злиття %s` @@ -1887,7 +1887,7 @@ settings.collaboration.owner=Власник settings.collaboration.undefined=Не визначено settings.hooks=Веб-хуки settings.githooks=Git хуки -settings.basic_settings=Базові налаштування +settings.basic_settings=Основні налаштування settings.mirror_settings=Налаштування дзеркала settings.mirror_settings.mirrored_repository=Віддзеркалений репозиторій settings.mirror_settings.direction=Напрямок @@ -2055,12 +2055,12 @@ settings.event_issue_assign=Призначення settings.event_issue_assign_desc=Задачу призначено або скасовано. settings.event_issue_label=Мітки settings.event_issue_label_desc=Додавання або видалення міток задач. -settings.event_issue_milestone=Задача з етапом +settings.event_issue_milestone=Етапи settings.event_issue_milestone_desc=Етап призначено, видалено або змінено. settings.event_issue_comment=Коментарі settings.event_issue_comment_desc=Коментар задачі створено, видалено чи відредаговано. settings.event_header_pull_request=Події запиту на злиття -settings.event_pull_request=Запити до злиття +settings.event_pull_request=Зміна settings.event_pull_request_desc=Запит до злиття відкрито, закрито, перевідкрито або відредаговано. settings.event_pull_request_assign=Призначення settings.event_pull_request_assign_desc=Запит про злиття призначено або скасовано. @@ -2485,7 +2485,7 @@ signing.will_sign = Коміт буде підписано ключем «%s». signing.wont_sign.error = Під час перевірки можливості підписати коміт сталася помилка. commits.search_branch = У цій гілці ext_wiki = Зовнішня вікі -pulls.commit_ref_at = `посилається на цей запит на злиття в коміті %[2]s` +pulls.commit_ref_at = `посилається на цей запит на злиття в коміті %s` pulls.cmd_instruction_hint = Переглянути інструкції для командного рядка issues.max_pinned = Неможливо закріпити більше задач issues.unpin_comment = відкріпив %s @@ -2847,7 +2847,7 @@ dashboard.update_migration_poster_id=Оновити мігровані ID авт dashboard.git_gc_repos=Виконати очистку сміття для всіх репозиторіїв dashboard.resync_all_sshkeys=Оновити файл «.ssh/authorized_keys» з SSH-ключами Forgejo. dashboard.resync_all_sshprincipals=Оновити файл «.ssh/authorized_principals» з SSH даними користувача Forgejo. -dashboard.resync_all_hooks=Пересинхронізувати перед-прийнятні, оновлюючі та пост-прийнятні хуки в усіх репозиторіях +dashboard.resync_all_hooks=Пересинхронізувати хуки pre-receive, update та post-receive в усіх репозиторіях dashboard.reinit_missing_repos=Переініціалізувати усі репозитрії git-файли яких втрачено dashboard.sync_external_users=Синхронізувати дані зовнішніх користувачів dashboard.cleanup_hook_task_table=Очистити hook_task таблицю @@ -2906,7 +2906,7 @@ users.edit_account=Редагувати обліковий запис users.max_repo_creation=Максимальна кількість репозиторіїв users.max_repo_creation_desc=(Введіть -1, щоб використовувати глобальний ліміт за замовчуванням.) users.is_activated=Обліковий запис користувача увімкнено -users.prohibit_login=Вимкнути вхід +users.prohibit_login=Заблокований обліковий запис users.is_admin=Обліковий запис адміністратора users.is_restricted=Обмежений users.allow_git_hook=Може створювати Git хуки @@ -3305,6 +3305,7 @@ dashboard.cron.cancelled = Cron: %[1]s скасовано: %[3]s defaulthooks.desc = Вебхуки автоматично сповіщають HTTP-сервер POST-запитами, коли в Forgejo відбуваються певні події. Вказані тут вебхуки є типовими і будуть скопійовані до всіх нових репозиторіїв. Докладніше — в посібнику з вебхуків. assets = Ресурси коду auths.invalid_openIdConnectAutoDiscoveryURL = Неправильна URL-адреса автоматичного виявлення (повинна бути дійсна URL-адреса, що починається з http:// або https://) +settings = Налаштування адміністратора [action] diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index acdd4c0ced..c6c534df9f 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -1062,8 +1062,8 @@ language.description = 此语言将保存到您的账号中,并在您登录后 language.localization_project = 帮助我们将 Forgejo 翻译成您的语言!了解更多。 user_block_yourself = 您不能屏蔽自己。 pronouns_custom_label = 自定义代词 -change_username_redirect_prompt.with_cooldown.one = 旧的用户名将在%[1]d天的保护期后对所有人可用,您仍可以在此期间重新认领旧的用户名。 -change_username_redirect_prompt.with_cooldown.few = 旧的用户名将在%[1]d天的保护期后对所有人可用,您仍可以在此期间重新认领旧的用户名。 +change_username_redirect_prompt.with_cooldown.one = 旧用户名将在 %[1]d 天的保护期后对所有人可用,您仍可以在此期间重新认领旧用户名。 +change_username_redirect_prompt.with_cooldown.few = 旧用户名将在 %[1]d 天的保护期后对所有人可用,您仍可以在此期间重新认领旧用户名。 keep_pronouns_private = 仅向已认证用户显示代词 keep_pronouns_private.description = 这将对未登录的访问者隐藏您的代词。 quota = 配额 @@ -1581,7 +1581,7 @@ issues.remove_ref_at=`删除了引用 %s %s` issues.add_ref_at=`添加了引用 %s %s` issues.delete_branch_at=`于 %[2]s 删除了分支 %[1]s` issues.filter_label=标签筛选 -issues.filter_label_exclude=`使用 alt + 鼠标左键 / 回车 排除标签` +issues.filter_label_exclude=使用 Alt + 单击 排除标签 issues.filter_label_no_select=所有标签 issues.filter_label_select_no_label=无标签 issues.filter_milestone=里程碑筛选 @@ -1655,13 +1655,13 @@ issues.close_comment_issue=评论并关闭 issues.reopen_issue=重新开放 issues.reopen_comment_issue=重新打开并评论 issues.create_comment=评论 -issues.closed_at=`于%[2]s关闭此议题` -issues.reopened_at=`重新打开此问题 %[2]s` -issues.commit_ref_at=`于%[2]s在代码提交中引用了该议题` -issues.ref_issue_from=`引用了议题 %[4]s %[2]s` -issues.ref_pull_from=`引用了合并请求 %[4]s %[2]s` -issues.ref_closing_from=`于 %[2]s 从合并请求 %[4]s引用了此议题,将关闭此议题` -issues.ref_reopening_from=`于 %[2]s 引用了合并请求 %[4]s 将重新讨论此议题 ` +issues.closed_at=`于 %s 关闭了此议题` +issues.reopened_at=`于 %s 重新打开了此议题` +issues.commit_ref_at=`于 %s 从提交中引用了此议题` +issues.ref_issue_from=`引用了此议题 %[3]s %[1]s` +issues.ref_pull_from=`引用了此合并请求 %[3]s %[1]s` +issues.ref_closing_from=`于 %[1]s 从合并请求 %[3]s 引用了此议题,将关闭此议题` +issues.ref_reopening_from=`于 %[1]s 从合并请求 %[3]s 引用了此议题,将重新打开此议题 ` issues.ref_closed_from=`关闭了这个议题 %[4]s %[2]s` issues.ref_reopened_from=`重新打开这个议题 %[4]s %[2]s` issues.ref_from=`来自 %[1]s` @@ -1969,8 +1969,8 @@ pulls.update_branch_success=分支更新成功 pulls.update_not_allowed=您无权更新分支 pulls.outdated_with_base_branch=此分支相比基础分支已过期 pulls.close=关闭 -pulls.closed_at=`于%[2]s关闭此合并请求 ` -pulls.reopened_at=`重新打开此合并请求 %[2]s` +pulls.closed_at=`于 %s 关闭了此合并请求 ` +pulls.reopened_at=`于 %s 重新打开了此合并请求` pulls.cmd_instruction_hint=查看命令行说明 pulls.cmd_instruction_checkout_title=检出 pulls.cmd_instruction_checkout_desc=从你的仓库中检出一个新的分支并测试变更。 @@ -2770,7 +2770,7 @@ settings.wiki_rename_branch_main = 标准化百科分支名称 settings.wiki_rename_branch_main_notices_1 = 此操作无法撤消。 settings.wiki_branch_rename_success = 百科仓库的分支名称已成功规范化。 settings.confirm_wiki_branch_rename = 重命名百科分支 -pulls.commit_ref_at = `在提交 %[2]s 中引用了此合并请求` +pulls.commit_ref_at = `于 %s 从提交中引用了此合并请求` settings.wiki_rename_branch_main_notices_2 = 这将永久重命名 %s 的仓库百科的内部分支。现存的检出方式需要更新。 settings.wiki_branch_rename_failure = 无法标准化仓库百科的分支名称。 settings.add_collaborator_blocked_our = 因仓库所有者已将其拉黑,不能添加该用户为协作者。 @@ -2922,6 +2922,7 @@ settings.event_action_success = 成功 settings.event_action_success_desc = Action运行以成功结束。 settings.event_action_failure_desc = Action运行以失败结束。 settings.event_header_action = Action运行事件 +issues.filter_type.all_pull_requests = 所有合并请求 [graphs] component_loading=正在加载 %s… @@ -3057,8 +3058,8 @@ teams.invite.by=邀请人 %s teams.invite.description=请点击下面的按钮加入团队。 follow_blocked_user = 你无法关注此组织,因为此组织已屏蔽你。 open_dashboard = 打开仪表盘 -settings.change_orgname_redirect_prompt.with_cooldown.one = 旧的组织名将在%[1]d天的保护期后对所有人可用,您仍可以在此期间重新认领旧的名字。 -settings.change_orgname_redirect_prompt.with_cooldown.few = 旧的组织名将在%[1]d天的保护期后对所有人可用,您仍可以在此期间重新认领旧名字。 +settings.change_orgname_redirect_prompt.with_cooldown.one = 旧组织名将在 %[1]d 天的保护期后对所有人可用,您仍可以在此期间重新认领旧名称。 +settings.change_orgname_redirect_prompt.with_cooldown.few = 旧组织名将在 %[1]d 天的保护期后对所有人可用,您仍可以在此期间重新认领旧名称。 [admin] dashboard=管理面板 diff --git a/options/locale/locale_zh-HK.ini b/options/locale/locale_zh-HK.ini index e2cb0d8b2c..45534801de 100644 --- a/options/locale/locale_zh-HK.ini +++ b/options/locale/locale_zh-HK.ini @@ -574,7 +574,7 @@ issues.delete_comment_confirm=您確定要刪除該條評論嗎? issues.context.edit=編輯 issues.reopen_issue=重新開啟 issues.create_comment=評論 -issues.commit_ref_at=`在代碼提交 %[2]s 中引用了該問題` +issues.commit_ref_at=`在代碼提交 %s 中引用了該問題` issues.role.owner=管理員 issues.role.member=普通成員 issues.sign_in_require_desc= 登入 才能加入這對話。 diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index b21e4c8f79..fba51a391e 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -1604,13 +1604,13 @@ issues.close_comment_issue=留言並關閉 issues.reopen_issue=重新開放 issues.reopen_comment_issue=留言並重新開放 issues.create_comment=留言 -issues.closed_at=`關閉了這個問題 %[2]s` -issues.reopened_at=`重新開放了這個問題 %[2]s` -issues.commit_ref_at=`在提交中關聯了這個問題 %[2]s` -issues.ref_issue_from=`關聯了這個問題 %[4]s %[2]s` -issues.ref_pull_from=`關聯了這個合併請求 %[4]s %[2]s` -issues.ref_closing_from=從將關閉此問題的拉取請求 %[4]s 中提及了此問題%[2]s -issues.ref_reopening_from=從將重新開啟此問題的拉取請求 %[4]s 中提及了此問題%[2]s +issues.closed_at=`關閉了這個問題 %s` +issues.reopened_at=`重新開放了這個問題 %s` +issues.commit_ref_at=`在提交中關聯了這個問題 %s` +issues.ref_issue_from=`關聯了這個問題 %[3]s %[1]s` +issues.ref_pull_from=`關聯了這個合併請求 %[3]s %[1]s` +issues.ref_closing_from=從將關閉此問題的拉取請求 %[3]s 中提及了此問題,%[1]s +issues.ref_reopening_from=從將重新開啟此問題的拉取請求 %[3]s 中提及了此問題,%[1]s issues.ref_closed_from=`關閉了這個問題 %[4]s %[2]s` issues.ref_reopened_from=`重新開放了這個問題 %[4]s %[2]s` issues.ref_from=`自 %[1]s` @@ -1879,8 +1879,8 @@ pulls.update_branch_success=分支更新成功 pulls.update_not_allowed=您無權更新分支 pulls.outdated_with_base_branch=相對於基底分支,此分支已過時 pulls.close=關閉合併請求 -pulls.closed_at=`關閉了這個合併請求 %[2]s` -pulls.reopened_at=`重新開放了這個合併請求 %[2]s` +pulls.closed_at=`關閉了這個合併請求 %s` +pulls.reopened_at=`重新開放了這個合併請求 %s` pulls.clear_merge_message=清除合併訊息 pulls.clear_merge_message_hint=清除合併訊息將僅移除提交訊息內容,留下產生的 git 結尾,如「Co-Authored-By …」。 @@ -2634,7 +2634,7 @@ commits.search_branch = 此分支 commits.browse_further = 進一步瀏覽 commits.renamed_from = 自 %s 重新命名 issues.filter_milestone_none = 沒有里程碑 -issues.num_comments_1 = %s 則留言 +issues.num_comments_1 = %d 則留言 issues.no_content = 沒有提供敘述。 settings.new_owner_blocked_doer = 新的所有者已封鎖您。 new_repo_helper = 一個儲存庫包含專案的所有檔案和它們的修訂歷史。在別處已經有儲存庫了嗎?遷移儲存庫。 @@ -2693,7 +2693,7 @@ signing.wont_sign.never = 永不簽署提交。 editor.push_out_of_date = 該推送似乎過期了。 issues.cancel_tracking_history = `已取消時間追蹤 %s` issues.due_date_not_writer = 您需要有寫入這個儲存庫的權限才能更新其問題的到期日。 -pulls.commit_ref_at = `在提交 %[2]s 引用了這個合併請求` +pulls.commit_ref_at = `在提交 %s 引用了這個合併請求` pulls.cmd_instruction_checkout_desc = 從您的專案儲存庫中,建立並切換到一個新分支以測試這些變更。 pulls.cmd_instruction_merge_title = 合併 pulls.ready_for_review = 可以開始審閱了嗎? diff --git a/options/locale_next/locale_de-DE.json b/options/locale_next/locale_de-DE.json index 94ab12f180..3847de2b43 100644 --- a/options/locale_next/locale_de-DE.json +++ b/options/locale_next/locale_de-DE.json @@ -97,5 +97,10 @@ "settings.visibility.description": "Die Profilsichtbarkeit beeinflusst die Möglichkeit anderer, auf deine nicht-privaten Repositorys zuzugreifen. Erfahre mehr", "avatar.constraints_hint": "Individuelles Profilbild darf %[1]s in der Größe nicht überschreiten, und nicht größer als %[2]dx%[3]d Pixel sein", "repo.diff.commit.next-short": "Nächste", - "repo.diff.commit.previous-short": "Vorherige" + "repo.diff.commit.previous-short": "Vorherige", + "profile.edit.link": "Profil bearbeiten", + "feed.atom.link": "Atom-Feed", + "keys.ssh.link": "SSH-Schlüssel", + "keys.gpg.link": "GPG-Schlüssel", + "profile.actions.tooltip": "Mehr Aktionen" } diff --git a/options/locale_next/locale_fil.json b/options/locale_next/locale_fil.json index 1f1e535dad..884a7b44eb 100644 --- a/options/locale_next/locale_fil.json +++ b/options/locale_next/locale_fil.json @@ -21,7 +21,7 @@ "alert.asset_load_failed": "Nabigong i-load ang mga asset file mula sa {path}. Siguraduhin na maa-access ang mga asset file.", "install.invalid_lfs_path": "Nabigong gawin ang LFS root sa tinakdang path: %[1]s", "alert.range_error": " dapat ay numero sa pagitan ng %[1]s at %[2]s.", - "meta.last_line": "Sayori... I love you. — MC from Doki Doki Literature Club", + "meta.last_line": "Every day, I imagine a future where I can be with you. In my hand is a pen that will write a poem of me and you. The ink flows down into a dark puddle... Just move your hand, write the way into his heart. But in this world of infinite choices. What will it take just to find that special day? Have I found everybody a fun assignment to do today? When you're here, everything that we do is fun for them anyway... When I can't even read my own feelings. What good are words when a smile says it all? And if this world won't write me an ending... What will it take just for me to have it all? Does my pen only write bitter words for those who are dear to me? Is it love if I take you, or is it love if I set you free? The ink flows down into a dark puddle... How can I write love into reality? If I can't hear the sound of your heartbeat What do you call love in your reality? And in your reality, if I don't know how to love you... I'll leave you be.", "mail.actions.successful_run_after_failure": "Na-recover ang workflow na %[1]s sa repositoryong %[2]s", "mail.actions.not_successful_run": "Nabigo ang workflow na %[1]s sa repositoryong %[2]s", "mail.actions.run_info_previous_status": "Nakaraang Status ng Run: %[1]s", @@ -94,5 +94,13 @@ "editor.textarea.tab_hint": "Naka-indent na ang linya. Pindutin ulit ang Tab o Escape para umalis sa editor.", "editor.textarea.shift_tab_hint": "Walang indentation sa linyang ito. Pindutin ang Shift + Tab ulit o Escape para umalis sa editor.", "admin.dashboard.cleanup_offline_runners": "Linisin ang mga offline na runner", - "settings.visibility.description": "Maaapektuhan ng visibility ng profile ang kakayahan ng iba na i-access ang iyong mga hindi pribadong repositoryo. Matuto pa" + "settings.visibility.description": "Maaapektuhan ng visibility ng profile ang kakayahan ng iba na i-access ang iyong mga hindi pribadong repositoryo. Matuto pa", + "avatar.constraints_hint": "Hindi maaaring lumagpas sa laking %[1]s o mas malaki sa %[2]dx%[3]d pixel ang custom na avatar", + "repo.diff.commit.next-short": "Susunod", + "repo.diff.commit.previous-short": "Nakaraan", + "profile.edit.link": "I-edit ang profile", + "feed.atom.link": "Atom feed", + "keys.ssh.link": "Mga SSH key", + "keys.gpg.link": "Mga GPG key", + "profile.actions.tooltip": "Higit pang mga aksyon" } diff --git a/options/locale_next/locale_fr-FR.json b/options/locale_next/locale_fr-FR.json index a9035f0848..da26d56107 100644 --- a/options/locale_next/locale_fr-FR.json +++ b/options/locale_next/locale_fr-FR.json @@ -6,7 +6,7 @@ }, "repo.pulls.title_desc": { "one": "veut fusionner %[1]d commit depuis %[2]s vers %[3]s", - "many": "souhaite fusionner %[1]d révision(s) depuis %[2]s vers %[3]s", + "many": "veut fusionner %[1]d commits depuis %[2]s vers %[3]s", "other": "" }, "search.milestone_kind": "Recherche dans les jalons…", diff --git a/options/locale_next/locale_it-IT.json b/options/locale_next/locale_it-IT.json index 8bd6d811a0..8464d6244e 100644 --- a/options/locale_next/locale_it-IT.json +++ b/options/locale_next/locale_it-IT.json @@ -15,5 +15,83 @@ "home.welcome.no_activity": "Nessun'attività", "home.explore_repos": "Esplora i repositori", "home.explore_users": "Esplora l'utenza", - "home.explore_orgs": "Esplora le organizzazioni" + "home.explore_orgs": "Esplora le organizzazioni", + "mail.actions.successful_run_after_failure_subject": "Il flusso di lavoro %[1] ha ripreso a funzionare nel repositorio %[2]s", + "mail.actions.not_successful_run_subject": "Il flusso di lavoro %[1]s è fallito nel repositorio %[2]s", + "relativetime.future": "nel futuro", + "relativetime.days": { + "one": "ieri", + "many": "%d giorni fa", + "other": "%d giorni fa" + }, + "relativetime.1day": "ieri", + "repo.form.cannot_create": "Tutti gli spazi in cui puoi creare repositori hanno raggiunto il limite di repositori.", + "discussion.locked": "Questa discussione è stata bloccata. Solo i contributori possono commentare.", + "relativetime.hours": { + "one": "un'ora fa", + "many": "%d ore fa", + "other": "%d ore fa" + }, + "relativetime.2years": "due anni fa", + "relativetime.now": "adesso", + "relativetime.weeks": { + "one": "una settimana fa", + "many": "%d settimane fa", + "other": "%d settimane fa" + }, + "relativetime.months": { + "one": "un mese fa", + "many": "%d mesi fa", + "other": "%d mesi fa" + }, + "relativetime.years": { + "one": "un anno fa", + "many": "%d anni fa", + "other": "%d anni fa" + }, + "repo.issue_indexer.title": "Indicizzatore delle segnalazioni", + "admin.config.moderation_config": "Impostazioni di moderazione", + "moderation.report_abuse": "Segnala abuso", + "moderation.report_content": "Segnala contenuto", + "moderation.report_abuse_form.already_reported": "Hai già segnalato questo contenuto", + "moderation.abuse_category": "Categoria", + "moderation.abuse_category.placeholder": "Seleziona una categoria", + "moderation.abuse_category.spam": "Spam", + "moderation.abuse_category.malware": "Malware", + "moderation.abuse_category.illegal_content": "Contenuti illegali", + "moderation.abuse_category.other_violations": "Altre violazioni delle regole della piattaforma", + "moderation.report_remarks": "Note aggiuntive", + "moderation.report_remarks.placeholder": "Aggiungi dettagli riguardanti l'abuso che stai segnalando.", + "moderation.submit_report": "Invia segnalazione", + "error.not_found.title": "Pagina non trovata", + "themes.names.forgejo-auto": "Forgejo (segui le impostazioni di sistema)", + "stars.list.none": "Nessuno ha messo una stella a questo repo.", + "watch.list.none": "Nessuno sta osservando questo repo.", + "followers.incoming.list.self.none": "Nessuno sta seguendo il tuo profilo.", + "followers.incoming.list.none": "Nessuno sta seguendo questo utente.", + "followers.outgoing.list.self.none": "Non segui nessuno.", + "followers.outgoing.list.none": "%s non sta seguendo nessuno.", + "relativetime.2days": "due giorni fa", + "relativetime.2weeks": "due settimane fa", + "relativetime.1week": "la settimana scorsa", + "relativetime.1month": "il mese scorso", + "relativetime.2months": "due mesi fa", + "relativetime.1year": "l'anno scorso", + "moderation.report_abuse_form.header": "Segnala abuso all'amministratore", + "moderation.report_abuse_form.details": "Questo modulo dovrebbe essere utilizzato per segnalare utenti che creano profili, repositori, segnalazioni o commenti spam o che si comportano in modo non adeguato.", + "moderation.report_abuse_form.invalid": "Argomenti non validi", + "moderation.reporting_failed": "Impossibile inviare segnalazione: %v", + "moderation.reported_thank_you": "Grazie per la segnalazione. L'amministratore è stato avvertito.", + "mail.actions.run_info_ref": "Ramo: %[1]s (%[2]s)", + "alert.asset_load_failed": "Impossibile caricare i file di risorsa da {path}. Controlla che i file di risorsa siano accessibili.", + "install.invalid_lfs_path": "Non è possibile creare una root LFS nel percorso specificato: %[1]s", + "home.welcome.activity_hint": "Non c'è nulla nel tuo feed. Le tue azioni e le attività dei repositori che segui verranno mostrate qui.", + "relativetime.mins": { + "one": "un minuto fa", + "many": "%d minuti fa", + "other": "%d minuti fa" + }, + "editor.textarea.tab_hint": "Linea già indentata. Premi di nuovo Tab o Esc per uscire dall'editor.", + "repo.diff.commit.previous-short": "Precedente", + "meta.last_line": "Ambaraba cicci cocco." } diff --git a/options/locale_next/locale_nds.json b/options/locale_next/locale_nds.json index 9a3884a87f..24268e2082 100644 --- a/options/locale_next/locale_nds.json +++ b/options/locale_next/locale_nds.json @@ -97,5 +97,10 @@ "settings.visibility.description": "De Profil-Sichtbaarkeid maakt daar wat an, of un wo anner Lüü diene nich-privaaten Repositoriums ankieken könen. Mehr unnerhören", "avatar.constraints_hint": "Dat eegene Kontobill düür nich groter as %[1]s wesen of groter as %[2]d×%[3]d Billtüttels wesen", "repo.diff.commit.next-short": "Anner", - "repo.diff.commit.previous-short": "Vörig" + "repo.diff.commit.previous-short": "Vörig", + "feed.atom.link": "Atom-Schuuv", + "keys.ssh.link": "SSH-Slötels", + "keys.gpg.link": "GPG-Slötels", + "profile.actions.tooltip": "Mehr Aktioonen", + "profile.edit.link": "Profil bewarken" } diff --git a/options/locale_next/locale_pt-BR.json b/options/locale_next/locale_pt-BR.json index 92e140878e..1a5eca6d34 100644 --- a/options/locale_next/locale_pt-BR.json +++ b/options/locale_next/locale_pt-BR.json @@ -103,5 +103,7 @@ "editor.textarea.shift_tab_hint": "Sem indentação nesta linha. Pressione Shift + Tab novamente ou Esc para sair do editor.", "admin.dashboard.cleanup_offline_runners": "Limpar runners desconectados", "avatar.constraints_hint": "Imagem de perfil personalizada não pode exceder %[1]s em tamanho ou ser maior que %[2]dx%[3]d pixels", - "settings.visibility.description": "A visibilidade do perfil afeta a habilidade de acessarem seus repositórios não-privados. Saiba mais" + "settings.visibility.description": "A visibilidade do perfil afeta a habilidade de acessarem seus repositórios não-privados. Saiba mais", + "repo.diff.commit.next-short": "Próximo", + "repo.diff.commit.previous-short": "Anterior" } diff --git a/options/locale_next/locale_ru-RU.json b/options/locale_next/locale_ru-RU.json index 8992cc6abd..922e2612af 100644 --- a/options/locale_next/locale_ru-RU.json +++ b/options/locale_next/locale_ru-RU.json @@ -23,7 +23,7 @@ "alert.asset_load_failed": "Не удалось получить ресурсы из {path}. Убедитесь, что файлы ресурсов доступны.", "install.invalid_lfs_path": "Не удалось расположить корень LFS по указанному пути: %[1]s", "alert.range_error": " - число должно быть в диапазоне от %[1]s-%[2]s.", - "meta.last_line": "Unskip.", + "meta.last_line": "Unskip..", "mail.actions.not_successful_run_subject": "Провал раб. потока %[1]s в репозитории %[2]s", "mail.actions.successful_run_after_failure_subject": "Возобновление раб. потока %[1]s в репозитории %[2]s", "mail.actions.run_info_ref": "Ветвь: %[1]s (%[2]s)", @@ -104,6 +104,11 @@ "admin.dashboard.cleanup_offline_runners": "Удалить недоступных исполнителей", "avatar.constraints_hint": "Изображение профиля не может быть более %[1]s и крупнее %[2]dx%[3]d пикселей", "settings.visibility.description": "Видимость профиля влияет на доступ других до ваших не частных репозиториев. Подробнее", - "repo.diff.commit.previous-short": "Предыдущий", - "repo.diff.commit.next-short": "Далее" + "repo.diff.commit.previous-short": "Пред.", + "repo.diff.commit.next-short": "След.", + "profile.actions.tooltip": "Показать действия", + "feed.atom.link": "Atom-лента", + "keys.ssh.link": "Ключи SSH", + "keys.gpg.link": "Ключи GPG", + "profile.edit.link": "Изменить профиль" } diff --git a/options/locale_next/locale_uk-UA.json b/options/locale_next/locale_uk-UA.json index c3bcf5397c..33cb5a41a3 100644 --- a/options/locale_next/locale_uk-UA.json +++ b/options/locale_next/locale_uk-UA.json @@ -105,5 +105,10 @@ "settings.visibility.description": "Видимість профілю впливає на можливість інших користувачів отримати доступ до ваших неприватних репозиторіїв. Дізнатися більше", "avatar.constraints_hint": "Розмір користувацького аватара не може перевищувати %[1]s або бути більшим за %[2]d×%[3]d пікселів", "repo.diff.commit.next-short": "Наступний", - "repo.diff.commit.previous-short": "Попередній" + "repo.diff.commit.previous-short": "Попередній", + "keys.ssh.link": "Ключі SSH", + "keys.gpg.link": "Ключі GPG", + "profile.edit.link": "Редагувати профіль", + "feed.atom.link": "Стрічка Atom", + "profile.actions.tooltip": "Більше дій" } diff --git a/options/locale_next/locale_zh-CN.json b/options/locale_next/locale_zh-CN.json index e7c1bad81e..0f408997bf 100644 --- a/options/locale_next/locale_zh-CN.json +++ b/options/locale_next/locale_zh-CN.json @@ -71,5 +71,12 @@ "editor.textarea.shift_tab_hint": "此行无缩进。再次按 Shift + Tab 或按 Escape 退出编辑器。", "admin.dashboard.cleanup_offline_runners": "清理离线运行器", "settings.visibility.description": "个人资料可见性设置会影响他人对您的非私有仓库的访问。了解更多", - "avatar.constraints_hint": "自定义头像大小不得超过 %[1]s,或大于 %[2]d×%[3]d 像素" + "avatar.constraints_hint": "自定义头像大小不得超过 %[1]s,或大于 %[2]d×%[3]d 像素", + "keys.ssh.link": "SSH 密钥", + "keys.gpg.link": "GPG 密钥", + "profile.actions.tooltip": "更多操作", + "repo.diff.commit.next-short": "下个", + "repo.diff.commit.previous-short": "上个", + "feed.atom.link": "Atom 订阅源", + "profile.edit.link": "编辑个人资料" } diff --git a/options/locale_next/locale_zh-TW.json b/options/locale_next/locale_zh-TW.json index 5e3e43f66e..3ae0b00d2b 100644 --- a/options/locale_next/locale_zh-TW.json +++ b/options/locale_next/locale_zh-TW.json @@ -68,5 +68,10 @@ "moderation.report_abuse_form.details": "這個表單是用來檢舉用戶建立垃圾帳號、儲存庫、問題、留言,或其他不當行為。", "moderation.report_abuse_form.invalid": "無效參數", "moderation.report_abuse_form.already_reported": "您已檢舉此內容", - "meta.last_line": "Rubi-chan? Hai! Nani ga suki? Choko minto yori mo a・na・ta♡ Ayumu-chan? Hai! Nani ga suki? Sutoroberii fureibaa yori mo a・na・ta♡ Shiki-chan! Hai! Nani ga suki? Kukkii and kuriimu yori mo a・na・ta♡ Minna? Hai! Nani ga suki? Mochiron daisuki AiScReam." + "meta.last_line": "Rubi-chan? Hai! Nani ga suki? Choko minto yori mo a・na・ta♡ Ayumu-chan? Hai! Nani ga suki? Sutoroberii fureibaa yori mo a・na・ta♡ Shiki-chan! Hai! Nani ga suki? Kukkii and kuriimu yori mo a・na・ta♡ Minna? Hai! Nani ga suki? Mochiron daisuki AiScReam.", + "admin.dashboard.cleanup_offline_runners": "清理離線 runners", + "settings.visibility.description": "個人資料的可見度會影響他人存取您非私人儲存庫的能力。了解更多", + "avatar.constraints_hint": "自定義大頭貼的大小不得超過 %[1]s,且解析度不得大於 %[2]d×%[3]d 像素", + "repo.diff.commit.next-short": "下一個", + "repo.diff.commit.previous-short": "上一個" } From cd0fb3152cff51c1cf253da11b72f19ceba64374 Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Thu, 26 Jun 2025 11:30:48 +0200 Subject: [PATCH 018/495] [v12.0/forgejo] i18n: update of translations from Codeberg Translate (#8294) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8238 Translations update from [Codeberg Translate](https://translate.codeberg.org) for [Forgejo/forgejo](https://translate.codeberg.org/projects/forgejo/forgejo/). It also includes following components: * [Forgejo/forgejo-next](https://translate.codeberg.org/projects/forgejo/forgejo-next/) Co-authored-by: 0ko <0ko@noreply.codeberg.org> Co-authored-by: AzzyDev Co-authored-by: BarryLhm Co-authored-by: Benedikt Straub Co-authored-by: Codeberg Translate Co-authored-by: Dirk Co-authored-by: Edgarsons Co-authored-by: EssGeeEich Co-authored-by: Fjuro Co-authored-by: Juno Takano Co-authored-by: Laurent FAVOLE Co-authored-by: Outbreak2096 Co-authored-by: Shihfu Juan Co-authored-by: SomeTr Co-authored-by: VaiTon Co-authored-by: Vyxie Co-authored-by: mahlzahn Co-authored-by: xtex Co-authored-by: Codeberg Translate Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8294 Reviewed-by: Earl Warren Reviewed-by: 0ko <0ko@noreply.codeberg.org> Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- options/locale/locale_ar.ini | 20 +-- options/locale/locale_bg.ini | 20 +-- options/locale/locale_cs-CZ.ini | 26 ++-- options/locale/locale_da.ini | 20 +-- options/locale/locale_de-DE.ini | 26 ++-- options/locale/locale_el-GR.ini | 20 +-- options/locale/locale_es-ES.ini | 20 +-- options/locale/locale_fa-IR.ini | 18 +-- options/locale/locale_fi-FI.ini | 14 +- options/locale/locale_fil.ini | 93 +++++------ options/locale/locale_fr-FR.ini | 28 ++-- options/locale/locale_ga-IE.ini | 14 +- options/locale/locale_hu-HU.ini | 2 +- options/locale/locale_id-ID.ini | 2 +- options/locale/locale_is-IS.ini | 4 +- options/locale/locale_it-IT.ini | 215 ++++++++++++++++++++++---- options/locale/locale_ja-JP.ini | 20 +-- options/locale/locale_jbo.ini | 10 +- options/locale/locale_ko-KR.ini | 4 +- options/locale/locale_lv-LV.ini | 20 +-- options/locale/locale_nds.ini | 22 +-- options/locale/locale_nl-NL.ini | 20 +-- options/locale/locale_pl-PL.ini | 20 +-- options/locale/locale_pt-BR.ini | 31 ++-- options/locale/locale_pt-PT.ini | 20 +-- options/locale/locale_ru-RU.ini | 22 +-- options/locale/locale_si-LK.ini | 16 +- options/locale/locale_sr-SP.ini | 2 +- options/locale/locale_sv-SE.ini | 14 +- options/locale/locale_tr-TR.ini | 18 +-- options/locale/locale_uk-UA.ini | 39 ++--- options/locale/locale_zh-CN.ini | 31 ++-- options/locale/locale_zh-HK.ini | 2 +- options/locale/locale_zh-TW.ini | 22 +-- options/locale_next/locale_de-DE.json | 7 +- options/locale_next/locale_fil.json | 12 +- options/locale_next/locale_fr-FR.json | 2 +- options/locale_next/locale_it-IT.json | 80 +++++++++- options/locale_next/locale_nds.json | 7 +- options/locale_next/locale_pt-BR.json | 4 +- options/locale_next/locale_ru-RU.json | 11 +- options/locale_next/locale_uk-UA.json | 7 +- options/locale_next/locale_zh-CN.json | 9 +- options/locale_next/locale_zh-TW.json | 7 +- 44 files changed, 654 insertions(+), 367 deletions(-) diff --git a/options/locale/locale_ar.ini b/options/locale/locale_ar.ini index f4ac1a0e3d..15d614e8bc 100644 --- a/options/locale/locale_ar.ini +++ b/options/locale/locale_ar.ini @@ -699,7 +699,7 @@ issues.filter_milestone_all = كل الأهداف issues.unlock.notice_2 = - يمكنك دوما إقفال هذه المسألة من جديد في المستقبل. issues.num_participants_few = %d متحاور release.title = عنوان الإصدار -issues.closed_at = `أغلق هذه المسألة %[2]s` +issues.closed_at = `أغلق هذه المسألة %s` issues.lock.title = إقفال التحاور في هذه المسألة. issues.new.no_label = بلا تصنيف issues.filter_sort.mostforks = الأعلى اشتقاقا @@ -759,7 +759,7 @@ branch.renamed = غُيّر اسم الفرع %s إلى %s. delete_preexisting = احذف الملفات الموجودة سابقا branch.included_desc = هذا الفرع جزء من الفرع المبدئي trust_model_helper_collaborator_committer = مشترك+مودع: ثق بتوقيعات المشتركين التي تطابق المودع -issues.reopened_at = `أعاد فتح هذه المسألة %[2]s` +issues.reopened_at = `أعاد فتح هذه المسألة %s` issues.action_milestone = هدف issues.new.assignees = المكلَّفون release.tag_name_protected = اسم الوسم محمي. @@ -1166,7 +1166,7 @@ pulls.status_checking = في انتظار بعض الفحوص pulls.status_checks_failure = بعض الفحوص فشلت pulls.status_checks_success = جميع الفحوص ناجحة pulls.status_checks_warning = بعض الفحوص تعطي تحذيرات -pulls.commit_ref_at = `أشار إلى طلب الدمج من إيداع %[2]s` +pulls.commit_ref_at = `أشار إلى طلب الدمج من إيداع %s` pulls.cmd_instruction_hint = `أظهر شرح استخدام سطر الأوامر.` pulls.cmd_instruction_checkout_title = اسحب pulls.cmd_instruction_checkout_desc = من مستودع مشروعك، اسحب (check out) فرعا جديدا واختبر التغييرات. @@ -1257,8 +1257,8 @@ pulls.status_checks_details = تفاصيل pulls.status_checks_hide_all = أخفِ كل الفحوص pulls.status_checks_show_all = أظهر كل الفحوص pulls.close = أغلق طلب الدمج -pulls.closed_at = `أغلق طلب الدمج %[2]s` -pulls.reopened_at = `أعاد فتح طلب الدمج %[2]s` +pulls.closed_at = `أغلق طلب الدمج %s` +pulls.reopened_at = `أعاد فتح طلب الدمج %s` milestones.title = العنوان milestones.desc = الوصف milestones.edit = عدّل الهدف @@ -1302,11 +1302,11 @@ issues.closed_by_fake = من %[2]s أُغلقت %[1]s issues.num_comments_1 = %d تعليق issues.num_comments = %d تعليقا issues.commented_at = `علّق %s` -issues.commit_ref_at = `أشار إلى هذه المسألة من إيداع %[2]s` -issues.ref_issue_from = `أشار إلى هذه المسألة %[4]s %[2]s` -issues.ref_pull_from = `أشار إلى هذا الطلب %[4]s %[2]s` -issues.ref_closing_from = `أشار إلى طلب دمج %[4]s سيغلق هذه المسألة %[2]s` -issues.ref_reopening_from = `أشار إلى طلب دمج %[4]s سيعيد فتح هذه المسألة %[2]s` +issues.commit_ref_at = `أشار إلى هذه المسألة من إيداع %s` +issues.ref_issue_from = `أشار إلى هذه المسألة %[3]s %[1]s` +issues.ref_pull_from = `أشار إلى هذا الطلب %[3]s %[1]s` +issues.ref_closing_from = `أشار إلى طلب دمج %[3]s سيغلق هذه المسألة %[1]s` +issues.ref_reopening_from = `أشار إلى طلب دمج %[3]s سيعيد فتح هذه المسألة %[1]s` issues.ref_closed_from = `أغلق هذه المسألة %[4]s %[2]s` issues.ref_reopened_from = `أعاد فتح هذه المسألة %[4]s %[2]s` issues.reference_issue.body = المحتوى diff --git a/options/locale/locale_bg.ini b/options/locale/locale_bg.ini index abce4f1133..1b9767f674 100644 --- a/options/locale/locale_bg.ini +++ b/options/locale/locale_bg.ini @@ -749,7 +749,7 @@ settings.admin_settings = Администраторски настройки issues.role.owner = Притежател settings.transfer.title = Прехвърляне на притежанието issues.author = Автор -issues.closed_at = `затвори тази задача %[2]s` +issues.closed_at = `затвори тази задача %s` settings.collaborator_deletion_desc = Премахването на сътрудник ще отнеме достъпа му до това хранилище. Продължаване? commits.message = Съобщение issues.due_date_not_set = Няма зададен краен срок. @@ -773,9 +773,9 @@ issues.filter_type.all_issues = Всички задачи issues.filter_poster_no_select = Всички автори issues.opened_by = отворена %[1]s от %[3]s issues.action_open = Отваряне -pulls.closed_at = `затвори тази заявка за сливане %[2]s` -pulls.reopened_at = `отвори наново тази заявка за сливане %[2]s` -issues.reopened_at = `отвори наново тази задача %[2]s` +pulls.closed_at = `затвори тази заявка за сливане %s` +pulls.reopened_at = `отвори наново тази заявка за сливане %s` +issues.reopened_at = `отвори наново тази задача %s` projects.column.edit = Редактиране на колоната issues.close = Затваряне на задачата issues.ref_reopened_from = `отвори наново тази задача %[4]s %[2]s` @@ -1205,7 +1205,7 @@ issues.dependency.cancel = Отказ issues.dependency.add_error_dep_exists = Зависимостта вече съществува. issues.dependency.add_error_dep_not_exist = Зависимостта не съществува. issues.remove_ref_at = `премахна препратката %s %s` -issues.ref_pull_from = `спомена тази заявка за сливане %[4]s %[2]s` +issues.ref_pull_from = `спомена тази заявка за сливане %[3]s %[1]s` issues.dependency.pr_no_dependencies = Няма зададени зависимости. issues.dependency.remove_info = Премахване на тази зависимост issues.dependency.removed_dependency = `премахна зависимостта %s` @@ -1230,11 +1230,11 @@ issues.dependency.title = Зависимости issues.dependency.issue_no_dependencies = Няма зададени зависимости. issues.dependency.pr_close_blocked = Трябва да затворите всички задачи, блокиращи тази заявка за сливане, преди да можете да я слеете. issues.dependency.pr_close_blocks = Тази заявка за сливане блокира затварянето на следните задачи -issues.ref_issue_from = `спомена тази задача %[4]s %[2]s` -issues.commit_ref_at = `спомена тази задача в подаване %[2]s` +issues.ref_issue_from = `спомена тази задача %[3]s %[1]s` +issues.commit_ref_at = `спомена тази задача в подаване %s` issues.add_ref_at = `добави препратка %s %s` pulls.merged_info_text = Клонът %s вече може да бъде изтрит. -pulls.commit_ref_at = `спомена тази заявка за сливане в подаване %[2]s` +pulls.commit_ref_at = `спомена тази заявка за сливане в подаване %s` issues.change_ref_at = `промени препратката от %s на %s %s` diff.review.reject = Поискване на промени diff.bin_not_shown = Двоичният файл не е показан. @@ -1299,9 +1299,9 @@ branch.create_new_branch = Създаване на клон от клон: pulls.status_checks_show_all = Показване на всички проверки size_format = %[1]s: %[2]s; %[3]s: %[4]s pulls.filter_changes_by_commit = Филтриране по подаване -issues.ref_closing_from = `спомена тази задача в заявка за сливане %[4]s, която ще я затвори, %[2]s` +issues.ref_closing_from = `спомена тази задача в заявка за сливане %[3]s, която ще я затвори, %[1]s` issues.ref_from = `от %[1]s` -issues.ref_reopening_from = `спомена тази задача в заявка за сливане %[4]s, която ще я отвори наново , %[2]s` +issues.ref_reopening_from = `спомена тази задача в заявка за сливане %[3]s, която ще я отвори наново , %[1]s` issues.draft_title = Чернова pulls.reopen_to_merge = Моля, отворете наново тази заявка за сливане, за да извършите сливане. pulls.cant_reopen_deleted_branch = Тази заявка за сливане не може да бъде отворена наново, защото клонът е изтрит. diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index 9448dd8e7e..830065fb64 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -1633,13 +1633,13 @@ issues.opened_by_fake=otevřeno %[1]s uživatelem %[2]s issues.closed_by_fake=od %[2]s byl uzavřen %[1]s issues.previous=Předchozí issues.next=Další -issues.open_title=Otevřeno -issues.closed_title=Uzavřeno +issues.open_title=Otevřené +issues.closed_title=Uzavřené issues.draft_title=Koncept issues.num_comments_1=%d komentář issues.num_comments=%d komentářů issues.commented_at=`okomentoval/a %s` -issues.delete_comment_confirm=Jste si jist, že chcete smazat tento komentář? +issues.delete_comment_confirm=Opravdu chcete smazat tento komentář? issues.context.copy_link=Kopírovat odkaz issues.context.quote_reply=Citovat odpověď issues.context.reference_issue=Odkázat v novém problému @@ -1653,13 +1653,13 @@ issues.close_comment_issue=Zavřít s komentářem issues.reopen_issue=Znovu otevřít issues.reopen_comment_issue=Znovu otevřít s komentářem issues.create_comment=Komentovat -issues.closed_at=`uzavřel/a tento problém %[2]s` -issues.reopened_at=`znovu otevřel/a tento problém %[2]s` -issues.commit_ref_at=`odkázal/a na tento problém z revize %[2]s` -issues.ref_issue_from=`odkázal/a na tento problém %[4]s %[2]s` -issues.ref_pull_from=`odkázal/a na tuto žádost o sloučení %[4]s %[2]s` -issues.ref_closing_from=`odkazoval/a na tento problém ze žádosti o sloučení %[4]s, která jej uzavře, %[2]s` -issues.ref_reopening_from=`odkazoval/a na tento problém ze žádosti o sloučení %[4]s, která jej znovu otevře, %[2]s` +issues.closed_at=`uzavřel/a tento problém %s` +issues.reopened_at=`znovu otevřel/a tento problém %s` +issues.commit_ref_at=`odkázal/a na tento problém z revize %s` +issues.ref_issue_from=`odkázal/a na tento problém %[3]s %[1]s` +issues.ref_pull_from=`odkázal/a na tuto žádost o sloučení %[3]s %[1]s` +issues.ref_closing_from=`odkázal/a na tento problém ze žádosti o sloučení %[3]s, která jej uzavře, %[1]s` +issues.ref_reopening_from=`odkázal/a na tento problém ze žádosti o sloučení %[3]s, která jej znovu otevře, %[1]s` issues.ref_closed_from=`uzavřel/a tento problém %[4]s %[2]s` issues.ref_reopened_from=`znovu otevřel/a tento problém %[4]s %[2]s` issues.ref_from=`z %[1]s` @@ -1966,8 +1966,8 @@ pulls.update_branch_success=Aktualizace větve byla úspěšná pulls.update_not_allowed=Nemáte oprávnění aktualizovat větev pulls.outdated_with_base_branch=Tato větev je zastaralá oproti základní větvi pulls.close=Zavřít žádost o sloučení -pulls.closed_at=`uzavřel/a tuto žádost o sloučení %[2]s` -pulls.reopened_at=`znovu otevřel/a tuto žádost o sloučení %[2]s` +pulls.closed_at=`uzavřel/a tuto žádost o sloučení %s` +pulls.reopened_at=`znovu otevřel/a tuto žádost o sloučení %s` 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 @@ -2758,7 +2758,7 @@ settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning = Tuto ak settings.new_owner_blocked_doer = Nový majitel vás zablokoval. settings.mirror_settings.pushed_repository = Odeslaný repozitář settings.add_collaborator_blocked_our = Nepodařilo se přidat spolupracovníka, jelikož byl zablokován majitelem repozitáře. -pulls.commit_ref_at = `se odkázal/a na tuto žádost o sloučení z revize %[2]s` +pulls.commit_ref_at = `odkázal/a na tuto žádost o sloučení z revize %s` settings.wiki_rename_branch_main = Normalizovat název větve wiki settings.wiki_rename_branch_main_desc = Přejmenovat větev interně používanou pro wiki na „%s“. Tato změna je trvalá a nelze ji vrátit. pulls.fast_forward_only_merge_pull_request = Pouze zrychlené diff --git a/options/locale/locale_da.ini b/options/locale/locale_da.ini index ea22f49e77..c82779ab60 100644 --- a/options/locale/locale_da.ini +++ b/options/locale/locale_da.ini @@ -1520,15 +1520,15 @@ issues.add_labels = tilføjede %s etiketterne %s issues.add_remove_labels = tilføjede %s og fjernede %s etiketter %s issues.add_milestone_at = `føjede dette til %s milepælen %s` issues.add_project_at = `føjede dette til %s- projektet %s` -issues.ref_reopening_from = `henviste til dette problem fra en pull-anmodning %[4]s, der vil genåbne den, %[2]s` +issues.ref_reopening_from = `henviste til dette problem fra en pull-anmodning %[3]s, der vil genåbne den, %[1]s` issues.ref_closed_from = `lukkede dette problem %[4]s %[2 ]s` issues.ref_reopened_from = `genåbnede dette problem %[4]s %[2 ]s` issues.ref_from = `fra %[1]s` issues.author = Forfatter -issues.commit_ref_at = `henviste til dette problem fra en commit %[2]s` -issues.ref_issue_from = `henviste til dette problem %[4]s %[2 ]s` -issues.ref_pull_from = `henviste til denne pull-anmodning %[4]s %[ 2]s` -issues.ref_closing_from = `henviste til dette problem fra en pull-anmodning %[4]s, der vil lukke det, %[2]s` +issues.commit_ref_at = `henviste til dette problem fra en commit %s` +issues.ref_issue_from = `henviste til dette problem %[3]s %[2 ]s` +issues.ref_pull_from = `henviste til denne pull-anmodning %[3]s %[1]s` +issues.ref_closing_from = `henviste til dette problem fra en pull-anmodning %[3]s, der vil lukke det, %[1]s` issues.author.tooltip.issue = Denne bruger er forfatteren til dette problem. issues.author.tooltip.pr = Denne bruger er forfatteren af denne pull-anmodning. issues.role.owner = Ejer @@ -1564,8 +1564,8 @@ issues.reaction.alt_add = Tilføj %[1]s reaktion til kommentar. issues.context.menu = Kommentar menu issues.reopen_comment_issue = Genåbner med kommentar issues.create_comment = Kommentar -issues.closed_at = `lukkede dette problem %[2]s` -issues.reopened_at = `genåbnede dette problem %[2]s` +issues.closed_at = `lukkede dette problem %s` +issues.reopened_at = `genåbnede dette problem %s` issues.remove_label = fjernede %s etiketten %s issues.remove_labels = fjernede %s etiketterne %s issues.change_project_at = `modificerede projektet fra %s til %s %s` @@ -1911,10 +1911,10 @@ pulls.editable_explanation = Denne pull-anmodning tillader redigeringer fra vedl pulls.auto_merge_button_when_succeed = (Når kontroller lykkes) pulls.status_checks_requested = Påkrævet pulls.close = Luk pull anmodning -pulls.commit_ref_at = `henviste til denne pull-anmodning fra en commit %[2]s` +pulls.commit_ref_at = `henviste til denne pull-anmodning fra en commit %s` pulls.cmd_instruction_hint = Se instruktionerne på kommandolinjen -pulls.reopened_at = `genåbnede denne pull-anmodning %[2]s` -pulls.closed_at = `lukkede denne pull-anmodning %[2]s` +pulls.reopened_at = `genåbnede denne pull-anmodning %s` +pulls.closed_at = `lukkede denne pull-anmodning %s` pulls.cmd_instruction_checkout_desc = Fra dit projektdepot, tjek en ny gren og test ændringerne. pulls.editable = Redigerbar pulls.made_using_agit = AGit diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 829912b3cc..f8bfc9258a 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -1577,7 +1577,7 @@ issues.remove_ref_at=`hat die Referenz %s %s entfernt` issues.add_ref_at=`hat die Referenz %s %s hinzugefügt` issues.delete_branch_at=`löschte den Branch %s %s` issues.filter_label=Label -issues.filter_label_exclude=`Alt + Klick/Enter verwenden, um Labels auszuschließen` +issues.filter_label_exclude=`Verwende Alt + Klick/Enter, um Labels auszuschließen` issues.filter_label_no_select=Alle Labels issues.filter_label_select_no_label=Kein Label issues.filter_milestone=Meilenstein @@ -1651,13 +1651,13 @@ issues.close_comment_issue=Mit Kommentar schließen issues.reopen_issue=Wieder öffnen issues.reopen_comment_issue=Mit Kommentar wieder öffnen issues.create_comment=Kommentieren -issues.closed_at=`hat diesen Issue %[2]s geschlossen` -issues.reopened_at=`hat dieses Issue %[2]s wieder geöffnet` -issues.commit_ref_at=`hat dieses Issue %[2]s aus einem Commit referenziert` -issues.ref_issue_from=`hat %[2]s auf dieses Issue verwiesen %[4]s` -issues.ref_pull_from=`hat %[2]s auf diesen Pull-Request verwiesen %[4]s` -issues.ref_closing_from=`hat %[2]s in einem Pull-Request %[4]s auf dieses Issue verwiesen, welcher es schließen wird` -issues.ref_reopening_from=`hat %[2]s in einem Pull-Request %[4]s auf dieses Issue verwiesen, welcher es erneut öffnen wird` +issues.closed_at=`hat dieses Issue %s geschlossen` +issues.reopened_at=`hat dieses Issue %s wieder geöffnet` +issues.commit_ref_at=`hat dieses Issue %s aus einem Commit referenziert` +issues.ref_issue_from=`hat %[1]s auf dieses Issue verwiesen %[3]s` +issues.ref_pull_from=`referenzierte diesen Pull-Request %[3]s %[1]s` +issues.ref_closing_from=`referenzierte dieses Issue aus einem Pull-Request %[3]s der es schließen wird, %[1]s` +issues.ref_reopening_from=`referenzierte dieses Issue aus einem Pull-Request %[3]s der es wieder öffnen wird, %[1]s` issues.ref_closed_from=`hat dieses Issue %[4]s geschlossen %[2]s` issues.ref_reopened_from=`hat dieses Issue %[4]s %[2]s wieder geöffnet` issues.ref_from=`von %[1]s` @@ -1962,8 +1962,8 @@ pulls.update_branch_success=Branch-Aktualisierung erfolgreich pulls.update_not_allowed=Du hast keine Berechtigung, den Branch zu updaten pulls.outdated_with_base_branch=Dieser Branch enthält nicht die neusten Commits des Basis-Branches pulls.close=Pull-Request schließen -pulls.closed_at=`hat diesen Pull-Request %[2]s geschlossen` -pulls.reopened_at=`hat diesen Pull-Request %[2]s wieder geöffnet` +pulls.closed_at=`hat diesen Pull-Request %s geschlossen` +pulls.reopened_at=`hat diesen Pull-Request %s wieder geöffnet` pulls.clear_merge_message=Merge-Nachricht löschen pulls.clear_merge_message_hint=Das Löschen der Merge-Nachricht wird nur den Inhalt der Commit-Nachricht entfernen und generierte Git-Trailer wie „Co-Authored-By …“ erhalten. @@ -2767,7 +2767,7 @@ settings.wiki_globally_editable = Allen erlauben, das Wiki zu bearbeiten settings.protect_branch_name_pattern_desc = Geschützte Branch-Namens-Patterns. Siehe die Dokumentation für Pattern-Syntax. Beispiele: main, release/** settings.ignore_stale_approvals = Abgestandene Genehmigungen ignorieren settings.ignore_stale_approvals_desc = Genehmigungen, welche für ältere Commits gemacht wurden (abgestandene Reviews), nicht in die Gesamtzahl der Genehmigung des PRs mitzählen. Irrelevant, falls abgestandene Reviews bereits verworfen werden. -pulls.commit_ref_at = `hat sich auf diesen Pull-Request von einem Commit %[2]s bezogen` +pulls.commit_ref_at = `referenzierte diesen Pull-Request aus einem Commit %s` pulls.fast_forward_only_merge_pull_request = Nur Fast-forward pulls.cmd_instruction_checkout_desc = Checke einen neuen Branch aus deinem Projekt-Repository aus und teste die Änderungen. pulls.cmd_instruction_merge_title = Zusammenführen @@ -3061,8 +3061,8 @@ teams.invite.by=Von %s eingeladen teams.invite.description=Bitte klicke auf die folgende Schaltfläche, um dem Team beizutreten. follow_blocked_user = Du kannst dieser Organisation nicht folgen, weil diese Organisation dich blockiert hat. open_dashboard = Übersicht öffnen -settings.change_orgname_redirect_prompt.with_cooldown.one = Der alte Organisationsname ist nach einer Abkühldauer von einem Tag wieder für alle verfügbar. Du kannst den alten Namen während dieser Abkühldauer erneut beanspruchen. -settings.change_orgname_redirect_prompt.with_cooldown.few = Der alte Organisationsname ist nach einer Abkühldauer von %[1]d Tagen wieder für alle verfügbar. Du kannst den alten Namen während dieser Abkühldauer erneut beanspruchen. +settings.change_orgname_redirect_prompt.with_cooldown.one = Der alte Organisationsname ist nach einer Schutzzeit von einem Tag wieder für alle verfügbar. Du kannst den alten Namen während dieser Schutzzeit erneut beanspruchen. +settings.change_orgname_redirect_prompt.with_cooldown.few = Der alte Organisationsname ist nach einer Schutzzeit von %[1]d Tagen wieder für alle verfügbar. Du kannst den alten Namen während dieser Schutzzeit erneut beanspruchen. [admin] dashboard=Übersicht diff --git a/options/locale/locale_el-GR.ini b/options/locale/locale_el-GR.ini index 29085aebf1..398a0d9ce4 100644 --- a/options/locale/locale_el-GR.ini +++ b/options/locale/locale_el-GR.ini @@ -1626,13 +1626,13 @@ issues.close_comment_issue=Αποστολή σχολίου και κλείσιμ issues.reopen_issue=Ανοίξτε ξανά issues.reopen_comment_issue=Αποστολή σχολίου και επανάνοιγμα ζητήματος issues.create_comment=Προσθήκη Σχολίου -issues.closed_at=`αυτό το ζήτημα έκλεισε %[2]s` -issues.reopened_at=`ξανά άνοιξε αυτό το ζήτημα %[2]s` -issues.commit_ref_at=`αναφορά σε αυτό το ζήτημα από την παραπομπή %[2]s` -issues.ref_issue_from=`αναφέρθηκε σε αυτό το ζήτημα %[4]s %[2]s` -issues.ref_pull_from=`αναφέρθηκε σε αυτό το pull request %[4]s %[2]s` -issues.ref_closing_from=`ανέφερε αυτό το ζήτημα σε ένα pull request %[4]s που στοχεύει να κλείσει το ζήτημα %[2]s` -issues.ref_reopening_from=`αναφέρθηκε σε αυτό το ζήτημα σε ένα pull request %[4]s που θα ξαναανοίξει αυτό το ζήτημα %[2]s` +issues.closed_at=`αυτό το ζήτημα έκλεισε %s` +issues.reopened_at=`ξανά άνοιξε αυτό το ζήτημα %s` +issues.commit_ref_at=`αναφορά σε αυτό το ζήτημα από την παραπομπή %s` +issues.ref_issue_from=`αναφέρθηκε σε αυτό το ζήτημα %[3]s %[1]s` +issues.ref_pull_from=`αναφέρθηκε σε αυτό το pull request %[3]s %[1]s` +issues.ref_closing_from=`ανέφερε αυτό το ζήτημα σε ένα pull request %[3]s που στοχεύει να κλείσει το ζήτημα %[1]s` +issues.ref_reopening_from=`αναφέρθηκε σε αυτό το ζήτημα σε ένα pull request %[3]s που θα ξαναανοίξει αυτό το ζήτημα %[1]s` issues.ref_closed_from=`έκλεισε αυτό το ζήτημα %[4]s %[2]s` issues.ref_reopened_from=`άνοιξε ξανά αυτό το ζήτημα %[4]s %[2]s` issues.ref_from=`από %[1]s` @@ -1939,8 +1939,8 @@ pulls.update_branch_success=Η ενημέρωση του κλάδου ήταν pulls.update_not_allowed=Δεν επιτρέπεται να ενημερώσετε τον κλάδο pulls.outdated_with_base_branch=Αυτός ο κλάδος δεν είναι ενημερωμένος με τον βασικό κλάδο pulls.close=Κλείσιμο pull request -pulls.closed_at=`έκλεισε αυτό το pull request %[2]s` -pulls.reopened_at=`άνοιξε ξανά αυτό το pull request %[2]s` +pulls.closed_at=`έκλεισε αυτό το pull request %s` +pulls.reopened_at=`άνοιξε ξανά αυτό το pull request %s` pulls.cmd_instruction_hint=Προβολή οδηγιών γραμμής εντολών pulls.cmd_instruction_checkout_title=Έλεγχος pulls.cmd_instruction_checkout_desc=Από το repository του έργου σας, ελέγξτε έναν νέο κλάδο και δοκιμάστε τις αλλαγές. @@ -2720,7 +2720,7 @@ settings.new_owner_blocked_doer = Ο νέος κάτοχος του αποθετ settings.enter_repo_name = Γράψτε το όνομα του κατόχου και του αποθετηρίου ακριβώς όπως το βλέπετε: settings.confirmation_string = Κείμενο επιβεβαίωσης settings.units.overview = Επισκόπηση -pulls.commit_ref_at = `ανέφερε το pull request στο commit %[2]s` +pulls.commit_ref_at = `ανέφερε το pull request στο commit %s` contributors.contribution_type.filter_label = Είδος συνεισφοράς: settings.wiki_rename_branch_main_notices_1 = Αυτή η ενέργεια ΔΕΝ αναιρείται. activity.navbar.contributors = Συνεισφέροντες diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini index f912409cc9..bdafba93b4 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -1648,13 +1648,13 @@ issues.close_comment_issue=Cerrar con comentario issues.reopen_issue=Reabrir issues.reopen_comment_issue=Reabrir con comentario issues.create_comment=Comentar -issues.closed_at=`cerró esta incidencia %[2]s` -issues.reopened_at=`reabrió esta incidencia %[2]s` -issues.commit_ref_at=`referenció esta incidencia en un commit %[2]s` -issues.ref_issue_from=`referenció esta incidencia %[4]s %[2]s` -issues.ref_pull_from=`referenció este pull request %[4]s %[2]s` -issues.ref_closing_from=`hizo referencia a esta incidencia desde un pull request %[4]s que lo cerrará , %[2]s` -issues.ref_reopening_from=`hizo referencia a esta incidencia desde un pull request %[4]s que lo reabrirá, %[2]s` +issues.closed_at=`cerró esta incidencia %s` +issues.reopened_at=`reabrió esta incidencia %s` +issues.commit_ref_at=`referenció esta incidencia en un commit %s` +issues.ref_issue_from=`referenció esta incidencia %[3]s %[1]s` +issues.ref_pull_from=`referenció este pull request %[3]s %[1]s` +issues.ref_closing_from=`hizo referencia a esta incidencia desde un pull request %[3]s que lo cerrará , %[1]s` +issues.ref_reopening_from=`hizo referencia a esta incidencia desde un pull request %[3]s que lo reabrirá, %[1]s` issues.ref_closed_from=`cerró esta incidencia %[4]s %[2]s` issues.ref_reopened_from=`reabrió esta incidencia %[4]s %[2]s` issues.ref_from=`de %[1]s` @@ -1959,8 +1959,8 @@ pulls.update_branch_success=La actualización de la rama ha finalizado correctam pulls.update_not_allowed=No tiene permisos para actualizar esta rama pulls.outdated_with_base_branch=Esta rama está desactualizada con la rama base pulls.close=Cerrar pull request -pulls.closed_at=`cerró este pull request %[2]s` -pulls.reopened_at=`reabrió este pull request %[2]s` +pulls.closed_at=`cerró este pull request %s` +pulls.reopened_at=`reabrió este pull request %s` pulls.clear_merge_message=Borrar mensaje de fusión pulls.clear_merge_message_hint=Limpiar el mensaje de fusión solo eliminará el contenido del mensaje de commit y mantendrá frases generadas como "Co-Autorizado por …". @@ -2789,7 +2789,7 @@ pulls.status_checks_hide_all = Ocultar todas las verificaciones settings.federation_not_enabled = La federación no está habilitada en tu instancia. wiki.search = Buscar en wiki pulls.status_checks_show_all = Mostrar todas las verificaciones -pulls.commit_ref_at = `hizo referencia a este pull request desde un commit %[2]s` +pulls.commit_ref_at = `hizo referencia a este pull request desde un commit %s` pulls.cmd_instruction_merge_title = Fusionar contributors.contribution_type.deletions = Eliminaciones contributors.contribution_type.filter_label = Tipo de contribución: diff --git a/options/locale/locale_fa-IR.ini b/options/locale/locale_fa-IR.ini index 804b48b2b2..dae0695495 100644 --- a/options/locale/locale_fa-IR.ini +++ b/options/locale/locale_fa-IR.ini @@ -1250,13 +1250,13 @@ issues.close_comment_issue=ثبت دیدگاه و بستن issues.reopen_issue=بازگشایی issues.reopen_comment_issue=ثبت دیدگاه و بازگشایی issues.create_comment=دیدگاه -issues.closed_at=`%[2]s این موضوع را بست` -issues.reopened_at=`%[2]s این موضوع را دوباره باز کرد` -issues.commit_ref_at=`ارجاع این مسئله به کامیت %[2]s` -issues.ref_issue_from=` ارجاعات این مسائله %[4] %[2]s` -issues.ref_pull_from=` ارجاعات این تقاضای ادغام %[4] %[2]s` -issues.ref_closing_from=` ارجاعات این تقاضای واکشی %[4] %[2]s` -issues.ref_reopening_from=` تقاضای واکشی ارجاع شده %[4] که مسائله بازگشایی خواهد کرد %[2] ` +issues.closed_at=`%s این موضوع را بست` +issues.reopened_at=`%s این موضوع را دوباره باز کرد` +issues.commit_ref_at=`ارجاع این مسئله به کامیت %s` +issues.ref_issue_from=` ارجاعات این مسائله %[3] %[1]s` +issues.ref_pull_from=` ارجاعات این تقاضای ادغام %[4] %[1]s` +issues.ref_closing_from=` ارجاعات این تقاضای واکشی %[4] %[1]s` +issues.ref_reopening_from=` تقاضای واکشی ارجاع شده %[3]sکه مسائله بازگشایی خواهد کرد %[2] ` issues.ref_closed_from=` بسته شده این مسائله %[4] %[2]s` issues.ref_reopened_from=` بازگشایی این مسائله %[4] %[2]s` issues.ref_from=`از %[1]` @@ -1493,8 +1493,8 @@ pulls.update_branch_rebase=بروزآوری شاخه با بازسازی مجد pulls.update_branch_success=شاخه به موفقیت بروز شد pulls.update_not_allowed=شما اجازه بروزرسانی شاخه را ندارید pulls.outdated_with_base_branch=این شاخه با شاخه پایه منسوخ شده است -pulls.closed_at=`این درخواست pull بسته شده %[2]s` -pulls.reopened_at=`این درخواست pull را بازگشایی کرد %[2]s` +pulls.closed_at=`این درخواست pull بسته شده %s` +pulls.reopened_at=`این درخواست pull را بازگشایی کرد %s` diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini index cff940a05a..164a60cc8d 100644 --- a/options/locale/locale_fi-FI.ini +++ b/options/locale/locale_fi-FI.ini @@ -1293,9 +1293,9 @@ issues.close_comment_issue=Kommentoi ja sulje issues.reopen_issue=Avaa uudelleen issues.reopen_comment_issue=Kommentoi ja avaa uudelleen issues.create_comment=Kommentoi -issues.closed_at=`sulki tämän ongelman %[2]s` -issues.reopened_at=`uudelleenavasi tämän ongelman %[2]s` -issues.commit_ref_at=`viittasi tähän ongelmaan kommitissa %[2]s` +issues.closed_at=`sulki tämän ongelman %s` +issues.reopened_at=`uudelleenavasi tämän ongelman %s` +issues.commit_ref_at=`viittasi tähän ongelmaan kommitissa %s` issues.author=Tekijä issues.role.owner=Omistaja issues.role.member=Jäsen @@ -2185,7 +2185,7 @@ settings.confirmation_string = Vahvistusteksti settings.delete_notices_2 = - Tämä toiminto poistaa pysyvästi tietovaraston %s mukaan lukien koodin, ongelmat, kommentit, wikidatan ja avustaja-asetukset. issues.filter_assginee_no_select = Kaikki käsittelijät issues.new.assign_to_me = Osoita itselle -pulls.closed_at = `sulki tämän vetopyynnön %[2]s` +pulls.closed_at = `sulki tämän vetopyynnön %s` tree_path_not_found_branch = Polkua %[1]s ei ole olemassa haarassa %[2]s transfer.no_permission_to_reject = Sinulla ei ole oikeutta hylätä tätä siirtoa. generate_repo = Luo tietovarasto @@ -2199,8 +2199,8 @@ issues.new.no_reviewers = Ei katselmoijia issues.add_label = lisäsi nimilapun %s %s issues.due_date_added = lisäsi eräpäivän %s %s issues.review.add_review_request = pyysi katselmointia käyttäjältä %[1]s %[2]s -issues.ref_pull_from = `viittasi tähän vetopyyntöön %[4]s %[2]s` -pulls.commit_ref_at = `viittasi tähän vetopyyntöön kommitista %[2]s` +issues.ref_pull_from = `viittasi tähän vetopyyntöön %[3]s %[1]s` +pulls.commit_ref_at = `viittasi tähän vetopyyntöön kommitista %s` issues.review.comment = katselmoi %s issues.add_labels = lisäsi nimilaput %s %s issues.review.add_review_requests = pyysi katselmointeja käyttäjiltä %[1]s %[2]s @@ -2381,7 +2381,7 @@ wiki.page_name_desc = Kirjoita tämän wikisivun nimi. Joitain erikoisnimiä ova pulls.blocked_by_changed_protected_files_1 = Tämä vetopyyntö sisältää suojatun tiedoston ja on siksi estetty: pulls.status_checks_warning = Jotkin tarkistukset raportoivat varoituksia pulls.status_checks_error = Jotkin tarkistukset raportoivat virheitä -pulls.reopened_at = `avasi uudelleen tämän vetopyynnön %[2]s` +pulls.reopened_at = `avasi uudelleen tämän vetopyynnön %s` pulls.auto_merge_when_succeed = Yhdistä automaatisesti kun kaikki tarkistukset onnistuvat signing.wont_sign.error = Tapahtui virhe tarkistaessa voiko kommitin allekirjoittaa. signing.wont_sign.twofa = Sinulla tulee olla kaksivaiheinen todennus käytössä, jotta kommitit voi allekirjoittaa. diff --git a/options/locale/locale_fil.ini b/options/locale/locale_fil.ini index 7d1405f633..8c9badb04b 100644 --- a/options/locale/locale_fil.ini +++ b/options/locale/locale_fil.ini @@ -365,7 +365,7 @@ table_modal.label.columns = Mga Column link_modal.header = Magdagdag ng link link_modal.url = Url link_modal.description = Deskripsyon -link_modal.paste_reminder = Pahiwatig: Kapag may URL sa clipboard, maari mong direktang i-paste sa editor para gumawa ng link. +link_modal.paste_reminder = Pahiwatig: Kapag may URL sa clipboard, maaari mong direktang i-paste sa editor para gumawa ng link. [filter] string.asc = A - Z @@ -432,7 +432,7 @@ openid_connect_desc = Ang piniling OpenID URI ay hindi alam. Iugnay iyan sa bago invalid_code = Ang iyong confirmation code ay hindi wasto o nag-expire na. oauth_signin_title = Mag-sign in para pahintulutan ang naka-link na account invalid_code_forgot_password = Ang iyong confirmation code ay hindi wasto o nag-expire na. Mag-click dito para magsimula ng bagong session. -confirmation_mail_sent_prompt = Ang isang bagong email na pang-kumpirma ay ipinadala sa %s. Para kumpletuhin ang proseso ng pagrehistro, pakisuri ang iyong inbox at sundan ang ibinigay na link sa loob ng %s. Kung mali ang email, maari kang mag-log in, at humingi ng isa pang email pang-kumpirma na ipapadala sa ibang address. +confirmation_mail_sent_prompt = Ang isang bagong email na pang-kumpirma ay ipinadala sa %s. Para kumpletuhin ang proseso ng pagrehistro, pakisuri ang iyong inbox at sundan ang ibinigay na link sa loob ng %s. Kung mali ang email, maaari kang mag-log in, at humingi ng isa pang email pang-kumpirma na ipapadala sa ibang address. invalid_password = Ang iyong password ay hindi tugma sa password na ginamit para gawin ang account. twofa_scratch_used = Ginamit mo na ang scratch code. Na-redirect ka sa two-factor settings page para tanggalin ang device enrollment o mag-generate ng bagong scratch code. manual_activation_only = Makipag-ugnayan sa tagapangangasiwa ng site para kumpletuhin ang pagrehistro. @@ -484,7 +484,7 @@ admin.new_user.text = Mangyaring mag-click dito para ipamahala register_notify = Maligayang Pagdating sa %s register_notify.title = %[1]s, maligayang pagdating sa %[2]s register_notify.text_1 = ito ang iyong registration confirmation email para sa %s! -register_notify.text_2 = Maari kang mag-sign in sa iyong account gamit ng iyong username: %s +register_notify.text_2 = Maaari kang mag-sign in sa iyong account gamit ng iyong username: %s reset_password = I-recover ang iyong account reset_password.title = %s, nagkaroon kami ng hiling para i-recover ang iyong account reset_password.text = Kung ikaw ito, paki-click ang sumusunod na link para i-recover ang iyong account sa loob ng %s: @@ -535,7 +535,7 @@ totp_disabled.text_1 = Ngayon lang na-disable ang Time-based one-time password ( totp_disabled.no_2fa = Wala nang mga ibang paraan ng 2FA ang naka-configure, nangangahulugan na hindi na kailangang mag-log in sa iyong account gamit ang 2FA. removed_security_key.subject = May tinanggal na security key removed_security_key.text_1 = Tinanggal ngayon lang ang security key na "%[1]s" sa iyong account. -account_security_caution.text_1 = Kung ikaw ito, maari mong ligtas na huwag pansinin ang mail na ito. +account_security_caution.text_1 = Kung ikaw ito, maaari mong ligtas na huwag pansinin ang mail na ito. account_security_caution.text_2 = Kung hindi ito ikaw, nakompromiso ang iyong account. Mangyaring makipag-ugnayan sa mga tagapangasiwa ng site na ito. totp_enrolled.subject = Nag-activate ka ng TOTP bilang paraan ng 2FA totp_enrolled.text_1.has_webauthn = Na-enable mo lang ang TOTP para sa iyong account. Nangangahulugan ito na para sa lahat ng mga hinaharap na pag-login sa iyong account, kailangan mong gumamit ng TOTP bilang paraan ng 2FA o gamitin ang iyong mga security key. @@ -644,7 +644,7 @@ AccessToken = Token ng pag-access Biography = Byograpya Location = Lokasyon visit_rate_limit = Natugunan ang limitasyon sa rate ng malayuang pagbisita. -username_claiming_cooldown = Hindi ma-claim ang username na ito, dahil hindi pa tapos ang panahon ng cooldown. Maari itong i-claim sa %[1]s. +username_claiming_cooldown = Hindi ma-claim ang username na ito, dahil hindi pa tapos ang panahon ng cooldown. Maaari itong i-claim sa %[1]s. email_domain_is_not_allowed = Sumasalungat ang domain ng email address ng user %s sa EMAIL_DOMAIN_ALLOWLIST o EMAIL_DOMAIN_BLOCKLIST. Siguraduhing natakda mo ang email address nang tama. [user] @@ -685,7 +685,7 @@ followers.title.few = Mga tagasunod following.title.one = Sinusundan followers.title.one = Tagasunod public_activity.visibility_hint.self_public = Nakikita ng lahat ang iyong aktibidad, maliban sa mga interaksyon sa pribadong espasyo. I-configure. -public_activity.visibility_hint.admin_public = Nakikita ng lahat ang aktibidad na ito, ngunit bilang tagapangasiwa maari mo ring makita ang mga interaksyon sa mga pribadong espasyo. +public_activity.visibility_hint.admin_public = Nakikita ng lahat ang aktibidad na ito, ngunit bilang tagapangasiwa maaari mo ring makita ang mga interaksyon sa mga pribadong espasyo. public_activity.visibility_hint.self_private = Nakikita mo lang at mga tagapangasiwa ng instansya ang iyong aktibidad. I-configure. public_activity.visibility_hint.admin_private = Nakikita mo ang aktibidad na ito dahil isa kang tagapangasiwa, ngunit gusto ng user na panatilihin itong pribado. public_activity.visibility_hint.self_private_profile = Ikaw lang at ang mga tagapangasiwa ng instansya ang makakakita ng iyong aktibidad dahil pribado ang iyong profile. I-configure. @@ -842,7 +842,7 @@ gpg_key_verify = I-verify gpg_invalid_token_signature = Ang ibinigay na GPG key, signature, at token ay hindi tumutugma o luma. gpg_token_required = Kailangan mong magbigay ng signature para sa token sa ibaba gpg_token = Token -gpg_token_help = Maari kang mag-generate ng signature gamit ng: +gpg_token_help = Maaari kang mag-generate ng signature gamit ng: gpg_token_signature = Naka-armor na GPG signature key_signature_gpg_placeholder = Nagsisimula sa "-----BEGIN PGP SIGNATURE-----" verify_gpg_key_success = Na-verify na ang GPG key na "%s". @@ -851,7 +851,7 @@ ssh_key_verify = I-verify ssh_invalid_token_signature = Ang ibinigay na SSH key, signature, o token ay hindi tumutugma o luma. ssh_token_required = Kailangan mong magbigay ng signature para sa token sa ibaba ssh_token = Token -ssh_token_help = Maari kang mag-generate ng signature gamit ng: +ssh_token_help = Maaari kang mag-generate ng signature gamit ng: ssh_token_signature = Naka-armor na SSH signature key_signature_ssh_placeholder = Nagsisimula sa "-----BEGIN SSH SIGNATURE-----" verify_ssh_key_success = Na-verify na ang SSH key na "%s". @@ -912,10 +912,10 @@ create_oauth2_application_success = Matagumpay kang gumawa ang bagong OAuth2 app oauth2_confidential_client = Kumpidensyal na kliyente. Piliin para sa mga app na pinapatilihing kumpidensyal ang sikreto, tulad ng mga web app. Huwag piliin para sa mga web app kasama ang mga desktop at mobile app. twofa_desc = Para protektahin ang iyong account laban sa pagnanakaw ng password, pwede mo gamitin ang iyong smartphone o ibang device para sa pagtanggap ng time-based one-time password ("TOTP"). twofa_scratch_token_regenerated = Ang iyong isang-beses na paggamit na recovery key ngayon ay %s. Ilagay ito sa ligtas na lugar, dahil hindi na ito ipapakita muli. -regenerate_scratch_token_desc = Kapag nawala mo ang iyong recovery key o ginamit mo na oara mag-sign in, maari mong i-reset dito. +regenerate_scratch_token_desc = Kapag nawala mo ang iyong recovery key o ginamit mo na oara mag-sign in, maaari mong i-reset dito. twofa_disable_desc = Ang pag-disable ng authentikasyong two-factor ay gagawing hindi gaanong ligtas ang iyong account. Magpatuloy? twofa_enrolled = Matagumpay na na-enroll ang iyong account. Ilagay ang iyong isang-beses na paggamit na recovery key (%s) sa isang ligtas na lugar, dahil hindi na ito ipapakita muli. -webauthn_desc = Ang mga security key ay isang hardware device na naglalaman ng mga cryptographic key. Maari silang gamitin para sa authentikasyong two-factor. Ang mga security key ay dapat suportahan ang WebAuthn Authenticator na standard. +webauthn_desc = Ang mga security key ay isang hardware device na naglalaman ng mga cryptographic key. Maaari silang gamitin para sa authentikasyong two-factor. Ang mga security key ay dapat suportahan ang WebAuthn Authenticator na standard. remove_oauth2_application = Tanggalin ang OAuth2 Application remove_oauth2_application_desc = Ang pagtanggal ng OAuth2 application ay babawiin ang access sa lahat ng mga naka-sign na access token. Magpatuloy? remove_oauth2_application_success = Binura na ang application. @@ -931,13 +931,13 @@ oauth2_regenerate_secret = I-regenerate ang sikreto oauth2_regenerate_secret_hint = Nawala mo ang iyong sikreto? oauth2_client_secret_hint = Ang sikreto ay hindi ipapakita muli pagkatapos umalis ka o i-refresh ang page na ito. Mangyaring siguraduhin na na-save mo iyan. oauth2_application_edit = I-edit -twofa_recovery_tip = Kapag mawala mo ang iyong device, maari kang gumamit ng isang isang-beses na paggamit na recovery key para makakuha muli ng access sa iyong account. +twofa_recovery_tip = Kapag mawala mo ang iyong device, maaari kang gumamit ng isang isang-beses na paggamit na recovery key para makakuha muli ng access sa iyong account. twofa_is_enrolled = Ang iyong account ay kasalukuyang naka-enroll sa autentikasyong two-factor. twofa_not_enrolled = Kasalukuyang hindi naka-enroll ang iyong account sa authentikasyong two-factor. twofa_disable = I-disable ang authentikasyong two-factor twofa_scratch_token_regenerate = I-regenerate ang isang-beses na paggamit na recovery key twofa_enroll = Mag-enroll sa authentikasyong two-factor -twofa_disable_note = Maari mong i-disable ang authentikasyong two-factor kapag kinakailangan. +twofa_disable_note = Maaari mong i-disable ang authentikasyong two-factor kapag kinakailangan. twofa_disabled = Na-disable na ang authentikasyong two-factor. scan_this_image = I-scan ang image na ito gamit ng iyong aplikasyong pang-authentikasyon: or_enter_secret = O ilagay ang sikreto: %s @@ -1005,8 +1005,8 @@ language.description = Mase-save ang wika sa iyong account at gagamitin bilang d language.localization_project = Tulungan kaming isalin ang Forgejo sa iyong wika! Matuto pa. pronouns_custom_label = Mga pasadyang pronoun user_block_yourself = Hindi mo maaaring harangan ang sarili mo. -change_username_redirect_prompt.with_cooldown.one = Magiging available ang lumang username sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw, maari mo pa ring ma-claim muli ang lumang username sa panahon ng panahon ng cooldown. -change_username_redirect_prompt.with_cooldown.few = Magiging available ang lumang username sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw, maari mo pa ring ma-claim muli ang lumang username sa panahon ng panahon ng cooldown. +change_username_redirect_prompt.with_cooldown.one = Magiging available ang lumang username sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw. Maaari mo pa ring ma-claim muli ang lumang username sa panahon ng panahon ng cooldown. +change_username_redirect_prompt.with_cooldown.few = Magiging available ang lumang username sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw. Maaari mo pa ring ma-claim muli ang lumang username sa panahon ng panahon ng cooldown. keep_pronouns_private = Ipakita lang ang mga panghalip sa mga naka-authenticate na user keep_pronouns_private.description = Itatago nito ang iyong mga panghalip mula sa mga bisita na hindi naka-log in. quota.applies_to_user = Nag-aapply ang mga sumusunod na panuntunan ng quota sa iyong account @@ -1071,7 +1071,7 @@ readme_helper_desc = Ito ang lugar kung saan makakasulat ka ng kumpletong deskri trust_model_helper_collaborator_committer = Katulong+Committer: I-trust ang mga signature batay sa mga katulong na tumutugma sa committer mirror_interval = Interval ng mirror (ang mga wastong unit ng oras ay "h", "m", "s"). 0 para i-disable ang periodic sync. (Pinakamababang interval: %s) transfer.reject_desc = Kanselahin ang pag-transfer mula sa "%s" -mirror_lfs_endpoint_desc = Ang sync ay susubukang gamitin ang clone url upang matukoy ang LFS server. Maari ka rin tumukoy ng isang custom na endpoint kapag ang LFS data ng repositoryo ay nilalagay sa ibang lugar. +mirror_lfs_endpoint_desc = Ang sync ay susubukang gamitin ang clone url upang matukoy ang LFS server. Maaari ka rin tumukoy ng isang custom na endpoint kapag ang LFS data ng repositoryo ay nilalagay sa ibang lugar. adopt_search = Ilagay ang username para maghanap ng mga unadopted na repositoryo… (iwanang walang laman para hanapin lahat) object_format = Format ng object readme_helper = Pumili ng README file template @@ -1164,8 +1164,8 @@ tree_path_not_found_commit = Hindi umiiral ang path na %[1]s sa commit %[2]s tree_path_not_found_branch = Hindi umiiral ang daanang %[1]s sa branch %[2]s migrate_items_pullrequests = Mga hiling sa paghila archive.pull.nocomment = Naka-archive ang repositoryong ito. Hindi ka makakakomento sa mga pull request. -archive.title = Naka-archive ang repositoryong ito. Maari mong itignan ang mga file at i-clone ito, pero hindi ka makakagawa ng anumang pagbabago sa estado ito, tulad ng pagtulak at paggawa ng mga isyu, pull request o mga komento. -archive.title_date = Naka-archive ang repositoryo na ito noong %s. Maari mong itignan ang mga file at i-clone ito, pero hindi ka makakagawa ng anumang pagbabago sa estado nito, tulad ng pagtulak o paggawa ng mga bagong isyu, mga pull request, o komento. +archive.title = Naka-archive ang repositoryong ito. Maaari mong itignan ang mga file at i-clone ito, pero hindi ka makakagawa ng anumang pagbabago sa estado ito, tulad ng pagtulak at paggawa ng mga isyu, pull request o mga komento. +archive.title_date = Naka-archive ang repositoryo na ito noong %s. Maaari mong itignan ang mga file at i-clone ito, pero hindi ka makakagawa ng anumang pagbabago sa estado nito, tulad ng pagtulak o paggawa ng mga bagong isyu, mga pull request, o komento. pulls = Mga hiling sa paghila activity.merged_prs_count_n = Mga naisamang hiling sa paghila wiki.last_updated = Huling binago %s @@ -1183,7 +1183,7 @@ issues.action_open = Buksan issues.closed_title = Sarado issues.reopen_issue = Buksang muli pulls.merged = Naisama na -pulls.merged_info_text = Maari nang burahin ang branch %s. +pulls.merged_info_text = Maaari nang burahin ang branch %s. milestones.update_ago = Binago %s activity.closed_issue_label = Sarado activity.merged_prs_label = Naisama @@ -1205,7 +1205,7 @@ migrate.clone_address_desc = Ang HTTP(S) o Git "clone" URL ng umiiral na reposit need_auth = Awtorisasyon migrate.github_token_desc = Maaari kang maglagay ng isa o higit pang mga token na hinihiwalay ng kuwit dito upang gawing mas-mabilis ang pagmigrate dahil sa rate limit ng GitHub API. BABALA: Ang pagabuso ng feature na ito ay maaaring maglabag sa patakaran ng tagapagbigay ng serbisyo at maaaring magdulot ng pag-block ng account. template.invalid = Kailangang pumili ng kahit isang template na repositoryo -migrate_options_lfs_endpoint.description = Susubukan ng migration na gamitin ang iyong Git remote upang matukoy ang LFS server. Maari mong magtiyak ng custom na endpoint kapag ang LFS data ng repositoryo ay nakalagay sa ibang lugar. +migrate_options_lfs_endpoint.description = Susubukan ng migration na gamitin ang iyong Git remote upang matukoy ang LFS server. Maaari mong magtiyak ng custom na endpoint kapag ang LFS data ng repositoryo ay nakalagay sa ibang lugar. blame.ignore_revs.failed = Nabigong hindi pansinin ang mga rebisyon sa .git-blame-ignore-revs. tree_path_not_found_tag = Hindi umiiral ang path na %[1]s sa tag %[2]s form.reach_limit_of_creation_n = Naabot na ng may-ari ang limitasyon na %d mga repositoryo. @@ -1471,10 +1471,10 @@ activity.new_issue_label = Nabuksan activity.merged_prs_count_1 = Naisamang hiling sa paghila activity.opened_prs_count_1 = Inimungkahing hiling sa paghila activity.opened_prs_label = Inimungkahi -pulls.reopened_at = `nabuksang muli ang hiling sa paghatak na %[2]s` +pulls.reopened_at = `binuksan muli ang hiling sa paghila %s` issues.opened_by_fake = binuksan ang %[1]s ni/ng %[2]s pulls.reopen_failed.base_branch = Hindi mabuksang muli ang hiling sa paghatak na ito dahil hindi na umiiral ang base branch. -issues.reopened_at = `binuksang muli ang isyung ito %[2]s` +issues.reopened_at = `binuksang muli ang isyung ito %s` pulls.reopen_failed.head_branch = Hindi mabubuksan muli ang hiling sa paghila, dahil hindi na umiiral ang head branch. settings.event_pull_request_desc = Binuksan, sinara, muling binuksan, o binago ang hiling sa paghatak. activity.opened_prs_count_n = Mga inimungkahing hiling sa paghila @@ -1500,7 +1500,7 @@ issues.content_history.created = ginawa editor.patching = Pina-patch: editor.fail_to_apply_patch = Hindi malapat ang patch na "%s" settings.danger_zone = Mapanganib na lugar -issues.closed_at = `isinara ang isyung ito %[2]s` +issues.closed_at = `isinara ang isyung ito %s` settings.collaboration.admin = Tagapangasiwa settings.admin_settings = Mga setting ng tagapangasiwa issues.start_tracking_history = `sinimulan ang trabaho %s` @@ -1627,7 +1627,7 @@ projects.column.edit_title = Pangalan projects.column.new_title = Pangalan projects.card_type.desc = Mga preview ng card commits.desc = I-browse ang history ng pagbabago ng source code. -commits.search.tooltip = Maari kang mag-prefix ng mga keyword gamit ang "author:", "committer:", "after:", o "before:", hal. "revert author:Nijika before:2022-10-09". +commits.search.tooltip = Maaari kang mag-prefix ng mga keyword gamit ang "author:", "committer:", "after:", o "before:", hal. "revert author:Nijika before:2022-10-09". issues.force_push_codes = `puwersahang itinulak ang %[1]s mula %[2]s sa %[4]s %[6]s` issues.push_commit_1 = idinagdag ang %d commit %s issues.push_commits_n = idinagdag ang %d mga commit %s @@ -1707,7 +1707,7 @@ issues.action_milestone = Milestone issues.action_milestone_no_select = Walang milestone issues.delete_branch_at = `binura ang branch na %s %s` issues.filter_label = Label -issues.filter_label_exclude = `Gamitin ang alt + click/enter para hindi isama ang mga label` +issues.filter_label_exclude = `Gamitin ang Alt + Click para hindi isama ang mga label` issues.filter_label_no_select = Lahat ng mga label issues.filter_milestone_closed = Mga nakasarang milestone issues.filter_assignee = Mangangasiwa @@ -1771,7 +1771,7 @@ issues.lock = I-lock ang usapan issues.unlock = I-unlock ang usapan issues.unlock_comment = na-unlock ang usapang ito %s issues.unlock.notice_1 = - Makakakomento muli ang lahat ng mga tao sa isyung ito. -issues.unlock.notice_2 = - Maari mong i-lock muli ang isyung ito sa hinaharap. +issues.unlock.notice_2 = - Maaari mong i-lock muli ang isyung ito sa hinaharap. issues.comment_on_locked = Hindi ka makakakomento sa naka-lock na isyu. issues.closed_by_fake = ni/ng %[2]s ay isinara %[1]s issues.comment_manually_pull_merged_at = manwal na isinama ang commit %[1]s sa %[2]s %[3]s @@ -1787,10 +1787,10 @@ issues.label_archive_tooltip = Ang mga naka-archive na label ay hindi isasama bi issues.is_stale = May mga pagbabago sa PR na ito mula sa pagsuri na ito issues.role.first_time_contributor = Unang-beses na contributor issues.lock.notice_1 = - Hindi makakadagdag ng mga bagong komento ang mga ibang user sa isyu na ito. -issues.lock.notice_3 = - Maari mong i-unlock muli ang isyung ito sa hinaharap. +issues.lock.notice_3 = - Maaari mong i-unlock muli ang isyung ito sa hinaharap. issues.label_deletion_desc = Ang pagbura ng label ay tatanggalin ito sa lahat ng mga isyu. Magpatuloy? -issues.commit_ref_at = `isinangguni ang isyu na ito mula sa commit %[2]s` -issues.ref_issue_from = `isinangguni ang isyu na ito sa %[4]s %[2]s` +issues.commit_ref_at = `isinangguni ang isyu na ito mula sa commit %s` +issues.ref_issue_from = `isinangguni ang isyu na ito sa %[3]s %[1]s` issues.num_participants_one = %d kasali issues.attachment.download = `I-click para i-download ang "%s" ` issues.num_participants_few = %d mga kasali @@ -1815,10 +1815,10 @@ issues.sign_in_require_desc = Mag-sign in upang sumali sa usapa issues.num_comments = %d mga komento issues.role.contributor_helper = Nakaraang nag-commit ang user na ito sa repositoryo na ito. issues.comment_pull_merged_at = isinama ang commit %[1]s sa %[2]s %[3]s -pulls.commit_ref_at = `isinangguni ang hiling sa paghila mula sa isang commit %[2]s` +pulls.commit_ref_at = `isinangguni ang hiling sa paghila mula sa isang commit %s` wiki.last_commit_info = Binago ni %s ang pahinang ito %s issues.content_history.edited = binago -issues.ref_pull_from = `isinangguni ang hiling sa paghila na ito %[4]s %[2]s` +issues.ref_pull_from = `isinangguni ang hiling sa paghila na ito %[3]s %[1]s` pulls.merged_title_desc_few = isinali ang %[1]d mga commit mula sa %[2]s patungong %[3]s %[4]s settings.org_not_allowed_to_be_collaborator = Hindi maaaring idagdag ang mga organisasyon bilang tagatulong. settings.add_collaborator_success = Naidagdag ang tagatulong. @@ -1828,7 +1828,7 @@ pulls.create = Gumawa ng hiling sa paghila issues.dependency.pr_close_blocked = Kailangan mong isara ang lahat ng mga isyu na humaharang sa hiling sa paghila na ito bago mo ito isama. pulls.delete.title = Burahin ang hiling sa paghila na ito? issues.dependency.pr_closing_blockedby = Hinarang ng mga sumusunod na isyu mula sa pagsara ng hiling sa paghila na ito -pulls.closed_at = `isinara ang hiling sa paghila na %[2]s` +pulls.closed_at = `isinara ang hiling sa paghila na ito %s` pulls.close = Isara ang hiling sa paghila pulls.cmd_instruction_hint = Tingnan ang mga panuto para sa command line project = Mga proyekto @@ -1836,8 +1836,8 @@ issues.content_history.deleted = binura pulls.no_results = Walang mga nahanap na resulta. pulls.closed = Sarado ang hiling sa paghila pulls.is_closed = Naisara na ang hiling sa paghila. -issues.ref_closing_from = `nagsangguni ang isyu mula sa hiling sa paghila %[4]s na magsasara sa isyu, %[2]s` -issues.ref_reopening_from = `nagsangguni ang isyu na ito mula sa hiling sa paghila %[4]s na muling bubukas, %[2]s` +issues.ref_closing_from = `nagsangguni ang isyu mula sa hiling sa paghila %[3]s na magsasara sa isyu, %[1]s` +issues.ref_reopening_from = `nagsangguni ang isyu na ito mula sa hiling sa paghila %[3]s na muling bubukas nito, %[1]s` issues.ref_closed_from = `isinara ang isyung ito %[4]s%[2]s` issues.review.wait = hiniling sa pagsuri %s issues.review.reject = hinihiling ang mga pagbago %s @@ -2015,14 +2015,14 @@ wiki.cancel = Kanselahin settings.collaboration.undefined = Hindi Natukoy settings.federation_settings = Mga Setting ng Federation settings = Mga Setting -settings.desc = Ang mga setting ang lugar kung saan maari mong ipamahala ang mga setting para sa repositoryo +settings.desc = Ang mga setting ang lugar kung saan maaari mong ipamahala ang mga setting para sa repositoryo pulls.collapse_files = I-collapse ang lahat ng mga file pulls.add_prefix = Magdagdag ng %s na prefix pulls.still_in_progress = Ginagawa pa? activity.title.prs_1 = %d hiling sa paghila activity.active_issues_count_n = %d mga aktibong isyu pulls.required_status_check_missing = Nawawala ang ilang mga kinakailangang pagsusuri. -pulls.required_status_check_administrator = Bilang tagapangasiwa, maari mo pa ring isama ang hiling sa paghila na ito. +pulls.required_status_check_administrator = Bilang tagapangasiwa, maaari mo pa ring isama ang hiling sa paghila na ito. pulls.blocked_by_approvals = Wala pang sapat na pag-apruba ang hiling sa paghila na ito. %d ng %d na pag-apruba ang ibinigay. settings.options = Repositoryo wiki.back_to_wiki = Bumalik sa pahina ng wiki @@ -2110,7 +2110,7 @@ settings.actions_desc = I-enable ang mga kasamang CI/CD pipeline gamit ang Forge settings.admin_indexer_commit_sha = Huling na-index na commit settings.admin_indexer_unindexed = Hindi naka-index settings.transfer_notices_3 = - Kung pribado ang repositoryo at ilipat sa isang indibidwal na user, ang aksyon na ito ay sinisigurado na ang user ay may pahintulot na basahin (at palitan ang mga pahintulot kung kailangan). -settings.convert_desc = Maari mong i-convert ang repositoryo na ito sa regular na repositoryo. Hindi ito mababawi. +settings.convert_desc = Maaari mong i-convert ang repositoryo na ito sa regular na repositoryo. Hindi ito mababawi. settings.transfer.button = Ilipat ang pagmamay-ari settings.signing_settings = Mga setting sa pagpapatunay ng pag-sign settings.admin_enable_close_issues_via_commit_in_any_branch = Isara ang isyu sa pamamagitan ng commit na ginawa sa hindi default na branch @@ -2137,7 +2137,7 @@ settings.deploy_key_deletion = Tanggalin ang deploy key settings.protect_enable_push = I-enable ang pagtulak settings.discord_icon_url.exceeds_max_length = Kailangang bababa o equal sa 2048 characters ang URL ng icon settings.protected_branch.save_rule = I-save ang rule -settings.mirror_settings.docs.can_still_use = Bagama't na hindi ka makakabago ng mga umiiral na mirror o gumawa ng bago, maari mo pa rin gamitin ang iyong umiiral na mirror. +settings.mirror_settings.docs.can_still_use = Bagama't na hindi ka makakabago ng mga umiiral na mirror o gumawa ng bago, maaari mo pa rin gamitin ang iyong umiiral na mirror. settings.slack_color = Kulay settings.discord_icon_url = URL ng icon settings.convert_fork_confirm = I-convert ang repositoryo @@ -2254,7 +2254,7 @@ settings.pulls.allow_rebase_update = I-enable ang pag-update ng hiling sa paghil settings.admin_enable_health_check = I-enable ang pagsusuri ng kalusugan ng repositoryo (git fsck) settings.new_owner_has_same_repo = Ang bagong may-ari ay may repositoryo na may katulad na pangalan. Mangyaring pumili ng ibang pangalan. settings.convert = I-convert sa regular na repositoryo -settings.convert_fork_desc = Maari mong i-convert ang fork na ito bilang regular na repositoryo. Hindi ito mababawi. +settings.convert_fork_desc = Maaari mong i-convert ang fork na ito bilang regular na repositoryo. Hindi ito mababawi. settings.convert_fork_notices_1 = Ang operasyon na ito ay ico-convert ang fork bilang regular na repositoryo at hindi mababawi. settings.transfer_abort_invalid = Hindi mo makakansela ang isang hindi umiiral na paglipat ng repositoryo. settings.transfer_quota_exceeded = Ang bagong may-ari (%s) ay lumalagpas sa quota. Hindi nailipat ang repositoryo. @@ -2290,8 +2290,8 @@ settings.webhook.headers = Mga header settings.webhook.payload = Nilalaman settings.webhook.body = Katawan settings.webhook.replay.description = I-replay ang webhook na ito. -settings.webhook.delivery.success = May nadagdag na event sa delivery queue. Maari magtagal ng ilang segundo bago makita sa delivery history. -settings.githooks_desc = Pinapagana ng Git ang mga Git hook. Maari mong baguhin ang mga hook file sa ibaba para mag-set up ng mga custom na operasyon. +settings.webhook.delivery.success = May nadagdag na event sa delivery queue. Maaari magtagal ng ilang segundo bago makita sa delivery history. +settings.githooks_desc = Pinapagana ng Git ang mga Git hook. Maaari mong baguhin ang mga hook file sa ibaba para mag-set up ng mga custom na operasyon. settings.githook_name = Pangalan ng hook settings.githook_content = Nilalaman ng hook settings.update_githook = I-update ang hook @@ -2362,7 +2362,7 @@ settings.mirror_settings.docs.pull_mirror_instructions = Para mag-set up ng pull milestones.invalid_due_date_format = Kailangang "yyyy-mm-dd" na format ang takdang petsa. signing.wont_sign.nokey = Walang key ang instansya na ito para i-sign ang commit na ito. activity.title.releases_1 = %d paglabas -settings.mirror_settings.docs.more_information_if_disabled = Maari kang matuto pa tungkol sa mga push at pull na mirror dito: +settings.mirror_settings.docs.more_information_if_disabled = Maaari kang matuto pa tungkol sa mga push at pull na mirror dito: settings.branches.switch_default_branch = Magpalit ng default branch settings.convert_notices_1 = Ang operasyon na ito ay ico-covert ang mirror sa regular na repositoryo at hindi mababawi. settings.convert_fork_succeed = Na-convert na ang fork sa regular na repositoryo. @@ -2732,7 +2732,7 @@ settings.protect_protected_file_patterns = Mga pattern ng nakaprotektang file (h settings.update_protect_branch_success = Binago na ang branch protection rule na "%s". settings.remove_protected_branch_success = Tinanggal ang branch protection rule na "%s". settings.tags.protection.pattern = Pattern ng tag -settings.tags.protection.pattern.description = Maari kang gumamit ng iisang pangalan o glob pattern o regular expression para magtugma ng maraming tag. Magbasa pa sa guide ng mga nakaprotektang tag. +settings.tags.protection.pattern.description = Maaari kang gumamit ng iisang pangalan o glob pattern o regular expression para magtugma ng maraming tag. Magbasa pa sa guide ng mga nakaprotektang tag. settings.thread_id = ID ng thread settings.matrix.room_id = ID ng room diff.has_escaped = May mga nakatagong Unicode character ang linya na ito @@ -2746,7 +2746,7 @@ diff.bin = BIN settings.default_update_style_desc = Ang default na istilio na gagamitin sa pag-update ng mga hiling sa paghila na nalilipas sa base branch. pulls.sign_in_require = Mag-sign in para gumawa ng bagong hiling sa paghila. new_from_template = Gumamit ng template -new_from_template_description = Maari kang pumili ng umiiral na repository template sa instansya na ito at i-apply ang mga setting nito. +new_from_template_description = Maaari kang pumili ng umiiral na repository template sa instansya na ito at i-apply ang mga setting nito. new_advanced = Mga advanced na setting new_advanced_expand = I-click para i-expand auto_init_description = Simulan ang kasaysayan ng Git gamit ang README at opsyonal na magdagdag ng mga lisensya at .gitignore na file. @@ -2780,6 +2780,7 @@ settings.event_action_recover = I-recover settings.event_action_success = Matagumpay settings.event_action_success_desc = Matagumpay na natapos ang Action Run. settings.event_action_recover_desc = Matagumpay na natapos ang Action Run pagkatapos na nabigo ang huling Action Run sa katulad na workflow. +issues.filter_type.all_pull_requests = Lahat ng mga hiling sa paghila [search] commit_kind = Maghanap ng mga commit… @@ -3205,7 +3206,7 @@ self_check.database_collation_mismatch = Inaasahan ang database na gamitin ang c auths.oauth2_admin_group = Group claim value para sa mga tagapangasiwa. (Opsyonal - kinakailangan ang claim name sa itaas) auths.tip.facebook = Magrehistro ng bagong application sa %s at idagdag ang produktong "Facebook Login" users.restricted.description = Payagan lamang ang interaksyon sa mga repositoryo at organisasyon kung saan ang user ay dinagdag bilang tagatulong. Iniiwasan nito ang pag-access sa publikong repositoryo sa instansya na ito. -users.local_import.description = Payagan ang pag-import ng mga repositoryo mula sa local file system ng user. Maari itong maging isyu sa seguridad. +users.local_import.description = Payagan ang pag-import ng mga repositoryo mula sa local file system ng user. Maaari itong maging isyu sa seguridad. emails.delete = Burahin ang Email emails.deletion_success = Binura na ang email address. auths.oauth2_required_claim_value = Kinakailangan na claim value @@ -3450,8 +3451,8 @@ teams.owners_permission_desc = Ang mga owner ay may punong access sa lah teams.add_nonexistent_repo = Hindi pa umiiral ang repositoryo na sinusubukan mong idagdag. Mangyaring gawin iyan muna. teams.all_repositories = Lahat ng mga repositoryo teams.all_repositories_helper = Ang koponan ay may access sa lahat ng mga repositoryo. Ang pagpili nito ay idadagdag ang lahat ng mga umiiral na repositoryo sa koponan. -settings.change_orgname_redirect_prompt.with_cooldown.few = Magiging available ang lumang pangalan ng organisasyon sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw, maari mo pa ring ma-claim muli ang lumang pangalan sa panahon ng cooldown. -settings.change_orgname_redirect_prompt.with_cooldown.one = Magiging available ang lumang pangalan ng organisasyon sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw, maari mo pa ring ma-claim muli ang lumang pangalan ng panahon ng cooldown. +settings.change_orgname_redirect_prompt.with_cooldown.few = Magiging available ang lumang pangalan ng organisasyon sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw. Maaari mo pa ring ma-claim muli ang lumang pangalan sa panahon ng cooldown. +settings.change_orgname_redirect_prompt.with_cooldown.one = Magiging available ang lumang pangalan ng organisasyon sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw. Maaari mo pa ring ma-claim muli ang lumang pangalan ng panahon ng cooldown. [packages] diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 3fcfda18bd..1cb7103bc0 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -1062,8 +1062,8 @@ language.localization_project = Aidez-nous à traduire Forgejo dans votre langue language.description = Cette langue sera enregistrée dans votre compte et utilisée comme langue par défaut après votre connexion. user_block_yourself = Vous ne pouvez pas vous bloquer vous même. pronouns_custom_label = Pronoms personnalisés -change_username_redirect_prompt.with_cooldown.one = L'ancien pseudonyme sera disponible pour n'importe qui après une période d'%[1]d jour, vous pouvez toujours réclamer votre ancien pseudonyme pendant cette période. -change_username_redirect_prompt.with_cooldown.few = L'ancien pseudonyme sera disponible pour n'importe qui après une période de %[1]d jours, vous pouvez toujours réclamer votre ancien pseudonyme pendant cette période. +change_username_redirect_prompt.with_cooldown.one = L'ancien pseudonyme sera disponible pour n'importe qui après une période d'%[1]d jour. Vous pouvez toujours réclamer votre ancien pseudonyme pendant cette période. +change_username_redirect_prompt.with_cooldown.few = L'ancien pseudonyme sera disponible pour n'importe qui après une période de %[1]d jours. Vous pouvez toujours réclamer votre ancien pseudonyme pendant cette période. quota.rule.exceeded = Dépassé regenerate_token = Régénérer access_token_regeneration = Régénérer le token d'accès @@ -1653,13 +1653,13 @@ issues.close_comment_issue=Fermer avec le commentaire issues.reopen_issue=Rouvrir issues.reopen_comment_issue=Réouvrir avec le commentaire issues.create_comment=Commenter -issues.closed_at=`a fermé ce ticket %[2]s.` -issues.reopened_at=`a rouvert ce ticket %[2]s.` -issues.commit_ref_at=`a référencé ce ticket depuis une révision %[2]s.` -issues.ref_issue_from=`a fait référence à %[4]s ce ticket %[2]s.` -issues.ref_pull_from=`a fait référence à cette demande d'ajout %[4]s %[2]s.` -issues.ref_closing_from=`a fait référence à une demande d'ajout %[4]s qui clora ce ticket, %[2]s.` -issues.ref_reopening_from=`a référencé une pull request %[4]s qui va ré-ouvrir ce ticket %[2]s` +issues.closed_at=`a fermé ce ticket %s` +issues.reopened_at=`a rouvert ce ticket %s` +issues.commit_ref_at=`a référencé ce ticket depuis une révision %s` +issues.ref_issue_from=`a fait référence à ce ticket %[3]s %[1]s` +issues.ref_pull_from=`a fait référence à cette demande d'ajout %[3]s %[1]s` +issues.ref_closing_from=`a fait référence à une demande d'ajout %[3]s qui clora ce ticket, %[1]s` +issues.ref_reopening_from=`a référencé ce ticket dans une pull request %[3]s qui va ré-ouvrir ce ticket, %[1]s` issues.ref_closed_from=`a fermé ce ticket %[4]s %[2]s` issues.ref_reopened_from=`a rouvert ce ticket %[4]s %[2]s.` issues.ref_from=`de %[1]s` @@ -1967,8 +1967,8 @@ pulls.update_branch_success=La mise à jour de la branche a réussi pulls.update_not_allowed=Vous n'êtes pas autorisé à mettre à jour la branche pulls.outdated_with_base_branch=Cette branche est désynchronisée avec la branche de base pulls.close=Fermer la demande d’ajout -pulls.closed_at=`a fermé cette demande d'ajout %[2]s.` -pulls.reopened_at=`a rouvert cette demande d'ajout %[2]s.` +pulls.closed_at=`a fermé cette demande d'ajout %s` +pulls.reopened_at=`a rouvert cette demande d'ajout %s` pulls.cmd_instruction_hint=Voir les instructions en ligne de commande pulls.cmd_instruction_checkout_title=Basculer pulls.cmd_instruction_checkout_desc=Depuis votre dépôt, basculer sur une nouvelle branche et tester des modifications. @@ -2762,7 +2762,7 @@ issues.blocked_by_user = Vous ne pouvez pas créer de tickets sur ce dépôt car pulls.blocked_by_user = Vous ne pouvez pas créer une pull request sur ce dépôt car vous êtes bloqué par son propriétaire. wiki.cancel = Annuler settings.wiki_globally_editable = Permettre l'édition du wiki a tout le monde -pulls.commit_ref_at = `a référencé cette pull request depuis le commit %[2]s` +pulls.commit_ref_at = `a référencé cette pull request depuis un commit %s` settings.new_owner_blocked_doer = Le nouveau propriétaire vous a bloqué. settings.enter_repo_name = Confirmez en entrant le propriétaire et le nom du dépôt exactement comme affiché : settings.wiki_rename_branch_main = Normalise le nom de la branche du Wiki @@ -3058,8 +3058,8 @@ teams.invite.by=Invité par %s teams.invite.description=Veuillez cliquer sur le bouton ci-dessous pour rejoindre l’équipe. follow_blocked_user = Vous ne pouvez pas suivre cette organisation car elle vous a bloqué. open_dashboard = Ouvrir le tableau de bord -settings.change_orgname_redirect_prompt.with_cooldown.few = L'ancien nom d'organisation sera disponible pour n'importe qui après une période de %[1]d jours, vous pouvez toujours réclamer votre ancien nom d'organisation pendant cette période. -settings.change_orgname_redirect_prompt.with_cooldown.one = L'ancien nom d'organisation sera disponible pour n'importe qui après une période d'%[1]d jour, vous pouvez toujours réclamer votre ancien nom d'organisation pendant cette période. +settings.change_orgname_redirect_prompt.with_cooldown.few = L'ancien nom d'organisation sera disponible pour n'importe qui après une période de %[1]d jours. Vous pouvez toujours réclamer votre ancien nom d'organisation pendant cette période. +settings.change_orgname_redirect_prompt.with_cooldown.one = L'ancien nom d'organisation sera disponible pour n'importe qui après une période d'%[1]d jour. Vous pouvez toujours réclamer votre ancien nom d'organisation pendant cette période. [admin] dashboard=Tableau de bord diff --git a/options/locale/locale_ga-IE.ini b/options/locale/locale_ga-IE.ini index d2d960b627..3bb06e8c21 100644 --- a/options/locale/locale_ga-IE.ini +++ b/options/locale/locale_ga-IE.ini @@ -1219,11 +1219,11 @@ issues.close_comment_issue = Dún le trácht issues.reopen_issue = Athoscail issues.reopen_comment_issue = Athoscail le trácht issues.create_comment = Trácht -issues.closed_at = `dhún an cheist seo %[2]s` -issues.reopened_at = `athoscail an t-eagrán seo %[2]s` -issues.commit_ref_at = `rinne tagairt don cheist seo ó ghealltanas %[2]s` -issues.ref_issue_from = `rinne dagairt don cheist seo %[4]s %[2]s` -issues.ref_pull_from = `rinne dagairt don iarratas tarraingthe seo %[4]s %[ 2]s` +issues.closed_at = `dhún an cheist seo %s` +issues.reopened_at = `athoscail an t-eagrán seo %s` +issues.commit_ref_at = `rinne tagairt don cheist seo ó ghealltanas %s` +issues.ref_issue_from = `rinne dagairt don cheist seo %[3]s %[1]s` +issues.ref_pull_from = `rinne dagairt don iarratas tarraingthe seo %[3]s %[1]s` issues.ref_closed_from = `dhún an cheist seo %[4]s %[2]s` issues.ref_reopened_from = `d'athoscail an eagrán seo %[4]s %[2]s` issues.ref_from = `ó %[1]s` @@ -1456,8 +1456,8 @@ pulls.update_branch_success = Bhí nuashonrú brainse rathúil pulls.update_not_allowed = Ní cheadaítear duit brainse a nuashonrú pulls.outdated_with_base_branch = Tá an brainse seo as dáta leis an mbunbhrainse pulls.close = Dún Iarratas Tarraing -pulls.closed_at = `dhún an t-iarratas tarraingthe seo %[2]s` -pulls.reopened_at = `athoscail an t-iarratas tarraingthe seo %[2]s` +pulls.closed_at = `dhún an t-iarratas tarraingthe seo %s` +pulls.reopened_at = `athoscail an t-iarratas tarraingthe seo %s` pulls.cmd_instruction_checkout_title = Seiceáil pulls.cmd_instruction_checkout_desc = Ó stór tionscadail, seiceáil brainse nua agus déan tástáil ar na hathruithe. pulls.cmd_instruction_merge_title = Cumaisc diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini index 411bad835a..3e93ee8ba9 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -932,7 +932,7 @@ issues.close_comment_issue=Hozzászólás és lezárás issues.reopen_issue=Újranyitás issues.reopen_comment_issue=Hozzászólás és újranyitás issues.create_comment=Hozzászólás -issues.commit_ref_at=`hivatkozott erre a hibajegyre egy commit-ból %[2]s` +issues.commit_ref_at=`hivatkozott erre a hibajegyre egy commit-ból %s` issues.role.owner=Tulajdonos issues.role.member=Tag issues.re_request_review=Véleményezés újrakérése diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini index 673d1464b1..f1a392105e 100644 --- a/options/locale/locale_id-ID.ini +++ b/options/locale/locale_id-ID.ini @@ -796,7 +796,7 @@ issues.close_comment_issue=Komentar dan Tutup issues.reopen_issue=Buka kembali issues.reopen_comment_issue=Komentar dan Buka Kembali issues.create_comment=Komentar -issues.commit_ref_at=`merujuk masalah dari komit %[2]s` +issues.commit_ref_at=`merujuk masalah dari komit %s` issues.role.owner=Pemilik issues.role.member=Anggota issues.sign_in_require_desc=Masuk untuk bergabung dengan percakapan ini. diff --git a/options/locale/locale_is-IS.ini b/options/locale/locale_is-IS.ini index 9b1d56fed9..baf8286923 100644 --- a/options/locale/locale_is-IS.ini +++ b/options/locale/locale_is-IS.ini @@ -805,8 +805,8 @@ issues.close_comment_issue=Senda ummæli og Loka issues.reopen_issue=Enduropna issues.reopen_comment_issue=Senda ummæli og Enduropna issues.create_comment=Senda Ummæli -issues.closed_at=`lokaði þessu vandamáli %[2]s` -issues.reopened_at=`enduropnaði þetta vandamál %[2]s` +issues.closed_at=`lokaði þessu vandamáli %s` +issues.reopened_at=`enduropnaði þetta vandamál %s` issues.ref_reopened_from=`enduropnaði þetta vandamál %[4]s %[2]s` issues.author=Höfundur issues.role.owner=Eigandi diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index 48995e951f..d46f709cde 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -54,7 +54,7 @@ mirror=Mirror new_repo=Nuovo repository new_migrate=Nuova migrazione new_mirror=Nuovo mirror -new_fork=Nuova derivazione +new_fork=Nuova biforcazione new_org=Nuova organizzazione new_project=Nuovo progetto manage_org=Gestisci le organizzazioni @@ -143,12 +143,12 @@ confirm_delete_selected = Confermare l'eliminazione di tutti gli elementi selezi sign_in_with_provider = Accedi con %s new_project_column = Nuova colonna toggle_menu = Mostra/Nascondi menu -filter.not_fork = Non fork +filter.not_fork = Non biforcazioni filter = Filtro filter.clear = Rimuovi filtri filter.is_archived = Archiviato filter.not_archived = Non archiviato -filter.is_fork = Da fork +filter.is_fork = Biforcazioni filter.is_mirror = Mirror filter.not_mirror = Non mirror filter.is_template = Modelli @@ -209,6 +209,7 @@ table_modal.label.columns = Colonne link_modal.header = Aggiungi collegamento link_modal.url = Url link_modal.description = Descrizione +link_modal.paste_reminder = Suggerimento: se hai già copiato un URL negli appunti, puoi incollarlo direttamente nell’editor per creare un collegamento. [filter] string.asc = A - Z @@ -232,6 +233,7 @@ lightweight_desc=Forgejo ha requisiti minimi bassi e può funzionare su un econo license=Open Source license_desc=Ottieni Forgejo! Partecipa per contribuire a rendere questo progetto ancora più bello. Non aver paura di diventare collaborante! install_desc = Semplicemente avvia l'eseguibile per la tua piattaforma, distribuiscilo con Docker, oppure scarica il pacchetto. +platform_desc = È stato verificato che Forgejo è pienamente compatibile con sistemi operativi liberi, come Linux e FreeBSD, nonché con diverse architetture CPU. Scegli liberamente la piattaforma che preferisci! [install] install=Installazione @@ -396,12 +398,12 @@ go_to = Vai a search.type.tooltip = Tipo di ricerca search.fuzzy.tooltip = Includi anche i risultati che corrispondono parzialmente ai termini di ricerca code_search_results = Risultati di ricerca per "%s" -relevant_repositories_tooltip = I repositori derivati o che non hanno argomento, icona, né descrizione sono nascosti. +relevant_repositories_tooltip = I repositori che sono biforcazioni o che non hanno argomento, icona, né descrizione sono nascosti. relevant_repositories = Sono visibili solo i repositori pertinenti, mostra risultati non filtrati. search.match.tooltip = Includi solo risultati che combaciano perfettamente con i termini di ricerca stars_few = %d stelle -forks_one = %d fork -forks_few = %d fork +forks_one = %d biforcazioni +forks_few = %d biforcazioni stars_one = %d stella [auth] @@ -485,6 +487,8 @@ sign_in_openid = Procedi con OpenID hint_login = Hai già un'utenza? Accedi! hint_register = Non hai un'utenza? Registrati ora. sign_up_button = Registrati ora. +unauthorized_credentials = Le credenziali non sono corrette o sono scadute. Controlla il comando o vedi %s per maggiori informazioni +use_onetime_code = Usa un codice monouso [mail] view_it_on=Visualizza su %s @@ -680,6 +684,8 @@ Location = Posizione AccessToken = Token di accesso FullName = Nome e cognome To = Nome del ramo +email_domain_is_not_allowed = Il dominio dell'indirizzo email dell'utente %s è in conflitto con EMAIL_DOMAIN_ALLOWLIST o EMAIL_DOMAIN_BLOCKLIST. Assicurati di aver inserito correttamente l'indirizzo email. +username_claiming_cooldown = Il nome utente non può essere assegnato, poiché il periodo di attesa non è ancora terminato. Sarà disponibile il %[1]s. [user] @@ -723,6 +729,7 @@ followers.title.one = Seguace followers.title.few = Seguaci following.title.one = Seguito following.title.few = Osservato +public_activity.visibility_hint.self_private_profile = Poiché il tuo profilo è privato, la tua attività è visibile solo a te e agli amministratori dell'istanza. Configura. [settings] @@ -1045,7 +1052,7 @@ added_on = Aggiunto su %s additional_repo_units_hint = Suggerisci l'attivazione di unità aggiuntive nel repositorio update_hints = Aggiorna suggerimenti update_hints_success = I suggerimenti sono stati aggiornati. -additional_repo_units_hint_description = Mostra un pulsante "Aggiungi più sezioni..." per i repositori che non hanno tutte le sezioni disponibili aggiunte. +additional_repo_units_hint_description = Visualizza un suggerimento “Abilita altro” per i repositori che non hanno tutte le unità disponibili abilitate. hints = Suggerimenti pronouns = Pronomi pronouns_custom = Personalizzato @@ -1053,6 +1060,34 @@ pronouns_unspecified = Non specificato language.title = Lingua predefinita language.description = Questa lingua verrà salvata nella tua utenza e verrà usata come predefinita ogni volta che farai l'accesso. language.localization_project = Aiutaci a tradurre Forgejo nella tua lingua! Più informazioni. +quota.sizes.assets.attachments.all = Allegati +quota.rule.no_limit = Illimitato +quota.sizes.assets.attachments.releases = Allegati del rilascio +quota.rule.exceeded = Superato +regenerate_token = Rigenera +access_token_regeneration = Rigenera il token d'accesso +access_token_regeneration_desc = Rigenerare un token comporterà la revoca dell'accesso al tuo account per tutte le applicazioni che lo utilizzano. Questa operazione è irreversibile. Vuoi procedere? +regenerate_token_success = Il token è stato rigenerato. Le applicazioni che lo utilizzano non hanno più accesso alla tua utenza e devono essere aggiornate con il nuovo token. +user_block_yourself = Non puoi bloccare te stesso. +quota.applies_to_user = Le seguenti regole di quota si applicano al tuo account +quota.applies_to_org = Le seguenti regole di quota si applicano a questa organizzazione +quota.rule.exceeded.helper = La dimensione totale degli oggetti per questa regola ha superato la quota. +quota.sizes.all = Tutti +quota.sizes.repos.all = Repositori +quota.sizes.repos.public = Repositori pubblici +quota.sizes.repos.private = Repositori privati +quota.sizes.git.all = Contenuto git +quota.sizes.git.lfs = Git LFS +quota.sizes.assets.all = Risorse +quota.sizes.assets.attachments.issues = Allegati della segnalazione +quota.sizes.assets.artifacts = Artefatti +quota.sizes.assets.packages.all = Pacchetti +quota.sizes.wiki = Wiki +keep_pronouns_private = Mostra i pronomi solo agli utenti che hanno effettuato il login +keep_pronouns_private.description = Questa impostazione nasconderà i tuoi pronomi agli utenti non ancora autenticati. +storage_overview = Panoramica spazio di archiviazione +quota = Quota +change_username_redirect_prompt.with_cooldown.one = Il vecchio nome utente sarà disponibile per tutti dopo un periodo di protezione di %\[1]d giorni. Durante questo periodo di attesa potrai comunque tornare al vecchio nome utente. [repo] owner=Proprietario @@ -1067,10 +1102,10 @@ template_description=I modelli di repositori consentono allɜ utenti di generare visibility=Visibilità visibility_description=Solo il proprietario o i membri dell'organizzazione se hanno diritti, saranno in grado di vederlo. visibility_helper_forced=L'amministratorə del sito impone che i nuovi repositori siano privati. -visibility_fork_helper=(Questa modifica influenzerà la visibilità di tutti i fork.) +visibility_fork_helper=(Questa modifica influenzerà la visibilità di tutte le biforcazioni.) clone_helper=Hai bisogno di aiuto per la clonazione? Visita Help. fork_repo=Deriva repositorio -fork_from=Deriva da +fork_from=Biforcazione di already_forked=Hai già fatto il fork di %s fork_to_different_account=Fai Fork a un account diverso fork_visibility_helper=La visibilità di un repositorio derivato non può essere modificata. @@ -1514,13 +1549,13 @@ issues.close_comment_issue=Commenta e chiudi issues.reopen_issue=Riapri issues.reopen_comment_issue=Commenta e riapri issues.create_comment=Commento -issues.closed_at=`ha chiuso questa segnalazione %[2]s` -issues.reopened_at=`ha riaperto questa segnalazione %[2]s` -issues.commit_ref_at=`ha fatto riferimento a questa segnalazione dal commit %[2]s` -issues.ref_issue_from=`ha fatto riferimento a questa segnalazione %[4]s %[2]s` -issues.ref_pull_from=`ha fatto riferimento a questa richiesta di modifica %[4]s %[2]s` -issues.ref_closing_from=`ha fatto riferimento a questa segnalazione da una richiesta di modifica %[4]s che la chiuderà, %[2]s` -issues.ref_reopening_from=`ha fatto riferimento a questa segnalazione da una richiesta di modifica %[4]s che la riaprirà, %[2]s` +issues.closed_at=`ha chiuso questa segnalazione %s` +issues.reopened_at=`ha riaperto questa segnalazione %s` +issues.commit_ref_at=`ha fatto riferimento a questa segnalazione dal commit %s` +issues.ref_issue_from=`ha fatto riferimento a questa segnalazione %[3]s %[1]s` +issues.ref_pull_from=`ha fatto riferimento a questa richiesta di modifica %[3]s %[1]s` +issues.ref_closing_from=`ha fatto riferimento a questa segnalazione da una richiesta di modifica %[3]s che la chiuderà, %[1]s` +issues.ref_reopening_from=`ha fatto riferimento a questa segnalazione da una richiesta di modifica %[3]s che la riaprirà, %[1]s` issues.ref_closed_from=`chiuso questa segnalazione %[4]s %[2]s` issues.ref_reopened_from=`ha riaperto questa segnalazione %[4]s %[2]s` issues.ref_from=`da %[1]s` @@ -1718,7 +1753,7 @@ pulls.cannot_merge_work_in_progress=Questa richiesta di modifica è contrassegna pulls.still_in_progress=Ancora in corso? pulls.add_prefix=Aggiungi prefisso %s pulls.remove_prefix=Rimuovi il prefisso %s -pulls.data_broken=Questa richiesta di modifica è rovinata a causa di informazioni mancanti riguardo la derivazione. +pulls.data_broken=Questa richiesta di modifica non è valida a causa di informazioni mancanti sulla biforcazione. pulls.files_conflicted=Questa richiesta di modifica va in conflitto con il ramo di destinazione. pulls.is_checking=Verifica dei conflitti di fusione in corso. Riprova tra qualche istante. pulls.is_ancestor=Questo ramo è già incluso nel ramo di destinazione. Non c'è nulla da fondere. @@ -1776,8 +1811,8 @@ pulls.update_branch_rebase=Aggiorna il ramo per cambio base pulls.update_branch_success=Ramo aggiornato con successo pulls.update_not_allowed=Non ti è permesso aggiornare il ramo pulls.outdated_with_base_branch=Questo ramo non è aggiornato con il ramo di base -pulls.closed_at=`ha chiuso questa richiesta di modifica %[2]s` -pulls.reopened_at=`ha riaperto questa richiesta di modifica %[2]s` +pulls.closed_at=`ha chiuso questa richiesta di modifica %s` +pulls.reopened_at=`ha riaperto questa richiesta di modifica %s` pulls.auto_merge_button_when_succeed=(Quando i controlli sono superati) pulls.auto_merge_when_succeed=Unione automatica quando tutti i controlli sono superati @@ -2100,7 +2135,7 @@ settings.event_create_desc=Ramo o etichetta creati. settings.event_delete=Elimina settings.event_delete_desc=Ramo o etichetta eliminati. settings.event_fork=Deriva -settings.event_fork_desc=Repository derivato. +settings.event_fork_desc=Creata una biforcazione del repositorio. settings.event_wiki=Wiki settings.event_release=Release settings.event_release_desc=Release pubblicata, aggiornata o rimossa in una repository. @@ -2137,7 +2172,7 @@ settings.event_pull_request_sync_desc=Pull request sincronizzata. settings.event_package=Pacchetto settings.event_package_desc=Pacchetto creato o eliminato in un repository. settings.branch_filter=Filtro rami -settings.branch_filter_desc=Whitelist dei rami per gli eventi di spinta, creazione dei rami e cancellazione dei rami, specificati come modello globo. Se vuoto o *, gli eventi per tutti i rami sono segnalati. Vedi la documentazione %[2]s per la sintassi. Esempi: master, {master,release*}. +settings.branch_filter_desc=Filtro, scritto come pattern glob, da applicare ai rami per gli eventi di tipo immissione, creazione di rami e rimozione di rami. Se vuoto o *, vengono considerati tutti gli eventi di tutti i rami. Maggiori dettagli sulla sintassi presso %[2]s. Esempi: master, {master,release*}. settings.active=Attivo settings.active_helper=Le informazioni sugli eventi innescati saranno inviate a questo URL del webhook. settings.add_hook_success=Il webhook è stato aggiunto. @@ -2167,8 +2202,8 @@ settings.web_hook_name_packagist=Packagist settings.packagist_username=Nome utente Packagist settings.packagist_api_token=API token settings.packagist_package_url=Url pacchetto pacchetti -settings.deploy_keys=Dispiega chiavi -settings.add_deploy_key=Aggiungi chiave di dispiego +settings.deploy_keys=Chiavi di distribuzione +settings.add_deploy_key=Aggiungi chiave di distribuzione settings.deploy_key_desc=Le deploy key possiedono l'accesso solamente alla lettura di un repository. settings.is_writable=Abilita accesso scrittura settings.is_writable_info=Permetti a questa deploy key di pushare nella repository. @@ -2177,7 +2212,7 @@ settings.title=Titolo settings.deploy_key_content=Contenuto settings.key_been_used=Una deploy key con contenuto identico è già in uso. settings.key_name_used=Esiste già una deploy key con questo nome. -settings.deploy_key_deletion=Rimuovi chiave di dispiego +settings.deploy_key_deletion=Rimuovi chiave di distribuzione settings.deploy_key_deletion_desc=Rimuovere una chiave di distribuzione ne revocherà l'accesso a questo repository. Continuare? settings.deploy_key_deletion_success=La chiave di distribuzione è stata rimossa. settings.branches=Rami @@ -2620,7 +2655,7 @@ issues.filter_type.reviewed_by_you = Revisionati da te projects.edit_success = Il progetto "%s" è stato aggiornato. issues.keyword_search_unavailable = La ricerca per parola chiave non è attualmente disponibile. Contatta l'amministratore del sito. issues.role.collaborator_helper = Quest*utente è statə invitatə a collaborare al progetto. -pulls.commit_ref_at = `ha fatto riferimento a questa richiesta di modifica da un commit %[2]s` +pulls.commit_ref_at = `ha fatto riferimento a questa richiesta di modifica da un commit %s` settings.thread_id = ID della discussione release.title = Titolo del rilascio visibility_helper = Rendi il repositorio privato @@ -2660,7 +2695,7 @@ wiki.page_title = Titolo della pagina wiki.page_content = Contenuto della pagina settings.mirror_settings.pushed_repository = Repositorio immesso settings.mirror_settings.push_mirror.edit_sync_time = Modifica intervallo di sincronizzazione degli specchi -settings.units.units = Unità della repository +settings.units.units = Sezioni del repositorio settings.units.add_more = Aggiungi ancora... settings.wiki_globally_editable = Consenti a tutti di modificare la wiki settings.pull_mirror_sync_in_progress = Prelevando cambiamenti dal progetto remoto %s. @@ -2732,7 +2767,7 @@ pulls.merged_title_desc_one = ha fuso %[1]d commit da %[2]s in Accedi per creare una richiesta di modifica. +settings.mirror_settings.push_mirror.none_ssh = Nessuno +sync_fork.branch_behind_one = Questo ramo è indietro di %[1]d commit rispetto a %[2]s +sync_fork.branch_behind_few = Questo ramo è indietro di %[1]d commit rispetto a %[2]s +no_eol.text = Nessun fine linea +no_eol.tooltip = Questo file non contiene un carattere di fine linea finale. +milestones.filter_sort.name = Nome +settings.protect_new_rule = Crea una nuova regola di protezione dei rami +editor.commit_email = E-mail di commit +mirror_public_key = Chiave SSH pubblica +mirror_denied_combination = Non è possibile utilizzare contemporaneamente l'autenticazione tramite chiave pubblica e password. +release.type_attachment = Allegato +release.invalid_external_url = URL esterno invalido: "%s" +new_from_template = Utilizza un modello +new_from_template_description = Puoi selezionare un modello di repositorio esistente su questa istanza e applicare le sue impostazioni. +new_advanced = Impostazioni avanzate +new_advanced_expand = Clicca per espandere +summary_card_alt = Scheda riepilogativa del repository %s +issues.filter_sort.relevance = Rilevanza +issues.num_reviews_one = %d revisioni +issues.num_reviews_few = %d revisioni +issues.reaction.add = Aggiungi reazione +issues.reaction.alt_many = %[1] e altri %[2]d hanno reagito %[3]s. +issues.reaction.alt_remove = Rimuovi la reazione %[1]s dal commento. +issues.reaction.alt_add = Aggiungi la reazione %[1]s al commento. +issues.review.remove_review_requests = rimosso richieste di revisione per %\[1]s %\[2]s +comment.blocked_by_user = Non è possibile commentare perché sei stato bloccato dal proprietario del repositorio o dall'autore. +issues.summary_card_alt = Scheda riepilogativa di una segnalazione intitolata "%s" nel repositorio %s +pulls.delete_after_merge.head_branch.is_default = Il ramo head che desideri eliminare è il ramo predefinito e non può essere eliminato. +settings.event_action_success = Successo +settings.event_action_success_desc = L'esecuzione dell'azione è andata a buon fine. +diff.git-notes.remove-header = Rimuovi nota +diff.git-notes.remove-body = Questa nota verrà rimossa. +activity.commit = Attività di commit [graphs] contributors.what = contribuzioni @@ -2839,7 +2947,7 @@ team_name_helper=I nomi dei team devono essere brevi e semplici da ricordare. team_desc_helper=Descrivi lo scopo o il ruolo del team. team_access_desc=Accesso al repository team_permission_desc=Autorizzazione -team_unit_desc=Consenti l'accesso a sezioni di progetto +team_unit_desc=Consenti l'accesso alle sezioni del repositorio team_unit_disabled=(Disabilitato) form.create_org_not_allowed=Non disponi dell'autorizzazione per creare un organizzazione. @@ -3493,6 +3601,12 @@ config.cache_test_slow = Successo nel controllo della cache, ma la risposta è l config.app_slogan = Slogan dell'istanza auths.default_domain_name = Nome di dominio predefinito utilizzato per l'indirizzo e-mail users.restricted.description = Permetti di interagire solo con i repositori e le organizzazioni in cui l'utente è aggiuntə come collaborante. Ciò evita l'accesso ai repositori pubblici di quest'istanza. +emails.deletion_success = L'indirizzo e-mail è stato eliminato. +monitor.duration = Durata (s) +emails.delete_desc = Confermare l’eliminazione di questo indirizzo email? +emails.delete_primary_email_error = Non puoi eliminare la e-mail primaria. +emails.delete = Elimina e-mail +users.organization_creation.description = Abilita la creazione di nuove organizzazioni. [action] @@ -3737,6 +3851,31 @@ owner.settings.cargo.initialize.success = L'indice di Cargo è stato creato corr 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 +arch.version.groups = Gruppo +arch.version.conflicts = Va in conflitto con +arch.version.depends = Dipende da +arch.version.makedepends = Dipendenze di build +arch.version.checkdepends = Dipendenze di controllo +arch.version.replaces = Sostituisce +arch.version.optdepends = Dipende opzionalmente da +arch.version.backup = Backup +search_in_external_registry = Cerca in %s +arch.version.provides = Fornisce +arch.pacman.conf = Aggiungi il server con la relativa distribuzione e architettura a /etc/pacman.conf: +alt.setup = Aggiungi il repositorio alla lista dei repositori in rete (seleziona l'architettura necessaria al posto di "_arch_"): +container.images.title = Immagini +arch.version.properties = Proprietà della versione +alt.registry.install = Per installare il pacchetto, esegui il comando seguente: +alt.install = Installa pacchetto +alt.registry = Configura questo registro dalla riga di comando: +arch.pacman.helper.gpg = Aggiungi il certificato a pacman: +arch.pacman.repo.multi = %s ha la stessa versione in diverse distribuzioni. +arch.pacman.repo.multi.item = Configurazione per %s +arch.pacman.sync = Sincronizza il paccketto con pacman: +arch.version.description = Descrizione +alt.repository = Informazioni del repositorio +alt.repository.architectures = Architetture +alt.repository.multiple_groups = Questo pacchetto è disponibile per più gruppi. [secrets] secrets = Segreti @@ -3834,7 +3973,7 @@ runs.empty_commit_message = (messaggio di commit vuoto) runs.no_runs = Il flusso di lavoro non è stato ancora eseguito. variables.creation.success = La variabile "%s" è stata aggiunta. variables.description = Le variabili saranno passate a determinate azioni e non possono essere lette altrimenti. -need_approval_desc = È necessaria l'approvazione per eseguire flussi di lavoro per richieste di modifica da derivazioni. +need_approval_desc = È necessaria l'approvazione per eseguire flussi di lavoro per richieste di modifica da biforcazioni. runs.no_workflows.documentation = Per ulteriori informazioni sulle Forgejo Actions vedi la documentazione. runs.no_workflows.quick_start = Non sai come iniziare con le Forgejo Actions? Vedi la guida rapida. runners.delete_runner_notice = Se un'attività è in esecuzione su questo esecutore sarà terminata ed etichettata fallito. Potrebbe rompere flussi di lavoro di costruzione. @@ -3848,6 +3987,8 @@ workflow.dispatch.invalid_input_type = Tipo ingresso "%s" non valido. workflow.dispatch.warn_input_limit = Visualizzati solo i primi %d ingressi. runs.no_job = Il flusso di lavoro deve contenere almeno un incarico workflow.dispatch.use_from = Usa flusso di lavoro da +variables.not_found = Non è stato possibile trovare la variabile. +runs.expire_log_message = I log sono stati eliminati in quanto troppo vecchi. @@ -3856,6 +3997,7 @@ workflow.dispatch.use_from = Usa flusso di lavoro da type-3.display_name = Progetto dell'organizzazione type-1.display_name = Progetto individuale type-2.display_name = Progetto +deleted.display_name = Progetto eliminato [git.filemode] symbolic_link=Link Simbolico @@ -3896,6 +4038,7 @@ milestone_kind = Ricerca tappe... regexp_tooltip = Interpreta i termini di ricerca come un'espressione regolare regexp = Espressione Regolare union_tooltip = Include i risultati che combaciano con una qualsiasi delle parole chiave separata da spazi +union = Parole chiavi [munits.data] gib = GiB @@ -3914,4 +4057,16 @@ filepreview.line = Linea %[1]d in %[2]s [repo.permissions] issues.write = Scrittura: Chiudere segnalazioni e gestire metadati come etichette, traguardi, assegnatarɜ, scadenze e dipendenze. -pulls.write = Scrittura: Chiudere richieste di modifica e gestire metadati come etichette, traguardi, assegnatarɜ, scadenze e dipendenze. \ No newline at end of file +pulls.write = Scrittura: Chiudere richieste di modifica e gestire metadati come etichette, traguardi, assegnatarɜ, scadenze e dipendenze. +releases.write = Scrittura: Può pubblicare, modificare ed eliminare rilasci e le risorse ad essi allegate. +code.write = Scrittura: Può aggiungere commit al repositorio, creare rami ed etichette. +wiki.read = Lettura: Può leggere la wiki integrata e la sua cronologia. +releases.read = Lettura: Può visualizzare e scaricare i rilasci. +projects.read = Lettura: Può accedere alle board di progetto del repositorio. +code.read = Lettura: Può accedere e clonare il codice del repositorio. +wiki.write = Scrittura: Può creare, aggiornare ed eliminare pagine nella wiki integrata. +issues.read = Lettura: Può leggere e creare segnalazioni e commenti. +pulls.read = Lettura: Può leggere e creare richieste di modifica. + +[translation_meta] +test = daje Roma \ No newline at end of file diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index d4d7024f5d..555f5c6a75 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -1610,13 +1610,13 @@ issues.close_comment_issue=コメントしてクローズ issues.reopen_issue=再オープンする issues.reopen_comment_issue=コメントして再オープン issues.create_comment=コメントする -issues.closed_at=`がイシューをクローズ %[2]s` -issues.reopened_at=`がイシューを再オープン %[2]s` -issues.commit_ref_at=`がコミットでこのイシューを参照 %[2]s` -issues.ref_issue_from=`が%[4]s、このイシューを参照 %[2]s` -issues.ref_pull_from=`が%[4]s、このプルリクエストを参照 %[2]s` -issues.ref_closing_from=`が%[4]s、プルリクエストがこのイシューをクローズするよう参照 %[2]s` -issues.ref_reopening_from=`が%[4]s、プルリクエストがこのイシューを再オープンするよう参照 %[2]s` +issues.closed_at=`がイシューをクローズ %s` +issues.reopened_at=`がイシューを再オープン %s` +issues.commit_ref_at=`がコミットでこのイシューを参照 %s` +issues.ref_issue_from=`が%[3]s、このイシューを参照 %[1]s` +issues.ref_pull_from=`が%[3]s、このプルリクエストを参照 %[1]s` +issues.ref_closing_from=`が%[3]s、プルリクエストがこのイシューをクローズするよう参照 %[1]s` +issues.ref_reopening_from=`が%[3]s、プルリクエストがこのイシューを再オープンするよう参照 %[1]s` issues.ref_closed_from=`が%[4]s、このイシューをクローズ %[2]s` issues.ref_reopened_from=`が%[4]s、このイシューを再オープン %[2]s` issues.ref_from=` %[1]s にて` @@ -1923,8 +1923,8 @@ pulls.update_branch_success=ブランチの更新が成功しました pulls.update_not_allowed=ブランチを更新する権限がありません pulls.outdated_with_base_branch=このブランチはベースブランチに対して最新ではありません pulls.close=プルリクエストをクローズ -pulls.closed_at=`がプルリクエストをクローズ %[2]s` -pulls.reopened_at=`がプルリクエストを再オープン %[2]s` +pulls.closed_at=`がプルリクエストをクローズ %s` +pulls.reopened_at=`がプルリクエストを再オープン %s` pulls.cmd_instruction_hint=コマンドラインの手順を表示 pulls.cmd_instruction_checkout_title=チェックアウト pulls.cmd_instruction_checkout_desc=プロジェクトリポジトリから新しいブランチをチェックアウトし、変更内容をテストします。 @@ -2721,7 +2721,7 @@ settings.wiki_rename_branch_main = wikiのブランチ名を正規化する settings.wiki_rename_branch_main_desc = wikiによって内部的に使われているブランチ名を "%s" に変更します。これは恒久的で元に戻すことはできません。 contributors.contribution_type.additions = 追加 vendored = vendor済み -pulls.commit_ref_at = `このプルリクエストを言及するコミット %[2]s` +pulls.commit_ref_at = `このプルリクエストを言及するコミット %s` pulls.fast_forward_only_merge_pull_request = Fast-forwardのみ admin.manage_flags = フラグ管理 admin.update_flags = フラグを更新 diff --git a/options/locale/locale_jbo.ini b/options/locale/locale_jbo.ini index 6124dc4d22..947bb298de 100644 --- a/options/locale/locale_jbo.ini +++ b/options/locale/locale_jbo.ini @@ -2,4 +2,12 @@ [common] -home = zdani \ No newline at end of file +home = zdani +dashboard = jitypalna +explore = sisku +help = se sidju +logo = se'isni +sign_in = co'a nerkla +sign_in_with_provider = co'a nerka sepi'o la .%s. +sign_out = co'a cliva +sign_up = co'a gumri \ No newline at end of file diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini index 433ec01828..be0400bea4 100644 --- a/options/locale/locale_ko-KR.ini +++ b/options/locale/locale_ko-KR.ini @@ -943,7 +943,7 @@ issues.close_comment_issue=클로즈 및 코멘트 issues.reopen_issue=다시 열기 issues.reopen_comment_issue=다시 오픈 및 코멘트 issues.create_comment=코멘트 -issues.commit_ref_at=` 커밋 %[2]s에서 이 이슈 언급` +issues.commit_ref_at=` 커밋 %s에서 이 이슈 언급` issues.role.owner=소유자 issues.role.member=멤버 issues.sign_in_require_desc=로그인하여 이 대화에 참여하세요. @@ -1378,7 +1378,7 @@ issues.closed_by_fake = %[2]s님이 %[1]s에 닫음 issues.new.closed_projects = 닫힌 프로젝트 pulls.merged_by_fake = %[2]s님이 %[1]s 병합함 issues.closed_by = %[3]s님이 %[1]s에 닫음 -issues.closed_at = `%[2]s`에 이 이슈를 닫음 +issues.closed_at = `%s`에 이 이슈를 닫음 issues.filter_milestone_closed = 닫힌 마일스톤 issues.opened_by_fake = %[2]s님이 %[1]s에 열음 issues.filter_project_none = 프로젝트 없음 diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 789871f3c3..98baff217b 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -1651,13 +1651,13 @@ issues.close_comment_issue=Aizvērt ar piebildi issues.reopen_issue=Atvērt atkārtoti issues.reopen_comment_issue=Atkārtoti atvērt ar piebildi issues.create_comment=Pievienot piebildi -issues.closed_at=`aizvēra šo pieteikumu %[2]s` -issues.reopened_at=`atkārtoti atvēra šo pieteikumu %[2]s` -issues.commit_ref_at=`atsaucās uz šo pieteikumu iesūtījumā %[2]s` -issues.ref_issue_from=`atsaucās uz šo pieteikumu %[4]s %[2]s` -issues.ref_pull_from=`atsaucās uz šo izmaiņu pieprasījumu %[4]s %[2]s` -issues.ref_closing_from=`atsaucās uz šo pieteikumu izmaiņu pieprasījumā %[4]s, kas aizvērs to, %[2]s` -issues.ref_reopening_from=`atsaucās uz šo pieteikumu izmaiņu pieprasījumā %[4]s, kas atkārtoti atvērs to, %[2]s` +issues.closed_at=`aizvēra šo pieteikumu %s` +issues.reopened_at=`atkārtoti atvēra šo pieteikumu %s` +issues.commit_ref_at=`atsaucās uz šo pieteikumu iesūtījumā %s` +issues.ref_issue_from=`atsaucās uz šo pieteikumu %[3]s %[1]s` +issues.ref_pull_from=`atsaucās uz šo izmaiņu pieprasījumu %[3]s %[1]s` +issues.ref_closing_from=`atsaucās uz šo pieteikumu izmaiņu pieprasījumā %[3]s, kas aizvērs to, %[1]s` +issues.ref_reopening_from=`atsaucās uz šo pieteikumu izmaiņu pieprasījumā %[3]s, kas atkārtoti atvērs to, %[1]s` issues.ref_closed_from=`aizvēra pieteikumu %[4]s %[2]s` issues.ref_reopened_from=`atkārtoti atvēra pieteikumu %[4]s %[2]s` issues.ref_from=`no %[1]s` @@ -1964,8 +1964,8 @@ pulls.update_branch_success=Zara atjaunināšana bija sekmīga pulls.update_not_allowed=Nav ļauts atjaunināt zaru pulls.outdated_with_base_branch=Šis zars ir novecojis salīdzinājumā ar pamata zaru pulls.close=Aizvērt izmaiņu pieprasījumu -pulls.closed_at=`aizvēra šo izmaiņu pieprasījumu %[2]s` -pulls.reopened_at=`atkārtoti atvēra šo izmaiņu pieprasījumu %[2]s` +pulls.closed_at=`aizvēra šo izmaiņu pieprasījumu %s` +pulls.reopened_at=`atkārtoti atvēra šo izmaiņu pieprasījumu %s` pulls.cmd_instruction_hint=Apskatīt komandrindas izmantošanas norādes pulls.cmd_instruction_checkout_title=Paņemt pulls.cmd_instruction_checkout_desc=Projekta glabātavā jāizveido jauns zars un jāpārbauda izmaiņas. @@ -2826,7 +2826,7 @@ issues.author.tooltip.pr = Šis lietotājs ir šī izmaiņu pieprasījuma izveid pulls.edit.already_changed = Neizdevās saglabāt izmaiņu pieprasījuma izmaiņas. Izskatās, ka saturu jau ir mainījis kāds cits lietotājs. Lūgums atsvaidzināt lapu un mēģināt labot vēlreiz, lai izvairītos no izmaiņu pārrakstīšanas pulls.blocked_by_user = Tu nevari izveidot izmaiņu pieprasījumu šajā glabātavā, jo tās īpašnieks ir Tevi liedzis. issues.all_title = Visi -pulls.commit_ref_at = ` atsaucāš uz šo izmaiņu pieprasījumu iesūtījumā %[2]s` +pulls.commit_ref_at = ` atsaucās uz šo izmaiņu pieprasījumu iesūtījumā %s` issues.num_participants_one = %d dalībnieks pulls.title_desc_one = vēlas iekļaut %[1]d iesūtījumu no %[2]s %[3]s issues.archived_label_description = (Arhivēts) %s diff --git a/options/locale/locale_nds.ini b/options/locale/locale_nds.ini index 57985942ed..68fe899d6e 100644 --- a/options/locale/locale_nds.ini +++ b/options/locale/locale_nds.ini @@ -1347,7 +1347,7 @@ issues.change_title_at = `hett %[3]s de Titel vun %[1]s issues.change_ref_at = `hett %[3]s de Nömen vun %[1]s to %[2]s ännert` issues.delete_branch_at = `hett %[2]s de Twieg %[1]s lösket` issues.filter_label = Vermark -issues.filter_label_exclude = `Bruuk Alt+Klick/Enter, um Vermarkens uttosluten` +issues.filter_label_exclude = Bruuk Alt + Klick, um Vermarkens uttosluten issues.filter_label_no_select = All Vermarkens issues.filter_label_select_no_label = Keen Vermark issues.filter_milestone = Marksteen @@ -1434,12 +1434,12 @@ issues.comment_pull_merged_at = hett Kommitteren %[1]s in %[2]s %[3]s tosamenfö issues.close_comment_issue = Mit Kommentaar dichtmaken issues.reopen_comment_issue = Mit Kommentaar weer opmaken issues.create_comment = Kommenteren -issues.reopened_at = `hett deeses Gefall %[2]s weer opmaakt` +issues.reopened_at = `hett deeses Gefall %s weer opmaakt` issues.comment_manually_pull_merged_at = hett Kommitteren %[1]s in %[2]s %[3]s vun Hand tosamenföhrt issues.reopen_issue = Weer opmaken -issues.closed_at = `hett deeses Gefall %[2]s dichtmaakt` -issues.commit_ref_at = `hett deeses Gefall %[2]s vun eenem Kommitteren benöömt` -issues.ref_closing_from = `hett deeses Gefall %[2]s vun eenem Haalvörslag, wat ’t %[4]s dichtmaken word, benöömt` +issues.closed_at = `hett deeses Gefall %s dichtmaakt` +issues.commit_ref_at = `hett deeses Gefall %s vun eenem Kommitteren benöömt` +issues.ref_closing_from = `hett deeses Gefall %[1]s vun eenem Haalvörslag, wat ’t %[3]s dichtmaken word, benöömt` issues.ref_closed_from = `hett deeses Gefall %[4]s %[2]s dichtmaakt` issues.ref_reopened_from = `hett deeses Gefall %[4]s %[2]s weer opmaakt` issues.ref_from = `vun %[1]s` @@ -1477,12 +1477,12 @@ issues.label.filter_sort.reverse_alphabetically = Umdreiht na de Alphabeet issues.label.filter_sort.by_size = Lüttste Grött issues.num_participants_one = %d Mitmaker issues.num_participants_few = %d Mitmakers -issues.ref_pull_from = `hett deesen Haalvörslag %[4]s %[2]s benöömt` +issues.ref_pull_from = `hett deesen Haalvörslag %[3]s %[1]s benöömt` issues.label_title = Naam issues.label_archived_filter = Archiveert Vermarkens wiesen issues.archived_label_description = (Archiveert) %s -issues.ref_issue_from = `hett deeses Gefall %[4]s %[2]s benöömt` -issues.ref_reopening_from = `hett deeses Gefall vun eenem Haalvörslag, wat ’t %[4]s weer opmaken word, %[2]s benöömt` +issues.ref_issue_from = `hett deeses Gefall %[3]s %[1]s benöömt` +issues.ref_reopening_from = `hett deeses Gefall vun eenem Haalvörslag, wat ’t %[3]s weer opmaken word, %[1]s benöömt` issues.author.tooltip.issue = Deeser Bruker is de Autor vun deesem Gefall. issues.role.member_helper = Deeser Bruker is een Liddmaat vun de Vereenigung, wat de Eegner vun deesem Repositorium is. issues.role.collaborator_helper = Deeser Bruuker is inladen worden, in deesem Repositorium mittoarbeiden. @@ -1740,8 +1740,8 @@ pulls.status_checks_show_all = All Överprüfens wiesen pulls.update_branch_rebase = Twieg mit Umbaseren vernejen pulls.outdated_with_base_branch = De Twieg is tegen de Grund-Twieg verollt pulls.close = Haalvörslag dichtmaken -pulls.closed_at = `hett deesen Haalvörslag %[2]s dichtmaakt` -pulls.reopened_at = `hett deesen Haalvörslag %[2]s weer opmaakt` +pulls.closed_at = `hett deesen Haalvörslag %s dichtmaakt` +pulls.reopened_at = `hett deesen Haalvörslag %s weer opmaakt` pulls.cmd_instruction_hint = Wies Oorderreeg-Instruksjes pulls.cmd_instruction_checkout_title = Utchecken pulls.cmd_instruction_merge_title = Tosamenföhren @@ -1771,7 +1771,7 @@ milestones.deletion = Marksteen lösken pulls.has_merged = Fehlslagen: De Haalvörslag is tosamenföhrt worden, du kannst nich noch eenmaal tosamenföhren of de Enn-Twieg ännern. pulls.unrelated_histories = Tosamenföhren fehlslagen: De Tosamenföhrens-Kopp un -Grund hebben keene gemeensame Histoorje. Wenk: Versöök eene anner Tosamenföhrens-Aard pulls.update_not_allowed = Du düürst deesen Twieg nich vernejen -pulls.commit_ref_at = `hett deesen Haalvörslag %[2]s vun eenem Kommitteren benöömt` +pulls.commit_ref_at = `hett deesen Haalvörslag %s vun eenem Kommitteren benöömt` pulls.auto_merge_newly_scheduled = De Haalvörslag weer sett, sik tosamentoföhren, wenn all Överprüfens kumpleet sünd. milestones.clear = Leeg maken pulls.push_rejected_no_message = Schuven fehlslagen: Dat Schuven is sünner feerne Naricht oflehnt worden. Bidde överprüüf de Git-Hakens för deeses Repositorium diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index 549718ce23..48442bc39f 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -1554,13 +1554,13 @@ issues.close_comment_issue=Sluit met commentaar issues.reopen_issue=Heropen issues.reopen_comment_issue=Heropen met commentaar issues.create_comment=Reageer -issues.closed_at=`heeft dit probleem gesloten %[2]s` -issues.reopened_at=`heropende dit probleem %[2]s` -issues.commit_ref_at=`verwees naar dit probleem vanuit commit %[2]s'` -issues.ref_issue_from=`refereerde aan dit issue %[4]s %[2]s` -issues.ref_pull_from=`refereerde aan deze pull request %[4]s %[2]s` -issues.ref_closing_from=`verwees naar deze issue van een pull request %[4]s dat het zal sluiten, %[2]s` -issues.ref_reopening_from=`verwees naar een pull request %[4]s dat dit issue heropent %[2]s ` +issues.closed_at=`heeft dit probleem gesloten %s` +issues.reopened_at=`heropende dit probleem %s` +issues.commit_ref_at=`verwees naar dit probleem vanuit commit %s` +issues.ref_issue_from=`refereerde aan dit issue %[3]s %[1]s` +issues.ref_pull_from=`refereerde aan deze pull request %[3]s %[1]s` +issues.ref_closing_from=`verwees naar deze issue van een pull request %[3]s dat het zal sluiten, %[1]s` +issues.ref_reopening_from=`verwees naar een pull request %[3]s dat dit issue heropent %[1]s ` issues.ref_closed_from=`sloot dit issue %[4]s %[2]s` issues.ref_reopened_from=`heropende dit issue %[4]s %[2]s` issues.ref_from=`van %[1]s` @@ -1815,8 +1815,8 @@ pulls.update_branch_rebase=Update branch via herbaseren pulls.update_branch_success=Branch update is geslaagd pulls.update_not_allowed=Je hebt geen toestemming om branch bij te werken pulls.outdated_with_base_branch=Deze branch is verouderd met de basis branch -pulls.closed_at=`heeft deze pull request gesloten %[2]s` -pulls.reopened_at=`heropende deze pull request %[2]s` +pulls.closed_at=`heeft deze pull request gesloten %s` +pulls.reopened_at=`heropende deze pull request %s` pulls.auto_merge_button_when_succeed=(Bij geslaagde controles) pulls.auto_merge_when_succeed=Automatisch samenvoegen wanneer alle controles gelukt zijn @@ -2627,7 +2627,7 @@ projects.column.set_default_desc = Stel deze kolom in als standaard voor ongecat issues.action_check = Aanvinken/uitvinken issues.dependency.issue_batch_close_blocked = Het is niet mogelijk om de issues die u gekozen heeft in bulk te sluiten, omdat issue #%d nog open afhankelijkheden heeft pulls.review_only_possible_for_full_diff = Beoordeling is alleen mogelijk bij het bekijken van de volledige diff -pulls.commit_ref_at = `heeft naar deze pull request verwezen vanuit een commit %[2]s` +pulls.commit_ref_at = `heeft naar deze pull request verwezen vanuit een commit %s` pulls.cmd_instruction_hint = Bekijk opdrachtregelinstructies pulls.cmd_instruction_checkout_desc = Vanuit uw project repository, schakel over naar een nieuwe branch en test de veranderingen. pulls.showing_specified_commit_range = Alleen veranderingen weergeven tussen %[1]s..%[2]s diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index 86a333a886..189e663618 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -1460,13 +1460,13 @@ issues.close_comment_issue=Zamknij z komentarzem issues.reopen_issue=Otwórz ponownie issues.reopen_comment_issue=Otwórz ponownie z komentarzem issues.create_comment=Skomentuj -issues.closed_at=`zamknął(-ęła) to zgłoszenie %[2]s` -issues.reopened_at=`otworzył(-a) ponownie to zgłoszenie %[2]s` -issues.commit_ref_at=`wspomniał(-a) to zgłoszenie z commita %[2]s` -issues.ref_issue_from=`odwołał(-a) się do tego zgłoszenia %[4]s %[2]s` -issues.ref_pull_from=`odwołał(-a) się do tego Pull Requesta %[4]s %[2]s` -issues.ref_closing_from=`odwołał(-a) się do pull requesta %[4]s, który zamknie to zgłoszenie %[2]s` -issues.ref_reopening_from=`odwołał(-a) się z pull requesta %[4]s, który otworzy na nowo to zgłoszenie %[2]s` +issues.closed_at=`zamknął(-ęła) to zgłoszenie %s` +issues.reopened_at=`otworzył(-a) ponownie to zgłoszenie %s` +issues.commit_ref_at=`wspomniał(-a) to zgłoszenie z commita %s` +issues.ref_issue_from=`odwołał(-a) się do tego zgłoszenia %[3]s %[1]s` +issues.ref_pull_from=`odwołał(-a) się do tego Pull Requesta %[3]s %[1]s` +issues.ref_closing_from=`odwołał(-a) się do pull requesta %[3]s, który zamknie to zgłoszenie %[1]s` +issues.ref_reopening_from=`odwołał(-a) się z pull requesta %[3]s, który otworzy na nowo to zgłoszenie %[1]s` issues.ref_closed_from=`zamknął(-ęła) to zgłoszenie %[4]s %[2]s` issues.ref_reopened_from=`ponownie otworzył(-a) to zgłoszenie %[4]s %[2]s` issues.ref_from=`z %[1]s` @@ -1679,8 +1679,8 @@ pulls.update_branch_rebase=Aktualizuj branch przez rebase pulls.update_branch_success=Aktualizacja gałęzi powiodła się pulls.update_not_allowed=Nie masz uprawnień do aktualizacji gałęzi pulls.outdated_with_base_branch=Ta gałąź jest przestarzała w stosunku do gałęzi bazowej -pulls.closed_at=`zamknął(-ęła) ten pull request %[2]s` -pulls.reopened_at=`otworzył(-a) ponownie ten Pull Request %[2]s` +pulls.closed_at=`zamknął(-ęła) ten pull request %s` +pulls.reopened_at=`otworzył(-a) ponownie ten Pull Request %s` @@ -2643,7 +2643,7 @@ pulls.closed = Pull request zamknięty pulls.blocked_by_outdated_branch = Ten pull request jest zablokowany ponieważ jest przedawniony. pulls.blocked_by_changed_protected_files_1 = Ten pull request jest zablokowany ponieważ wprowadza zmiany do chronionego pliku: pulls.push_rejected_no_message = Wypchnięcie nie powiodło się: Wypchnięcie zostało odrzucone, ale nie otrzymano zdalnej wiadomości. Sprawdź hooki Git dla tego repozytorium.= -pulls.commit_ref_at = `odniósł się do tego pull requesta z commita %[2]s` +pulls.commit_ref_at = `odniósł się do tego pull requesta z commita %s` pulls.cmd_instruction_checkout_desc = Ze swojego repozytorium projektu, utwórz nową gałąź i przetestuj zmiany. pulls.clear_merge_message_hint = Wyczyszczenie wiadomości scalenia usunie tylko treść wiadomości commitu pozostawiając wygenerowane przez git dopiski takie jak "Co-Authored-By ...". pulls.delete_after_merge.head_branch.insufficient_branch = Nie masz uprawnień by usunąć head gałęzi. diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 26bdd35420..8de0374eb2 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -1063,8 +1063,8 @@ language.localization_project = Ajude-nos a traduzir Forgejo para o seu idioma! language.description = Essa língua será salva em sua conta e será usada como padrão após você iniciar a sessão. user_block_yourself = Você não pode se bloquear. pronouns_custom_label = Pronomes personalizados -change_username_redirect_prompt.with_cooldown.one = O nome de usuário antigo ficará disponível para qualquer pessoa após um período de espera de %[1]d dia, você ainda pode recuperar o nome de usuário antigo durante este período de espera. -change_username_redirect_prompt.with_cooldown.few = O nome de usuário antigo ficará disponível para qualquer pessoa após um período de espera de %[1]d dias, você ainda pode recuperar o nome de usuário antigo durante este período de espera. +change_username_redirect_prompt.with_cooldown.one = O nome de usuário antigo ficará disponível para qualquer pessoa após um período de proteção de %[1]d dia. Você ainda pode recuperar o nome de usuário antigo durante este período de proteção. +change_username_redirect_prompt.with_cooldown.few = O nome de usuário antigo ficará disponível para qualquer pessoa após um período de proteção de %[1]d dias. Você ainda pode recuperar o nome de usuário antigo durante este período de proteção. quota.applies_to_user = As seguintes regras de cota se aplicam à sua conta quota.rule.exceeded.helper = O tamanho total de objetos para esta regra excedeu a cota. keep_pronouns_private = Mostrar pronomes apenas para usuários autenticados @@ -1568,7 +1568,7 @@ issues.remove_ref_at=`removeu a referência %s %s` issues.add_ref_at=`adicionou a referência %s %s` issues.delete_branch_at=`excluiu branch %s %s` issues.filter_label=Etiqueta -issues.filter_label_exclude=`Use alt + clique/enter para excluir etiquetas` +issues.filter_label_exclude=Use Alt + Clique para excluir etiquetas issues.filter_label_no_select=Todas as etiquetas issues.filter_label_select_no_label=Sem etiqueta issues.filter_milestone=Marco @@ -1642,13 +1642,13 @@ issues.close_comment_issue=Comentar e fechar issues.reopen_issue=Reabrir issues.reopen_comment_issue=Comentar e reabrir issues.create_comment=Comentar -issues.closed_at=`fechou esta issue %[2]s` -issues.reopened_at=`reabriu esta issue %[2]s` -issues.commit_ref_at=`citou esta issue em um commit %[2]s` -issues.ref_issue_from=`referenciado esta issue %[4]s %[2]s` -issues.ref_pull_from=`referenciado este pull request %[4]s %[2]s` -issues.ref_closing_from=`referenciado esta issue de um pull request %[4]s que a fechará %[2]s` -issues.ref_reopening_from=`referenciado esta issue de um pull request %[4]s que a reabrirá %[2]s` +issues.closed_at=`fechou esta issue %s` +issues.reopened_at=`reabriu esta issue %s` +issues.commit_ref_at=`citou esta issue de um commit %s` +issues.ref_issue_from=`citou esta issue %[3]s %[1]s` +issues.ref_pull_from=`citou este pull request %[3]s %[1]s` +issues.ref_closing_from=`citou esta issue de um pull request %[3]s que a fechará %[1]s` +issues.ref_reopening_from=`citou esta issue de um pull request %[3]s que a reabrirá, %[1]s` issues.ref_closed_from=`fechou esta issue %[4]s %[2]s` issues.ref_reopened_from=`reabriu esta issue %[4]s %[2]s` issues.ref_from=`de %[1]s` @@ -1942,8 +1942,8 @@ pulls.update_branch_success=Atualização do branch foi bem-sucedida pulls.update_not_allowed=Você não tem permissão para atualizar o branch pulls.outdated_with_base_branch=Este branch está desatualizado com o branch base pulls.close=Fechar pull request -pulls.closed_at=`fechou este pull request %[2]s` -pulls.reopened_at=`reabriu este pull request %[2]s` +pulls.closed_at=`fechou este pull request %s` +pulls.reopened_at=`reabriu este pull request %s` pulls.clear_merge_message=Limpar mensagem do merge pulls.clear_merge_message_hint=Limpar a mensagem de merge só irá remover o conteúdo da mensagem de commit e manter trailers git gerados, como "Co-Authored-By …". @@ -2719,7 +2719,7 @@ issues.label_archive_tooltip = Etiquetas arquivadas não serão exibidas nas sug activity.navbar.pulse = Recente settings.units.overview = Geral settings.units.add_more = Habilitar mais -pulls.commit_ref_at = `referenciou este pedido de mesclagem no commit %[2]s` +pulls.commit_ref_at = `citou este pull request de um commit %s` pulls.cmd_instruction_merge_title = Mesclar settings.units.units = Unidades vendored = Externo @@ -2920,6 +2920,7 @@ settings.event_action_recover = Recuperar settings.event_action_recover_desc = A execução da Action teve sucesso após a última execução no mesmo workflow ter falhado. settings.event_action_success = Sucesso settings.event_action_success_desc = A execução da Action foi bem sucedida. +issues.filter_type.all_pull_requests = Todos os pull requests [graphs] component_loading = Carregando %s… @@ -3056,8 +3057,8 @@ open_dashboard = Abrir painel settings.change_orgname_prompt = Obs.: Alterar o nome de uma organização resultará na alteração do URL dela e disponibilizará o nome antigo para uso. follow_blocked_user = Não foi possível seguir esta organização porque ela bloqueou-o(a). form.name_pattern_not_allowed = O padrão "%s" não é permitido no nome de uma organização. -settings.change_orgname_redirect_prompt.with_cooldown.one = O nome de organização antigo ficará disponível para qualquer pessoa após um período de proteção de %[1]d dia, você ainda pode recuperar o nome antigo durante este período de proteção. -settings.change_orgname_redirect_prompt.with_cooldown.few = O nome de organização antigo ficará disponível para qualquer pessoa após um período de espera de %[1]d dia, você ainda pode recuperar o nome antigo durante este período de espera. +settings.change_orgname_redirect_prompt.with_cooldown.one = O nome de organização antigo ficará disponível para qualquer pessoa após um período de proteção de %[1]d dia. Você ainda pode recuperar o nome antigo durante este período de proteção. +settings.change_orgname_redirect_prompt.with_cooldown.few = O nome de organização antigo ficará disponível para qualquer pessoa após um período de proteção de %[1]d dia. Você ainda pode recuperar o nome antigo durante este período de proteção. [admin] dashboard=Painel diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index 7f36d164b3..0e8f2d485e 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -1657,13 +1657,13 @@ issues.close_comment_issue=Fechar com comentário issues.reopen_issue=Reabrir issues.reopen_comment_issue=Reabrir com comentário issues.create_comment=Comentar -issues.closed_at=`encerrou esta questão %[2]s` -issues.reopened_at=`reabriu esta questão %[2]s` -issues.commit_ref_at=`referenciou esta questão num cometimento %[2]s` -issues.ref_issue_from=`referiu esta questão %[4]s %[2]s` -issues.ref_pull_from=`referiu este pedido de integração %[4]s %[2]s` -issues.ref_closing_from=`referiu esta questão a partir de um pedido de integração %[4]s que a fechará %[2]s` -issues.ref_reopening_from=`referiu esta questão a partir de um pedido de integração %[4]s que a reabrirá %[2]s` +issues.closed_at=`encerrou esta questão %s` +issues.reopened_at=`reabriu esta questão %s` +issues.commit_ref_at=`referenciou esta questão num cometimento %s` +issues.ref_issue_from=`referiu esta questão %[3]s %[1]s` +issues.ref_pull_from=`referiu este pedido de integração %[3]s %[1]s` +issues.ref_closing_from=`referiu esta questão a partir de um pedido de integração %[3]s que a fechará %[1]s` +issues.ref_reopening_from=`referiu esta questão a partir de um pedido de integração %[3]s que a reabrirá %[1]s` issues.ref_closed_from=`encerrou esta questão %[4]s %[2]s` issues.ref_reopened_from=`reabriu esta questão %[4]s %[2]s` issues.ref_from=`de %[1]s` @@ -1972,8 +1972,8 @@ pulls.update_branch_success=A sincronização do ramo foi bem sucedida pulls.update_not_allowed=Não tem autorização para sincronizar o ramo 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.closed_at=`fechou este pedido de integração %s` +pulls.reopened_at=`reabriu este pedido de integração %s` 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. @@ -2785,7 +2785,7 @@ settings.wiki_rename_branch_main_desc = Renomear o ramo usado internamente pelo settings.add_collaborator_blocked_our = Não foi possível adicionar o/a colaborador/a porque o/a proprietário/a do repositório bloqueou-os. settings.add_webhook.invalid_path = A localização não pode conter "." ou ".." ou ficar em branco. Não pode começar ou terminar com uma barra. settings.graphql_url = URL do GraphQL -pulls.commit_ref_at = `referiu este pedido de integração a partir de um cometimento %[2]s` +pulls.commit_ref_at = `referiu este pedido de integração a partir de um cometimento %s` settings.confirm_wiki_branch_rename = Renomear o ramo do wiki settings.wiki_branch_rename_success = O nome do ramo do wiki do repositório foi normalizado com sucesso. settings.wiki_branch_rename_failure = Falhou a normalização do nome do ramo do wiki do repositório. diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 9158329978..2ef1b868d4 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -1563,7 +1563,7 @@ issues.remove_ref_at=`убрана ссылка на %s %s` issues.add_ref_at=`добавлена ссылка на %s %s` issues.delete_branch_at=`удалена ветвь %s %s` issues.filter_label=Метки -issues.filter_label_exclude=`Исключайте метки с помощью alt + лкм/enter` +issues.filter_label_exclude=Исключайте метки с помощью Alt + ЛКМ issues.filter_label_no_select=Любые метки issues.filter_label_select_no_label=Без меток issues.filter_milestone=Этап @@ -1637,13 +1637,13 @@ issues.close_comment_issue=Закрыть комментарием issues.reopen_issue=Открыть снова issues.reopen_comment_issue=Открыть снова комментарием issues.create_comment=Комментировать -issues.closed_at=`задача была закрыта %[2]s` -issues.reopened_at=`задача была открыта снова %[2]s` -issues.commit_ref_at=`упоминание этой задачи в коммите %[2]s` -issues.ref_issue_from=`упоминание этой задачи %[4]s %[2]s` -issues.ref_pull_from=`упоминание этого запроса слияния %[4]s %[2]s` -issues.ref_closing_from=`упоминание из запроса на слияние %[4]s, который закроет эту задачу %[2]s` -issues.ref_reopening_from=`упоминание из запроса на слияние %[4]s, который повторно откроет эту задачу %[2]s` +issues.closed_at=`задача была закрыта %s` +issues.reopened_at=`задача была открыта снова %s` +issues.commit_ref_at=`упоминание этой задачи в коммите %s` +issues.ref_issue_from=`упоминание этой задачи %[3]s %[1]s` +issues.ref_pull_from=`упоминание этого запроса слияния %[3]s %[1]s` +issues.ref_closing_from=`упоминание из запроса на слияние %[3]s, который закроет эту задачу %[1]s` +issues.ref_reopening_from=`упоминание из запроса на слияние %[3]s, который повторно откроет эту задачу %[1]s` issues.ref_closed_from=`закрыл этот запрос %[4]s %[2]s` issues.ref_reopened_from=`задача была открыта снова %[4]s %[2]s` issues.ref_from=`из %[1]s` @@ -1943,8 +1943,8 @@ pulls.update_branch_success=Ветвь успешно обновлена pulls.update_not_allowed=Недостаточно прав для обновления ветви pulls.outdated_with_base_branch=Эта ветвь отстает от базовой ветви pulls.close=Закрыть запрос слияния -pulls.closed_at=`закрыл этот запрос на слияние %[2]s` -pulls.reopened_at=`переоткрыл этот запрос на слияние %[2]s` +pulls.closed_at=`закрыл этот запрос на слияние %s` +pulls.reopened_at=`переоткрыл этот запрос на слияние %s` pulls.cmd_instruction_hint=Показать инструкции для командной строки pulls.cmd_instruction_merge_title=Слейте изменения pulls.cmd_instruction_merge_desc=Слейте изменения и отправьте их обратно. @@ -2772,7 +2772,7 @@ settings.ignore_stale_approvals = Игнорировать устаревшие contributors.contribution_type.additions = Добавления contributors.contribution_type.deletions = Удаления contributors.contribution_type.filter_label = Вид деятельности: -pulls.commit_ref_at = `упоминание этого запроса слияния в коммите %[2]s` +pulls.commit_ref_at = `сослался на этот запрос слияния в коммите %s` settings.thread_id = ИД обсуждения pulls.made_using_agit = AGit activity.navbar.contributors = Соавторы diff --git a/options/locale/locale_si-LK.ini b/options/locale/locale_si-LK.ini index d55b238b1c..54b0b246db 100644 --- a/options/locale/locale_si-LK.ini +++ b/options/locale/locale_si-LK.ini @@ -1100,12 +1100,12 @@ issues.close_comment_issue=අදහස් දක්වා වසන්න issues.reopen_issue=නැවත විවෘත කරන්න issues.reopen_comment_issue=අදහස් දක්වා විවෘත කරන්න issues.create_comment=අදහස -issues.closed_at=`මෙම ගැටළුව වසා %[2]s` -issues.reopened_at=`මෙම ගැටළුව නැවත විවෘත කරන ලදි %[2]s` -issues.ref_issue_from=`මෙම නිකුතුව %[4]s හි %[2]s` -issues.ref_pull_from=`මෙම අදින්න ඉල්ලීම%[4]s %[2]s` -issues.ref_closing_from=`මෙම ගැටළුව වසා දමනු ඇත%[4]s මෙම ගැටළුව %[2]s` -issues.ref_reopening_from=`මෙම ගැටළුව නැවත විවෘත කරනු ඇත%[4]s මෙම ගැටළුව %[2]s` +issues.closed_at=`මෙම ගැටළුව වසා %s` +issues.reopened_at=`මෙම ගැටළුව නැවත විවෘත කරන ලදි %s` +issues.ref_issue_from=`මෙම නිකුතුව %[3]s හි %[1]s` +issues.ref_pull_from=`මෙම අදින්න ඉල්ලීම%[3]s %[1]s` +issues.ref_closing_from=`මෙම ගැටළුව වසා දමනු ඇත%[3]s මෙම ගැටළුව %[1]s` +issues.ref_reopening_from=`මෙම ගැටළුව නැවත විවෘත කරනු ඇත%[3]s මෙම ගැටළුව %[1]s` issues.ref_closed_from=`මෙම නිකුතුව%[4]s %[2]s` issues.ref_reopened_from=`මෙම නිකුතුව%[4]s %[2]sනැවත විවෘත කරන ලදි` issues.ref_from=`හිම%[1]s` @@ -1342,8 +1342,8 @@ pulls.update_branch_rebase=රිබේස් මගින් ශාඛාව pulls.update_branch_success=ශාඛා යාවත්කාලීන කිරීම සාර්ථක විය pulls.update_not_allowed=ශාඛාව යාවත්කාලීන කිරීමට ඔබට අවසර නැත pulls.outdated_with_base_branch=මෙම ශාඛාව මූලික ශාඛාව සමඟ දිවයයි -pulls.closed_at=`මෙම අදින්න ඉල්ලීම වසා %[2]s` -pulls.reopened_at=`මෙම අදින්න ඉල්ලීම නැවත විවෘත කරන ලදි %[2]s` +pulls.closed_at=`මෙම අදින්න ඉල්ලීම වසා %s` +pulls.reopened_at=`මෙම අදින්න ඉල්ලීම නැවත විවෘත කරන ලදි %s` diff --git a/options/locale/locale_sr-SP.ini b/options/locale/locale_sr-SP.ini index 56c1a7e650..b14fdc1a35 100644 --- a/options/locale/locale_sr-SP.ini +++ b/options/locale/locale_sr-SP.ini @@ -326,7 +326,7 @@ issues.no_content=Још нема садржаја. issues.close_issue=Затвори issues.reopen_issue=Поново отвори issues.create_comment=Коментирај -issues.commit_ref_at=`поменуо овај задатак у комит %[2]s` +issues.commit_ref_at=`поменуо овај задатак у комит %s` issues.poster=Аутор issues.collaborator=Коаутор issues.owner=Власник diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index 541acbf408..8b43cb29b8 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -1157,13 +1157,13 @@ issues.close_comment_issue=Stäng med kommentar issues.reopen_issue=Återöppna issues.reopen_comment_issue=Öppna igen med kommentar issues.create_comment=Kommentera -issues.closed_at=`stängde ärendet %[2]s` -issues.reopened_at=`återöppnade detta ärende %[2]s` -issues.commit_ref_at=`refererade till detta ärende från en incheckning %[2]s` -issues.ref_issue_from=`refererade till detta ärende %[4]s %[2]s` -issues.ref_pull_from=`refererade till denna pull-förfrågan %[4]s %[2]s` -issues.ref_closing_from=`hänvisade till detta ärende från en pull-förfrågan %[4]s som kommer att stänga det %[2]s` -issues.ref_reopening_from=`hänvisade till detta ärende från en pull-förfrågan %[4]s som kommer att öppna ärendet på nytt %[2]s` +issues.closed_at=`stängde ärendet %s` +issues.reopened_at=`återöppnade detta ärende %s` +issues.commit_ref_at=`refererade till detta ärende från en incheckning %s` +issues.ref_issue_from=`refererade till detta ärende %[3]s %[1]s` +issues.ref_pull_from=`refererade till denna pull-förfrågan %[3]s %[1]s` +issues.ref_closing_from=`hänvisade till detta ärende från en pull-förfrågan %[3]s som kommer att stänga det %[1]s` +issues.ref_reopening_from=`hänvisade till detta ärende från en pull-förfrågan %[3]s som kommer att öppna ärendet på nytt %[1]s` issues.ref_closed_from=`stängde detta ärende %[4]s %[2]s` issues.ref_reopened_from=`öpnnade detta ärende igen %[4]s %[2]s` issues.ref_from=`från %[1]s` diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini index 4f51ddcc7e..c07cefdab9 100644 --- a/options/locale/locale_tr-TR.ini +++ b/options/locale/locale_tr-TR.ini @@ -1594,13 +1594,13 @@ issues.close_comment_issue=Yorum Yap ve Kapat issues.reopen_issue=Yeniden aç issues.reopen_comment_issue=Yorum Yap ve Yeniden Aç issues.create_comment=Yorum yap -issues.closed_at=`%[2]s konusunu kapattı` -issues.reopened_at=`%[2]s konusunu yeniden açtı` -issues.commit_ref_at=`%[2]s işlemesinde bu konuyu işaret etti` -issues.ref_issue_from=`bu konuya referansta bulundu %[4]s %[2]s` -issues.ref_pull_from=`bu değişiklik isteğine referansta bulundu %[4]s %[2]s` -issues.ref_closing_from=`bir değişiklik isteğine referansta bulundu %[4]s bu konu kapatılacak %[2]s` -issues.ref_reopening_from=`bir değişiklik isteğine referansta bulundu %[4]s bu konu yeniden açılacak %[2]s` +issues.closed_at=`%s konusunu kapattı` +issues.reopened_at=`%s konusunu yeniden açtı` +issues.commit_ref_at=`%s işlemesinde bu konuyu işaret etti` +issues.ref_issue_from=`bu konuya referansta bulundu %[3]s %[1]s` +issues.ref_pull_from=`bu değişiklik isteğine referansta bulundu %[3]s %[1]s` +issues.ref_closing_from=`bir değişiklik isteğine referansta bulundu %[3]s bu konu kapatılacak %[1]s` +issues.ref_reopening_from=`bir değişiklik isteğine referansta bulundu %[3]s bu konu yeniden açılacak %[1]s` issues.ref_closed_from=`bu konuyu kapat%[4]s %[2]s` issues.ref_reopened_from=`konuyu yeniden aç%[4]s %[2]s` issues.ref_from=`%[1]s'den` @@ -1907,8 +1907,8 @@ pulls.update_branch_success=Dal güncellemesi başarıyla gerçekleştirildi pulls.update_not_allowed=Dalı güncelleme izniniz yok pulls.outdated_with_base_branch=Bu dal, temel dal ile güncel değil pulls.close=Değişiklik İsteğini Kapat -pulls.closed_at=`%[2]s değişiklik isteğini kapattı` -pulls.reopened_at=`%[2]s değişiklik isteğini yeniden açtı` +pulls.closed_at=`%s değişiklik isteğini kapattı` +pulls.reopened_at=`%s değişiklik isteğini yeniden açtı` pulls.cmd_instruction_hint=`Komut satırı talimatlarını görüntüleyin.` pulls.cmd_instruction_checkout_title=Çekme pulls.cmd_instruction_checkout_desc=Proje deponuzdan yeni bir dalı çekin ve değişiklikleri test edin. diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 2e536c3d1a..faa3f2a56e 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -694,7 +694,7 @@ disabled_public_activity=Цей користувач вимкнув публіч joined_on = Реєстрація %s email_visibility.private = Ваш email видно лише вам і адміністраторам email_visibility.limited = Вашу е-пошту видно всім авторизованим -settings = Користувацькі параметри +settings = Користувацькі налаштування block_user.detail_3 = Ви не зможете додати один одного в якості співавтора репозиторію. show_on_map = Показати це місце на мапі block_user.detail_2 = Цей користувач не зможе взаємодіяти з репозиторіями, власником яких є ви, а також із задачами та коментарями, які ви створили. @@ -1447,7 +1447,7 @@ issues.remove_ref_at=`видалив посилання %s %s` issues.add_ref_at=`додав посилання %s %s` issues.delete_branch_at=`видалена гілка %s %s` issues.filter_label=Мітка -issues.filter_label_exclude=`Використовуйте Alt + клік/Enter для виключення міток` +issues.filter_label_exclude=Використовуйте Alt + клік для виключення міток issues.filter_label_no_select=Всі мітки issues.filter_milestone=Етап issues.filter_project=Проєкт @@ -1496,17 +1496,17 @@ issues.context.quote_reply=Цитувати відповідь issues.context.reference_issue=Послатися в новій задачі issues.context.edit=Редагувати issues.context.delete=Видалити -issues.close_comment_issue=Прокоментувати і закрити +issues.close_comment_issue=Закрити з коментарем issues.reopen_issue=Відкрити знову -issues.reopen_comment_issue=Прокоментувати та відкрити знову +issues.reopen_comment_issue=Відкрити знову з коментарем issues.create_comment=Коментар -issues.closed_at=`закрив цю задачу %[2]s` -issues.reopened_at=`повторно відкрив цю задачу %[2]s` -issues.commit_ref_at=`згадано цю задачу в коміті %[2]s` -issues.ref_issue_from=`посилається на цю задачу %[4]s %[2]s` -issues.ref_pull_from=`послався на цей запит злиття %[4]s %[2]s` -issues.ref_closing_from=`згадав запит на злиття %[4]s, які закриють цю задачу %[2]s` -issues.ref_reopening_from=`згадав запит на злиття %[4]s, які повторно відкриють цю задачу %[2]s` +issues.closed_at=`закриває цю задачу %s` +issues.reopened_at=`повторно відкриває цю задачу %s` +issues.commit_ref_at=`посилається на цю задачу в коміті %s` +issues.ref_issue_from=`посилається на цю задачу %[3]s %[1]s` +issues.ref_pull_from=`посилається на цей запит злиття %[3]s %[1]s` +issues.ref_closing_from=`посилається в запиті на злиття %[3]s, який закриє цю задачу, %[1]s` +issues.ref_reopening_from=`посилається в запиті на злиття %[3]s, який повторно відкриє цю задачу, %[1]s` issues.ref_closed_from=`закрив цю задачу %[4]s %[2]s` issues.ref_reopened_from=`повторно відкрито цю задачу %[4]s %[2]s` issues.ref_from=`із %[1]s` @@ -1743,8 +1743,8 @@ pulls.update_branch_rebase=Оновити гілку перебазування pulls.update_branch_success=Оновлення гілки пройшло успішно pulls.update_not_allowed=Ви не можете оновити гілку pulls.outdated_with_base_branch=Ця гілка застаріла відносно базової гілки -pulls.closed_at=`закрив цей запит на злиття %[2]s` -pulls.reopened_at=`повторно відкрив цей запит на злиття %[2]s` +pulls.closed_at=`закриває цей запит на злиття %s` +pulls.reopened_at=`повторно відкриває цей запит на злиття %s` @@ -1887,7 +1887,7 @@ settings.collaboration.owner=Власник settings.collaboration.undefined=Не визначено settings.hooks=Веб-хуки settings.githooks=Git хуки -settings.basic_settings=Базові налаштування +settings.basic_settings=Основні налаштування settings.mirror_settings=Налаштування дзеркала settings.mirror_settings.mirrored_repository=Віддзеркалений репозиторій settings.mirror_settings.direction=Напрямок @@ -2055,12 +2055,12 @@ settings.event_issue_assign=Призначення settings.event_issue_assign_desc=Задачу призначено або скасовано. settings.event_issue_label=Мітки settings.event_issue_label_desc=Додавання або видалення міток задач. -settings.event_issue_milestone=Задача з етапом +settings.event_issue_milestone=Етапи settings.event_issue_milestone_desc=Етап призначено, видалено або змінено. settings.event_issue_comment=Коментарі settings.event_issue_comment_desc=Коментар задачі створено, видалено чи відредаговано. settings.event_header_pull_request=Події запиту на злиття -settings.event_pull_request=Запити до злиття +settings.event_pull_request=Зміна settings.event_pull_request_desc=Запит до злиття відкрито, закрито, перевідкрито або відредаговано. settings.event_pull_request_assign=Призначення settings.event_pull_request_assign_desc=Запит про злиття призначено або скасовано. @@ -2485,7 +2485,7 @@ signing.will_sign = Коміт буде підписано ключем «%s». signing.wont_sign.error = Під час перевірки можливості підписати коміт сталася помилка. commits.search_branch = У цій гілці ext_wiki = Зовнішня вікі -pulls.commit_ref_at = `посилається на цей запит на злиття в коміті %[2]s` +pulls.commit_ref_at = `посилається на цей запит на злиття в коміті %s` pulls.cmd_instruction_hint = Переглянути інструкції для командного рядка issues.max_pinned = Неможливо закріпити більше задач issues.unpin_comment = відкріпив %s @@ -2847,7 +2847,7 @@ dashboard.update_migration_poster_id=Оновити мігровані ID авт dashboard.git_gc_repos=Виконати очистку сміття для всіх репозиторіїв dashboard.resync_all_sshkeys=Оновити файл «.ssh/authorized_keys» з SSH-ключами Forgejo. dashboard.resync_all_sshprincipals=Оновити файл «.ssh/authorized_principals» з SSH даними користувача Forgejo. -dashboard.resync_all_hooks=Пересинхронізувати перед-прийнятні, оновлюючі та пост-прийнятні хуки в усіх репозиторіях +dashboard.resync_all_hooks=Пересинхронізувати хуки pre-receive, update та post-receive в усіх репозиторіях dashboard.reinit_missing_repos=Переініціалізувати усі репозитрії git-файли яких втрачено dashboard.sync_external_users=Синхронізувати дані зовнішніх користувачів dashboard.cleanup_hook_task_table=Очистити hook_task таблицю @@ -2906,7 +2906,7 @@ users.edit_account=Редагувати обліковий запис users.max_repo_creation=Максимальна кількість репозиторіїв users.max_repo_creation_desc=(Введіть -1, щоб використовувати глобальний ліміт за замовчуванням.) users.is_activated=Обліковий запис користувача увімкнено -users.prohibit_login=Вимкнути вхід +users.prohibit_login=Заблокований обліковий запис users.is_admin=Обліковий запис адміністратора users.is_restricted=Обмежений users.allow_git_hook=Може створювати Git хуки @@ -3305,6 +3305,7 @@ dashboard.cron.cancelled = Cron: %[1]s скасовано: %[3]s defaulthooks.desc = Вебхуки автоматично сповіщають HTTP-сервер POST-запитами, коли в Forgejo відбуваються певні події. Вказані тут вебхуки є типовими і будуть скопійовані до всіх нових репозиторіїв. Докладніше — в посібнику з вебхуків. assets = Ресурси коду auths.invalid_openIdConnectAutoDiscoveryURL = Неправильна URL-адреса автоматичного виявлення (повинна бути дійсна URL-адреса, що починається з http:// або https://) +settings = Налаштування адміністратора [action] diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index acdd4c0ced..c6c534df9f 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -1062,8 +1062,8 @@ language.description = 此语言将保存到您的账号中,并在您登录后 language.localization_project = 帮助我们将 Forgejo 翻译成您的语言!了解更多。 user_block_yourself = 您不能屏蔽自己。 pronouns_custom_label = 自定义代词 -change_username_redirect_prompt.with_cooldown.one = 旧的用户名将在%[1]d天的保护期后对所有人可用,您仍可以在此期间重新认领旧的用户名。 -change_username_redirect_prompt.with_cooldown.few = 旧的用户名将在%[1]d天的保护期后对所有人可用,您仍可以在此期间重新认领旧的用户名。 +change_username_redirect_prompt.with_cooldown.one = 旧用户名将在 %[1]d 天的保护期后对所有人可用,您仍可以在此期间重新认领旧用户名。 +change_username_redirect_prompt.with_cooldown.few = 旧用户名将在 %[1]d 天的保护期后对所有人可用,您仍可以在此期间重新认领旧用户名。 keep_pronouns_private = 仅向已认证用户显示代词 keep_pronouns_private.description = 这将对未登录的访问者隐藏您的代词。 quota = 配额 @@ -1581,7 +1581,7 @@ issues.remove_ref_at=`删除了引用 %s %s` issues.add_ref_at=`添加了引用 %s %s` issues.delete_branch_at=`于 %[2]s 删除了分支 %[1]s` issues.filter_label=标签筛选 -issues.filter_label_exclude=`使用 alt + 鼠标左键 / 回车 排除标签` +issues.filter_label_exclude=使用 Alt + 单击 排除标签 issues.filter_label_no_select=所有标签 issues.filter_label_select_no_label=无标签 issues.filter_milestone=里程碑筛选 @@ -1655,13 +1655,13 @@ issues.close_comment_issue=评论并关闭 issues.reopen_issue=重新开放 issues.reopen_comment_issue=重新打开并评论 issues.create_comment=评论 -issues.closed_at=`于%[2]s关闭此议题` -issues.reopened_at=`重新打开此问题 %[2]s` -issues.commit_ref_at=`于%[2]s在代码提交中引用了该议题` -issues.ref_issue_from=`引用了议题 %[4]s %[2]s` -issues.ref_pull_from=`引用了合并请求 %[4]s %[2]s` -issues.ref_closing_from=`于 %[2]s 从合并请求 %[4]s引用了此议题,将关闭此议题` -issues.ref_reopening_from=`于 %[2]s 引用了合并请求 %[4]s 将重新讨论此议题 ` +issues.closed_at=`于 %s 关闭了此议题` +issues.reopened_at=`于 %s 重新打开了此议题` +issues.commit_ref_at=`于 %s 从提交中引用了此议题` +issues.ref_issue_from=`引用了此议题 %[3]s %[1]s` +issues.ref_pull_from=`引用了此合并请求 %[3]s %[1]s` +issues.ref_closing_from=`于 %[1]s 从合并请求 %[3]s 引用了此议题,将关闭此议题` +issues.ref_reopening_from=`于 %[1]s 从合并请求 %[3]s 引用了此议题,将重新打开此议题 ` issues.ref_closed_from=`关闭了这个议题 %[4]s %[2]s` issues.ref_reopened_from=`重新打开这个议题 %[4]s %[2]s` issues.ref_from=`来自 %[1]s` @@ -1969,8 +1969,8 @@ pulls.update_branch_success=分支更新成功 pulls.update_not_allowed=您无权更新分支 pulls.outdated_with_base_branch=此分支相比基础分支已过期 pulls.close=关闭 -pulls.closed_at=`于%[2]s关闭此合并请求 ` -pulls.reopened_at=`重新打开此合并请求 %[2]s` +pulls.closed_at=`于 %s 关闭了此合并请求 ` +pulls.reopened_at=`于 %s 重新打开了此合并请求` pulls.cmd_instruction_hint=查看命令行说明 pulls.cmd_instruction_checkout_title=检出 pulls.cmd_instruction_checkout_desc=从你的仓库中检出一个新的分支并测试变更。 @@ -2770,7 +2770,7 @@ settings.wiki_rename_branch_main = 标准化百科分支名称 settings.wiki_rename_branch_main_notices_1 = 此操作无法撤消。 settings.wiki_branch_rename_success = 百科仓库的分支名称已成功规范化。 settings.confirm_wiki_branch_rename = 重命名百科分支 -pulls.commit_ref_at = `在提交 %[2]s 中引用了此合并请求` +pulls.commit_ref_at = `于 %s 从提交中引用了此合并请求` settings.wiki_rename_branch_main_notices_2 = 这将永久重命名 %s 的仓库百科的内部分支。现存的检出方式需要更新。 settings.wiki_branch_rename_failure = 无法标准化仓库百科的分支名称。 settings.add_collaborator_blocked_our = 因仓库所有者已将其拉黑,不能添加该用户为协作者。 @@ -2922,6 +2922,7 @@ settings.event_action_success = 成功 settings.event_action_success_desc = Action运行以成功结束。 settings.event_action_failure_desc = Action运行以失败结束。 settings.event_header_action = Action运行事件 +issues.filter_type.all_pull_requests = 所有合并请求 [graphs] component_loading=正在加载 %s… @@ -3057,8 +3058,8 @@ teams.invite.by=邀请人 %s teams.invite.description=请点击下面的按钮加入团队。 follow_blocked_user = 你无法关注此组织,因为此组织已屏蔽你。 open_dashboard = 打开仪表盘 -settings.change_orgname_redirect_prompt.with_cooldown.one = 旧的组织名将在%[1]d天的保护期后对所有人可用,您仍可以在此期间重新认领旧的名字。 -settings.change_orgname_redirect_prompt.with_cooldown.few = 旧的组织名将在%[1]d天的保护期后对所有人可用,您仍可以在此期间重新认领旧名字。 +settings.change_orgname_redirect_prompt.with_cooldown.one = 旧组织名将在 %[1]d 天的保护期后对所有人可用,您仍可以在此期间重新认领旧名称。 +settings.change_orgname_redirect_prompt.with_cooldown.few = 旧组织名将在 %[1]d 天的保护期后对所有人可用,您仍可以在此期间重新认领旧名称。 [admin] dashboard=管理面板 diff --git a/options/locale/locale_zh-HK.ini b/options/locale/locale_zh-HK.ini index e2cb0d8b2c..45534801de 100644 --- a/options/locale/locale_zh-HK.ini +++ b/options/locale/locale_zh-HK.ini @@ -574,7 +574,7 @@ issues.delete_comment_confirm=您確定要刪除該條評論嗎? issues.context.edit=編輯 issues.reopen_issue=重新開啟 issues.create_comment=評論 -issues.commit_ref_at=`在代碼提交 %[2]s 中引用了該問題` +issues.commit_ref_at=`在代碼提交 %s 中引用了該問題` issues.role.owner=管理員 issues.role.member=普通成員 issues.sign_in_require_desc= 登入 才能加入這對話。 diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index b21e4c8f79..fba51a391e 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -1604,13 +1604,13 @@ issues.close_comment_issue=留言並關閉 issues.reopen_issue=重新開放 issues.reopen_comment_issue=留言並重新開放 issues.create_comment=留言 -issues.closed_at=`關閉了這個問題 %[2]s` -issues.reopened_at=`重新開放了這個問題 %[2]s` -issues.commit_ref_at=`在提交中關聯了這個問題 %[2]s` -issues.ref_issue_from=`關聯了這個問題 %[4]s %[2]s` -issues.ref_pull_from=`關聯了這個合併請求 %[4]s %[2]s` -issues.ref_closing_from=從將關閉此問題的拉取請求 %[4]s 中提及了此問題%[2]s -issues.ref_reopening_from=從將重新開啟此問題的拉取請求 %[4]s 中提及了此問題%[2]s +issues.closed_at=`關閉了這個問題 %s` +issues.reopened_at=`重新開放了這個問題 %s` +issues.commit_ref_at=`在提交中關聯了這個問題 %s` +issues.ref_issue_from=`關聯了這個問題 %[3]s %[1]s` +issues.ref_pull_from=`關聯了這個合併請求 %[3]s %[1]s` +issues.ref_closing_from=從將關閉此問題的拉取請求 %[3]s 中提及了此問題,%[1]s +issues.ref_reopening_from=從將重新開啟此問題的拉取請求 %[3]s 中提及了此問題,%[1]s issues.ref_closed_from=`關閉了這個問題 %[4]s %[2]s` issues.ref_reopened_from=`重新開放了這個問題 %[4]s %[2]s` issues.ref_from=`自 %[1]s` @@ -1879,8 +1879,8 @@ pulls.update_branch_success=分支更新成功 pulls.update_not_allowed=您無權更新分支 pulls.outdated_with_base_branch=相對於基底分支,此分支已過時 pulls.close=關閉合併請求 -pulls.closed_at=`關閉了這個合併請求 %[2]s` -pulls.reopened_at=`重新開放了這個合併請求 %[2]s` +pulls.closed_at=`關閉了這個合併請求 %s` +pulls.reopened_at=`重新開放了這個合併請求 %s` pulls.clear_merge_message=清除合併訊息 pulls.clear_merge_message_hint=清除合併訊息將僅移除提交訊息內容,留下產生的 git 結尾,如「Co-Authored-By …」。 @@ -2634,7 +2634,7 @@ commits.search_branch = 此分支 commits.browse_further = 進一步瀏覽 commits.renamed_from = 自 %s 重新命名 issues.filter_milestone_none = 沒有里程碑 -issues.num_comments_1 = %s 則留言 +issues.num_comments_1 = %d 則留言 issues.no_content = 沒有提供敘述。 settings.new_owner_blocked_doer = 新的所有者已封鎖您。 new_repo_helper = 一個儲存庫包含專案的所有檔案和它們的修訂歷史。在別處已經有儲存庫了嗎?遷移儲存庫。 @@ -2693,7 +2693,7 @@ signing.wont_sign.never = 永不簽署提交。 editor.push_out_of_date = 該推送似乎過期了。 issues.cancel_tracking_history = `已取消時間追蹤 %s` issues.due_date_not_writer = 您需要有寫入這個儲存庫的權限才能更新其問題的到期日。 -pulls.commit_ref_at = `在提交 %[2]s 引用了這個合併請求` +pulls.commit_ref_at = `在提交 %s 引用了這個合併請求` pulls.cmd_instruction_checkout_desc = 從您的專案儲存庫中,建立並切換到一個新分支以測試這些變更。 pulls.cmd_instruction_merge_title = 合併 pulls.ready_for_review = 可以開始審閱了嗎? diff --git a/options/locale_next/locale_de-DE.json b/options/locale_next/locale_de-DE.json index 94ab12f180..3847de2b43 100644 --- a/options/locale_next/locale_de-DE.json +++ b/options/locale_next/locale_de-DE.json @@ -97,5 +97,10 @@ "settings.visibility.description": "Die Profilsichtbarkeit beeinflusst die Möglichkeit anderer, auf deine nicht-privaten Repositorys zuzugreifen. Erfahre mehr", "avatar.constraints_hint": "Individuelles Profilbild darf %[1]s in der Größe nicht überschreiten, und nicht größer als %[2]dx%[3]d Pixel sein", "repo.diff.commit.next-short": "Nächste", - "repo.diff.commit.previous-short": "Vorherige" + "repo.diff.commit.previous-short": "Vorherige", + "profile.edit.link": "Profil bearbeiten", + "feed.atom.link": "Atom-Feed", + "keys.ssh.link": "SSH-Schlüssel", + "keys.gpg.link": "GPG-Schlüssel", + "profile.actions.tooltip": "Mehr Aktionen" } diff --git a/options/locale_next/locale_fil.json b/options/locale_next/locale_fil.json index 1f1e535dad..884a7b44eb 100644 --- a/options/locale_next/locale_fil.json +++ b/options/locale_next/locale_fil.json @@ -21,7 +21,7 @@ "alert.asset_load_failed": "Nabigong i-load ang mga asset file mula sa {path}. Siguraduhin na maa-access ang mga asset file.", "install.invalid_lfs_path": "Nabigong gawin ang LFS root sa tinakdang path: %[1]s", "alert.range_error": " dapat ay numero sa pagitan ng %[1]s at %[2]s.", - "meta.last_line": "Sayori... I love you. — MC from Doki Doki Literature Club", + "meta.last_line": "Every day, I imagine a future where I can be with you. In my hand is a pen that will write a poem of me and you. The ink flows down into a dark puddle... Just move your hand, write the way into his heart. But in this world of infinite choices. What will it take just to find that special day? Have I found everybody a fun assignment to do today? When you're here, everything that we do is fun for them anyway... When I can't even read my own feelings. What good are words when a smile says it all? And if this world won't write me an ending... What will it take just for me to have it all? Does my pen only write bitter words for those who are dear to me? Is it love if I take you, or is it love if I set you free? The ink flows down into a dark puddle... How can I write love into reality? If I can't hear the sound of your heartbeat What do you call love in your reality? And in your reality, if I don't know how to love you... I'll leave you be.", "mail.actions.successful_run_after_failure": "Na-recover ang workflow na %[1]s sa repositoryong %[2]s", "mail.actions.not_successful_run": "Nabigo ang workflow na %[1]s sa repositoryong %[2]s", "mail.actions.run_info_previous_status": "Nakaraang Status ng Run: %[1]s", @@ -94,5 +94,13 @@ "editor.textarea.tab_hint": "Naka-indent na ang linya. Pindutin ulit ang Tab o Escape para umalis sa editor.", "editor.textarea.shift_tab_hint": "Walang indentation sa linyang ito. Pindutin ang Shift + Tab ulit o Escape para umalis sa editor.", "admin.dashboard.cleanup_offline_runners": "Linisin ang mga offline na runner", - "settings.visibility.description": "Maaapektuhan ng visibility ng profile ang kakayahan ng iba na i-access ang iyong mga hindi pribadong repositoryo. Matuto pa" + "settings.visibility.description": "Maaapektuhan ng visibility ng profile ang kakayahan ng iba na i-access ang iyong mga hindi pribadong repositoryo. Matuto pa", + "avatar.constraints_hint": "Hindi maaaring lumagpas sa laking %[1]s o mas malaki sa %[2]dx%[3]d pixel ang custom na avatar", + "repo.diff.commit.next-short": "Susunod", + "repo.diff.commit.previous-short": "Nakaraan", + "profile.edit.link": "I-edit ang profile", + "feed.atom.link": "Atom feed", + "keys.ssh.link": "Mga SSH key", + "keys.gpg.link": "Mga GPG key", + "profile.actions.tooltip": "Higit pang mga aksyon" } diff --git a/options/locale_next/locale_fr-FR.json b/options/locale_next/locale_fr-FR.json index a9035f0848..da26d56107 100644 --- a/options/locale_next/locale_fr-FR.json +++ b/options/locale_next/locale_fr-FR.json @@ -6,7 +6,7 @@ }, "repo.pulls.title_desc": { "one": "veut fusionner %[1]d commit depuis %[2]s vers %[3]s", - "many": "souhaite fusionner %[1]d révision(s) depuis %[2]s vers %[3]s", + "many": "veut fusionner %[1]d commits depuis %[2]s vers %[3]s", "other": "" }, "search.milestone_kind": "Recherche dans les jalons…", diff --git a/options/locale_next/locale_it-IT.json b/options/locale_next/locale_it-IT.json index 8bd6d811a0..8464d6244e 100644 --- a/options/locale_next/locale_it-IT.json +++ b/options/locale_next/locale_it-IT.json @@ -15,5 +15,83 @@ "home.welcome.no_activity": "Nessun'attività", "home.explore_repos": "Esplora i repositori", "home.explore_users": "Esplora l'utenza", - "home.explore_orgs": "Esplora le organizzazioni" + "home.explore_orgs": "Esplora le organizzazioni", + "mail.actions.successful_run_after_failure_subject": "Il flusso di lavoro %[1] ha ripreso a funzionare nel repositorio %[2]s", + "mail.actions.not_successful_run_subject": "Il flusso di lavoro %[1]s è fallito nel repositorio %[2]s", + "relativetime.future": "nel futuro", + "relativetime.days": { + "one": "ieri", + "many": "%d giorni fa", + "other": "%d giorni fa" + }, + "relativetime.1day": "ieri", + "repo.form.cannot_create": "Tutti gli spazi in cui puoi creare repositori hanno raggiunto il limite di repositori.", + "discussion.locked": "Questa discussione è stata bloccata. Solo i contributori possono commentare.", + "relativetime.hours": { + "one": "un'ora fa", + "many": "%d ore fa", + "other": "%d ore fa" + }, + "relativetime.2years": "due anni fa", + "relativetime.now": "adesso", + "relativetime.weeks": { + "one": "una settimana fa", + "many": "%d settimane fa", + "other": "%d settimane fa" + }, + "relativetime.months": { + "one": "un mese fa", + "many": "%d mesi fa", + "other": "%d mesi fa" + }, + "relativetime.years": { + "one": "un anno fa", + "many": "%d anni fa", + "other": "%d anni fa" + }, + "repo.issue_indexer.title": "Indicizzatore delle segnalazioni", + "admin.config.moderation_config": "Impostazioni di moderazione", + "moderation.report_abuse": "Segnala abuso", + "moderation.report_content": "Segnala contenuto", + "moderation.report_abuse_form.already_reported": "Hai già segnalato questo contenuto", + "moderation.abuse_category": "Categoria", + "moderation.abuse_category.placeholder": "Seleziona una categoria", + "moderation.abuse_category.spam": "Spam", + "moderation.abuse_category.malware": "Malware", + "moderation.abuse_category.illegal_content": "Contenuti illegali", + "moderation.abuse_category.other_violations": "Altre violazioni delle regole della piattaforma", + "moderation.report_remarks": "Note aggiuntive", + "moderation.report_remarks.placeholder": "Aggiungi dettagli riguardanti l'abuso che stai segnalando.", + "moderation.submit_report": "Invia segnalazione", + "error.not_found.title": "Pagina non trovata", + "themes.names.forgejo-auto": "Forgejo (segui le impostazioni di sistema)", + "stars.list.none": "Nessuno ha messo una stella a questo repo.", + "watch.list.none": "Nessuno sta osservando questo repo.", + "followers.incoming.list.self.none": "Nessuno sta seguendo il tuo profilo.", + "followers.incoming.list.none": "Nessuno sta seguendo questo utente.", + "followers.outgoing.list.self.none": "Non segui nessuno.", + "followers.outgoing.list.none": "%s non sta seguendo nessuno.", + "relativetime.2days": "due giorni fa", + "relativetime.2weeks": "due settimane fa", + "relativetime.1week": "la settimana scorsa", + "relativetime.1month": "il mese scorso", + "relativetime.2months": "due mesi fa", + "relativetime.1year": "l'anno scorso", + "moderation.report_abuse_form.header": "Segnala abuso all'amministratore", + "moderation.report_abuse_form.details": "Questo modulo dovrebbe essere utilizzato per segnalare utenti che creano profili, repositori, segnalazioni o commenti spam o che si comportano in modo non adeguato.", + "moderation.report_abuse_form.invalid": "Argomenti non validi", + "moderation.reporting_failed": "Impossibile inviare segnalazione: %v", + "moderation.reported_thank_you": "Grazie per la segnalazione. L'amministratore è stato avvertito.", + "mail.actions.run_info_ref": "Ramo: %[1]s (%[2]s)", + "alert.asset_load_failed": "Impossibile caricare i file di risorsa da {path}. Controlla che i file di risorsa siano accessibili.", + "install.invalid_lfs_path": "Non è possibile creare una root LFS nel percorso specificato: %[1]s", + "home.welcome.activity_hint": "Non c'è nulla nel tuo feed. Le tue azioni e le attività dei repositori che segui verranno mostrate qui.", + "relativetime.mins": { + "one": "un minuto fa", + "many": "%d minuti fa", + "other": "%d minuti fa" + }, + "editor.textarea.tab_hint": "Linea già indentata. Premi di nuovo Tab o Esc per uscire dall'editor.", + "repo.diff.commit.previous-short": "Precedente", + "meta.last_line": "Ambaraba cicci cocco." } diff --git a/options/locale_next/locale_nds.json b/options/locale_next/locale_nds.json index 9a3884a87f..24268e2082 100644 --- a/options/locale_next/locale_nds.json +++ b/options/locale_next/locale_nds.json @@ -97,5 +97,10 @@ "settings.visibility.description": "De Profil-Sichtbaarkeid maakt daar wat an, of un wo anner Lüü diene nich-privaaten Repositoriums ankieken könen. Mehr unnerhören", "avatar.constraints_hint": "Dat eegene Kontobill düür nich groter as %[1]s wesen of groter as %[2]d×%[3]d Billtüttels wesen", "repo.diff.commit.next-short": "Anner", - "repo.diff.commit.previous-short": "Vörig" + "repo.diff.commit.previous-short": "Vörig", + "feed.atom.link": "Atom-Schuuv", + "keys.ssh.link": "SSH-Slötels", + "keys.gpg.link": "GPG-Slötels", + "profile.actions.tooltip": "Mehr Aktioonen", + "profile.edit.link": "Profil bewarken" } diff --git a/options/locale_next/locale_pt-BR.json b/options/locale_next/locale_pt-BR.json index 92e140878e..1a5eca6d34 100644 --- a/options/locale_next/locale_pt-BR.json +++ b/options/locale_next/locale_pt-BR.json @@ -103,5 +103,7 @@ "editor.textarea.shift_tab_hint": "Sem indentação nesta linha. Pressione Shift + Tab novamente ou Esc para sair do editor.", "admin.dashboard.cleanup_offline_runners": "Limpar runners desconectados", "avatar.constraints_hint": "Imagem de perfil personalizada não pode exceder %[1]s em tamanho ou ser maior que %[2]dx%[3]d pixels", - "settings.visibility.description": "A visibilidade do perfil afeta a habilidade de acessarem seus repositórios não-privados. Saiba mais" + "settings.visibility.description": "A visibilidade do perfil afeta a habilidade de acessarem seus repositórios não-privados. Saiba mais", + "repo.diff.commit.next-short": "Próximo", + "repo.diff.commit.previous-short": "Anterior" } diff --git a/options/locale_next/locale_ru-RU.json b/options/locale_next/locale_ru-RU.json index 8992cc6abd..922e2612af 100644 --- a/options/locale_next/locale_ru-RU.json +++ b/options/locale_next/locale_ru-RU.json @@ -23,7 +23,7 @@ "alert.asset_load_failed": "Не удалось получить ресурсы из {path}. Убедитесь, что файлы ресурсов доступны.", "install.invalid_lfs_path": "Не удалось расположить корень LFS по указанному пути: %[1]s", "alert.range_error": " - число должно быть в диапазоне от %[1]s-%[2]s.", - "meta.last_line": "Unskip.", + "meta.last_line": "Unskip..", "mail.actions.not_successful_run_subject": "Провал раб. потока %[1]s в репозитории %[2]s", "mail.actions.successful_run_after_failure_subject": "Возобновление раб. потока %[1]s в репозитории %[2]s", "mail.actions.run_info_ref": "Ветвь: %[1]s (%[2]s)", @@ -104,6 +104,11 @@ "admin.dashboard.cleanup_offline_runners": "Удалить недоступных исполнителей", "avatar.constraints_hint": "Изображение профиля не может быть более %[1]s и крупнее %[2]dx%[3]d пикселей", "settings.visibility.description": "Видимость профиля влияет на доступ других до ваших не частных репозиториев. Подробнее", - "repo.diff.commit.previous-short": "Предыдущий", - "repo.diff.commit.next-short": "Далее" + "repo.diff.commit.previous-short": "Пред.", + "repo.diff.commit.next-short": "След.", + "profile.actions.tooltip": "Показать действия", + "feed.atom.link": "Atom-лента", + "keys.ssh.link": "Ключи SSH", + "keys.gpg.link": "Ключи GPG", + "profile.edit.link": "Изменить профиль" } diff --git a/options/locale_next/locale_uk-UA.json b/options/locale_next/locale_uk-UA.json index c3bcf5397c..33cb5a41a3 100644 --- a/options/locale_next/locale_uk-UA.json +++ b/options/locale_next/locale_uk-UA.json @@ -105,5 +105,10 @@ "settings.visibility.description": "Видимість профілю впливає на можливість інших користувачів отримати доступ до ваших неприватних репозиторіїв. Дізнатися більше", "avatar.constraints_hint": "Розмір користувацького аватара не може перевищувати %[1]s або бути більшим за %[2]d×%[3]d пікселів", "repo.diff.commit.next-short": "Наступний", - "repo.diff.commit.previous-short": "Попередній" + "repo.diff.commit.previous-short": "Попередній", + "keys.ssh.link": "Ключі SSH", + "keys.gpg.link": "Ключі GPG", + "profile.edit.link": "Редагувати профіль", + "feed.atom.link": "Стрічка Atom", + "profile.actions.tooltip": "Більше дій" } diff --git a/options/locale_next/locale_zh-CN.json b/options/locale_next/locale_zh-CN.json index e7c1bad81e..0f408997bf 100644 --- a/options/locale_next/locale_zh-CN.json +++ b/options/locale_next/locale_zh-CN.json @@ -71,5 +71,12 @@ "editor.textarea.shift_tab_hint": "此行无缩进。再次按 Shift + Tab 或按 Escape 退出编辑器。", "admin.dashboard.cleanup_offline_runners": "清理离线运行器", "settings.visibility.description": "个人资料可见性设置会影响他人对您的非私有仓库的访问。了解更多", - "avatar.constraints_hint": "自定义头像大小不得超过 %[1]s,或大于 %[2]d×%[3]d 像素" + "avatar.constraints_hint": "自定义头像大小不得超过 %[1]s,或大于 %[2]d×%[3]d 像素", + "keys.ssh.link": "SSH 密钥", + "keys.gpg.link": "GPG 密钥", + "profile.actions.tooltip": "更多操作", + "repo.diff.commit.next-short": "下个", + "repo.diff.commit.previous-short": "上个", + "feed.atom.link": "Atom 订阅源", + "profile.edit.link": "编辑个人资料" } diff --git a/options/locale_next/locale_zh-TW.json b/options/locale_next/locale_zh-TW.json index 5e3e43f66e..3ae0b00d2b 100644 --- a/options/locale_next/locale_zh-TW.json +++ b/options/locale_next/locale_zh-TW.json @@ -68,5 +68,10 @@ "moderation.report_abuse_form.details": "這個表單是用來檢舉用戶建立垃圾帳號、儲存庫、問題、留言,或其他不當行為。", "moderation.report_abuse_form.invalid": "無效參數", "moderation.report_abuse_form.already_reported": "您已檢舉此內容", - "meta.last_line": "Rubi-chan? Hai! Nani ga suki? Choko minto yori mo a・na・ta♡ Ayumu-chan? Hai! Nani ga suki? Sutoroberii fureibaa yori mo a・na・ta♡ Shiki-chan! Hai! Nani ga suki? Kukkii and kuriimu yori mo a・na・ta♡ Minna? Hai! Nani ga suki? Mochiron daisuki AiScReam." + "meta.last_line": "Rubi-chan? Hai! Nani ga suki? Choko minto yori mo a・na・ta♡ Ayumu-chan? Hai! Nani ga suki? Sutoroberii fureibaa yori mo a・na・ta♡ Shiki-chan! Hai! Nani ga suki? Kukkii and kuriimu yori mo a・na・ta♡ Minna? Hai! Nani ga suki? Mochiron daisuki AiScReam.", + "admin.dashboard.cleanup_offline_runners": "清理離線 runners", + "settings.visibility.description": "個人資料的可見度會影響他人存取您非私人儲存庫的能力。了解更多", + "avatar.constraints_hint": "自定義大頭貼的大小不得超過 %[1]s,且解析度不得大於 %[2]d×%[3]d 像素", + "repo.diff.commit.next-short": "下一個", + "repo.diff.commit.previous-short": "上一個" } From 184e068f376ce8c5f5bfe74ec17f3188d8ba9189 Mon Sep 17 00:00:00 2001 From: Danko Aleksejevs Date: Thu, 26 Jun 2025 20:06:21 +0200 Subject: [PATCH 019/495] feat: show more relevant results for 'dependencies' dropdown (#8003) - Fix issue dropdown breaking when currently selected issue is included in results. - Add `sort` parameter to `/issues/search` API. - Sort dropdown by relevance. - Make priority_repo_id work again. - Added E2E test. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8003 Reviewed-by: Shiny Nematoda Reviewed-by: Gusted Co-authored-by: Danko Aleksejevs Co-committed-by: Danko Aleksejevs --- models/fixtures/repository.yml | 2 +- models/issues/issue_search.go | 17 ++-- models/issues/pull_list.go | 2 +- modules/indexer/issues/bleve/bleve.go | 11 ++- modules/indexer/issues/db/db.go | 3 + modules/indexer/issues/db/options.go | 5 ++ .../issues/elasticsearch/elasticsearch.go | 6 +- modules/indexer/issues/internal/model.go | 5 +- .../indexer/issues/internal/tests/tests.go | 19 ++++ routers/api/v1/repo/issue.go | 15 +++- routers/web/repo/issue.go | 11 +-- templates/swagger/v1_json.tmpl | 18 ++++ tests/e2e/declare_repos_test.go | 81 ++++++++++++++--- tests/e2e/issue-sidebar.test.e2e.ts | 88 +++++++++++++++++++ tests/e2e/utils_e2e_test.go | 1 + tests/test_utils.go | 7 ++ web_src/js/features/repo-issue.js | 19 ++-- 17 files changed, 269 insertions(+), 41 deletions(-) diff --git a/models/fixtures/repository.yml b/models/fixtures/repository.yml index c383fa43ac..2f104eed65 100644 --- a/models/fixtures/repository.yml +++ b/models/fixtures/repository.yml @@ -32,7 +32,7 @@ created_unix: 1731254961 updated_unix: 1731254961 topics: '[]' - + - id: 2 owner_id: 2 diff --git a/models/issues/issue_search.go b/models/issues/issue_search.go index 91a69c26a7..529f0c15d4 100644 --- a/models/issues/issue_search.go +++ b/models/issues/issue_search.go @@ -48,7 +48,9 @@ type IssuesOptions struct { //nolint UpdatedBeforeUnix int64 // prioritize issues from this repo PriorityRepoID int64 - IsArchived optional.Option[bool] + // if this issue index (not ID) exists and matches the filters, *and* priorityrepo sort is used, show it first + PriorityIssueIndex int64 + IsArchived optional.Option[bool] // If combined with AllPublic, then private as well as public issues // that matches the criteria will be returned, if AllPublic is false @@ -60,7 +62,7 @@ type IssuesOptions struct { //nolint // applySorts sort an issues-related session based on the provided // sortType string -func applySorts(sess *xorm.Session, sortType string, priorityRepoID int64) { +func applySorts(sess *xorm.Session, sortType string, priorityRepoID, priorityIssueIndex int64) { switch sortType { case "oldest": sess.Asc("issue.created_unix").Asc("issue.id") @@ -97,8 +99,11 @@ func applySorts(sess *xorm.Session, sortType string, priorityRepoID int64) { case "priorityrepo": sess.OrderBy("CASE "+ "WHEN issue.repo_id = ? THEN 1 "+ - "ELSE 2 END ASC", priorityRepoID). - Desc("issue.created_unix"). + "ELSE 2 END ASC", priorityRepoID) + if priorityIssueIndex != 0 { + sess.OrderBy("issue.index = ? DESC", priorityIssueIndex) + } + sess.Desc("issue.created_unix"). Desc("issue.id") case "project-column-sorting": sess.Asc("project_issue.sorting").Desc("issue.created_unix").Desc("issue.id") @@ -470,7 +475,7 @@ func Issues(ctx context.Context, opts *IssuesOptions) (IssueList, error) { Join("INNER", "repository", "`issue`.repo_id = `repository`.id") applyLimit(sess, opts) applyConditions(sess, opts) - applySorts(sess, opts.SortType, opts.PriorityRepoID) + applySorts(sess, opts.SortType, opts.PriorityRepoID, opts.PriorityIssueIndex) issues := IssueList{} if err := sess.Find(&issues); err != nil { @@ -494,7 +499,7 @@ func IssueIDs(ctx context.Context, opts *IssuesOptions, otherConds ...builder.Co } applyLimit(sess, opts) - applySorts(sess, opts.SortType, opts.PriorityRepoID) + applySorts(sess, opts.SortType, opts.PriorityRepoID, opts.PriorityIssueIndex) var res []int64 total, err := sess.Select("`issue`.id").Table(&Issue{}).FindAndCount(&res) diff --git a/models/issues/pull_list.go b/models/issues/pull_list.go index 8fc0491026..ddb813cf44 100644 --- a/models/issues/pull_list.go +++ b/models/issues/pull_list.go @@ -149,7 +149,7 @@ func PullRequests(ctx context.Context, baseRepoID int64, opts *PullRequestsOptio } findSession := listPullRequestStatement(ctx, baseRepoID, opts) - applySorts(findSession, opts.SortType, 0) + applySorts(findSession, opts.SortType, 0, 0) findSession = db.SetSessionPagination(findSession, opts) prs := make([]*PullRequest, 0, opts.PageSize) found := findSession.Find(&prs) diff --git a/modules/indexer/issues/bleve/bleve.go b/modules/indexer/issues/bleve/bleve.go index 573d63a446..8549ba8dfc 100644 --- a/modules/indexer/issues/bleve/bleve.go +++ b/modules/indexer/issues/bleve/bleve.go @@ -170,7 +170,7 @@ func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) ( if issueID, err := token.ParseIssueReference(); err == nil { idQuery := inner_bleve.NumericEqualityQuery(issueID, "index") - idQuery.SetBoost(5.0) + idQuery.SetBoost(20.0) innerQ.AddQuery(idQuery) } @@ -197,6 +197,15 @@ func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) ( queries = append(queries, bleve.NewDisjunctionQuery(repoQueries...)) } + if options.PriorityRepoID.Has() { + eq := inner_bleve.NumericEqualityQuery(options.PriorityRepoID.Value(), "repo_id") + eq.SetBoost(10.0) + meh := bleve.NewMatchAllQuery() + meh.SetBoost(0) + should := bleve.NewDisjunctionQuery(eq, meh) + queries = append(queries, should) + } + if options.IsPull.Has() { queries = append(queries, inner_bleve.BoolFieldQuery(options.IsPull.Value(), "is_pull")) } diff --git a/modules/indexer/issues/db/db.go b/modules/indexer/issues/db/db.go index 397daa3265..5f42bce9a1 100644 --- a/modules/indexer/issues/db/db.go +++ b/modules/indexer/issues/db/db.go @@ -53,6 +53,7 @@ func (i *Indexer) Search(ctx context.Context, options *internal.SearchOptions) ( cond := builder.NewCond() + var priorityIssueIndex int64 if options.Keyword != "" { repoCond := builder.In("repo_id", options.RepoIDs) if len(options.RepoIDs) == 1 { @@ -82,6 +83,7 @@ func (i *Indexer) Search(ctx context.Context, options *internal.SearchOptions) ( builder.Eq{"`index`": issueID}, cond, ) + priorityIssueIndex = issueID } } @@ -89,6 +91,7 @@ func (i *Indexer) Search(ctx context.Context, options *internal.SearchOptions) ( if err != nil { return nil, err } + opt.PriorityIssueIndex = priorityIssueIndex // If pagesize == 0, return total count only. It's a special case for search count. if options.Paginator != nil && options.Paginator.PageSize == 0 { diff --git a/modules/indexer/issues/db/options.go b/modules/indexer/issues/db/options.go index 4411cc1c37..55a471fc8e 100644 --- a/modules/indexer/issues/db/options.go +++ b/modules/indexer/issues/db/options.go @@ -78,6 +78,11 @@ func ToDBOptions(ctx context.Context, options *internal.SearchOptions) (*issue_m User: nil, } + if options.PriorityRepoID.Has() { + opts.SortType = "priorityrepo" + opts.PriorityRepoID = options.PriorityRepoID.Value() + } + if len(options.MilestoneIDs) == 1 && options.MilestoneIDs[0] == 0 { opts.MilestoneIDs = []int64{db.NoConditionID} } else { diff --git a/modules/indexer/issues/elasticsearch/elasticsearch.go b/modules/indexer/issues/elasticsearch/elasticsearch.go index 9d2786e101..d632a22b2a 100644 --- a/modules/indexer/issues/elasticsearch/elasticsearch.go +++ b/modules/indexer/issues/elasticsearch/elasticsearch.go @@ -165,7 +165,7 @@ func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) ( } var eitherQ elastic.Query = innerQ if issueID, err := token.ParseIssueReference(); err == nil { - indexQ := elastic.NewTermQuery("index", issueID).Boost(15.0) + indexQ := elastic.NewTermQuery("index", issueID).Boost(20) eitherQ = elastic.NewDisMaxQuery().Query(indexQ).Query(innerQ).TieBreaker(0.5) } switch token.Kind { @@ -188,6 +188,10 @@ func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) ( } query.Must(q) } + if options.PriorityRepoID.Has() { + q := elastic.NewTermQuery("repo_id", options.PriorityRepoID.Value()).Boost(10) + query.Should(q) + } if options.IsPull.Has() { query.Must(elastic.NewTermQuery("is_pull", options.IsPull.Value())) diff --git a/modules/indexer/issues/internal/model.go b/modules/indexer/issues/internal/model.go index 6c55405179..cdd113212d 100644 --- a/modules/indexer/issues/internal/model.go +++ b/modules/indexer/issues/internal/model.go @@ -75,8 +75,9 @@ type SearchResult struct { type SearchOptions struct { Keyword string // keyword to search - RepoIDs []int64 // repository IDs which the issues belong to - AllPublic bool // if include all public repositories + RepoIDs []int64 // repository IDs which the issues belong to + AllPublic bool // if include all public repositories + PriorityRepoID optional.Option[int64] // issues from this repository will be prioritized when SortByScore IsPull optional.Option[bool] // if the issues is a pull request IsClosed optional.Option[bool] // if the issues is closed diff --git a/modules/indexer/issues/internal/tests/tests.go b/modules/indexer/issues/internal/tests/tests.go index ef75955a14..b63957ff84 100644 --- a/modules/indexer/issues/internal/tests/tests.go +++ b/modules/indexer/issues/internal/tests/tests.go @@ -742,6 +742,25 @@ var cases = []*testIndexerCase{ } }, }, + { + Name: "PriorityRepoID", + SearchOptions: &internal.SearchOptions{ + IsPull: optional.Some(false), + IsClosed: optional.Some(false), + PriorityRepoID: optional.Some(int64(3)), + Paginator: &db.ListOptionsAll, + SortBy: internal.SortByScore, + }, + Expected: func(t *testing.T, data map[int64]*internal.IndexerData, result *internal.SearchResult) { + for i, v := range result.Hits { + if i < 7 { + assert.Equal(t, int64(3), data[v.ID].RepoID) + } else { + assert.NotEqual(t, int64(3), data[v.ID].RepoID) + } + } + }, + }, } type testIndexerCase struct { diff --git a/routers/api/v1/repo/issue.go b/routers/api/v1/repo/issue.go index 5495c4a6ba..442e109843 100644 --- a/routers/api/v1/repo/issue.go +++ b/routers/api/v1/repo/issue.go @@ -121,6 +121,12 @@ func SearchIssues(ctx *context.APIContext) { // description: Number of items per page // type: integer // minimum: 0 + // - name: sort + // in: query + // description: Type of sort + // type: string + // enum: [relevance, latest, oldest, recentupdate, leastupdate, mostcomment, leastcomment, nearduedate, farduedate] + // default: latest // responses: // "200": // "$ref": "#/responses/IssueList" @@ -276,7 +282,7 @@ func SearchIssues(ctx *context.APIContext) { IsClosed: isClosed, IncludedAnyLabelIDs: includedAnyLabels, MilestoneIDs: includedMilestones, - SortBy: issue_indexer.SortByCreatedDesc, + SortBy: issue_indexer.ParseSortBy(ctx.FormString("sort"), issue_indexer.SortByCreatedDesc), } if since != 0 { @@ -305,9 +311,10 @@ func SearchIssues(ctx *context.APIContext) { } } - // FIXME: It's unsupported to sort by priority repo when searching by indexer, - // it's indeed an regression, but I think it is worth to support filtering by indexer first. - _ = ctx.FormInt64("priority_repo_id") + priorityRepoID := ctx.FormInt64("priority_repo_id") + if priorityRepoID > 0 { + searchOpt.PriorityRepoID = optional.Some(priorityRepoID) + } ids, total, err := issue_indexer.SearchIssues(ctx, searchOpt) if err != nil { diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index 5e228507c0..a34e3b7c78 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -2775,7 +2775,7 @@ func SearchIssues(ctx *context.Context) { IncludedAnyLabelIDs: includedAnyLabels, MilestoneIDs: includedMilestones, ProjectID: projectID, - SortBy: issue_indexer.SortByCreatedDesc, + SortBy: issue_indexer.ParseSortBy(ctx.FormString("sort"), issue_indexer.SortByCreatedDesc), } if since != 0 { @@ -2804,9 +2804,10 @@ func SearchIssues(ctx *context.Context) { } } - // FIXME: It's unsupported to sort by priority repo when searching by indexer, - // it's indeed an regression, but I think it is worth to support filtering by indexer first. - _ = ctx.FormInt64("priority_repo_id") + priorityRepoID := ctx.FormInt64("priority_repo_id") + if priorityRepoID > 0 { + searchOpt.PriorityRepoID = optional.Some(priorityRepoID) + } ids, total, err := issue_indexer.SearchIssues(ctx, searchOpt) if err != nil { @@ -2944,7 +2945,7 @@ func ListIssues(ctx *context.Context) { IsPull: isPull, IsClosed: isClosed, ProjectID: projectID, - SortBy: issue_indexer.SortByCreatedDesc, + SortBy: issue_indexer.ParseSortBy(ctx.FormString("sort"), issue_indexer.SortByCreatedDesc), } if since != 0 { searchOpt.UpdatedAfterUnix = optional.Some(since) diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 59c13cd9e6..0e8382b8ab 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -4524,6 +4524,24 @@ "description": "Number of items per page", "name": "limit", "in": "query" + }, + { + "enum": [ + "relevance", + "latest", + "oldest", + "recentupdate", + "leastupdate", + "mostcomment", + "leastcomment", + "nearduedate", + "farduedate" + ], + "type": "string", + "default": "latest", + "description": "Type of sort", + "name": "sort", + "in": "query" } ], "responses": { diff --git a/tests/e2e/declare_repos_test.go b/tests/e2e/declare_repos_test.go index 351f7821eb..93f69faf4c 100644 --- a/tests/e2e/declare_repos_test.go +++ b/tests/e2e/declare_repos_test.go @@ -9,16 +9,23 @@ import ( "testing" "time" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + repo_model "forgejo.org/models/repo" unit_model "forgejo.org/models/unit" "forgejo.org/models/unittest" user_model "forgejo.org/models/user" "forgejo.org/modules/git" "forgejo.org/modules/indexer/stats" + "forgejo.org/modules/optional" + "forgejo.org/modules/timeutil" + issue_service "forgejo.org/services/issue" files_service "forgejo.org/services/repository/files" "forgejo.org/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "xorm.io/xorm/convert" ) // first entry represents filename @@ -29,19 +36,34 @@ type FileChanges struct { Versions []string } +// performs additional repo setup as needed +type SetupRepo func(*user_model.User, *repo_model.Repository) + // put your Git repo declarations in here // feel free to amend the helper function below or use the raw variant directly func DeclareGitRepos(t *testing.T) func() { + now := timeutil.TimeStampNow() + postIssue := func(repo *repo_model.Repository, user *user_model.User, age int64, title, content string) { + issue := &issues_model.Issue{ + RepoID: repo.ID, + PosterID: user.ID, + Title: title, + Content: content, + CreatedUnix: now.Add(-age), + } + require.NoError(t, issue_service.NewIssue(db.DefaultContext, repo, issue, nil, nil, nil)) + } + cleanupFunctions := []func(){ - newRepo(t, 2, "diff-test", []FileChanges{{ + newRepo(t, 2, "diff-test", nil, []FileChanges{{ Filename: "testfile", Versions: []string{"hello", "hallo", "hola", "native", "ubuntu-latest", "- runs-on: ubuntu-latest", "- runs-on: debian-latest"}, - }}), - newRepo(t, 2, "language-stats-test", []FileChanges{{ + }}, nil), + newRepo(t, 2, "language-stats-test", nil, []FileChanges{{ Filename: "main.rs", Versions: []string{"fn main() {", "println!(\"Hello World!\");", "}"}, - }}), - newRepo(t, 2, "mentions-highlighted", []FileChanges{ + }}, nil), + newRepo(t, 2, "mentions-highlighted", nil, []FileChanges{ { Filename: "history1.md", Versions: []string{""}, @@ -52,11 +74,34 @@ func DeclareGitRepos(t *testing.T) func() { Versions: []string{""}, CommitMsg: "Another commit which mentions @user1 in the title\nand @user2 in the text", }, - }), - newRepo(t, 2, "unicode-escaping", []FileChanges{{ + }, nil), + newRepo(t, 2, "unicode-escaping", nil, []FileChanges{{ Filename: "a-file", Versions: []string{"{a}{а}"}, - }}), + }}, nil), + newRepo(t, 11, "dependency-test", &tests.DeclarativeRepoOptions{ + UnitConfig: optional.Some(map[unit_model.Type]convert.Conversion{ + unit_model.TypeIssues: &repo_model.IssuesConfig{ + EnableDependencies: true, + }, + }), + }, []FileChanges{}, func(user *user_model.User, repo *repo_model.Repository) { + postIssue(repo, user, 500, "first issue here", "an issue created earlier") + postIssue(repo, user, 400, "second issue here (not 1)", "not the right issue, but in the right repo") + postIssue(repo, user, 300, "third issue here", "depends on things") + postIssue(repo, user, 200, "unrelated issue", "shrug emoji") + postIssue(repo, user, 100, "newest issue", "very new") + }), + newRepo(t, 11, "dependency-test-2", &tests.DeclarativeRepoOptions{ + UnitConfig: optional.Some(map[unit_model.Type]convert.Conversion{ + unit_model.TypeIssues: &repo_model.IssuesConfig{ + EnableDependencies: true, + }, + }), + }, []FileChanges{}, func(user *user_model.User, repo *repo_model.Repository) { + postIssue(repo, user, 450, "right issue", "an issue containing word right") + postIssue(repo, user, 150, "left issue", "an issue containing word left") + }), // add your repo declarations here } @@ -67,12 +112,18 @@ func DeclareGitRepos(t *testing.T) func() { } } -func newRepo(t *testing.T, userID int64, repoName string, fileChanges []FileChanges) func() { +func newRepo(t *testing.T, userID int64, repoName string, initOpts *tests.DeclarativeRepoOptions, fileChanges []FileChanges, setup SetupRepo) func() { user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: userID}) - somerepo, _, cleanupFunc := tests.CreateDeclarativeRepo(t, user, repoName, - []unit_model.Type{unit_model.TypeCode, unit_model.TypeIssues}, nil, - nil, - ) + + opts := tests.DeclarativeRepoOptions{} + if initOpts != nil { + opts = *initOpts + } + opts.Name = optional.Some(repoName) + if !opts.EnabledUnits.Has() { + opts.EnabledUnits = optional.Some([]unit_model.Type{unit_model.TypeCode, unit_model.TypeIssues}) + } + somerepo, _, cleanupFunc := tests.CreateDeclarativeRepoWithOptions(t, user, opts) var lastCommitID string for _, file := range fileChanges { @@ -118,6 +169,10 @@ func newRepo(t *testing.T, userID int64, repoName string, fileChanges []FileChan } } + if setup != nil { + setup(user, somerepo) + } + err := stats.UpdateRepoIndexer(somerepo) require.NoError(t, err) diff --git a/tests/e2e/issue-sidebar.test.e2e.ts b/tests/e2e/issue-sidebar.test.e2e.ts index bc65b0842c..34885d0d5d 100644 --- a/tests/e2e/issue-sidebar.test.e2e.ts +++ b/tests/e2e/issue-sidebar.test.e2e.ts @@ -262,3 +262,91 @@ test('New Issue: Milestone', async ({page}, workerInfo) => { await expect(selectedMilestone).toContainText('No milestone'); await save_visual(page); }); + +test.describe('Dependency dropdown', () => { + test.use({user: 'user11'}); + test('Issue: Dependencies', async ({page}) => { + const response = await page.goto('/user11/dependency-test/issues/3'); + expect(response?.status()).toBe(200); + + const depsBlock = page.locator('.issue-content-right .depending'); + const deleteDepBtn = page.locator('.issue-content-right .depending .delete-dependency-button'); + + const input = page.locator('#new-dependency-drop-list .search'); + const current = page.locator('#new-dependency-drop-list .text').first(); + const menu = page.locator('#new-dependency-drop-list .menu'); + const items = page.locator('#new-dependency-drop-list .menu .item'); + + const confirmDelete = async () => { + const modal = page.locator('.modal.remove-dependency'); + await expect(modal).toBeVisible(); + await expect(modal).toContainText('This will remove the dependency from this issue'); + await modal.locator('button.ok').click(); + }; + + // A kludge to set the dropdown to the *wrong* value so it lets us select the correct one next. + const resetDropdown = async () => { + if (await current.textContent().then((s) => s.includes('#4'))) return; + await input.click(); + await input.fill('unrelated'); + await expect(items.first()).toContainText('unrelated'); + await items.first().click(); + await expect(current).toContainText('#4'); + await input.click(); + }; + + await expect(depsBlock).toBeVisible(); + while (await deleteDepBtn.first().isVisible()) { + await deleteDepBtn.first().click(); // wipe added dependencies from any previously failed tests + await confirmDelete(); + } + await expect(depsBlock).toContainText('No dependencies set'); + + await input.scrollIntoViewIfNeeded(); + await input.click(); + + const first = 'first issue here'; + const second = 'second issue here'; + const newest = 'newest issue'; + + // Without query, it should show issues in the same repo, sorted by date, except current one. + await expect(menu).toBeVisible(); + await expect(items).toHaveCount(4); // 5 issues in this repo, minus current one + await expect(items.first()).toContainText(newest); + await expect(items.last()).toContainText(first); + await resetDropdown(); + + // With query, it should search all repos, but show current repo issues first. + await input.fill('right'); + await expect(items.first()).toContainText(second); + await expect.poll(() => items.count()).toBeGreaterThan(1); // there is an issue in user11/dependency-test-2 containing the word "right" + await resetDropdown(); + + // When entering an issue number, it should always show that one first, then all text matches. + await input.fill('1'); + await expect(items.first()).toContainText(first); + await expect(items.nth(1)).toBeVisible(); + await resetDropdown(); + + // Should behave the same with a prefix + await input.fill('#1'); + await expect(items.first()).toContainText(first); + + // Selecting an issue + await items.first().click(); + await expect(current).toContainText(first); + + // Add dependency + const link = page.locator('.issue-content-right .depending .dependency a.title'); + await page.locator('.issue-content-right .depending button').click(); + await expect(link).toHaveAttribute('href', '/user11/dependency-test/issues/1'); + + // Remove dependency + await expect(deleteDepBtn).toBeVisible(); + await deleteDepBtn.click(); + + await confirmDelete(); + + await expect(depsBlock).toContainText('No dependencies set'); + }); +}); diff --git a/tests/e2e/utils_e2e_test.go b/tests/e2e/utils_e2e_test.go index e121c604c3..efa1657cee 100644 --- a/tests/e2e/utils_e2e_test.go +++ b/tests/e2e/utils_e2e_test.go @@ -93,6 +93,7 @@ func createSessions(t testing.TB) { users := []string{ "user1", "user2", + "user11", "user12", "user18", "user29", diff --git a/tests/test_utils.go b/tests/test_utils.go index 75d1f98914..b53159ae2c 100644 --- a/tests/test_utils.go +++ b/tests/test_utils.go @@ -42,6 +42,7 @@ import ( "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "xorm.io/xorm/convert" ) func exitf(format string, args ...any) { @@ -342,6 +343,7 @@ type DeclarativeRepoOptions struct { Name optional.Option[string] EnabledUnits optional.Option[[]unit_model.Type] DisabledUnits optional.Option[[]unit_model.Type] + UnitConfig optional.Option[map[unit_model.Type]convert.Conversion] Files optional.Option[[]*files_service.ChangeRepoFile] WikiBranch optional.Option[string] AutoInit optional.Option[bool] @@ -390,9 +392,14 @@ func CreateDeclarativeRepoWithOptions(t *testing.T, owner *user_model.User, opts enabledUnits = make([]repo_model.RepoUnit, len(units)) for i, unitType := range units { + var config convert.Conversion + if cfg, ok := opts.UnitConfig.Value()[unitType]; ok { + config = cfg + } enabledUnits[i] = repo_model.RepoUnit{ RepoID: repo.ID, Type: unitType, + Config: config, } } } diff --git a/web_src/js/features/repo-issue.js b/web_src/js/features/repo-issue.js index 297329d816..bf76453428 100644 --- a/web_src/js/features/repo-issue.js +++ b/web_src/js/features/repo-issue.js @@ -125,16 +125,21 @@ function excludeLabel(item) { export function initRepoIssueSidebarList() { const repolink = $('#repolink').val(); const repoId = $('#repoId').val(); - const crossRepoSearch = $('#crossRepoSearch').val(); + const crossRepoSearch = $('#crossRepoSearch').val() === 'true'; const tp = $('#type').val(); - let issueSearchUrl = `${appSubUrl}/${repolink}/issues/search?q={query}&type=${tp}`; - if (crossRepoSearch === 'true') { - issueSearchUrl = `${appSubUrl}/issues/search?q={query}&priority_repo_id=${repoId}&type=${tp}`; - } $('#new-dependency-drop-list') .dropdown({ apiSettings: { - url: issueSearchUrl, + beforeSend(settings) { + if (!settings.urlData.query.trim()) { + settings.url = `${appSubUrl}/${repolink}/issues/search?q={query}&type=${tp}&sort=updated`; + } else if (crossRepoSearch) { + settings.url = `${appSubUrl}/issues/search?q={query}&priority_repo_id=${repoId}&type=${tp}&sort=relevance`; + } else { + settings.url = `${appSubUrl}/${repolink}/issues/search?q={query}&type=${tp}&sort=relevance`; + } + return settings; + }, onResponse(response) { const filteredResponse = {success: true, results: []}; const currIssueId = $('#new-dependency-drop-list').data('issue-id'); @@ -142,7 +147,7 @@ export function initRepoIssueSidebarList() { for (const [_, issue] of Object.entries(response)) { // Don't list current issue in the dependency list. if (issue.id === currIssueId) { - return; + continue; } filteredResponse.results.push({ name: `#${issue.number} ${issueTitleHTML(htmlEscape(issue.title)) From 7ad20a2730be25112e51f79d982ec5d34fa386bc Mon Sep 17 00:00:00 2001 From: oliverpool Date: Fri, 27 Jun 2025 11:22:10 +0200 Subject: [PATCH 020/495] git/blob: GetContentBase64 with fewer allocations and no goroutine (#8297) See #8222 for context.i `GetBlobContentBase64` was using a pipe and a goroutine to read the blob content as base64. This can be replace by a pre-allocated buffer and a direct copy. Note that although similar to `GetBlobContent`, it does not truncate the content if the blob size is over the limit (but returns an error). I think that `GetBlobContent` should adopt the same behavior at some point (error instead of truncating). ### Tests - I added test coverage for Go changes... - [x] in their respective `*_test.go` for unit tests. - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [x] I do not want this change to show in the release notes. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8297 Reviewed-by: Earl Warren Co-authored-by: oliverpool Co-committed-by: oliverpool --- modules/git/blob.go | 51 +++++++++++++++++----------- modules/git/blob_test.go | 18 ++++++++++ routers/api/v1/repo/wiki.go | 8 ++--- services/repository/files/content.go | 11 +++--- 4 files changed, 57 insertions(+), 31 deletions(-) diff --git a/modules/git/blob.go b/modules/git/blob.go index 30615afe32..14ca2b1445 100644 --- a/modules/git/blob.go +++ b/modules/git/blob.go @@ -8,6 +8,7 @@ import ( "bufio" "bytes" "encoding/base64" + "fmt" "io" "forgejo.org/modules/log" @@ -172,33 +173,43 @@ func (b *Blob) GetBlobContent(limit int64) (string, error) { return string(buf), err } -// GetBlobContentBase64 Reads the content of the blob with a base64 encode and returns the encoded string -func (b *Blob) GetBlobContentBase64() (string, error) { - dataRc, err := b.DataAsync() - if err != nil { - return "", err - } - defer dataRc.Close() +type BlobTooLargeError struct { + Size, Limit int64 +} - pr, pw := io.Pipe() - encoder := base64.NewEncoder(base64.StdEncoding, pw) +func (b BlobTooLargeError) Error() string { + return fmt.Sprintf("blob: content larger than limit (%d > %d)", b.Size, b.Limit) +} - go func() { - _, err := io.Copy(encoder, dataRc) - _ = encoder.Close() - - if err != nil { - _ = pw.CloseWithError(err) - } else { - _ = pw.Close() +// GetContentBase64 Reads the content of the blob and returns it as base64 encoded string. +// Returns [BlobTooLargeError] if the (unencoded) content is larger than the limit. +func (b *Blob) GetContentBase64(limit int64) (string, error) { + if b.Size() > limit { + return "", BlobTooLargeError{ + Size: b.Size(), + Limit: limit, } - }() + } - out, err := io.ReadAll(pr) + rc, size, err := b.NewTruncatedReader(limit) if err != nil { return "", err } - return string(out), nil + defer rc.Close() + + encoding := base64.StdEncoding + buf := bytes.NewBuffer(make([]byte, 0, encoding.EncodedLen(int(size)))) + + encoder := base64.NewEncoder(encoding, buf) + + if _, err := io.Copy(encoder, rc); err != nil { + return "", err + } + if err := encoder.Close(); err != nil { + return "", err + } + + return buf.String(), nil } // GuessContentType guesses the content type of the blob. diff --git a/modules/git/blob_test.go b/modules/git/blob_test.go index 54115013d3..a4b8033941 100644 --- a/modules/git/blob_test.go +++ b/modules/git/blob_test.go @@ -63,6 +63,24 @@ func TestBlob(t *testing.T) { require.Equal(t, "file2\n", r) }) + t.Run("GetContentBase64", func(t *testing.T) { + r, err := testBlob.GetContentBase64(100) + require.NoError(t, err) + require.Equal(t, "ZmlsZTIK", r) + + r, err = testBlob.GetContentBase64(-1) + require.ErrorAs(t, err, &BlobTooLargeError{}) + require.Empty(t, r) + + r, err = testBlob.GetContentBase64(4) + require.ErrorAs(t, err, &BlobTooLargeError{}) + require.Empty(t, r) + + r, err = testBlob.GetContentBase64(6) + require.NoError(t, err) + require.Equal(t, "ZmlsZTIK", r) + }) + t.Run("NewTruncatedReader", func(t *testing.T) { // read fewer than available rc, size, err := testBlob.NewTruncatedReader(100) diff --git a/routers/api/v1/repo/wiki.go b/routers/api/v1/repo/wiki.go index bb4cf0f211..7b6a00408a 100644 --- a/routers/api/v1/repo/wiki.go +++ b/routers/api/v1/repo/wiki.go @@ -5,6 +5,7 @@ package repo import ( "encoding/base64" + "errors" "fmt" "net/http" "net/url" @@ -506,11 +507,8 @@ func findWikiRepoCommit(ctx *context.APIContext) (*git.Repository, *git.Commit) // given tree entry, encoded with base64. Writes to ctx if an error occurs. func wikiContentsByEntry(ctx *context.APIContext, entry *git.TreeEntry) string { blob := entry.Blob() - if blob.Size() > setting.API.DefaultMaxBlobSize { - return "" - } - content, err := blob.GetBlobContentBase64() - if err != nil { + content, err := blob.GetContentBase64(setting.API.DefaultMaxBlobSize) + if err != nil && !errors.As(err, &git.BlobTooLargeError{}) { ctx.Error(http.StatusInternalServerError, "GetBlobContentBase64", err) return "" } diff --git a/services/repository/files/content.go b/services/repository/files/content.go index 3d2217df18..dfdee1d1df 100644 --- a/services/repository/files/content.go +++ b/services/repository/files/content.go @@ -5,6 +5,7 @@ package files import ( "context" + "errors" "fmt" "net/url" "path" @@ -273,13 +274,11 @@ func GetBlobBySHA(ctx context.Context, repo *repo_model.Repository, gitRepo *git if err != nil { return nil, err } - content := "" - if gitBlob.Size() <= setting.API.DefaultMaxBlobSize { - content, err = gitBlob.GetBlobContentBase64() - if err != nil { - return nil, err - } + content, err := gitBlob.GetContentBase64(setting.API.DefaultMaxBlobSize) + if err != nil && !errors.As(err, &git.BlobTooLargeError{}) { + return nil, err } + return &api.GitBlob{ SHA: gitBlob.ID.String(), URL: repo.APIURL() + "/git/blobs/" + url.PathEscape(gitBlob.ID.String()), From a2e7446fe7785b2299118b6baf4b89a5821001b8 Mon Sep 17 00:00:00 2001 From: Gusted Date: Fri, 27 Jun 2025 11:44:59 +0200 Subject: [PATCH 021/495] chore: use eventually for mysql collation test (#8301) - Regression of removing `time.Sleep(5 * time.Second)` in forgejo/forgejo#7917. - Ref: https://codeberg.org/forgejo/forgejo/issues/8221#issuecomment-5532035 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8301 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- tests/integration/db_collation_test.go | 29 +++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/tests/integration/db_collation_test.go b/tests/integration/db_collation_test.go index bf55bdd8ee..c41209f1fe 100644 --- a/tests/integration/db_collation_test.go +++ b/tests/integration/db_collation_test.go @@ -7,6 +7,7 @@ package integration import ( "net/http" "testing" + "time" "forgejo.org/models/db" "forgejo.org/modules/setting" @@ -97,9 +98,13 @@ func TestDatabaseCollation(t *testing.T) { defer test.MockVariableValue(&setting.Database.CharsetCollation, "utf8mb4_bin")() require.NoError(t, db.ConvertDatabaseTable()) - r, err := db.CheckCollations(x) - require.NoError(t, err) - assert.Equal(t, "utf8mb4_bin", r.DatabaseCollation) + var r *db.CheckCollationsResult + assert.Eventually(t, func() bool { + r, err = db.CheckCollations(x) + require.NoError(t, err) + + return r.DatabaseCollation == "utf8mb4_bin" + }, time.Second*30, time.Second) assert.True(t, r.CollationEquals(r.ExpectedCollation, r.DatabaseCollation)) assert.Empty(t, r.InconsistentCollationColumns) @@ -117,9 +122,13 @@ func TestDatabaseCollation(t *testing.T) { defer test.MockVariableValue(&setting.Database.CharsetCollation, "utf8mb4_general_ci")() require.NoError(t, db.ConvertDatabaseTable()) - r, err := db.CheckCollations(x) - require.NoError(t, err) - assert.Equal(t, "utf8mb4_general_ci", r.DatabaseCollation) + var r *db.CheckCollationsResult + assert.Eventually(t, func() bool { + r, err = db.CheckCollations(x) + require.NoError(t, err) + + return r.DatabaseCollation == "utf8mb4_general_ci" + }, time.Second*30, time.Second) assert.True(t, r.CollationEquals(r.ExpectedCollation, r.DatabaseCollation)) assert.Empty(t, r.InconsistentCollationColumns) @@ -137,9 +146,15 @@ func TestDatabaseCollation(t *testing.T) { defer test.MockVariableValue(&setting.Database.CharsetCollation, "")() require.NoError(t, db.ConvertDatabaseTable()) + var r *db.CheckCollationsResult r, err := db.CheckCollations(x) require.NoError(t, err) - assert.True(t, r.IsCollationCaseSensitive(r.DatabaseCollation)) + assert.Eventually(t, func() bool { + r, err = db.CheckCollations(x) + require.NoError(t, err) + + return r.IsCollationCaseSensitive(r.DatabaseCollation) + }, time.Second*30, time.Second) assert.True(t, r.CollationEquals(r.ExpectedCollation, r.DatabaseCollation)) assert.Empty(t, r.InconsistentCollationColumns) }) From 1b9ac275785e67148305a731b0cee6e33c7bb007 Mon Sep 17 00:00:00 2001 From: Robert Wolff Date: Mon, 23 Jun 2025 23:00:32 +0200 Subject: [PATCH 022/495] feat(ui): add issue comment assignment doer links --- modules/templates/helper.go | 1 + modules/templates/util_render.go | 28 +++++++++++++------ modules/templates/util_render_test.go | 26 +++++++++++++++++ .../repo/issue/view_content/comments.tmpl | 22 ++++++--------- tests/integration/issue_comment_test.go | 6 ++-- 5 files changed, 58 insertions(+), 25 deletions(-) diff --git a/modules/templates/helper.go b/modules/templates/helper.go index 02b175e6f6..42b4bad83c 100644 --- a/modules/templates/helper.go +++ b/modules/templates/helper.go @@ -188,6 +188,7 @@ func NewFuncMap() template.FuncMap { "RenderMarkdownToHtml": RenderMarkdownToHtml, "RenderLabel": RenderLabel, "RenderLabels": RenderLabels, + "RenderUser": RenderUser, "RenderReviewRequest": RenderReviewRequest, // ----------------------------------------------------------------- diff --git a/modules/templates/util_render.go b/modules/templates/util_render.go index a4d7a82eea..48f4eb04a3 100644 --- a/modules/templates/util_render.go +++ b/modules/templates/util_render.go @@ -7,6 +7,7 @@ import ( "context" "encoding/hex" "fmt" + "html" "html/template" "math" "net/url" @@ -15,6 +16,7 @@ import ( "unicode" issues_model "forgejo.org/models/issues" + user_model "forgejo.org/models/user" "forgejo.org/modules/emoji" "forgejo.org/modules/log" "forgejo.org/modules/markup" @@ -26,7 +28,7 @@ import ( // RenderCommitMessage renders commit message with XSS-safe and special links. func RenderCommitMessage(ctx context.Context, msg string, metas map[string]string) template.HTML { - cleanMsg := template.HTMLEscapeString(msg) + cleanMsg := html.EscapeString(msg) // we can safely assume that it will not return any error, since there // shouldn't be any special HTML. fullMessage, err := markup.RenderCommitMessage(&markup.RenderContext{ @@ -63,7 +65,7 @@ func RenderCommitMessageLinkSubject(ctx context.Context, msg, urlDefault string, Ctx: ctx, DefaultLink: urlDefault, Metas: metas, - }, template.HTMLEscapeString(msgLine)) + }, html.EscapeString(msgLine)) if err != nil { log.Error("RenderCommitMessageSubject: %v", err) return template.HTML("") @@ -88,7 +90,7 @@ func RenderCommitBody(ctx context.Context, msg string, metas map[string]string) renderedMessage, err := markup.RenderCommitMessage(&markup.RenderContext{ Ctx: ctx, Metas: metas, - }, template.HTMLEscapeString(msgLine)) + }, html.EscapeString(msgLine)) if err != nil { log.Error("RenderCommitMessage: %v", err) return "" @@ -122,7 +124,7 @@ func RenderIssueTitle(ctx context.Context, text string, metas map[string]string) renderedText, err := markup.RenderIssueTitle(&markup.RenderContext{ Ctx: ctx, Metas: metas, - }, template.HTMLEscapeString(text)) + }, html.EscapeString(text)) if err != nil { log.Error("RenderIssueTitle: %v", err) return template.HTML("") @@ -132,7 +134,7 @@ func RenderIssueTitle(ctx context.Context, text string, metas map[string]string) // RenderRefIssueTitle renders referenced issue/pull title with defined post processors func RenderRefIssueTitle(ctx context.Context, text string) template.HTML { - renderedText, err := markup.RenderRefIssueTitle(&markup.RenderContext{Ctx: ctx}, template.HTMLEscapeString(text)) + renderedText, err := markup.RenderRefIssueTitle(&markup.RenderContext{Ctx: ctx}, html.EscapeString(text)) if err != nil { log.Error("RenderRefIssueTitle: %v", err) return "" @@ -150,7 +152,7 @@ func RenderLabel(ctx context.Context, locale translation.Locale, label *issues_m labelScope = label.ExclusiveScope() ) - description := emoji.ReplaceAliases(template.HTMLEscapeString(label.Description)) + description := emoji.ReplaceAliases(html.EscapeString(label.Description)) if label.IsArchived() { archivedCSSClass = "archived-label" @@ -212,7 +214,7 @@ func RenderLabel(ctx context.Context, locale translation.Locale, label *issues_m // RenderEmoji renders html text with emoji post processors func RenderEmoji(ctx context.Context, text string) template.HTML { renderedText, err := markup.RenderEmoji(&markup.RenderContext{Ctx: ctx}, - template.HTMLEscapeString(text)) + html.EscapeString(text)) if err != nil { log.Error("RenderEmoji: %v", err) return template.HTML("") @@ -263,10 +265,20 @@ func RenderLabels(ctx context.Context, locale translation.Locale, labels []*issu return template.HTML(htmlCode) } +func RenderUser(ctx context.Context, user user_model.User) template.HTML { + if user.ID > 0 { + return template.HTML(fmt.Sprintf( + "%s", + user.HomeLink(), html.EscapeString(user.GetDisplayName()))) + } + return template.HTML(fmt.Sprintf("%s", + html.EscapeString(user.GetDisplayName()))) +} + func RenderReviewRequest(users []issues_model.RequestReviewTarget) template.HTML { usernames := make([]string, 0, len(users)) for _, user := range users { - usernames = append(usernames, template.HTMLEscapeString(user.Name())) + usernames = append(usernames, html.EscapeString(user.Name())) } htmlCode := `` diff --git a/modules/templates/util_render_test.go b/modules/templates/util_render_test.go index b75b061218..00543a1b33 100644 --- a/modules/templates/util_render_test.go +++ b/modules/templates/util_render_test.go @@ -11,6 +11,9 @@ import ( "forgejo.org/models/db" issues_model "forgejo.org/models/issues" "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" "forgejo.org/modules/translation" "github.com/stretchr/testify/assert" @@ -221,3 +224,26 @@ func TestRenderLabels(t *testing.T) { assert.Contains(t, RenderLabels(db.DefaultContext, tr, []*issues_model.Label{label}, "user2/repo1", true), "user2/repo1/pulls?labels=1") } + +func TestRenderUser(t *testing.T) { + unittest.PrepareTestEnv(t) + + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + org := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}) + ghost := user_model.NewGhostUser() + + assert.Contains(t, RenderUser(db.DefaultContext, *user), + "user2") + assert.Contains(t, RenderUser(db.DefaultContext, *org), + "org3") + assert.Contains(t, RenderUser(db.DefaultContext, *ghost), + "Ghost") + + defer test.MockVariableValue(&setting.UI.DefaultShowFullName, true)() + assert.Contains(t, RenderUser(db.DefaultContext, *user), + "< U<se>r Tw<o > ><") + assert.Contains(t, RenderUser(db.DefaultContext, *org), + "<<<< >> >> > >> > >>> >>") + assert.Contains(t, RenderUser(db.DefaultContext, *ghost), + "Ghost") +} diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl index aca77a92e5..53a64b9b41 100644 --- a/templates/repo/issue/view_content/comments.tmpl +++ b/templates/repo/issue/view_content/comments.tmpl @@ -197,27 +197,23 @@ {{else if and (eq .Type 9) (gt .AssigneeID 0)}}
{{svg "octicon-person"}} - {{if .RemovedAssignee}} - {{template "shared/user/avatarlink" dict "user" .Assignee}} - - {{template "shared/user/authorlink" .Assignee}} + {{template "shared/user/avatarlink" dict "user" .Assignee}} + + {{template "shared/user/authorlink" .Assignee}} + {{if .RemovedAssignee}} {{if eq .Poster.ID .Assignee.ID}} {{ctx.Locale.Tr "repo.issues.remove_self_assignment" $createdStr}} {{else}} - {{ctx.Locale.Tr "repo.issues.remove_assignee_at" .Poster.GetDisplayName $createdStr}} + {{ctx.Locale.Tr "repo.issues.remove_assignee_at" (RenderUser $.Context .Poster) $createdStr}} {{end}} - - {{else}} - {{template "shared/user/avatarlink" dict "user" .Assignee}} - - {{template "shared/user/authorlink" .Assignee}} + {{else}} {{if eq .Poster.ID .AssigneeID}} {{ctx.Locale.Tr "repo.issues.self_assign_at" $createdStr}} {{else}} - {{ctx.Locale.Tr "repo.issues.add_assignee_at" .Poster.GetDisplayName $createdStr}} + {{ctx.Locale.Tr "repo.issues.add_assignee_at" (RenderUser $.Context .Poster) $createdStr}} {{end}} - - {{end}} + {{end}} +
{{else if eq .Type 10}}
diff --git a/tests/integration/issue_comment_test.go b/tests/integration/issue_comment_test.go index ee62b418f4..70a60cd402 100644 --- a/tests/integration/issue_comment_test.go +++ b/tests/integration/issue_comment_test.go @@ -205,15 +205,13 @@ func TestIssueCommentChangeAssignee(t *testing.T) { testIssueCommentChangeEvent(t, htmlDoc, "2041", "octicon-person", "User One", "/user1", []string{"user1 was unassigned by user2"}, - []string{"/user1"}) - // []string{"/user1", "/user2"}) + []string{"/user1", "/user2"}) // Add other testIssueCommentChangeEvent(t, htmlDoc, "2042", "octicon-person", "< Ur Tw ><", "/user2", []string{"user2 was assigned by user1"}, - []string{"/user2"}) - // []string{"/user2", "/user1"}) + []string{"/user2", "/user1"}) // Self-remove testIssueCommentChangeEvent(t, htmlDoc, "2043", From 76b3f4cd6ad1a692199eec90db7c8b7985708d9d Mon Sep 17 00:00:00 2001 From: Robert Wolff Date: Fri, 27 Jun 2025 13:27:06 +0200 Subject: [PATCH 023/495] test: prevent XSS for label rendering --- models/fixtures/label.yml | 24 ++++++++++++++++++++++++ modules/templates/util_render_test.go | 27 +++++++++++++++++++++++---- services/convert/issue_test.go | 9 +++++---- 3 files changed, 52 insertions(+), 8 deletions(-) diff --git a/models/fixtures/label.yml b/models/fixtures/label.yml index acfac74968..84c2a7f418 100644 --- a/models/fixtures/label.yml +++ b/models/fixtures/label.yml @@ -3,6 +3,7 @@ repo_id: 1 org_id: 0 name: label1 + description: 'First label' color: '#abcdef' exclusive: false num_issues: 2 @@ -107,3 +108,26 @@ num_issues: 0 num_closed_issues: 0 archived_unix: 0 + +- + id: 11 + repo_id: 3 + org_id: 0 + name: " /'?&" + description: "Malicious label ' " + color: '#000000' + exclusive: true + num_issues: 0 + num_closed_issues: 0 + archived_unix: 0 + +- + id: 12 + repo_id: 3 + org_id: 0 + name: 'archived label<>' + color: '#000000' + exclusive: false + num_issues: 0 + num_closed_issues: 0 + archived_unix: 2991092130 diff --git a/modules/templates/util_render_test.go b/modules/templates/util_render_test.go index 00543a1b33..5974c34073 100644 --- a/modules/templates/util_render_test.go +++ b/modules/templates/util_render_test.go @@ -218,11 +218,30 @@ func TestRenderLabels(t *testing.T) { tr := &translation.MockLocale{} label := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 1}) + labelScoped := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 7}) + labelMalicious := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 11}) + labelArchived := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 12}) - assert.Contains(t, RenderLabels(db.DefaultContext, tr, []*issues_model.Label{label}, "user2/repo1", false), - "user2/repo1/issues?labels=1") - assert.Contains(t, RenderLabels(db.DefaultContext, tr, []*issues_model.Label{label}, "user2/repo1", true), - "user2/repo1/pulls?labels=1") + rendered := RenderLabels(db.DefaultContext, tr, []*issues_model.Label{label}, "user2/repo1", false) + assert.Contains(t, rendered, "user2/repo1/issues?labels=1") + assert.Contains(t, rendered, ">label1<") + assert.Contains(t, rendered, "title='First label'") + rendered = RenderLabels(db.DefaultContext, tr, []*issues_model.Label{label}, "user2/repo1", true) + assert.Contains(t, rendered, "user2/repo1/pulls?labels=1") + assert.Contains(t, rendered, ">label1<") + rendered = RenderLabels(db.DefaultContext, tr, []*issues_model.Label{labelScoped}, "user2/repo1", false) + assert.Contains(t, rendered, "user2/repo1/issues?labels=7") + assert.Contains(t, rendered, ">scope<") + assert.Contains(t, rendered, ">label1<") + rendered = RenderLabels(db.DefaultContext, tr, []*issues_model.Label{labelMalicious}, "user2/repo1", false) + assert.Contains(t, rendered, "user2/repo1/issues?labels=11") + assert.Contains(t, rendered, "> <script>malicious</script> <") + assert.Contains(t, rendered, ">'?&<") + assert.Contains(t, rendered, "title='Malicious label ' <script>malicious</script>'") + rendered = RenderLabels(db.DefaultContext, tr, []*issues_model.Label{labelArchived}, "user2/repo1", false) + assert.Contains(t, rendered, "user2/repo1/issues?labels=12") + assert.Contains(t, rendered, ">archived label<><") + assert.Contains(t, rendered, "title='repo.issues.archived_label_description'") } func TestRenderUser(t *testing.T) { diff --git a/services/convert/issue_test.go b/services/convert/issue_test.go index 97bacfb229..ea8ad9b7ef 100644 --- a/services/convert/issue_test.go +++ b/services/convert/issue_test.go @@ -24,10 +24,11 @@ func TestLabel_ToLabel(t *testing.T) { label := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 1}) repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: label.RepoID}) assert.Equal(t, &api.Label{ - ID: label.ID, - Name: label.Name, - Color: "abcdef", - URL: fmt.Sprintf("%sapi/v1/repos/user2/repo1/labels/%d", setting.AppURL, label.ID), + ID: label.ID, + Name: label.Name, + Color: "abcdef", + Description: label.Description, + URL: fmt.Sprintf("%sapi/v1/repos/user2/repo1/labels/%d", setting.AppURL, label.ID), }, ToLabel(label, repo, nil)) } From aee161ff255f29ce57155fddca944360779c8a36 Mon Sep 17 00:00:00 2001 From: Michael Jerger Date: Fri, 27 Jun 2025 13:59:07 +0200 Subject: [PATCH 024/495] [gitea] week 2025-19 cherry pick (gitea/main -> forgejo) (#7909) ## Checklist - [x] go to the last cherry-pick PR (forgejo/forgejo#7804) to figure out how far it went: [gitea@a2024953c5](https://github.com/go-gitea/gitea/commit/a2024953c5914c5a7d59d236262f9bd94b65b996) - [x] cherry-pick and open PR (forgejo/forgejo#7909) - [ ] have the PR pass the CI - end-to-end (specially important if there are actions related changes) - [ ] add `run-end-to-end` label - [ ] check the result - [ ] write release notes - [ ] assign reviewers - [ ] 48h later, last call - merge 1 hour after the last call ## Legend - :question: - No decision about the commit has been made. - :cherries: - The commit has been cherry picked. - :fast_forward: - The commit has been skipped. - :bulb: - The commit has been skipped, but should be ported to Forgejo. - :writing_hand: - The commit has been skipped, and a port to Forgejo already exists. ## Commits - :cherries: [`gitea`](https://github.com/go-gitea/gitea/commit/e92c4f18083ed312b69591ebb77e0f504ee77025) -> [`forgejo`](https://codeberg.org/forgejo/forgejo/commit/56fa2caef32c4b0e5017f4b09188ad1dfc8d3603) Add missing setting load in dump-repo command ([gitea#34479](https://github.com/go-gitea/gitea/pull/34479)) - :cherries: [`gitea`](https://github.com/go-gitea/gitea/commit/7b518bc6c79035a53c0b752680d833fce5e1a2fe) -> [`forgejo`](https://codeberg.org/forgejo/forgejo/commit/6e5299606a1bd42cb45ed472a84ba797cf2fa790) Change "rejected" to "changes requested" in 3rd party PR review notification ([gitea#34481](https://github.com/go-gitea/gitea/pull/34481)) ## TODO - :bulb: [`gitea`](https://github.com/go-gitea/gitea/commit/972381097c6b3488bf9d5c3c4fde04775b2e3a3c) Fix url validation in webhook add/edit API ([gitea#34492](https://github.com/go-gitea/gitea/pull/34492)) Relevant input validation but test needs more backport. ------ - :bulb: [`gitea`](https://github.com/go-gitea/gitea/commit/59df03b5542f05a1a927996fbf6483f7da363e03) Fix get / delete runner to use consistent http 404 and 500 status ([gitea#34480](https://github.com/go-gitea/gitea/pull/34480)) It may be relevant to Forgejo as well ------ - :bulb: [`gitea`](https://github.com/go-gitea/gitea/commit/1e2f3514b9afd903e19a0413e5d925515e13abf8) Add endpoint deleting workflow run ([gitea#34337](https://github.com/go-gitea/gitea/pull/34337)) Actions, it would be worth having in Forgejo as well. ------ - :bulb: [`gitea`](https://github.com/go-gitea/gitea/commit/5cb4cbf044e2f0483afc92516bb4b9aff6ea2b9a) Fix repo broken check ([gitea#34444](https://github.com/go-gitea/gitea/pull/34444)) Check wether this is relevant to us, port if yes. ------ - :bulb: [`gitea`](https://github.com/go-gitea/gitea/commit/355e9a9d544aa2d3f3a17b06cdb2bf1ceb290fd7) Add a webhook push test for dev branch ([gitea#34421](https://github.com/go-gitea/gitea/pull/34421)) Enhances webhook integration tests. ------ - :bulb: [`gitea`](https://github.com/go-gitea/gitea/commit/34281bc198a5ad9a1faa5285d4648b05d7218aaa) Fix bug webhook milestone is not right. ([gitea#34419](https://github.com/go-gitea/gitea/pull/34419)) Testcode diverged, port required. ------ - :bulb: [`gitea`](https://github.com/go-gitea/gitea/commit/780e92ea99646dfefbe11734a4845fbf304be83c) Only git operations should update `last changed` of a repository ([gitea#34388](https://github.com/go-gitea/gitea/pull/34388)) Port required, would benefit from additional tests. ------ - :bulb: [`gitea`](https://github.com/go-gitea/gitea/commit/b07e03956af8f29464067b19cb5cacee358b592f) When updating comment, if the content is the same, just return and not update the databse ([gitea#34422](https://github.com/go-gitea/gitea/pull/34422)) Codebase diverged, port required. ------ - :bulb: [`gitea`](https://github.com/go-gitea/gitea/commit/71a11872091634f1370374ef123d32798ec0447d) Fix incorrect divergence cache after switching default branch ([gitea#34370](https://github.com/go-gitea/gitea/pull/34370)) Depends on previous gitea changes, port needed. ------ - :bulb: [`gitea`](https://github.com/go-gitea/gitea/commit/4c611bf280c501c22c6a58e94d9e3ce6a73214df) Add a button editing action secret ([gitea#34348](https://github.com/go-gitea/gitea/pull/34348)) This is an interesting feature and it has tests as well. Feature request covering this: https://codeberg.org/forgejo/forgejo/issues/7882 ------ - :bulb: [`gitea`](https://github.com/go-gitea/gitea/commit/2fbc8f9e87fc37f21997bf32d9b29fc16e92780c) Fix LFS file not stored in LFS when uploaded/edited via API or web UI ([gitea#34367](https://github.com/go-gitea/gitea/pull/34367)) Our code diverged - pls. check relevance & maybe port. ------ - :bulb: [`gitea`](https://github.com/go-gitea/gitea/commit/020e774b915512815637aac743ddbe595c5eede5) feat: add label 'state' to metric 'gitea_users' ([gitea#34326](https://github.com/go-gitea/gitea/pull/34326)) Adjust our existing tests while porting this. ------ ## Skipped - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/ec10c6ba5a6c4c3a5ab9bdf47616d6058c6fb59c) [skip ci] Updated translations via Crowdin ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/d89eed998f9e4dc84d0ef02451703590d7a8ef51) Fix edithook api can not update package, status and workflow_job events ([gitea#34495](https://github.com/go-gitea/gitea/pull/34495)) - gitea actions specific specific ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/b6c066747400927407a6b4807165d2de40c7495b) Add R-HNF to the TRANSLATORS file ([gitea#34494](https://github.com/go-gitea/gitea/pull/34494)) - gitea translators update specific ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/6fbf0e67383dd2970d8e6c309ebc5c634732866c) nix flake update ([gitea#34476](https://github.com/go-gitea/gitea/pull/34476)) - gitea dependency update specific ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/c24f4b3d2912224164ee3a75850a6a31bdd041f1) Add migrations tests ([gitea#34456](https://github.com/go-gitea/gitea/pull/34456)) ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/bf338bb9e231a8f9ccef7de2e13a0fdf871fc680) Fix project board view ([gitea#34470](https://github.com/go-gitea/gitea/pull/34470)) - gitea ui specific specific ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/319d03fbc049de34a6fa0bc3019107ec5b724ff2) [skip ci] Updated translations via Crowdin ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/dd500ce5598848e4f50999b627155ec8520932d3) Fix Workflow run Not Found page ([gitea#34459](https://github.com/go-gitea/gitea/pull/34459)) - gitea actions specific specific ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/b6bf128f1e1a943df85c1ce276d0317c8689ffca) [skip ci] Updated translations via Crowdin ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/a0595add72db4a5fb421579b9c6bb7dae1392c86) Fix remove org user failure on mssql ([gitea#34449](https://github.com/go-gitea/gitea/pull/34449)) ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/b5fd3e7210cfbcb87015f3a5b8c3f25eab2a5715) Fix comment textarea scroll issue in Firefox ([gitea#34438](https://github.com/go-gitea/gitea/pull/34438)) - gitea ui specific specific ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/4011e2245bcd96f53077f73b7a33b1a754f7151f) Fix releases sidebar navigation link ([gitea#34436](https://github.com/go-gitea/gitea/pull/34436)) - gitea ui specific specific ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/0902d42fc753cd5f266046f003307285fe9507d5) [skip ci] Updated translations via Crowdin ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/4a98ab05403ef1900937487d434bc075812b0303) Remove legacy template helper functions ([gitea#34426](https://github.com/go-gitea/gitea/pull/34426)) - gitea specific specific ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/9b8609e017aef8376eb59d9fd3e428e35f9caeda) Fix GetUsersByEmails ([gitea#34423](https://github.com/go-gitea/gitea/pull/34423)) - gitea specific specific ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/0f63a5ef48b23c6ab26a4b13cfd26edbe4efbfa3) [skip ci] Updated translations via Crowdin ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/ad271444e912ddf44591451292b39b0d6b859955) Fix a bug when uploading file via lfs ssh command ([gitea#34408](https://github.com/go-gitea/gitea/pull/34408)) :skiP: present with PR #7752 ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/8b16ab719cab24805beb2189af7ee960ca94d524) Merge and tweak markup editor expander CSS ([gitea#34409](https://github.com/go-gitea/gitea/pull/34409)) - gitea ui specific specific ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/2ecd73d2e586cd4ff2001246d54c4affe0e1ccec) Bump `@github/relative-time-element` to v4.4.8 ([gitea#34413](https://github.com/go-gitea/gitea/pull/34413)) - gitea dependency update specific ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/179068fddbb463f3a34162730649d82acec522d3) Refactor commit message rendering and fix bugs ([gitea#34412](https://github.com/go-gitea/gitea/pull/34412)) - gitea ui specific specific ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/44aadc37c9c0810f3a41189929ae21c613b6bc98) [skip ci] Updated translations via Crowdin ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/f63822fe64b0759dc7e38b467eaa7c41b71d8c5d) Fix autofocus behavior ([gitea#34397](https://github.com/go-gitea/gitea/pull/34397)) - gitea ui specific specific ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/82071ee7300d478f56519ec30be0213b18a7882c) [skip ci] Updated translations via Crowdin ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/bbfc21e74f69a9b1ac83271923210c731edd2873) Fix "The sidebar of the repository file list does not have a fixed height #34298" ([gitea#34321](https://github.com/go-gitea/gitea/pull/34321)) - gitea ui specific specific ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/dd886d729f6206ad878aa5e0f0f3d4d20ea9a208) Update JS and PY dependencies ([gitea#34391](https://github.com/go-gitea/gitea/pull/34391)) - gitea dependency update specific ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/2a660b4a1b6913f80981d8840b3dc129a4eb7f26) Upgrade go-github v61 -> v71 ([gitea#34385](https://github.com/go-gitea/gitea/pull/34385)) - gitea dependency update specific ------ - :fast_forward: [`gitea`](https://github.com/go-gitea/gitea/commit/6bd8fe53537172fb4df976962115f1b928bf2993) Bump `@github/relative-time-element` to v4.4.7 ([gitea#34384](https://github.com/go-gitea/gitea/pull/34384)) - gitea dependency update specific ------

Stats


Between [`gitea@a2024953c5`](https://github.com/go-gitea/gitea/commit/a2024953c5914c5a7d59d236262f9bd94b65b996) and [`gitea@ec10c6ba5a`](https://github.com/go-gitea/gitea/commit/ec10c6ba5a6c4c3a5ab9bdf47616d6058c6fb59c), **41** commits have been reviewed. We picked **2**, skipped **27**, and decided to port **12**.
Co-authored-by: Sebastian Weigand Co-authored-by: Lunny Xiao Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7909 Reviewed-by: Earl Warren Co-authored-by: Michael Jerger Co-committed-by: Michael Jerger --- cmd/dump_repo.go | 5 +++++ services/webhook/discord.go | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/cmd/dump_repo.go b/cmd/dump_repo.go index eb89273e7f..7159d55e99 100644 --- a/cmd/dump_repo.go +++ b/cmd/dump_repo.go @@ -82,6 +82,11 @@ wiki, issues, labels, releases, release_assets, milestones, pull_requests, comme } func runDumpRepository(stdCtx context.Context, ctx *cli.Command) error { + setupConsoleLogger(log.INFO, log.CanColorStderr, os.Stderr) + + // setting.DisableLoggerInit() + setting.LoadSettings() // cannot access skip_tls_verify settings otherwise + stdCtx, cancel := installSignals(stdCtx) defer cancel() diff --git a/services/webhook/discord.go b/services/webhook/discord.go index db98d40583..7259c4a995 100644 --- a/services/webhook/discord.go +++ b/services/webhook/discord.go @@ -350,7 +350,7 @@ func parseHookPullRequestEventType(event webhook_module.HookEventType) (string, case webhook_module.HookEventPullRequestReviewApproved: return "approved", nil case webhook_module.HookEventPullRequestReviewRejected: - return "rejected", nil + return "requested changes", nil case webhook_module.HookEventPullRequestReviewComment: return "comment", nil default: From 3fb6e171051c4946b93a38bbb5212d3245d485ef Mon Sep 17 00:00:00 2001 From: Lucas Schwiderski Date: Fri, 27 Jun 2025 15:29:44 +0200 Subject: [PATCH 025/495] fix: add missing trust status to pull review commits (#8296) Closes: #8293 ## Checklist The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org). ### Tests - I added test coverage for Go changes... - [ ] in their respective `*_test.go` for unit tests. - [x] in the `tests/integration` directory if it involves interactions with a live Forgejo server. - I added test coverage for JavaScript changes... - [ ] in `web_src/js/*.test.js` if it can be unit tested. - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)). ### Documentation - [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [x] I do not want this change to show in the release notes. - [ ] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/.md` to be be used for the release notes instead of the title. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8296 Reviewed-by: Earl Warren Co-authored-by: Lucas Schwiderski Co-committed-by: Lucas Schwiderski --- routers/web/repo/pull.go | 7 ++ tests/integration/pull_commit_test.go | 93 +++++++++++++++++++++++++++ tests/integration/repo_test.go | 78 ++++++++++++++++++++++ 3 files changed, 178 insertions(+) diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index fd18646211..4e365f24ea 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -996,6 +996,13 @@ func viewPullFiles(ctx *context.Context, specifiedStartCommit, specifiedEndCommi ctx.Data["Verification"] = verification ctx.Data["Author"] = user_model.ValidateCommitWithEmail(ctx, curCommit) + if err := asymkey_model.CalculateTrustStatus(verification, ctx.Repo.Repository.GetTrustModel(), func(user *user_model.User) (bool, error) { + return repo_model.IsOwnerMemberCollaborator(ctx, ctx.Repo.Repository, user.ID) + }, nil); err != nil { + ctx.ServerError("CalculateTrustStatus", err) + return + } + note := &git.Note{} err = git.GetNote(ctx, ctx.Repo.GitRepo, specifiedEndCommit, note) if err == nil { diff --git a/tests/integration/pull_commit_test.go b/tests/integration/pull_commit_test.go index 8ca78f8147..1de437ef46 100644 --- a/tests/integration/pull_commit_test.go +++ b/tests/integration/pull_commit_test.go @@ -4,13 +4,26 @@ package integration import ( + "context" + "encoding/base64" + "fmt" "net/http" + "net/url" + "os" "testing" + auth_model "forgejo.org/models/auth" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/git" + "forgejo.org/modules/setting" + api "forgejo.org/modules/structs" + "forgejo.org/modules/test" pull_service "forgejo.org/services/pull" "forgejo.org/tests" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestListPullCommits(t *testing.T) { @@ -48,3 +61,83 @@ func TestPullCommitLinks(t *testing.T) { commitLinkHref, _ := commitLink.Attr("href") assert.Equal(t, "/user2/repo1/pulls/3/commits/5f22f7d0d95d614d25a5b68592adb345a4b5c7fd", commitLinkHref) } + +func TestPullCommitSignature(t *testing.T) { + t.Cleanup(func() { + // Cannot use t.Context(), it is in the done state. + require.NoError(t, git.InitFull(context.Background())) //nolint:usetesting + }) + + defer test.MockVariableValue(&setting.Repository.Signing.SigningName, "UwU")() + defer test.MockVariableValue(&setting.Repository.Signing.SigningEmail, "fox@example.com")() + defer test.MockVariableValue(&setting.Repository.Signing.CRUDActions, []string{"always"})() + defer test.MockVariableValue(&setting.Repository.Signing.InitialCommit, []string{"always"})() + + filePath := "signed.txt" + fromBranch := "master" + toBranch := "branch-signed" + + onGiteaRun(t, func(t *testing.T, u *url.URL) { + // Use a new GNUPGPHOME to avoid messing with the existing GPG keyring. + tmpDir := t.TempDir() + require.NoError(t, os.Chmod(tmpDir, 0o700)) + t.Setenv("GNUPGHOME", tmpDir) + + rootKeyPair, err := importTestingKey() + require.NoError(t, err) + defer test.MockVariableValue(&setting.Repository.Signing.SigningKey, rootKeyPair.PrimaryKey.KeyIdShortString())() + defer test.MockVariableValue(&setting.Repository.Signing.Format, "openpgp")() + + // Ensure the git config is updated with the new signing format. + require.NoError(t, git.InitFull(t.Context())) + + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + testCtx := NewAPITestContext(t, user.Name, "pull-request-commit-header-signed", auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) + u.Path = testCtx.GitPath() + + t.Run("Create repository", doAPICreateRepository(testCtx, false, git.Sha1ObjectFormat)) + + t.Run("Create commit", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + options := &api.CreateFileOptions{ + FileOptions: api.FileOptions{ + BranchName: fromBranch, + NewBranchName: toBranch, + Message: fmt.Sprintf("from:%s to:%s path:%s", fromBranch, toBranch, filePath), + Author: api.Identity{ + Name: user.FullName, + Email: user.Email, + }, + Committer: api.Identity{ + Name: user.FullName, + Email: user.Email, + }, + }, + ContentBase64: base64.StdEncoding.EncodeToString(fmt.Appendf(nil, "This is new text for %s", filePath)), + } + + req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", testCtx.Username, testCtx.Reponame, filePath), &options). + AddTokenAuth(testCtx.Token) + resp := testCtx.Session.MakeRequest(t, req, http.StatusCreated) + + var contents api.FileResponse + DecodeJSON(t, resp, &contents) + + assert.True(t, contents.Verification.Verified) + }) + + t.Run("Create pull request", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + pr, err := doAPICreatePullRequest(testCtx, testCtx.Username, testCtx.Reponame, fromBranch, toBranch)(t) + require.NoError(t, err) + + req := NewRequest(t, "GET", fmt.Sprintf("/%s/%s/pulls/%d/commits/%s", testCtx.Username, testCtx.Reponame, pr.Index, pr.Head.Sha)) + resp := testCtx.Session.MakeRequest(t, req, http.StatusOK) + + htmlDoc := NewHTMLParser(t, resp.Body) + htmlDoc.AssertElement(t, "#diff-commit-header .commit-header-row.message.isSigned.isVerified", true) + }) + }) +} diff --git a/tests/integration/repo_test.go b/tests/integration/repo_test.go index b66726a3e6..329a31ace8 100644 --- a/tests/integration/repo_test.go +++ b/tests/integration/repo_test.go @@ -5,15 +5,19 @@ package integration import ( + "context" + "encoding/base64" "fmt" "net/http" "net/url" + "os" "path" "regexp" "strings" "testing" "time" + auth_model "forgejo.org/models/auth" "forgejo.org/models/db" repo_model "forgejo.org/models/repo" unit_model "forgejo.org/models/unit" @@ -22,6 +26,7 @@ import ( "forgejo.org/modules/git" "forgejo.org/modules/optional" "forgejo.org/modules/setting" + api "forgejo.org/modules/structs" "forgejo.org/modules/test" "forgejo.org/modules/translation" repo_service "forgejo.org/services/repository" @@ -682,6 +687,79 @@ func TestViewCommit(t *testing.T) { assert.True(t, test.IsNormalPageCompleted(resp.Body.String()), "non-existing commit should render 404 page") } +func TestViewCommitSignature(t *testing.T) { + t.Cleanup(func() { + // Cannot use t.Context(), it is in the done state. + require.NoError(t, git.InitFull(context.Background())) //nolint:usetesting + }) + + defer test.MockVariableValue(&setting.Repository.Signing.SigningName, "UwU")() + defer test.MockVariableValue(&setting.Repository.Signing.SigningEmail, "fox@example.com")() + defer test.MockVariableValue(&setting.Repository.Signing.CRUDActions, []string{"always"})() + defer test.MockVariableValue(&setting.Repository.Signing.InitialCommit, []string{"always"})() + + filePath := "signed.txt" + fromBranch := "master" + toBranch := "branch-signed" + + onGiteaRun(t, func(t *testing.T, u *url.URL) { + // Use a new GNUPGPHOME to avoid messing with the existing GPG keyring. + tmpDir := t.TempDir() + require.NoError(t, os.Chmod(tmpDir, 0o700)) + t.Setenv("GNUPGHOME", tmpDir) + + rootKeyPair, err := importTestingKey() + require.NoError(t, err) + defer test.MockVariableValue(&setting.Repository.Signing.SigningKey, rootKeyPair.PrimaryKey.KeyIdShortString())() + defer test.MockVariableValue(&setting.Repository.Signing.Format, "openpgp")() + + // Ensure the git config is updated with the new signing format. + require.NoError(t, git.InitFull(t.Context())) + + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + testCtx := NewAPITestContext(t, user.Name, "commit-header-signed", auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) + u.Path = testCtx.GitPath() + + t.Run("Create repository", doAPICreateRepository(testCtx, false, git.Sha1ObjectFormat)) + + t.Run("Create commit", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + options := &api.CreateFileOptions{ + FileOptions: api.FileOptions{ + BranchName: fromBranch, + NewBranchName: toBranch, + Message: fmt.Sprintf("from:%s to:%s path:%s", fromBranch, toBranch, filePath), + Author: api.Identity{ + Name: user.FullName, + Email: user.Email, + }, + Committer: api.Identity{ + Name: user.FullName, + Email: user.Email, + }, + }, + ContentBase64: base64.StdEncoding.EncodeToString(fmt.Appendf(nil, "This is new text for %s", filePath)), + } + + req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", testCtx.Username, testCtx.Reponame, filePath), &options). + AddTokenAuth(testCtx.Token) + resp := testCtx.Session.MakeRequest(t, req, http.StatusCreated) + + var contents api.FileResponse + DecodeJSON(t, resp, &contents) + + assert.True(t, contents.Verification.Verified) + + req = NewRequest(t, "GET", fmt.Sprintf("/%s/%s/commit/%s", testCtx.Username, testCtx.Reponame, contents.Commit.SHA)) + resp = testCtx.Session.MakeRequest(t, req, http.StatusOK) + + htmlDoc := NewHTMLParser(t, resp.Body) + htmlDoc.AssertElement(t, ".commit-header-row.message.isSigned.isVerified", true) + }) + }) +} + func TestCommitView(t *testing.T) { defer tests.PrepareTestEnv(t)() From c085d6c9ac7afe822a59eccba589c67eb1ac9b1c Mon Sep 17 00:00:00 2001 From: Gusted Date: Fri, 27 Jun 2025 15:43:31 +0200 Subject: [PATCH 026/495] fix: pass doer's ID for CRUD instance signing (#8304) - When doing CRUD actions, the commiter and author are reconstructed and do not contain the doer's ID. Make sure to pass this ID along so it can be used to verify the rules of instance signing for CRUD actions. - Regression of forgejo/forgejo#7693. It seems that previously this didn't work correctly as it would not care about a empty ID. - Resolves forgejo/forgejo#8278 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8304 Reviewed-by: Michael Kriese Reviewed-by: Beowulf Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- services/repository/files/file.go | 51 +++++++++++----------- tests/integration/signing_git_test.go | 61 ++++++++++++++++++++++++++- 2 files changed, 85 insertions(+), 27 deletions(-) diff --git a/services/repository/files/file.go b/services/repository/files/file.go index ef9a87dbcf..5b93258840 100644 --- a/services/repository/files/file.go +++ b/services/repository/files/file.go @@ -104,36 +104,35 @@ func GetAuthorAndCommitterUsers(author, committer *IdentityOptions, doer *user_m // then we use bogus User objects for them to store their FullName and Email. // If only one of the two are provided, we set both of them to it. // If neither are provided, both are the doer. - if committer != nil && committer.Email != "" { - if doer != nil && strings.EqualFold(doer.Email, committer.Email) { - committerUser = doer // the committer is the doer, so will use their user object - if committer.Name != "" { - committerUser.FullName = committer.Name + getUser := func(identity *IdentityOptions) *user_model.User { + if identity == nil || identity.Email == "" { + return nil + } + + if doer != nil && strings.EqualFold(doer.Email, identity.Email) { + user := doer // the committer is the doer, so will use their user object + if identity.Name != "" { + user.FullName = identity.Name } // Use the provided email and not revert to placeholder mail. - committerUser.KeepEmailPrivate = false - } else { - committerUser = &user_model.User{ - FullName: committer.Name, - Email: committer.Email, - } - } - } - if author != nil && author.Email != "" { - if doer != nil && strings.EqualFold(doer.Email, author.Email) { - authorUser = doer // the author is the doer, so will use their user object - if authorUser.Name != "" { - authorUser.FullName = author.Name - } - // Use the provided email and not revert to placeholder mail. - authorUser.KeepEmailPrivate = false - } else { - authorUser = &user_model.User{ - FullName: author.Name, - Email: author.Email, - } + user.KeepEmailPrivate = false + return user + } + + var id int64 + if doer != nil { + id = doer.ID + } + return &user_model.User{ + ID: id, // Needed to ensure the doer is checked to pass rules for instance signing of CRUD actions. + FullName: identity.Name, + Email: identity.Email, } } + + committerUser = getUser(committer) + authorUser = getUser(author) + if authorUser == nil { if committerUser != nil { authorUser = committerUser // No valid author was given so use the committer diff --git a/tests/integration/signing_git_test.go b/tests/integration/signing_git_test.go index 9d69306e0a..c4759aaddb 100644 --- a/tests/integration/signing_git_test.go +++ b/tests/integration/signing_git_test.go @@ -235,7 +235,7 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O })) }) - t.Run("No publickey", func(t *testing.T) { + t.Run("No 2fa", func(t *testing.T) { defer tests.PrintCurrentTest(t)() testCtx := NewAPITestContext(t, "user4", "initial-no-2fa"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) @@ -287,6 +287,65 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O })) }) + t.Run("AlwaysSign-Initial-CRUD-Pubkey", func(t *testing.T) { + setting.Repository.Signing.CRUDActions = []string{"pubkey"} + + t.Run("Has publickey", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + testCtx := NewAPITestContext(t, username, "initial-always-pubkey"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) + t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) + t.Run("CreateCRUDFile-Pubkey", crudActionCreateFile( + t, testCtx, user, "master", "pubkey", "signed-pubkey.txt", func(t *testing.T, response api.FileResponse) { + assert.True(t, response.Verification.Verified) + assert.Equal(t, "fox@example.com", response.Verification.Signer.Email) + })) + }) + + t.Run("No publickey", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + testCtx := NewAPITestContext(t, "user4", "initial-always-no-pubkey"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) + t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) + t.Run("CreateCRUDFile-Pubkey", crudActionCreateFile( + t, testCtx, user, "master", "pubkey", "unsigned-pubkey.txt", func(t *testing.T, response api.FileResponse) { + assert.False(t, response.Verification.Verified) + })) + }) + }) + + t.Run("AlwaysSign-Initial-CRUD-Twofa", func(t *testing.T) { + setting.Repository.Signing.CRUDActions = []string{"twofa"} + + t.Run("Has 2fa", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + t.Cleanup(func() { + unittest.AssertSuccessfulDelete(t, &auth_model.WebAuthnCredential{UserID: user.ID}) + }) + + testCtx := NewAPITestContext(t, username, "initial-always-twofa"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) + unittest.AssertSuccessfulInsert(t, &auth_model.WebAuthnCredential{UserID: user.ID}) + t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) + t.Run("CreateCRUDFile-Twofa", crudActionCreateFile( + t, testCtx, user, "master", "twofa", "signed-twofa.txt", func(t *testing.T, response api.FileResponse) { + assert.True(t, response.Verification.Verified) + assert.Equal(t, "fox@example.com", response.Verification.Signer.Email) + })) + }) + + t.Run("No 2fa", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + testCtx := NewAPITestContext(t, "user4", "initial-always-no-twofa"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) + t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) + t.Run("CreateCRUDFile-Pubkey", crudActionCreateFile( + t, testCtx, user, "master", "twofa", "unsigned-twofa.txt", func(t *testing.T, response api.FileResponse) { + assert.False(t, response.Verification.Verified) + })) + }) + }) + t.Run("AlwaysSign-Initial-CRUD-Always", func(t *testing.T) { defer tests.PrintCurrentTest(t)() setting.Repository.Signing.CRUDActions = []string{"always"} From 69d374435b0aa9e4c6891e0072ba8e6241696a8e Mon Sep 17 00:00:00 2001 From: floss4good Date: Fri, 27 Jun 2025 15:47:58 +0200 Subject: [PATCH 027/495] fix: abuse reports string data types (#8267) Follow-up of !6977 I was fooled by the fact that for SQLite the columns corresponding to `string` fields were created as `TEXT`; but this is not the case for PostgreSQL and MariaDB/MySQL. According to XORM default mapping rules[^1] _String is corresponding to varchar(255)_. Therefore `abuse_report`.`remarks` should be of type `VARCHAR(500)` and `abuse_report_shadow_copy`.`raw_value` of type `LONGTEXT`. ### Testing I have dropped the affected columns (or the entire tables) and checked that for PostgreSQL and MariaDB they are created with the correct type and also manually tested the abusive content reporting functionality in order to make sure that no DB error will be returned if for 'Remarks' a text longer than 255 characters is submitted or when a (big) shadow copy is created. [^1]: https://xorm.io/docs/chapter-02/4.columns/ Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8267 Reviewed-by: Gusted Co-authored-by: floss4good Co-committed-by: floss4good --- models/moderation/abuse_report.go | 2 +- models/moderation/shadow_copy.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/models/moderation/abuse_report.go b/models/moderation/abuse_report.go index dadd61a95e..3a6244ef4c 100644 --- a/models/moderation/abuse_report.go +++ b/models/moderation/abuse_report.go @@ -100,7 +100,7 @@ type AbuseReport struct { // The abuse category selected by the reporter. Category AbuseCategoryType `xorm:"INDEX NOT NULL"` // Remarks provided by the reporter. - Remarks string + Remarks string `xorm:"VARCHAR(500)"` // The ID of the corresponding shadow-copied content when exists; otherwise null. ShadowCopyID sql.NullInt64 `xorm:"DEFAULT NULL"` CreatedUnix timeutil.TimeStamp `xorm:"created NOT NULL"` diff --git a/models/moderation/shadow_copy.go b/models/moderation/shadow_copy.go index cdd8f69c52..d363610a48 100644 --- a/models/moderation/shadow_copy.go +++ b/models/moderation/shadow_copy.go @@ -17,7 +17,7 @@ import ( type AbuseReportShadowCopy struct { ID int64 `xorm:"pk autoincr"` - RawValue string `xorm:"NOT NULL"` + RawValue string `xorm:"LONGTEXT NOT NULL"` // A JSON with relevant fields from user, repository, issue or comment table. CreatedUnix timeutil.TimeStamp `xorm:"created NOT NULL"` } From 71d3cb95908a3f5cdcb0e9226b60195a92963751 Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Fri, 27 Jun 2025 16:20:44 +0200 Subject: [PATCH 028/495] [v12.0/forgejo] fix: add missing trust status to pull review commits (#8317) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8296 Closes: #8293 ## Checklist The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org). ### Tests - I added test coverage for Go changes... - [ ] in their respective `*_test.go` for unit tests. - [x] in the `tests/integration` directory if it involves interactions with a live Forgejo server. - I added test coverage for JavaScript changes... - [ ] in `web_src/js/*.test.js` if it can be unit tested. - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)). ### Documentation - [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [x] I do not want this change to show in the release notes. - [ ] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/.md` to be be used for the release notes instead of the title. Co-authored-by: Lucas Schwiderski Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8317 Reviewed-by: Earl Warren Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- routers/web/repo/pull.go | 7 ++ tests/integration/pull_commit_test.go | 93 +++++++++++++++++++++++++++ tests/integration/repo_test.go | 78 ++++++++++++++++++++++ 3 files changed, 178 insertions(+) diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index fd18646211..4e365f24ea 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -996,6 +996,13 @@ func viewPullFiles(ctx *context.Context, specifiedStartCommit, specifiedEndCommi ctx.Data["Verification"] = verification ctx.Data["Author"] = user_model.ValidateCommitWithEmail(ctx, curCommit) + if err := asymkey_model.CalculateTrustStatus(verification, ctx.Repo.Repository.GetTrustModel(), func(user *user_model.User) (bool, error) { + return repo_model.IsOwnerMemberCollaborator(ctx, ctx.Repo.Repository, user.ID) + }, nil); err != nil { + ctx.ServerError("CalculateTrustStatus", err) + return + } + note := &git.Note{} err = git.GetNote(ctx, ctx.Repo.GitRepo, specifiedEndCommit, note) if err == nil { diff --git a/tests/integration/pull_commit_test.go b/tests/integration/pull_commit_test.go index 8ca78f8147..1de437ef46 100644 --- a/tests/integration/pull_commit_test.go +++ b/tests/integration/pull_commit_test.go @@ -4,13 +4,26 @@ package integration import ( + "context" + "encoding/base64" + "fmt" "net/http" + "net/url" + "os" "testing" + auth_model "forgejo.org/models/auth" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/git" + "forgejo.org/modules/setting" + api "forgejo.org/modules/structs" + "forgejo.org/modules/test" pull_service "forgejo.org/services/pull" "forgejo.org/tests" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestListPullCommits(t *testing.T) { @@ -48,3 +61,83 @@ func TestPullCommitLinks(t *testing.T) { commitLinkHref, _ := commitLink.Attr("href") assert.Equal(t, "/user2/repo1/pulls/3/commits/5f22f7d0d95d614d25a5b68592adb345a4b5c7fd", commitLinkHref) } + +func TestPullCommitSignature(t *testing.T) { + t.Cleanup(func() { + // Cannot use t.Context(), it is in the done state. + require.NoError(t, git.InitFull(context.Background())) //nolint:usetesting + }) + + defer test.MockVariableValue(&setting.Repository.Signing.SigningName, "UwU")() + defer test.MockVariableValue(&setting.Repository.Signing.SigningEmail, "fox@example.com")() + defer test.MockVariableValue(&setting.Repository.Signing.CRUDActions, []string{"always"})() + defer test.MockVariableValue(&setting.Repository.Signing.InitialCommit, []string{"always"})() + + filePath := "signed.txt" + fromBranch := "master" + toBranch := "branch-signed" + + onGiteaRun(t, func(t *testing.T, u *url.URL) { + // Use a new GNUPGPHOME to avoid messing with the existing GPG keyring. + tmpDir := t.TempDir() + require.NoError(t, os.Chmod(tmpDir, 0o700)) + t.Setenv("GNUPGHOME", tmpDir) + + rootKeyPair, err := importTestingKey() + require.NoError(t, err) + defer test.MockVariableValue(&setting.Repository.Signing.SigningKey, rootKeyPair.PrimaryKey.KeyIdShortString())() + defer test.MockVariableValue(&setting.Repository.Signing.Format, "openpgp")() + + // Ensure the git config is updated with the new signing format. + require.NoError(t, git.InitFull(t.Context())) + + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + testCtx := NewAPITestContext(t, user.Name, "pull-request-commit-header-signed", auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) + u.Path = testCtx.GitPath() + + t.Run("Create repository", doAPICreateRepository(testCtx, false, git.Sha1ObjectFormat)) + + t.Run("Create commit", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + options := &api.CreateFileOptions{ + FileOptions: api.FileOptions{ + BranchName: fromBranch, + NewBranchName: toBranch, + Message: fmt.Sprintf("from:%s to:%s path:%s", fromBranch, toBranch, filePath), + Author: api.Identity{ + Name: user.FullName, + Email: user.Email, + }, + Committer: api.Identity{ + Name: user.FullName, + Email: user.Email, + }, + }, + ContentBase64: base64.StdEncoding.EncodeToString(fmt.Appendf(nil, "This is new text for %s", filePath)), + } + + req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", testCtx.Username, testCtx.Reponame, filePath), &options). + AddTokenAuth(testCtx.Token) + resp := testCtx.Session.MakeRequest(t, req, http.StatusCreated) + + var contents api.FileResponse + DecodeJSON(t, resp, &contents) + + assert.True(t, contents.Verification.Verified) + }) + + t.Run("Create pull request", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + pr, err := doAPICreatePullRequest(testCtx, testCtx.Username, testCtx.Reponame, fromBranch, toBranch)(t) + require.NoError(t, err) + + req := NewRequest(t, "GET", fmt.Sprintf("/%s/%s/pulls/%d/commits/%s", testCtx.Username, testCtx.Reponame, pr.Index, pr.Head.Sha)) + resp := testCtx.Session.MakeRequest(t, req, http.StatusOK) + + htmlDoc := NewHTMLParser(t, resp.Body) + htmlDoc.AssertElement(t, "#diff-commit-header .commit-header-row.message.isSigned.isVerified", true) + }) + }) +} diff --git a/tests/integration/repo_test.go b/tests/integration/repo_test.go index b66726a3e6..329a31ace8 100644 --- a/tests/integration/repo_test.go +++ b/tests/integration/repo_test.go @@ -5,15 +5,19 @@ package integration import ( + "context" + "encoding/base64" "fmt" "net/http" "net/url" + "os" "path" "regexp" "strings" "testing" "time" + auth_model "forgejo.org/models/auth" "forgejo.org/models/db" repo_model "forgejo.org/models/repo" unit_model "forgejo.org/models/unit" @@ -22,6 +26,7 @@ import ( "forgejo.org/modules/git" "forgejo.org/modules/optional" "forgejo.org/modules/setting" + api "forgejo.org/modules/structs" "forgejo.org/modules/test" "forgejo.org/modules/translation" repo_service "forgejo.org/services/repository" @@ -682,6 +687,79 @@ func TestViewCommit(t *testing.T) { assert.True(t, test.IsNormalPageCompleted(resp.Body.String()), "non-existing commit should render 404 page") } +func TestViewCommitSignature(t *testing.T) { + t.Cleanup(func() { + // Cannot use t.Context(), it is in the done state. + require.NoError(t, git.InitFull(context.Background())) //nolint:usetesting + }) + + defer test.MockVariableValue(&setting.Repository.Signing.SigningName, "UwU")() + defer test.MockVariableValue(&setting.Repository.Signing.SigningEmail, "fox@example.com")() + defer test.MockVariableValue(&setting.Repository.Signing.CRUDActions, []string{"always"})() + defer test.MockVariableValue(&setting.Repository.Signing.InitialCommit, []string{"always"})() + + filePath := "signed.txt" + fromBranch := "master" + toBranch := "branch-signed" + + onGiteaRun(t, func(t *testing.T, u *url.URL) { + // Use a new GNUPGPHOME to avoid messing with the existing GPG keyring. + tmpDir := t.TempDir() + require.NoError(t, os.Chmod(tmpDir, 0o700)) + t.Setenv("GNUPGHOME", tmpDir) + + rootKeyPair, err := importTestingKey() + require.NoError(t, err) + defer test.MockVariableValue(&setting.Repository.Signing.SigningKey, rootKeyPair.PrimaryKey.KeyIdShortString())() + defer test.MockVariableValue(&setting.Repository.Signing.Format, "openpgp")() + + // Ensure the git config is updated with the new signing format. + require.NoError(t, git.InitFull(t.Context())) + + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + testCtx := NewAPITestContext(t, user.Name, "commit-header-signed", auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) + u.Path = testCtx.GitPath() + + t.Run("Create repository", doAPICreateRepository(testCtx, false, git.Sha1ObjectFormat)) + + t.Run("Create commit", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + options := &api.CreateFileOptions{ + FileOptions: api.FileOptions{ + BranchName: fromBranch, + NewBranchName: toBranch, + Message: fmt.Sprintf("from:%s to:%s path:%s", fromBranch, toBranch, filePath), + Author: api.Identity{ + Name: user.FullName, + Email: user.Email, + }, + Committer: api.Identity{ + Name: user.FullName, + Email: user.Email, + }, + }, + ContentBase64: base64.StdEncoding.EncodeToString(fmt.Appendf(nil, "This is new text for %s", filePath)), + } + + req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", testCtx.Username, testCtx.Reponame, filePath), &options). + AddTokenAuth(testCtx.Token) + resp := testCtx.Session.MakeRequest(t, req, http.StatusCreated) + + var contents api.FileResponse + DecodeJSON(t, resp, &contents) + + assert.True(t, contents.Verification.Verified) + + req = NewRequest(t, "GET", fmt.Sprintf("/%s/%s/commit/%s", testCtx.Username, testCtx.Reponame, contents.Commit.SHA)) + resp = testCtx.Session.MakeRequest(t, req, http.StatusOK) + + htmlDoc := NewHTMLParser(t, resp.Body) + htmlDoc.AssertElement(t, ".commit-header-row.message.isSigned.isVerified", true) + }) + }) +} + func TestCommitView(t *testing.T) { defer tests.PrepareTestEnv(t)() From 5f88d15a63cec9c827cd0ae4062dbf7d33f95353 Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Fri, 27 Jun 2025 16:26:11 +0200 Subject: [PATCH 029/495] [v12.0/forgejo] fix: pass doer's ID for CRUD instance signing (#8318) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8304 - When doing CRUD actions, the commiter and author are reconstructed and do not contain the doer's ID. Make sure to pass this ID along so it can be used to verify the rules of instance signing for CRUD actions. - Regression of forgejo/forgejo#7693. It seems that previously this didn't work correctly as it would not care about a empty ID. - Resolves forgejo/forgejo#8278 Co-authored-by: Gusted Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8318 Reviewed-by: Gusted Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- services/repository/files/file.go | 51 +++++++++++----------- tests/integration/signing_git_test.go | 61 ++++++++++++++++++++++++++- 2 files changed, 85 insertions(+), 27 deletions(-) diff --git a/services/repository/files/file.go b/services/repository/files/file.go index ef9a87dbcf..5b93258840 100644 --- a/services/repository/files/file.go +++ b/services/repository/files/file.go @@ -104,36 +104,35 @@ func GetAuthorAndCommitterUsers(author, committer *IdentityOptions, doer *user_m // then we use bogus User objects for them to store their FullName and Email. // If only one of the two are provided, we set both of them to it. // If neither are provided, both are the doer. - if committer != nil && committer.Email != "" { - if doer != nil && strings.EqualFold(doer.Email, committer.Email) { - committerUser = doer // the committer is the doer, so will use their user object - if committer.Name != "" { - committerUser.FullName = committer.Name + getUser := func(identity *IdentityOptions) *user_model.User { + if identity == nil || identity.Email == "" { + return nil + } + + if doer != nil && strings.EqualFold(doer.Email, identity.Email) { + user := doer // the committer is the doer, so will use their user object + if identity.Name != "" { + user.FullName = identity.Name } // Use the provided email and not revert to placeholder mail. - committerUser.KeepEmailPrivate = false - } else { - committerUser = &user_model.User{ - FullName: committer.Name, - Email: committer.Email, - } - } - } - if author != nil && author.Email != "" { - if doer != nil && strings.EqualFold(doer.Email, author.Email) { - authorUser = doer // the author is the doer, so will use their user object - if authorUser.Name != "" { - authorUser.FullName = author.Name - } - // Use the provided email and not revert to placeholder mail. - authorUser.KeepEmailPrivate = false - } else { - authorUser = &user_model.User{ - FullName: author.Name, - Email: author.Email, - } + user.KeepEmailPrivate = false + return user + } + + var id int64 + if doer != nil { + id = doer.ID + } + return &user_model.User{ + ID: id, // Needed to ensure the doer is checked to pass rules for instance signing of CRUD actions. + FullName: identity.Name, + Email: identity.Email, } } + + committerUser = getUser(committer) + authorUser = getUser(author) + if authorUser == nil { if committerUser != nil { authorUser = committerUser // No valid author was given so use the committer diff --git a/tests/integration/signing_git_test.go b/tests/integration/signing_git_test.go index 9d69306e0a..c4759aaddb 100644 --- a/tests/integration/signing_git_test.go +++ b/tests/integration/signing_git_test.go @@ -235,7 +235,7 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O })) }) - t.Run("No publickey", func(t *testing.T) { + t.Run("No 2fa", func(t *testing.T) { defer tests.PrintCurrentTest(t)() testCtx := NewAPITestContext(t, "user4", "initial-no-2fa"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) @@ -287,6 +287,65 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O })) }) + t.Run("AlwaysSign-Initial-CRUD-Pubkey", func(t *testing.T) { + setting.Repository.Signing.CRUDActions = []string{"pubkey"} + + t.Run("Has publickey", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + testCtx := NewAPITestContext(t, username, "initial-always-pubkey"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) + t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) + t.Run("CreateCRUDFile-Pubkey", crudActionCreateFile( + t, testCtx, user, "master", "pubkey", "signed-pubkey.txt", func(t *testing.T, response api.FileResponse) { + assert.True(t, response.Verification.Verified) + assert.Equal(t, "fox@example.com", response.Verification.Signer.Email) + })) + }) + + t.Run("No publickey", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + testCtx := NewAPITestContext(t, "user4", "initial-always-no-pubkey"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) + t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) + t.Run("CreateCRUDFile-Pubkey", crudActionCreateFile( + t, testCtx, user, "master", "pubkey", "unsigned-pubkey.txt", func(t *testing.T, response api.FileResponse) { + assert.False(t, response.Verification.Verified) + })) + }) + }) + + t.Run("AlwaysSign-Initial-CRUD-Twofa", func(t *testing.T) { + setting.Repository.Signing.CRUDActions = []string{"twofa"} + + t.Run("Has 2fa", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + t.Cleanup(func() { + unittest.AssertSuccessfulDelete(t, &auth_model.WebAuthnCredential{UserID: user.ID}) + }) + + testCtx := NewAPITestContext(t, username, "initial-always-twofa"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) + unittest.AssertSuccessfulInsert(t, &auth_model.WebAuthnCredential{UserID: user.ID}) + t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) + t.Run("CreateCRUDFile-Twofa", crudActionCreateFile( + t, testCtx, user, "master", "twofa", "signed-twofa.txt", func(t *testing.T, response api.FileResponse) { + assert.True(t, response.Verification.Verified) + assert.Equal(t, "fox@example.com", response.Verification.Signer.Email) + })) + }) + + t.Run("No 2fa", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + testCtx := NewAPITestContext(t, "user4", "initial-always-no-twofa"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) + t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) + t.Run("CreateCRUDFile-Pubkey", crudActionCreateFile( + t, testCtx, user, "master", "twofa", "unsigned-twofa.txt", func(t *testing.T, response api.FileResponse) { + assert.False(t, response.Verification.Verified) + })) + }) + }) + t.Run("AlwaysSign-Initial-CRUD-Always", func(t *testing.T) { defer tests.PrintCurrentTest(t)() setting.Repository.Signing.CRUDActions = []string{"always"} From faff8f7c67aa9139b36be6c0fc28162d08340448 Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Fri, 27 Jun 2025 16:30:23 +0200 Subject: [PATCH 030/495] [v12.0/forgejo] fix: abuse reports string data types (#8319) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8267 Follow-up of !6977 I was fooled by the fact that for SQLite the columns corresponding to `string` fields were created as `TEXT`; but this is not the case for PostgreSQL and MariaDB/MySQL. According to XORM default mapping rules[^1] _String is corresponding to varchar(255)_. Therefore `abuse_report`.`remarks` should be of type `VARCHAR(500)` and `abuse_report_shadow_copy`.`raw_value` of type `LONGTEXT`. ### Testing I have dropped the affected columns (or the entire tables) and checked that for PostgreSQL and MariaDB they are created with the correct type and also manually tested the abusive content reporting functionality in order to make sure that no DB error will be returned if for 'Remarks' a text longer than 255 characters is submitted or when a (big) shadow copy is created. [^1]: https://xorm.io/docs/chapter-02/4.columns/ Co-authored-by: floss4good Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8319 Reviewed-by: Gusted Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- models/moderation/abuse_report.go | 2 +- models/moderation/shadow_copy.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/models/moderation/abuse_report.go b/models/moderation/abuse_report.go index dadd61a95e..3a6244ef4c 100644 --- a/models/moderation/abuse_report.go +++ b/models/moderation/abuse_report.go @@ -100,7 +100,7 @@ type AbuseReport struct { // The abuse category selected by the reporter. Category AbuseCategoryType `xorm:"INDEX NOT NULL"` // Remarks provided by the reporter. - Remarks string + Remarks string `xorm:"VARCHAR(500)"` // The ID of the corresponding shadow-copied content when exists; otherwise null. ShadowCopyID sql.NullInt64 `xorm:"DEFAULT NULL"` CreatedUnix timeutil.TimeStamp `xorm:"created NOT NULL"` diff --git a/models/moderation/shadow_copy.go b/models/moderation/shadow_copy.go index cdd8f69c52..d363610a48 100644 --- a/models/moderation/shadow_copy.go +++ b/models/moderation/shadow_copy.go @@ -17,7 +17,7 @@ import ( type AbuseReportShadowCopy struct { ID int64 `xorm:"pk autoincr"` - RawValue string `xorm:"NOT NULL"` + RawValue string `xorm:"LONGTEXT NOT NULL"` // A JSON with relevant fields from user, repository, issue or comment table. CreatedUnix timeutil.TimeStamp `xorm:"created NOT NULL"` } From 6b27fa66b9876390323169089e2136d1cdd8dd6e Mon Sep 17 00:00:00 2001 From: Gusted Date: Fri, 27 Jun 2025 17:37:29 +0200 Subject: [PATCH 031/495] chore: sort blocked users list for determistic results (#8320) - Ref https://codeberg.org/forgejo/forgejo/issues/8221#issuecomment-5515478 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8320 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- tests/integration/api_block_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/integration/api_block_test.go b/tests/integration/api_block_test.go index 8b25ce9283..0e2cf7ee25 100644 --- a/tests/integration/api_block_test.go +++ b/tests/integration/api_block_test.go @@ -4,8 +4,10 @@ package integration import ( + "cmp" "fmt" "net/http" + "slices" "testing" auth_model "forgejo.org/models/auth" @@ -46,6 +48,7 @@ func TestAPIUserBlock(t *testing.T) { var blockedUsers []api.BlockedUser DecodeJSON(t, resp, &blockedUsers) assert.Len(t, blockedUsers, 2) + slices.SortFunc(blockedUsers, func(a, b api.BlockedUser) int { return cmp.Compare(a.BlockID, b.BlockID) }) assert.EqualValues(t, 1, blockedUsers[0].BlockID) assert.EqualValues(t, 2, blockedUsers[1].BlockID) }) From 4a6182a3e33226549f555962f19f8615473ca43d Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Fri, 27 Jun 2025 18:15:43 +0200 Subject: [PATCH 032/495] [v12.0/forgejo] chore: sort blocked users list for determistic results (#8321) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8320 - Ref https://codeberg.org/forgejo/forgejo/issues/8221#issuecomment-5515478 Co-authored-by: Gusted Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8321 Reviewed-by: Earl Warren Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- tests/integration/api_block_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/integration/api_block_test.go b/tests/integration/api_block_test.go index 8b25ce9283..0e2cf7ee25 100644 --- a/tests/integration/api_block_test.go +++ b/tests/integration/api_block_test.go @@ -4,8 +4,10 @@ package integration import ( + "cmp" "fmt" "net/http" + "slices" "testing" auth_model "forgejo.org/models/auth" @@ -46,6 +48,7 @@ func TestAPIUserBlock(t *testing.T) { var blockedUsers []api.BlockedUser DecodeJSON(t, resp, &blockedUsers) assert.Len(t, blockedUsers, 2) + slices.SortFunc(blockedUsers, func(a, b api.BlockedUser) int { return cmp.Compare(a.BlockID, b.BlockID) }) assert.EqualValues(t, 1, blockedUsers[0].BlockID) assert.EqualValues(t, 2, blockedUsers[1].BlockID) }) From 225a0f7026e885cec6605ddcf27aeacfb1a90221 Mon Sep 17 00:00:00 2001 From: oliverpool Date: Fri, 27 Jun 2025 23:10:09 +0200 Subject: [PATCH 033/495] git/TreeEntry: LinkTarget simplification (#8323) See #8222 for context. This PR removes a call to `Blob.GetBlobContent` and `Blob.DataAsync` and unifies symlink resolution: - length was unlimited in one case - length was truncated to 1024 chars in the other case Now it is hard-limited to 4096 chars (ie error if larger), which is a length which seems appropriate according to https://stackoverflow.com/a/22575737. ### Tests - Tests are already present in `tests/integration/repo_test.go:972`: `TestRepoFollowSymlink` (it caught a cap/len stupid mistake). - [x] I did not document these changes and I do not expect someone else to do it. - [x] I do not want this change to show in the release notes. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8323 Reviewed-by: Earl Warren Co-authored-by: oliverpool Co-committed-by: oliverpool --- modules/git/tree_entry.go | 43 ++++++++++++++++------------ services/repository/files/content.go | 2 +- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/modules/git/tree_entry.go b/modules/git/tree_entry.go index d51b7992fe..ec5c632ca0 100644 --- a/modules/git/tree_entry.go +++ b/modules/git/tree_entry.go @@ -116,32 +116,37 @@ func (te *TreeEntry) Type() string { } } +// LinkTarget returns the target of the symlink as string. +func (te *TreeEntry) LinkTarget() (string, error) { + if !te.IsLink() { + return "", ErrBadLink{te.Name(), "not a symlink"} + } + + const symlinkLimit = 4096 // according to git config core.longpaths https://stackoverflow.com/a/22575737 + blob := te.Blob() + if blob.Size() > symlinkLimit { + return "", ErrBadLink{te.Name(), "symlink too large"} + } + + rc, size, err := blob.NewTruncatedReader(symlinkLimit) + if err != nil { + return "", err + } + defer rc.Close() + + buf := make([]byte, int(size)) + _, err = io.ReadFull(rc, buf) + return string(buf), err +} + // FollowLink returns the entry pointed to by a symlink func (te *TreeEntry) FollowLink() (*TreeEntry, string, error) { - if !te.IsLink() { - return nil, "", ErrBadLink{te.Name(), "not a symlink"} - } - // read the link - r, err := te.Blob().DataAsync() + lnk, err := te.LinkTarget() if err != nil { return nil, "", err } - closed := false - defer func() { - if !closed { - _ = r.Close() - } - }() - buf := make([]byte, te.Size()) - _, err = io.ReadFull(r, buf) - if err != nil { - return nil, "", err - } - _ = r.Close() - closed = true - lnk := string(buf) t := te.ptree // traverse up directories diff --git a/services/repository/files/content.go b/services/repository/files/content.go index dfdee1d1df..5a6006e9f2 100644 --- a/services/repository/files/content.go +++ b/services/repository/files/content.go @@ -206,7 +206,7 @@ func GetContents(ctx context.Context, repo *repo_model.Repository, treePath, ref } else if entry.IsLink() { contentsResponse.Type = string(ContentTypeLink) // The target of a symlink file is the content of the file - targetFromContent, err := entry.Blob().GetBlobContent(1024) + targetFromContent, err := entry.LinkTarget() if err != nil { return nil, err } From d6e4342353a19d8579687743f020f9bd9bc99435 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Sat, 28 Jun 2025 23:28:12 +0200 Subject: [PATCH 034/495] fix: make API /repos/{owner}/{repo}/compare/{basehead} work with forks (#8326) - fix: API must use headGitRepo instead of ctx.Repo.GitRepo for comparing - fix: make API /repos/{owner}/{repo}/compare/{basehead} work with forks - add test coverage for both fixes and the underlying function `parseCompareInfo` - refactor and improve part of the helpers from `tests/integration/api_helper_for_declarative_test.go` - remove a few wrong or misleading comments Refs forgejo/forgejo#7978 ## Note on the focus of the PR It was initially created to address a regression introduced in v12. But the tests that verify it is fixed discovered a v11.0 bug. They cannot conveniently be separated because they both relate to the same area of code that was previously not covered by any test. ## Note on v11.0 backport It must be manually done by cherry-picking all commits up to and not including `fix: API must use headGitRepo instead of ctx.Repo.GitRepo for comparing` because it is v12 specific. ## Checklist The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org). ### Tests - I added test coverage for Go changes... - [x] in the `tests/integration` directory if it involves interactions with a live Forgejo server. ### Documentation - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [x] I do not want this change to show in the release notes. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8326 Reviewed-by: Otto Co-authored-by: Earl Warren Co-committed-by: Earl Warren --- routers/api/v1/repo/compare.go | 4 +- routers/api/v1/repo/pull.go | 9 +- tests/integration/api_branch_test.go | 2 +- .../api_helper_for_declarative_test.go | 67 ++++-- tests/integration/api_repo_compare_test.go | 224 ++++++++++++++---- .../integration/api_repo_file_create_test.go | 9 +- tests/integration/api_repo_file_get_test.go | 2 +- tests/integration/api_repo_lfs_test.go | 2 +- tests/integration/api_repo_test.go | 4 +- tests/integration/git_test.go | 37 +-- tests/integration/pull_commit_test.go | 2 +- tests/integration/repo_test.go | 2 +- tests/integration/signing_git_test.go | 71 +++--- tests/integration/ssh_key_test.go | 14 +- 14 files changed, 311 insertions(+), 138 deletions(-) diff --git a/routers/api/v1/repo/compare.go b/routers/api/v1/repo/compare.go index 9c941ea07f..7fc59ea171 100644 --- a/routers/api/v1/repo/compare.go +++ b/routers/api/v1/repo/compare.go @@ -64,7 +64,7 @@ func CompareDiff(ctx *context.APIContext) { } } - _, headGitRepo, ci, _, _ := parseCompareInfo(ctx, api.CreatePullRequestOption{ + headRepository, headGitRepo, ci, _, _ := parseCompareInfo(ctx, api.CreatePullRequestOption{ Base: infos[0], Head: infos[1], }) @@ -80,7 +80,7 @@ func CompareDiff(ctx *context.APIContext) { apiFiles := []*api.CommitAffectedFiles{} userCache := make(map[string]*user_model.User) for i := 0; i < len(ci.Commits); i++ { - apiCommit, err := convert.ToCommit(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, ci.Commits[i], userCache, + apiCommit, err := convert.ToCommit(ctx, headRepository, headGitRepo, ci.Commits[i], userCache, convert.ToCommitOptions{ Stat: true, Verification: verification, diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go index c9dda124de..9360ff1335 100644 --- a/routers/api/v1/repo/pull.go +++ b/routers/api/v1/repo/pull.go @@ -1125,7 +1125,6 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) } } - // Check if current user has fork of repository or in the same repository. headRepo := repo_model.GetForkedRepo(ctx, headUser.ID, baseRepo.ID) if headRepo == nil && !isSameRepo { err := baseRepo.GetBaseRepo(ctx) @@ -1134,13 +1133,11 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) return nil, nil, nil, "", "" } - // Check if baseRepo's base repository is the same as headUser's repository. if baseRepo.BaseRepo == nil || baseRepo.BaseRepo.OwnerID != headUser.ID { log.Trace("parseCompareInfo[%d]: does not have fork or in same repository", baseRepo.ID) ctx.NotFound("GetBaseRepo") return nil, nil, nil, "", "" } - // Assign headRepo so it can be used below. headRepo = baseRepo.BaseRepo } @@ -1202,9 +1199,9 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) } // Check if head branch is valid. - headIsCommit := ctx.Repo.GitRepo.IsCommitExist(headBranch) - headIsBranch := ctx.Repo.GitRepo.IsBranchExist(headBranch) - headIsTag := ctx.Repo.GitRepo.IsTagExist(headBranch) + headIsCommit := headGitRepo.IsCommitExist(headBranch) + headIsBranch := headGitRepo.IsBranchExist(headBranch) + headIsTag := headGitRepo.IsTagExist(headBranch) if !headIsCommit && !headIsBranch && !headIsTag { // Check if headBranch is short sha commit hash if headCommit, _ := headGitRepo.GetCommit(headBranch); headCommit != nil { diff --git a/tests/integration/api_branch_test.go b/tests/integration/api_branch_test.go index 8e88501596..d8800217d3 100644 --- a/tests/integration/api_branch_test.go +++ b/tests/integration/api_branch_test.go @@ -116,7 +116,7 @@ func testAPICreateBranches(t *testing.T, giteaURL *url.URL) { ctx := NewAPITestContext(t, "user2", "my-noo-repo-"+objectFormat.Name(), auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) giteaURL.Path = ctx.GitPath() - t.Run("CreateRepo", doAPICreateRepository(ctx, false, objectFormat)) + t.Run("CreateRepo", doAPICreateRepository(ctx, nil, objectFormat)) testCases := []struct { OldBranch string NewBranch string diff --git a/tests/integration/api_helper_for_declarative_test.go b/tests/integration/api_helper_for_declarative_test.go index c9b6f84f4f..ada6a2c311 100644 --- a/tests/integration/api_helper_for_declarative_test.go +++ b/tests/integration/api_helper_for_declarative_test.go @@ -48,20 +48,22 @@ func (ctx APITestContext) GitPath() string { return fmt.Sprintf("%s/%s.git", ctx.Username, ctx.Reponame) } -func doAPICreateRepository(ctx APITestContext, empty bool, objectFormat git.ObjectFormat, callback ...func(*testing.T, api.Repository)) func(*testing.T) { +func doAPICreateRepository(ctx APITestContext, opts *api.CreateRepoOption, objectFormat git.ObjectFormat, callback ...func(*testing.T, api.Repository)) func(*testing.T) { return func(t *testing.T) { - createRepoOption := &api.CreateRepoOption{ - AutoInit: !empty, - Description: "Temporary repo", - Name: ctx.Reponame, - Private: true, - Template: true, - Gitignores: "", - License: "WTFPL", - Readme: "Default", - ObjectFormatName: objectFormat.Name(), + if opts == nil { + opts = &api.CreateRepoOption{ + AutoInit: true, + Description: "Temporary repo", + Name: ctx.Reponame, + Private: true, + Template: true, + Gitignores: "", + License: "WTFPL", + Readme: "Default", + } } - req := NewRequestWithJSON(t, "POST", "/api/v1/user/repos", createRepoOption). + opts.ObjectFormatName = objectFormat.Name() + req := NewRequestWithJSON(t, "POST", "/api/v1/user/repos", opts). AddTokenAuth(ctx.Token) if ctx.ExpectedCode != 0 { ctx.Session.MakeRequest(t, req, ctx.ExpectedCode) @@ -237,8 +239,8 @@ func doAPICreatePullRequest(ctx APITestContext, owner, repo, baseBranch, headBra } } -func doAPIGetPullRequest(ctx APITestContext, owner, repo string, index int64) func(*testing.T) (api.PullRequest, error) { - return func(t *testing.T) (api.PullRequest, error) { +func doAPIGetPullRequest(ctx APITestContext, owner, repo string, index int64) func(*testing.T) api.PullRequest { + return func(t *testing.T) api.PullRequest { req := NewRequest(t, http.MethodGet, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d", owner, repo, index)). AddTokenAuth(ctx.Token) @@ -248,10 +250,9 @@ func doAPIGetPullRequest(ctx APITestContext, owner, repo string, index int64) fu } resp := ctx.Session.MakeRequest(t, req, expected) - decoder := json.NewDecoder(resp.Body) pr := api.PullRequest{} - err := decoder.Decode(&pr) - return pr, err + DecodeJSON(t, resp, &pr) + return pr } } @@ -347,20 +348,40 @@ func doAPICancelAutoMergePullRequest(ctx APITestContext, owner, repo string, ind } } -func doAPIGetBranch(ctx APITestContext, branch string, callback ...func(*testing.T, api.Branch)) func(*testing.T) { - return func(t *testing.T) { +func doAPIGetBranch(ctx APITestContext, branch string) func(*testing.T) api.Branch { + return func(t *testing.T) api.Branch { req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/branches/%s", ctx.Username, ctx.Reponame, branch). AddTokenAuth(ctx.Token) + expected := http.StatusOK + if ctx.ExpectedCode != 0 { + expected = ctx.ExpectedCode + } + resp := ctx.Session.MakeRequest(t, req, expected) + + branch := api.Branch{} + DecodeJSON(t, resp, &branch) + return branch + } +} + +func doAPICreateTag(ctx APITestContext, tag, target, message string, callback ...func(*testing.T, api.Tag)) func(*testing.T) { + return func(t *testing.T) { + req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/tags", ctx.Username, ctx.Reponame), &api.CreateTagOption{ + TagName: tag, + Message: message, + Target: target, + }). + AddTokenAuth(ctx.Token) if ctx.ExpectedCode != 0 { ctx.Session.MakeRequest(t, req, ctx.ExpectedCode) return } - resp := ctx.Session.MakeRequest(t, req, http.StatusOK) + resp := ctx.Session.MakeRequest(t, req, http.StatusCreated) - var branch api.Branch - DecodeJSON(t, resp, &branch) + var tag api.Tag + DecodeJSON(t, resp, &tag) if len(callback) > 0 { - callback[0](t, branch) + callback[0](t, tag) } } } diff --git a/tests/integration/api_repo_compare_test.go b/tests/integration/api_repo_compare_test.go index 35f0a21d82..e4e85fc742 100644 --- a/tests/integration/api_repo_compare_test.go +++ b/tests/integration/api_repo_compare_test.go @@ -4,56 +4,200 @@ package integration import ( + "encoding/base64" + "fmt" "net/http" + "net/url" "testing" + "time" auth_model "forgejo.org/models/auth" "forgejo.org/models/unittest" user_model "forgejo.org/models/user" + "forgejo.org/modules/git" api "forgejo.org/modules/structs" - "forgejo.org/tests" "github.com/stretchr/testify/assert" ) -func TestAPICompareBranches(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - // Login as User2. - session := loginUser(t, user.Name) - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) - - repoName := "repo20" - - req := NewRequestf(t, "GET", "/api/v1/repos/user2/%s/compare/add-csv...remove-files-b", repoName). - AddTokenAuth(token) - resp := MakeRequest(t, req, http.StatusOK) - - var apiResp *api.Compare - DecodeJSON(t, resp, &apiResp) - - assert.Equal(t, 2, apiResp.TotalCommits) - assert.Len(t, apiResp.Commits, 2) - assert.Len(t, apiResp.Files, 3) -} - func TestAPICompareCommits(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - // Login as User2. - session := loginUser(t, user.Name) - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) - - req := NewRequestf(t, "GET", "/api/v1/repos/user2/repo20/compare/c8e31bc...8babce9"). - AddTokenAuth(token) - resp := MakeRequest(t, req, http.StatusOK) - - var apiResp *api.Compare - DecodeJSON(t, resp, &apiResp) - - assert.Equal(t, 2, apiResp.TotalCommits) - assert.Len(t, apiResp.Commits, 2) - assert.Len(t, apiResp.Files, 3) + forEachObjectFormat(t, testAPICompareCommits) +} + +func testAPICompareCommits(t *testing.T, objectFormat git.ObjectFormat) { + onGiteaRun(t, func(t *testing.T, u *url.URL) { + newBranchAndFile := func(ctx APITestContext, user *user_model.User, branch, filename string) func(*testing.T) { + return func(t *testing.T) { + doAPICreateFile(ctx, filename, &api.CreateFileOptions{ + FileOptions: api.FileOptions{ + NewBranchName: branch, + Message: "create " + filename, + Author: api.Identity{ + Name: user.Name, + Email: user.Email, + }, + Committer: api.Identity{ + Name: user.Name, + Email: user.Email, + }, + Dates: api.CommitDateOptions{ + Author: time.Now(), + Committer: time.Now(), + }, + }, + ContentBase64: base64.StdEncoding.EncodeToString([]byte("content " + filename)), + })(t) + } + } + + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + user2repo := "repoA" + user2Ctx := NewAPITestContext(t, user2.Name, user2repo, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) + t.Run("CreateUser2Repository", doAPICreateRepository(user2Ctx, &api.CreateRepoOption{ + AutoInit: true, + Description: "Temporary repo", + Name: user2Ctx.Reponame, + }, objectFormat)) + user2branchName := "user2branch" + t.Run("CreateUser2RepositoryBranch", newBranchAndFile(user2Ctx, user2, user2branchName, "user2branchfilename.txt")) + user2branch := doAPIGetBranch(user2Ctx, user2branchName)(t) + user2master := doAPIGetBranch(user2Ctx, "master")(t) + user2tag1 := "tag1" + t.Run("CreateUser2RepositoryTag1", doAPICreateTag(user2Ctx, user2tag1, "master", "user2branchtag1")) + user2tag2 := "tag2" + t.Run("CreateUser2RepositoryTag1", doAPICreateTag(user2Ctx, user2tag2, user2branchName, "user2branchtag2")) + + shortCommitLength := 7 + + for _, testCase := range []struct { + name string + a string + b string + }{ + { + name: "Commits", + a: user2master.Commit.ID, + b: user2branch.Commit.ID, + }, + { + name: "ShortCommits", + a: user2master.Commit.ID[:shortCommitLength], + b: user2branch.Commit.ID[:shortCommitLength], + }, + { + name: "Branches", + a: "master", + b: user2branchName, + }, + { + name: "Tags", + a: user2tag1, + b: user2tag2, + }, + } { + t.Run("SameRepo"+testCase.name, func(t *testing.T) { + // a...b + req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/compare/%s...%s", user2.Name, user2repo, testCase.a, testCase.b). + AddTokenAuth(user2Ctx.Token) + resp := MakeRequest(t, req, http.StatusOK) + + var apiResp *api.Compare + DecodeJSON(t, resp, &apiResp) + + assert.Equal(t, 1, apiResp.TotalCommits) + assert.Len(t, apiResp.Commits, 1) + assert.Len(t, apiResp.Files, 1) + + // b...a + req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/compare/%s...%s", user2.Name, user2repo, testCase.b, testCase.a). + AddTokenAuth(user2Ctx.Token) + resp = MakeRequest(t, req, http.StatusOK) + + DecodeJSON(t, resp, &apiResp) + + assert.Equal(t, 0, apiResp.TotalCommits) + assert.Empty(t, apiResp.Commits) + assert.Empty(t, apiResp.Files) + }) + } + + user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) + user4Ctx := NewAPITestContext(t, user4.Name, user2repo, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) + t.Run("User4ForksUser2Repository", doAPIForkRepository(user4Ctx, user2.Name)) + user4branchName := "user4branch" + t.Run("CreateUser4RepositoryBranch", newBranchAndFile(user4Ctx, user4, user4branchName, "user4branchfilename.txt")) + user4branch := doAPIGetBranch(user4Ctx, user4branchName)(t) + user4tag4 := "tag4" + t.Run("CreateUser4RepositoryTag4", doAPICreateTag(user4Ctx, user4tag4, user4branchName, "user4branchtag4")) + + t.Run("FromTheForkedRepo", func(t *testing.T) { + // user4/repoA is a fork of user2/repoA and when evaluating + // + // user4/repoA/compare/master...user2:user2branch + // + // user2/repoA is not explicitly specified, it is implicitly the repository + // from which user4/repoA was forked + req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/compare/%s...%s:%s", user4.Name, user2repo, "master", user2.Name, user2branchName). + AddTokenAuth(user4Ctx.Token) + resp := MakeRequest(t, req, http.StatusOK) + + var apiResp *api.Compare + DecodeJSON(t, resp, &apiResp) + + assert.Equal(t, 1, apiResp.TotalCommits) + assert.Len(t, apiResp.Commits, 1) + assert.Len(t, apiResp.Files, 1) + }) + + for _, testCase := range []struct { + name string + a string + b string + }{ + { + name: "Commits", + a: user2master.Commit.ID, + b: fmt.Sprintf("%s:%s", user4.Name, user4branch.Commit.ID), + }, + { + name: "ShortCommits", + a: user2master.Commit.ID[:shortCommitLength], + b: fmt.Sprintf("%s:%s", user4.Name, user4branch.Commit.ID[:shortCommitLength]), + }, + { + name: "Branches", + a: "master", + b: fmt.Sprintf("%s:%s", user4.Name, user4branchName), + }, + { + name: "Tags", + a: user2tag1, + b: fmt.Sprintf("%s:%s", user4.Name, user4tag4), + }, + { + name: "SameRepo", + a: "master", + b: fmt.Sprintf("%s:%s", user2.Name, user2branchName), + }, + } { + t.Run("ForkedRepo"+testCase.name, func(t *testing.T) { + // user2/repoA is forked into user4/repoA and when evaluating + // + // user2/repoA/compare/a...user4:b + // + // user4/repoA is not explicitly specified, it is implicitly the repository + // owned by user4 which is a fork of repoA + req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/compare/%s...%s", user2.Name, user2repo, testCase.a, testCase.b). + AddTokenAuth(user2Ctx.Token) + resp := MakeRequest(t, req, http.StatusOK) + + var apiResp *api.Compare + DecodeJSON(t, resp, &apiResp) + + assert.Equal(t, 1, apiResp.TotalCommits) + assert.Len(t, apiResp.Commits, 1) + assert.Len(t, apiResp.Files, 1) + }) + } + }) } diff --git a/tests/integration/api_repo_file_create_test.go b/tests/integration/api_repo_file_create_test.go index c112653e11..4916ef97ef 100644 --- a/tests/integration/api_repo_file_create_test.go +++ b/tests/integration/api_repo_file_create_test.go @@ -287,7 +287,14 @@ func TestAPICreateFile(t *testing.T) { // Test creating a file in an empty repository forEachObjectFormat(t, func(t *testing.T, objectFormat git.ObjectFormat) { reponame := "empty-repo-" + objectFormat.Name() - doAPICreateRepository(NewAPITestContext(t, "user2", reponame, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser), true, objectFormat)(t) + ctx := NewAPITestContext(t, "user2", reponame, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) + opts := &api.CreateRepoOption{ + Description: "Temporary repo", + Name: ctx.Reponame, + Private: true, + Template: true, + } + doAPICreateRepository(ctx, opts, objectFormat)(t) createFileOptions = getCreateFileOptions() fileID++ treePath = fmt.Sprintf("new/file%d.txt", fileID) diff --git a/tests/integration/api_repo_file_get_test.go b/tests/integration/api_repo_file_get_test.go index 7bd7393b01..408c630a1c 100644 --- a/tests/integration/api_repo_file_get_test.go +++ b/tests/integration/api_repo_file_get_test.go @@ -27,7 +27,7 @@ func TestAPIGetRawFileOrLFS(t *testing.T) { // Test with LFS onGiteaRun(t, func(t *testing.T, u *url.URL) { httpContext := NewAPITestContext(t, "user2", "repo-lfs-test", auth_model.AccessTokenScopeWriteRepository) - doAPICreateRepository(httpContext, false, git.Sha1ObjectFormat, func(t *testing.T, repository api.Repository) { // FIXME: use forEachObjectFormat + doAPICreateRepository(httpContext, nil, git.Sha1ObjectFormat, func(t *testing.T, repository api.Repository) { // FIXME: use forEachObjectFormat u.Path = httpContext.GitPath() dstPath := t.TempDir() diff --git a/tests/integration/api_repo_lfs_test.go b/tests/integration/api_repo_lfs_test.go index b8ba54f876..b0edf7b854 100644 --- a/tests/integration/api_repo_lfs_test.go +++ b/tests/integration/api_repo_lfs_test.go @@ -64,7 +64,7 @@ func TestAPILFSMediaType(t *testing.T) { func createLFSTestRepository(t *testing.T, name string) *repo_model.Repository { ctx := NewAPITestContext(t, "user2", "lfs-"+name+"-repo", auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepo", doAPICreateRepository(ctx, false, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat + t.Run("CreateRepo", doAPICreateRepository(ctx, nil, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat repo, err := repo_model.GetRepositoryByOwnerAndName(db.DefaultContext, "user2", "lfs-"+name+"-repo") require.NoError(t, err) diff --git a/tests/integration/api_repo_test.go b/tests/integration/api_repo_test.go index fd62670eb3..e81f4307ee 100644 --- a/tests/integration/api_repo_test.go +++ b/tests/integration/api_repo_test.go @@ -415,7 +415,7 @@ func testAPIRepoMigrateConflict(t *testing.T, u *url.URL) { httpContext := baseAPITestContext httpContext.Reponame = "repo-tmp-17" - t.Run("CreateRepo", doAPICreateRepository(httpContext, false, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat + t.Run("CreateRepo", doAPICreateRepository(httpContext, nil, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat user, err := user_model.GetUserByName(db.DefaultContext, httpContext.Username) require.NoError(t, err) @@ -498,7 +498,7 @@ func testAPIRepoCreateConflict(t *testing.T, u *url.URL) { httpContext := baseAPITestContext httpContext.Reponame = "repo-tmp-17" - t.Run("CreateRepo", doAPICreateRepository(httpContext, false, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat + t.Run("CreateRepo", doAPICreateRepository(httpContext, nil, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat req := NewRequestWithJSON(t, "POST", "/api/v1/user/repos", &api.CreateRepoOption{ diff --git a/tests/integration/git_test.go b/tests/integration/git_test.go index e79f6fe802..9a66781024 100644 --- a/tests/integration/git_test.go +++ b/tests/integration/git_test.go @@ -69,7 +69,7 @@ func testGit(t *testing.T, u *url.URL) { dstPath := t.TempDir() - t.Run("CreateRepoInDifferentUser", doAPICreateRepository(forkedUserCtx, false, objectFormat)) + t.Run("CreateRepoInDifferentUser", doAPICreateRepository(forkedUserCtx, nil, objectFormat)) t.Run("AddUserAsCollaborator", doAPIAddCollaborator(forkedUserCtx, httpContext.Username, perm.AccessModeRead)) t.Run("ForkFromDifferentUser", doAPIForkRepository(httpContext, forkedUserCtx.Username)) @@ -110,7 +110,7 @@ func testGit(t *testing.T, u *url.URL) { sshContext.Reponame = "repo-tmp-18-" + objectFormat.Name() keyname := "my-testing-key" forkedUserCtx.Reponame = sshContext.Reponame - t.Run("CreateRepoInDifferentUser", doAPICreateRepository(forkedUserCtx, false, objectFormat)) + t.Run("CreateRepoInDifferentUser", doAPICreateRepository(forkedUserCtx, nil, objectFormat)) t.Run("AddUserAsCollaborator", doAPIAddCollaborator(forkedUserCtx, sshContext.Username, perm.AccessModeRead)) t.Run("ForkFromDifferentUser", doAPIForkRepository(sshContext, forkedUserCtx.Username)) @@ -529,8 +529,7 @@ func doMergeFork(ctx, baseCtx APITestContext, baseBranch, headBranch string) fun t.Run("EnsureCanSeePull", doEnsureCanSeePull(headCtx, pr, false)) t.Run("CheckPR", func(t *testing.T) { oldMergeBase := pr.MergeBase - pr2, err := doAPIGetPullRequest(baseCtx, baseCtx.Username, baseCtx.Reponame, pr.Index)(t) - require.NoError(t, err) + pr2 := doAPIGetPullRequest(baseCtx, baseCtx.Username, baseCtx.Reponame, pr.Index)(t) assert.Equal(t, oldMergeBase, pr2.MergeBase) }) t.Run("EnsurDiffNoChange", doEnsureDiffNoChange(baseCtx, pr, diffHash, diffLength)) @@ -730,24 +729,21 @@ func doAutoPRMerge(baseCtx *APITestContext, dstPath string) func(t *testing.T) { // Check pr status ctx.ExpectedCode = 0 - pr, err = doAPIGetPullRequest(ctx, baseCtx.Username, baseCtx.Reponame, pr.Index)(t) - require.NoError(t, err) + pr = doAPIGetPullRequest(ctx, baseCtx.Username, baseCtx.Reponame, pr.Index)(t) assert.False(t, pr.HasMerged) // Call API to add Failure status for commit t.Run("CreateStatus", addCommitStatus(api.CommitStatusFailure)) // Check pr status - pr, err = doAPIGetPullRequest(ctx, baseCtx.Username, baseCtx.Reponame, pr.Index)(t) - require.NoError(t, err) + pr = doAPIGetPullRequest(ctx, baseCtx.Username, baseCtx.Reponame, pr.Index)(t) assert.False(t, pr.HasMerged) // Call API to add Success status for commit t.Run("CreateStatus", addCommitStatus(api.CommitStatusSuccess)) // test pr status - pr, err = doAPIGetPullRequest(ctx, baseCtx.Username, baseCtx.Reponame, pr.Index)(t) - require.NoError(t, err) + pr = doAPIGetPullRequest(ctx, baseCtx.Username, baseCtx.Reponame, pr.Index)(t) assert.True(t, pr.HasMerged) } } @@ -836,8 +832,7 @@ func doCreateAgitFlowPull(dstPath string, ctx *APITestContext, headBranch string assert.Equal(t, 1, pr1.CommitsAhead) assert.Equal(t, 0, pr1.CommitsBehind) - prMsg, err := doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr1.Index)(t) - require.NoError(t, err) + prMsg := doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr1.Index)(t) assert.Equal(t, "user2/"+headBranch, pr1.HeadBranch) assert.False(t, prMsg.HasMerged) @@ -858,8 +853,7 @@ func doCreateAgitFlowPull(dstPath string, ctx *APITestContext, headBranch string } assert.Equal(t, 1, pr2.CommitsAhead) assert.Equal(t, 0, pr2.CommitsBehind) - prMsg, err = doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr2.Index)(t) - require.NoError(t, err) + prMsg = doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr2.Index)(t) assert.Equal(t, "user2/test/"+headBranch, pr2.HeadBranch) assert.False(t, prMsg.HasMerged) @@ -910,8 +904,7 @@ func doCreateAgitFlowPull(dstPath string, ctx *APITestContext, headBranch string require.NoError(t, err) unittest.AssertCount(t, &issues_model.PullRequest{}, pullNum+2) - prMsg, err := doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr1.Index)(t) - require.NoError(t, err) + prMsg := doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr1.Index)(t) assert.False(t, prMsg.HasMerged) assert.Equal(t, commit, prMsg.Head.Sha) @@ -928,8 +921,7 @@ func doCreateAgitFlowPull(dstPath string, ctx *APITestContext, headBranch string require.NoError(t, err) unittest.AssertCount(t, &issues_model.PullRequest{}, pullNum+2) - prMsg, err = doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr2.Index)(t) - require.NoError(t, err) + prMsg = doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr2.Index)(t) assert.False(t, prMsg.HasMerged) assert.Equal(t, commit, prMsg.Head.Sha) @@ -953,8 +945,7 @@ func doCreateAgitFlowPull(dstPath string, ctx *APITestContext, headBranch string err := pr3.LoadIssue(db.DefaultContext) require.NoError(t, err) - _, err2 := doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr3.Index)(t) - require.NoError(t, err2) + doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr3.Index)(t) assert.Equal(t, "Testing commit 2", pr3.Issue.Title) assert.Contains(t, pr3.Issue.Content, "Longer description.") @@ -975,8 +966,7 @@ func doCreateAgitFlowPull(dstPath string, ctx *APITestContext, headBranch string err := pr.LoadIssue(db.DefaultContext) require.NoError(t, err) - _, err = doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr.Index)(t) - require.NoError(t, err) + doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr.Index)(t) assert.Equal(t, "my-shiny-title", pr.Issue.Title) assert.Contains(t, pr.Issue.Content, "Longer description.") @@ -998,8 +988,7 @@ func doCreateAgitFlowPull(dstPath string, ctx *APITestContext, headBranch string err := pr.LoadIssue(db.DefaultContext) require.NoError(t, err) - _, err = doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr.Index)(t) - require.NoError(t, err) + doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr.Index)(t) assert.Equal(t, "Testing commit 2", pr.Issue.Title) assert.Contains(t, pr.Issue.Content, "custom") diff --git a/tests/integration/pull_commit_test.go b/tests/integration/pull_commit_test.go index 1de437ef46..f82fc08df4 100644 --- a/tests/integration/pull_commit_test.go +++ b/tests/integration/pull_commit_test.go @@ -95,7 +95,7 @@ func TestPullCommitSignature(t *testing.T) { testCtx := NewAPITestContext(t, user.Name, "pull-request-commit-header-signed", auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) u.Path = testCtx.GitPath() - t.Run("Create repository", doAPICreateRepository(testCtx, false, git.Sha1ObjectFormat)) + t.Run("Create repository", doAPICreateRepository(testCtx, nil, git.Sha1ObjectFormat)) t.Run("Create commit", func(t *testing.T) { defer tests.PrintCurrentTest(t)() diff --git a/tests/integration/repo_test.go b/tests/integration/repo_test.go index 329a31ace8..7370b63dcd 100644 --- a/tests/integration/repo_test.go +++ b/tests/integration/repo_test.go @@ -720,7 +720,7 @@ func TestViewCommitSignature(t *testing.T) { testCtx := NewAPITestContext(t, user.Name, "commit-header-signed", auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) u.Path = testCtx.GitPath() - t.Run("Create repository", doAPICreateRepository(testCtx, false, git.Sha1ObjectFormat)) + t.Run("Create repository", doAPICreateRepository(testCtx, nil, git.Sha1ObjectFormat)) t.Run("Create commit", func(t *testing.T) { defer tests.PrintCurrentTest(t)() diff --git a/tests/integration/signing_git_test.go b/tests/integration/signing_git_test.go index c4759aaddb..e4c0d6049b 100644 --- a/tests/integration/signing_git_test.go +++ b/tests/integration/signing_git_test.go @@ -109,13 +109,14 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O defer tests.PrintCurrentTest(t)() testCtx := NewAPITestContext(t, username, "initial-unsigned"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) - t.Run("CheckMasterBranchUnsigned", doAPIGetBranch(testCtx, "master", func(t *testing.T, branch api.Branch) { + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) + t.Run("CheckMasterBranchUnsigned", func(t *testing.T) { + branch := doAPIGetBranch(testCtx, "master")(t) assert.NotNil(t, branch.Commit) assert.NotNil(t, branch.Commit.Verification) assert.False(t, branch.Commit.Verification.Verified) assert.Empty(t, branch.Commit.Verification.Signature) - })) + }) t.Run("CreateCRUDFile-Never", crudActionCreateFile( t, testCtx, user, "master", "never", "unsigned-never.txt", func(t *testing.T, response api.FileResponse) { assert.False(t, response.Verification.Verified) @@ -191,25 +192,27 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O defer tests.PrintCurrentTest(t)() testCtx := NewAPITestContext(t, username, "initial-pubkey"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) - t.Run("CheckMasterBranchSigned", doAPIGetBranch(testCtx, "master", func(t *testing.T, branch api.Branch) { + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) + t.Run("CheckMasterBranchSigned", func(t *testing.T) { + branch := doAPIGetBranch(testCtx, "master")(t) require.NotNil(t, branch.Commit) require.NotNil(t, branch.Commit.Verification) assert.True(t, branch.Commit.Verification.Verified) assert.Equal(t, "fox@example.com", branch.Commit.Verification.Signer.Email) - })) + }) }) t.Run("No publickey", func(t *testing.T) { defer tests.PrintCurrentTest(t)() testCtx := NewAPITestContext(t, "user4", "initial-no-pubkey"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) - t.Run("CheckMasterBranchSigned", doAPIGetBranch(testCtx, "master", func(t *testing.T, branch api.Branch) { + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) + t.Run("CheckMasterBranchSigned", func(t *testing.T) { + branch := doAPIGetBranch(testCtx, "master")(t) require.NotNil(t, branch.Commit) require.NotNil(t, branch.Commit.Verification) assert.False(t, branch.Commit.Verification.Verified) - })) + }) }) }) @@ -226,25 +229,27 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O testCtx := NewAPITestContext(t, username, "initial-2fa"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) unittest.AssertSuccessfulInsert(t, &auth_model.WebAuthnCredential{UserID: user.ID}) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) - t.Run("CheckMasterBranchSigned", doAPIGetBranch(testCtx, "master", func(t *testing.T, branch api.Branch) { + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) + t.Run("CheckMasterBranchSigned", func(t *testing.T) { + branch := doAPIGetBranch(testCtx, "master")(t) require.NotNil(t, branch.Commit) require.NotNil(t, branch.Commit.Verification) assert.True(t, branch.Commit.Verification.Verified) assert.Equal(t, "fox@example.com", branch.Commit.Verification.Signer.Email) - })) + }) }) t.Run("No 2fa", func(t *testing.T) { defer tests.PrintCurrentTest(t)() testCtx := NewAPITestContext(t, "user4", "initial-no-2fa"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) - t.Run("CheckMasterBranchSigned", doAPIGetBranch(testCtx, "master", func(t *testing.T, branch api.Branch) { + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) + t.Run("CheckMasterBranchSigned", func(t *testing.T) { + branch := doAPIGetBranch(testCtx, "master")(t) require.NotNil(t, branch.Commit) require.NotNil(t, branch.Commit.Verification) assert.False(t, branch.Commit.Verification.Verified) - })) + }) }) }) @@ -253,13 +258,14 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O setting.Repository.Signing.InitialCommit = []string{"always"} testCtx := NewAPITestContext(t, username, "initial-always"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) - t.Run("CheckMasterBranchSigned", doAPIGetBranch(testCtx, "master", func(t *testing.T, branch api.Branch) { + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) + t.Run("CheckMasterBranchSigned", func(t *testing.T) { + branch := doAPIGetBranch(testCtx, "master")(t) require.NotNil(t, branch.Commit) require.NotNil(t, branch.Commit.Verification) assert.True(t, branch.Commit.Verification.Verified) assert.Equal(t, "fox@example.com", branch.Commit.Verification.Signer.Email) - })) + }) }) t.Run("AlwaysSign-Initial-CRUD-Never", func(t *testing.T) { @@ -267,7 +273,7 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O setting.Repository.Signing.CRUDActions = []string{"never"} testCtx := NewAPITestContext(t, username, "initial-always-never"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) t.Run("CreateCRUDFile-Never", crudActionCreateFile( t, testCtx, user, "master", "never", "unsigned-never.txt", func(t *testing.T, response api.FileResponse) { assert.False(t, response.Verification.Verified) @@ -279,7 +285,7 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O setting.Repository.Signing.CRUDActions = []string{"parentsigned"} testCtx := NewAPITestContext(t, username, "initial-always-parent"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) t.Run("CreateCRUDFile-ParentSigned", crudActionCreateFile( t, testCtx, user, "master", "parentsigned", "signed-parent.txt", func(t *testing.T, response api.FileResponse) { assert.True(t, response.Verification.Verified) @@ -294,7 +300,7 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O defer tests.PrintCurrentTest(t)() testCtx := NewAPITestContext(t, username, "initial-always-pubkey"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) t.Run("CreateCRUDFile-Pubkey", crudActionCreateFile( t, testCtx, user, "master", "pubkey", "signed-pubkey.txt", func(t *testing.T, response api.FileResponse) { assert.True(t, response.Verification.Verified) @@ -306,7 +312,7 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O defer tests.PrintCurrentTest(t)() testCtx := NewAPITestContext(t, "user4", "initial-always-no-pubkey"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) t.Run("CreateCRUDFile-Pubkey", crudActionCreateFile( t, testCtx, user, "master", "pubkey", "unsigned-pubkey.txt", func(t *testing.T, response api.FileResponse) { assert.False(t, response.Verification.Verified) @@ -326,7 +332,7 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O testCtx := NewAPITestContext(t, username, "initial-always-twofa"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) unittest.AssertSuccessfulInsert(t, &auth_model.WebAuthnCredential{UserID: user.ID}) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) t.Run("CreateCRUDFile-Twofa", crudActionCreateFile( t, testCtx, user, "master", "twofa", "signed-twofa.txt", func(t *testing.T, response api.FileResponse) { assert.True(t, response.Verification.Verified) @@ -338,7 +344,7 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O defer tests.PrintCurrentTest(t)() testCtx := NewAPITestContext(t, "user4", "initial-always-no-twofa"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) t.Run("CreateCRUDFile-Pubkey", crudActionCreateFile( t, testCtx, user, "master", "twofa", "unsigned-twofa.txt", func(t *testing.T, response api.FileResponse) { assert.False(t, response.Verification.Verified) @@ -351,7 +357,7 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O setting.Repository.Signing.CRUDActions = []string{"always"} testCtx := NewAPITestContext(t, username, "initial-always-always"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) t.Run("CreateCRUDFile-Always", crudActionCreateFile( t, testCtx, user, "master", "always", "signed-always.txt", func(t *testing.T, response api.FileResponse) { assert.True(t, response.Verification.Verified) @@ -369,12 +375,13 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O require.NoError(t, err) t.Run("MergePR", doAPIMergePullRequest(testCtx, testCtx.Username, testCtx.Reponame, pr.Index)) }) - t.Run("CheckMasterBranchUnsigned", doAPIGetBranch(testCtx, "master", func(t *testing.T, branch api.Branch) { + t.Run("CheckMasterBranchUnsigned", func(t *testing.T) { + branch := doAPIGetBranch(testCtx, "master")(t) require.NotNil(t, branch.Commit) require.NotNil(t, branch.Commit.Verification) assert.False(t, branch.Commit.Verification.Verified) assert.Empty(t, branch.Commit.Verification.Signature) - })) + }) }) t.Run("BaseSignedMerging", func(t *testing.T) { @@ -387,12 +394,13 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O require.NoError(t, err) t.Run("MergePR", doAPIMergePullRequest(testCtx, testCtx.Username, testCtx.Reponame, pr.Index)) }) - t.Run("CheckMasterBranchUnsigned", doAPIGetBranch(testCtx, "master", func(t *testing.T, branch api.Branch) { + t.Run("CheckMasterBranchUnsigned", func(t *testing.T) { + branch := doAPIGetBranch(testCtx, "master")(t) require.NotNil(t, branch.Commit) require.NotNil(t, branch.Commit.Verification) assert.False(t, branch.Commit.Verification.Verified) assert.Empty(t, branch.Commit.Verification.Signature) - })) + }) }) t.Run("CommitsSignedMerging", func(t *testing.T) { @@ -405,11 +413,12 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O require.NoError(t, err) t.Run("MergePR", doAPIMergePullRequest(testCtx, testCtx.Username, testCtx.Reponame, pr.Index)) }) - t.Run("CheckMasterBranchUnsigned", doAPIGetBranch(testCtx, "master", func(t *testing.T, branch api.Branch) { + t.Run("CheckMasterBranchUnsigned", func(t *testing.T) { + branch := doAPIGetBranch(testCtx, "master")(t) require.NotNil(t, branch.Commit) require.NotNil(t, branch.Commit.Verification) assert.True(t, branch.Commit.Verification.Verified) - })) + }) }) } diff --git a/tests/integration/ssh_key_test.go b/tests/integration/ssh_key_test.go index aece9c3fd9..a92694d2fa 100644 --- a/tests/integration/ssh_key_test.go +++ b/tests/integration/ssh_key_test.go @@ -55,7 +55,13 @@ func testPushDeployKeyOnEmptyRepo(t *testing.T, u *url.URL) { keyname := fmt.Sprintf("%s-push", ctx.Reponame) u.Path = ctx.GitPath() - t.Run("CreateEmptyRepository", doAPICreateRepository(ctx, true, objectFormat)) + opts := &api.CreateRepoOption{ + Description: "Temporary repo", + Name: ctx.Reponame, + Private: true, + Template: true, + } + t.Run("CreateEmptyRepository", doAPICreateRepository(ctx, opts, objectFormat)) t.Run("CheckIsEmpty", doCheckRepositoryEmptyStatus(ctx, true)) @@ -105,8 +111,8 @@ func testKeyOnlyOneType(t *testing.T, u *url.URL) { failCtx := ctx failCtx.ExpectedCode = http.StatusUnprocessableEntity - t.Run("CreateRepository", doAPICreateRepository(ctx, false, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat - t.Run("CreateOtherRepository", doAPICreateRepository(otherCtx, false, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat + t.Run("CreateRepository", doAPICreateRepository(ctx, nil, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat + t.Run("CreateOtherRepository", doAPICreateRepository(otherCtx, nil, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat withKeyFile(t, keyname, func(keyFile string) { var userKeyPublicKeyID int64 @@ -180,7 +186,7 @@ func testKeyOnlyOneType(t *testing.T, u *url.URL) { t.Run("DeleteOtherRepository", doAPIDeleteRepository(otherCtxWithDeleteRepo)) - t.Run("RecreateRepository", doAPICreateRepository(ctxWithDeleteRepo, false, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat + t.Run("RecreateRepository", doAPICreateRepository(ctxWithDeleteRepo, nil, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat t.Run("CreateUserKey", doAPICreateUserKey(ctx, keyname, keyFile, func(t *testing.T, publicKey api.PublicKey) { userKeyPublicKeyID = publicKey.ID From a300c0b9fd23e9c116c571a4eab17ab6c99376f9 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Sat, 28 Jun 2025 18:43:06 +0200 Subject: [PATCH 035/495] chore(cleanup): GitRepo.GetCommit is equivalent to GitRepo.IsBranchExist Since go-git was dropped in a21128a734636c2a18431cfc1742e8a7cf165f58, IsBranchExist relies on git-cat-file to figure out if a commit ID exists. There is no need to fallback to GetCommit if IsBranchExist determines the commit does not exist and it will come to the same conclusion. --- routers/api/v1/repo/pull.go | 19 ++++--------------- routers/web/repo/compare.go | 21 ++++----------------- 2 files changed, 8 insertions(+), 32 deletions(-) diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go index 9360ff1335..cb66b4d09d 100644 --- a/routers/api/v1/repo/pull.go +++ b/routers/api/v1/repo/pull.go @@ -1116,13 +1116,8 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) baseIsBranch := ctx.Repo.GitRepo.IsBranchExist(baseBranch) baseIsTag := ctx.Repo.GitRepo.IsTagExist(baseBranch) if !baseIsCommit && !baseIsBranch && !baseIsTag { - // Check for short SHA usage - if baseCommit, _ := ctx.Repo.GitRepo.GetCommit(baseBranch); baseCommit != nil { - baseBranch = baseCommit.ID.String() - } else { - ctx.NotFound("BaseNotExist") - return nil, nil, nil, "", "" - } + ctx.NotFound("BaseNotExist") + return nil, nil, nil, "", "" } headRepo := repo_model.GetForkedRepo(ctx, headUser.ID, baseRepo.ID) @@ -1203,14 +1198,8 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) headIsBranch := headGitRepo.IsBranchExist(headBranch) headIsTag := headGitRepo.IsTagExist(headBranch) if !headIsCommit && !headIsBranch && !headIsTag { - // Check if headBranch is short sha commit hash - if headCommit, _ := headGitRepo.GetCommit(headBranch); headCommit != nil { - headBranch = headCommit.ID.String() - } else { - headGitRepo.Close() - ctx.NotFound("IsRefExist", nil) - return nil, nil, nil, "", "" - } + ctx.NotFound("IsRefExist", nil) + return nil, nil, nil, "", "" } headBranchRef := headBranch diff --git a/routers/web/repo/compare.go b/routers/web/repo/compare.go index de2e29ab9f..59538d8a0e 100644 --- a/routers/web/repo/compare.go +++ b/routers/web/repo/compare.go @@ -312,22 +312,16 @@ func ParseCompareInfo(ctx *context.Context) *common.CompareInfo { baseIsTag := ctx.Repo.GitRepo.IsTagExist(ci.BaseBranch) if !baseIsCommit && !baseIsBranch && !baseIsTag { - // Check if baseBranch is short sha commit hash - if baseCommit, _ := ctx.Repo.GitRepo.GetCommit(ci.BaseBranch); baseCommit != nil { - ci.BaseBranch = baseCommit.ID.String() - ctx.Data["BaseBranch"] = ci.BaseBranch - baseIsCommit = true - } else if ci.BaseBranch == ctx.Repo.GetObjectFormat().EmptyObjectID().String() { + if ci.BaseBranch == ctx.Repo.GetObjectFormat().EmptyObjectID().String() { if isSameRepo { ctx.Redirect(ctx.Repo.RepoLink + "/compare/" + util.PathEscapeSegments(ci.HeadBranch)) } else { ctx.Redirect(ctx.Repo.RepoLink + "/compare/" + util.PathEscapeSegments(ci.HeadRepo.FullName()) + ":" + util.PathEscapeSegments(ci.HeadBranch)) } - return nil } else { ctx.NotFound("IsRefExist", nil) - return nil } + return nil } ctx.Data["BaseIsCommit"] = baseIsCommit ctx.Data["BaseIsBranch"] = baseIsBranch @@ -514,15 +508,8 @@ func ParseCompareInfo(ctx *context.Context) *common.CompareInfo { headIsBranch := ci.HeadGitRepo.IsBranchExist(ci.HeadBranch) headIsTag := ci.HeadGitRepo.IsTagExist(ci.HeadBranch) if !headIsCommit && !headIsBranch && !headIsTag { - // Check if headBranch is short sha commit hash - if headCommit, _ := ci.HeadGitRepo.GetCommit(ci.HeadBranch); headCommit != nil { - ci.HeadBranch = headCommit.ID.String() - ctx.Data["HeadBranch"] = ci.HeadBranch - headIsCommit = true - } else { - ctx.NotFound("IsRefExist", nil) - return nil - } + ctx.NotFound("IsRefExist", nil) + return nil } ctx.Data["HeadIsCommit"] = headIsCommit ctx.Data["HeadIsBranch"] = headIsBranch From b8e66a5552a10dd13ef91d6806111bf0d946a93a Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Sat, 28 Jun 2025 18:48:37 +0200 Subject: [PATCH 036/495] feat: improve API /repos/{owner}/{repo}/compare/{basehead} error messages --- routers/api/v1/repo/pull.go | 11 ++-- tests/integration/api_repo_compare_test.go | 68 ++++++++++++++++++++++ 2 files changed, 73 insertions(+), 6 deletions(-) diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go index cb66b4d09d..20f718d6c2 100644 --- a/routers/api/v1/repo/pull.go +++ b/routers/api/v1/repo/pull.go @@ -1084,7 +1084,6 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) err error ) - // If there is no head repository, it means pull request between same repository. headInfos := strings.Split(form.Head, ":") if len(headInfos) == 1 { isSameRepo = true @@ -1094,7 +1093,7 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) headUser, err = user_model.GetUserByName(ctx, headInfos[0]) if err != nil { if user_model.IsErrUserNotExist(err) { - ctx.NotFound("GetUserByName") + ctx.NotFound(fmt.Errorf("the owner %s does not exist", headInfos[0])) } else { ctx.Error(http.StatusInternalServerError, "GetUserByName", err) } @@ -1104,7 +1103,7 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) // The head repository can also point to the same repo isSameRepo = ctx.Repo.Owner.ID == headUser.ID } else { - ctx.NotFound() + ctx.NotFound(fmt.Errorf("the head part of {basehead} %s must contain zero or one colon (:) but contains %d", form.Head, len(headInfos)-1)) return nil, nil, nil, "", "" } @@ -1116,7 +1115,7 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) baseIsBranch := ctx.Repo.GitRepo.IsBranchExist(baseBranch) baseIsTag := ctx.Repo.GitRepo.IsTagExist(baseBranch) if !baseIsCommit && !baseIsBranch && !baseIsTag { - ctx.NotFound("BaseNotExist") + ctx.NotFound(fmt.Errorf("could not find '%s' to be a commit, branch or tag in the base repository %s/%s", baseBranch, baseRepo.Owner.Name, baseRepo.Name)) return nil, nil, nil, "", "" } @@ -1130,7 +1129,7 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) if baseRepo.BaseRepo == nil || baseRepo.BaseRepo.OwnerID != headUser.ID { log.Trace("parseCompareInfo[%d]: does not have fork or in same repository", baseRepo.ID) - ctx.NotFound("GetBaseRepo") + ctx.NotFound(fmt.Errorf("%[1]s does not have a fork of %[2]s/%[3]s and %[2]s/%[3]s is not a fork of a repository from %[1]s", headUser.Name, baseRepo.Owner.Name, baseRepo.Name)) return nil, nil, nil, "", "" } headRepo = baseRepo.BaseRepo @@ -1198,7 +1197,7 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) headIsBranch := headGitRepo.IsBranchExist(headBranch) headIsTag := headGitRepo.IsTagExist(headBranch) if !headIsCommit && !headIsBranch && !headIsTag { - ctx.NotFound("IsRefExist", nil) + ctx.NotFound(fmt.Errorf("could not find '%s' to be a commit, branch or tag in the head repository %s/%s", headBranch, headRepo.Owner.Name, headRepo.Name)) return nil, nil, nil, "", "" } diff --git a/tests/integration/api_repo_compare_test.go b/tests/integration/api_repo_compare_test.go index e4e85fc742..1724924fdc 100644 --- a/tests/integration/api_repo_compare_test.go +++ b/tests/integration/api_repo_compare_test.go @@ -7,7 +7,9 @@ import ( "encoding/base64" "fmt" "net/http" + "net/http/httptest" "net/url" + "strings" "testing" "time" @@ -50,6 +52,28 @@ func testAPICompareCommits(t *testing.T, objectFormat git.ObjectFormat) { } } + requireErrorContains := func(t *testing.T, resp *httptest.ResponseRecorder, expected string) { + t.Helper() + + type response struct { + Message string `json:"message"` + Errors []string `json:"errors"` + } + var bodyResp response + DecodeJSON(t, resp, &bodyResp) + + if strings.Contains(bodyResp.Message, expected) { + return + } + for _, error := range bodyResp.Errors { + if strings.Contains(error, expected) { + return + } + } + t.Log(fmt.Sprintf("expected %s in %+v", expected, bodyResp)) + t.Fail() + } + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) user2repo := "repoA" user2Ctx := NewAPITestContext(t, user2.Name, user2repo, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) @@ -123,6 +147,14 @@ func testAPICompareCommits(t *testing.T, objectFormat git.ObjectFormat) { user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) user4Ctx := NewAPITestContext(t, user4.Name, user2repo, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) + + t.Run("ForkNotFound", func(t *testing.T) { + req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/compare/%s...%s:%s", user2.Name, user2repo, "master", user4.Name, user2branchName). + AddTokenAuth(user2Ctx.Token) + resp := MakeRequest(t, req, http.StatusNotFound) + requireErrorContains(t, resp, "user4 does not have a fork of user2/repoA and user2/repoA is not a fork of a repository from user4") + }) + t.Run("User4ForksUser2Repository", doAPIForkRepository(user4Ctx, user2.Name)) user4branchName := "user4branch" t.Run("CreateUser4RepositoryBranch", newBranchAndFile(user4Ctx, user4, user4branchName, "user4branchfilename.txt")) @@ -199,5 +231,41 @@ func testAPICompareCommits(t *testing.T, objectFormat git.ObjectFormat) { assert.Len(t, apiResp.Files, 1) }) } + + t.Run("ForkUserDoesNotExist", func(t *testing.T) { + notUser := "notauser" + req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/compare/master...%s:branchname", user2.Name, user2repo, notUser). + AddTokenAuth(user2Ctx.Token) + resp := MakeRequest(t, req, http.StatusNotFound) + requireErrorContains(t, resp, fmt.Sprintf("the owner %s does not exist", notUser)) + }) + + t.Run("HeadHasTooManyColon", func(t *testing.T) { + req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/compare/master...one:two:many", user2.Name, user2repo). + AddTokenAuth(user2Ctx.Token) + resp := MakeRequest(t, req, http.StatusNotFound) + requireErrorContains(t, resp, fmt.Sprintf("must contain zero or one colon (:) but contains 2")) + }) + + for _, testCase := range []struct { + what string + baseHead string + }{ + { + what: "base", + baseHead: "notexists...master", + }, + { + what: "head", + baseHead: "master...notexists", + }, + } { + t.Run("BaseHeadNotExists "+testCase.what, func(t *testing.T) { + req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/compare/%s", user2.Name, user2repo, testCase.baseHead). + AddTokenAuth(user2Ctx.Token) + resp := MakeRequest(t, req, http.StatusNotFound) + requireErrorContains(t, resp, fmt.Sprintf("could not find 'notexists' to be a commit, branch or tag in the %s", testCase.what)) + }) + } }) } From 66e0988a43bb81031182a83891c2d3efa4c4b2f3 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Sat, 28 Jun 2025 20:27:41 +0200 Subject: [PATCH 037/495] feat: make API pull and compare endpoint references to head more robust It is best to prefix the reference to resolve any ambiguity once it has been determined that it is a branch or a tag. It was done in forgejo/forgejo#5991 for the base reference but not for the head reference. Refs forgejo/forgejo#5991 --- routers/api/v1/repo/pull.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go index 20f718d6c2..e7ff533d6a 100644 --- a/routers/api/v1/repo/pull.go +++ b/routers/api/v1/repo/pull.go @@ -1202,6 +1202,11 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) } headBranchRef := headBranch + if headIsBranch { + headBranchRef = git.BranchPrefix + headBranch + } else if headIsTag { + headBranchRef = git.TagPrefix + headBranch + } compareInfo, err := headGitRepo.GetCompareInfo(repo_model.RepoPath(baseRepo.Owner.Name, baseRepo.Name), baseBranchRef, headBranchRef, false, false) if err != nil { From 164c5ef87f99c77664ea72064ce127956a402ac1 Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Sun, 29 Jun 2025 00:10:56 +0200 Subject: [PATCH 038/495] [v12.0/forgejo] fix: make API /repos/{owner}/{repo}/compare/{basehead} work with forks (#8331) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8326 - fix: API must use headGitRepo instead of ctx.Repo.GitRepo for comparing - fix: make API /repos/{owner}/{repo}/compare/{basehead} work with forks - add test coverage for both fixes and the underlying function `parseCompareInfo` - refactor and improve part of the helpers from `tests/integration/api_helper_for_declarative_test.go` - remove a few wrong or misleading comments Refs forgejo/forgejo#7978 ## Note on the focus of the PR It was initially created to address a regression introduced in v12. But the tests that verify it is fixed discovered a v11.0 bug. They cannot conveniently be separated because they both relate to the same area of code that was previously not covered by any test. ## Note on v11.0 backport It must be manually done by cherry-picking all commits up to and not including `fix: API must use headGitRepo instead of ctx.Repo.GitRepo for comparing` because it is v12 specific. ## Checklist The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org). ### Tests - I added test coverage for Go changes... - [x] in the `tests/integration` directory if it involves interactions with a live Forgejo server. ### Documentation - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [x] I do not want this change to show in the release notes. Co-authored-by: Earl Warren Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8331 Reviewed-by: Earl Warren Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- routers/api/v1/repo/compare.go | 4 +- routers/api/v1/repo/pull.go | 9 +- tests/integration/api_branch_test.go | 2 +- .../api_helper_for_declarative_test.go | 67 ++++-- tests/integration/api_repo_compare_test.go | 224 ++++++++++++++---- .../integration/api_repo_file_create_test.go | 9 +- tests/integration/api_repo_file_get_test.go | 2 +- tests/integration/api_repo_lfs_test.go | 2 +- tests/integration/api_repo_test.go | 4 +- tests/integration/git_test.go | 37 +-- tests/integration/pull_commit_test.go | 2 +- tests/integration/repo_test.go | 2 +- tests/integration/signing_git_test.go | 71 +++--- tests/integration/ssh_key_test.go | 14 +- 14 files changed, 311 insertions(+), 138 deletions(-) diff --git a/routers/api/v1/repo/compare.go b/routers/api/v1/repo/compare.go index 9c941ea07f..7fc59ea171 100644 --- a/routers/api/v1/repo/compare.go +++ b/routers/api/v1/repo/compare.go @@ -64,7 +64,7 @@ func CompareDiff(ctx *context.APIContext) { } } - _, headGitRepo, ci, _, _ := parseCompareInfo(ctx, api.CreatePullRequestOption{ + headRepository, headGitRepo, ci, _, _ := parseCompareInfo(ctx, api.CreatePullRequestOption{ Base: infos[0], Head: infos[1], }) @@ -80,7 +80,7 @@ func CompareDiff(ctx *context.APIContext) { apiFiles := []*api.CommitAffectedFiles{} userCache := make(map[string]*user_model.User) for i := 0; i < len(ci.Commits); i++ { - apiCommit, err := convert.ToCommit(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, ci.Commits[i], userCache, + apiCommit, err := convert.ToCommit(ctx, headRepository, headGitRepo, ci.Commits[i], userCache, convert.ToCommitOptions{ Stat: true, Verification: verification, diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go index c9dda124de..9360ff1335 100644 --- a/routers/api/v1/repo/pull.go +++ b/routers/api/v1/repo/pull.go @@ -1125,7 +1125,6 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) } } - // Check if current user has fork of repository or in the same repository. headRepo := repo_model.GetForkedRepo(ctx, headUser.ID, baseRepo.ID) if headRepo == nil && !isSameRepo { err := baseRepo.GetBaseRepo(ctx) @@ -1134,13 +1133,11 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) return nil, nil, nil, "", "" } - // Check if baseRepo's base repository is the same as headUser's repository. if baseRepo.BaseRepo == nil || baseRepo.BaseRepo.OwnerID != headUser.ID { log.Trace("parseCompareInfo[%d]: does not have fork or in same repository", baseRepo.ID) ctx.NotFound("GetBaseRepo") return nil, nil, nil, "", "" } - // Assign headRepo so it can be used below. headRepo = baseRepo.BaseRepo } @@ -1202,9 +1199,9 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) } // Check if head branch is valid. - headIsCommit := ctx.Repo.GitRepo.IsCommitExist(headBranch) - headIsBranch := ctx.Repo.GitRepo.IsBranchExist(headBranch) - headIsTag := ctx.Repo.GitRepo.IsTagExist(headBranch) + headIsCommit := headGitRepo.IsCommitExist(headBranch) + headIsBranch := headGitRepo.IsBranchExist(headBranch) + headIsTag := headGitRepo.IsTagExist(headBranch) if !headIsCommit && !headIsBranch && !headIsTag { // Check if headBranch is short sha commit hash if headCommit, _ := headGitRepo.GetCommit(headBranch); headCommit != nil { diff --git a/tests/integration/api_branch_test.go b/tests/integration/api_branch_test.go index 8e88501596..d8800217d3 100644 --- a/tests/integration/api_branch_test.go +++ b/tests/integration/api_branch_test.go @@ -116,7 +116,7 @@ func testAPICreateBranches(t *testing.T, giteaURL *url.URL) { ctx := NewAPITestContext(t, "user2", "my-noo-repo-"+objectFormat.Name(), auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) giteaURL.Path = ctx.GitPath() - t.Run("CreateRepo", doAPICreateRepository(ctx, false, objectFormat)) + t.Run("CreateRepo", doAPICreateRepository(ctx, nil, objectFormat)) testCases := []struct { OldBranch string NewBranch string diff --git a/tests/integration/api_helper_for_declarative_test.go b/tests/integration/api_helper_for_declarative_test.go index c9b6f84f4f..ada6a2c311 100644 --- a/tests/integration/api_helper_for_declarative_test.go +++ b/tests/integration/api_helper_for_declarative_test.go @@ -48,20 +48,22 @@ func (ctx APITestContext) GitPath() string { return fmt.Sprintf("%s/%s.git", ctx.Username, ctx.Reponame) } -func doAPICreateRepository(ctx APITestContext, empty bool, objectFormat git.ObjectFormat, callback ...func(*testing.T, api.Repository)) func(*testing.T) { +func doAPICreateRepository(ctx APITestContext, opts *api.CreateRepoOption, objectFormat git.ObjectFormat, callback ...func(*testing.T, api.Repository)) func(*testing.T) { return func(t *testing.T) { - createRepoOption := &api.CreateRepoOption{ - AutoInit: !empty, - Description: "Temporary repo", - Name: ctx.Reponame, - Private: true, - Template: true, - Gitignores: "", - License: "WTFPL", - Readme: "Default", - ObjectFormatName: objectFormat.Name(), + if opts == nil { + opts = &api.CreateRepoOption{ + AutoInit: true, + Description: "Temporary repo", + Name: ctx.Reponame, + Private: true, + Template: true, + Gitignores: "", + License: "WTFPL", + Readme: "Default", + } } - req := NewRequestWithJSON(t, "POST", "/api/v1/user/repos", createRepoOption). + opts.ObjectFormatName = objectFormat.Name() + req := NewRequestWithJSON(t, "POST", "/api/v1/user/repos", opts). AddTokenAuth(ctx.Token) if ctx.ExpectedCode != 0 { ctx.Session.MakeRequest(t, req, ctx.ExpectedCode) @@ -237,8 +239,8 @@ func doAPICreatePullRequest(ctx APITestContext, owner, repo, baseBranch, headBra } } -func doAPIGetPullRequest(ctx APITestContext, owner, repo string, index int64) func(*testing.T) (api.PullRequest, error) { - return func(t *testing.T) (api.PullRequest, error) { +func doAPIGetPullRequest(ctx APITestContext, owner, repo string, index int64) func(*testing.T) api.PullRequest { + return func(t *testing.T) api.PullRequest { req := NewRequest(t, http.MethodGet, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d", owner, repo, index)). AddTokenAuth(ctx.Token) @@ -248,10 +250,9 @@ func doAPIGetPullRequest(ctx APITestContext, owner, repo string, index int64) fu } resp := ctx.Session.MakeRequest(t, req, expected) - decoder := json.NewDecoder(resp.Body) pr := api.PullRequest{} - err := decoder.Decode(&pr) - return pr, err + DecodeJSON(t, resp, &pr) + return pr } } @@ -347,20 +348,40 @@ func doAPICancelAutoMergePullRequest(ctx APITestContext, owner, repo string, ind } } -func doAPIGetBranch(ctx APITestContext, branch string, callback ...func(*testing.T, api.Branch)) func(*testing.T) { - return func(t *testing.T) { +func doAPIGetBranch(ctx APITestContext, branch string) func(*testing.T) api.Branch { + return func(t *testing.T) api.Branch { req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/branches/%s", ctx.Username, ctx.Reponame, branch). AddTokenAuth(ctx.Token) + expected := http.StatusOK + if ctx.ExpectedCode != 0 { + expected = ctx.ExpectedCode + } + resp := ctx.Session.MakeRequest(t, req, expected) + + branch := api.Branch{} + DecodeJSON(t, resp, &branch) + return branch + } +} + +func doAPICreateTag(ctx APITestContext, tag, target, message string, callback ...func(*testing.T, api.Tag)) func(*testing.T) { + return func(t *testing.T) { + req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/tags", ctx.Username, ctx.Reponame), &api.CreateTagOption{ + TagName: tag, + Message: message, + Target: target, + }). + AddTokenAuth(ctx.Token) if ctx.ExpectedCode != 0 { ctx.Session.MakeRequest(t, req, ctx.ExpectedCode) return } - resp := ctx.Session.MakeRequest(t, req, http.StatusOK) + resp := ctx.Session.MakeRequest(t, req, http.StatusCreated) - var branch api.Branch - DecodeJSON(t, resp, &branch) + var tag api.Tag + DecodeJSON(t, resp, &tag) if len(callback) > 0 { - callback[0](t, branch) + callback[0](t, tag) } } } diff --git a/tests/integration/api_repo_compare_test.go b/tests/integration/api_repo_compare_test.go index 35f0a21d82..e4e85fc742 100644 --- a/tests/integration/api_repo_compare_test.go +++ b/tests/integration/api_repo_compare_test.go @@ -4,56 +4,200 @@ package integration import ( + "encoding/base64" + "fmt" "net/http" + "net/url" "testing" + "time" auth_model "forgejo.org/models/auth" "forgejo.org/models/unittest" user_model "forgejo.org/models/user" + "forgejo.org/modules/git" api "forgejo.org/modules/structs" - "forgejo.org/tests" "github.com/stretchr/testify/assert" ) -func TestAPICompareBranches(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - // Login as User2. - session := loginUser(t, user.Name) - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) - - repoName := "repo20" - - req := NewRequestf(t, "GET", "/api/v1/repos/user2/%s/compare/add-csv...remove-files-b", repoName). - AddTokenAuth(token) - resp := MakeRequest(t, req, http.StatusOK) - - var apiResp *api.Compare - DecodeJSON(t, resp, &apiResp) - - assert.Equal(t, 2, apiResp.TotalCommits) - assert.Len(t, apiResp.Commits, 2) - assert.Len(t, apiResp.Files, 3) -} - func TestAPICompareCommits(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - // Login as User2. - session := loginUser(t, user.Name) - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) - - req := NewRequestf(t, "GET", "/api/v1/repos/user2/repo20/compare/c8e31bc...8babce9"). - AddTokenAuth(token) - resp := MakeRequest(t, req, http.StatusOK) - - var apiResp *api.Compare - DecodeJSON(t, resp, &apiResp) - - assert.Equal(t, 2, apiResp.TotalCommits) - assert.Len(t, apiResp.Commits, 2) - assert.Len(t, apiResp.Files, 3) + forEachObjectFormat(t, testAPICompareCommits) +} + +func testAPICompareCommits(t *testing.T, objectFormat git.ObjectFormat) { + onGiteaRun(t, func(t *testing.T, u *url.URL) { + newBranchAndFile := func(ctx APITestContext, user *user_model.User, branch, filename string) func(*testing.T) { + return func(t *testing.T) { + doAPICreateFile(ctx, filename, &api.CreateFileOptions{ + FileOptions: api.FileOptions{ + NewBranchName: branch, + Message: "create " + filename, + Author: api.Identity{ + Name: user.Name, + Email: user.Email, + }, + Committer: api.Identity{ + Name: user.Name, + Email: user.Email, + }, + Dates: api.CommitDateOptions{ + Author: time.Now(), + Committer: time.Now(), + }, + }, + ContentBase64: base64.StdEncoding.EncodeToString([]byte("content " + filename)), + })(t) + } + } + + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + user2repo := "repoA" + user2Ctx := NewAPITestContext(t, user2.Name, user2repo, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) + t.Run("CreateUser2Repository", doAPICreateRepository(user2Ctx, &api.CreateRepoOption{ + AutoInit: true, + Description: "Temporary repo", + Name: user2Ctx.Reponame, + }, objectFormat)) + user2branchName := "user2branch" + t.Run("CreateUser2RepositoryBranch", newBranchAndFile(user2Ctx, user2, user2branchName, "user2branchfilename.txt")) + user2branch := doAPIGetBranch(user2Ctx, user2branchName)(t) + user2master := doAPIGetBranch(user2Ctx, "master")(t) + user2tag1 := "tag1" + t.Run("CreateUser2RepositoryTag1", doAPICreateTag(user2Ctx, user2tag1, "master", "user2branchtag1")) + user2tag2 := "tag2" + t.Run("CreateUser2RepositoryTag1", doAPICreateTag(user2Ctx, user2tag2, user2branchName, "user2branchtag2")) + + shortCommitLength := 7 + + for _, testCase := range []struct { + name string + a string + b string + }{ + { + name: "Commits", + a: user2master.Commit.ID, + b: user2branch.Commit.ID, + }, + { + name: "ShortCommits", + a: user2master.Commit.ID[:shortCommitLength], + b: user2branch.Commit.ID[:shortCommitLength], + }, + { + name: "Branches", + a: "master", + b: user2branchName, + }, + { + name: "Tags", + a: user2tag1, + b: user2tag2, + }, + } { + t.Run("SameRepo"+testCase.name, func(t *testing.T) { + // a...b + req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/compare/%s...%s", user2.Name, user2repo, testCase.a, testCase.b). + AddTokenAuth(user2Ctx.Token) + resp := MakeRequest(t, req, http.StatusOK) + + var apiResp *api.Compare + DecodeJSON(t, resp, &apiResp) + + assert.Equal(t, 1, apiResp.TotalCommits) + assert.Len(t, apiResp.Commits, 1) + assert.Len(t, apiResp.Files, 1) + + // b...a + req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/compare/%s...%s", user2.Name, user2repo, testCase.b, testCase.a). + AddTokenAuth(user2Ctx.Token) + resp = MakeRequest(t, req, http.StatusOK) + + DecodeJSON(t, resp, &apiResp) + + assert.Equal(t, 0, apiResp.TotalCommits) + assert.Empty(t, apiResp.Commits) + assert.Empty(t, apiResp.Files) + }) + } + + user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) + user4Ctx := NewAPITestContext(t, user4.Name, user2repo, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) + t.Run("User4ForksUser2Repository", doAPIForkRepository(user4Ctx, user2.Name)) + user4branchName := "user4branch" + t.Run("CreateUser4RepositoryBranch", newBranchAndFile(user4Ctx, user4, user4branchName, "user4branchfilename.txt")) + user4branch := doAPIGetBranch(user4Ctx, user4branchName)(t) + user4tag4 := "tag4" + t.Run("CreateUser4RepositoryTag4", doAPICreateTag(user4Ctx, user4tag4, user4branchName, "user4branchtag4")) + + t.Run("FromTheForkedRepo", func(t *testing.T) { + // user4/repoA is a fork of user2/repoA and when evaluating + // + // user4/repoA/compare/master...user2:user2branch + // + // user2/repoA is not explicitly specified, it is implicitly the repository + // from which user4/repoA was forked + req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/compare/%s...%s:%s", user4.Name, user2repo, "master", user2.Name, user2branchName). + AddTokenAuth(user4Ctx.Token) + resp := MakeRequest(t, req, http.StatusOK) + + var apiResp *api.Compare + DecodeJSON(t, resp, &apiResp) + + assert.Equal(t, 1, apiResp.TotalCommits) + assert.Len(t, apiResp.Commits, 1) + assert.Len(t, apiResp.Files, 1) + }) + + for _, testCase := range []struct { + name string + a string + b string + }{ + { + name: "Commits", + a: user2master.Commit.ID, + b: fmt.Sprintf("%s:%s", user4.Name, user4branch.Commit.ID), + }, + { + name: "ShortCommits", + a: user2master.Commit.ID[:shortCommitLength], + b: fmt.Sprintf("%s:%s", user4.Name, user4branch.Commit.ID[:shortCommitLength]), + }, + { + name: "Branches", + a: "master", + b: fmt.Sprintf("%s:%s", user4.Name, user4branchName), + }, + { + name: "Tags", + a: user2tag1, + b: fmt.Sprintf("%s:%s", user4.Name, user4tag4), + }, + { + name: "SameRepo", + a: "master", + b: fmt.Sprintf("%s:%s", user2.Name, user2branchName), + }, + } { + t.Run("ForkedRepo"+testCase.name, func(t *testing.T) { + // user2/repoA is forked into user4/repoA and when evaluating + // + // user2/repoA/compare/a...user4:b + // + // user4/repoA is not explicitly specified, it is implicitly the repository + // owned by user4 which is a fork of repoA + req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/compare/%s...%s", user2.Name, user2repo, testCase.a, testCase.b). + AddTokenAuth(user2Ctx.Token) + resp := MakeRequest(t, req, http.StatusOK) + + var apiResp *api.Compare + DecodeJSON(t, resp, &apiResp) + + assert.Equal(t, 1, apiResp.TotalCommits) + assert.Len(t, apiResp.Commits, 1) + assert.Len(t, apiResp.Files, 1) + }) + } + }) } diff --git a/tests/integration/api_repo_file_create_test.go b/tests/integration/api_repo_file_create_test.go index c112653e11..4916ef97ef 100644 --- a/tests/integration/api_repo_file_create_test.go +++ b/tests/integration/api_repo_file_create_test.go @@ -287,7 +287,14 @@ func TestAPICreateFile(t *testing.T) { // Test creating a file in an empty repository forEachObjectFormat(t, func(t *testing.T, objectFormat git.ObjectFormat) { reponame := "empty-repo-" + objectFormat.Name() - doAPICreateRepository(NewAPITestContext(t, "user2", reponame, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser), true, objectFormat)(t) + ctx := NewAPITestContext(t, "user2", reponame, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) + opts := &api.CreateRepoOption{ + Description: "Temporary repo", + Name: ctx.Reponame, + Private: true, + Template: true, + } + doAPICreateRepository(ctx, opts, objectFormat)(t) createFileOptions = getCreateFileOptions() fileID++ treePath = fmt.Sprintf("new/file%d.txt", fileID) diff --git a/tests/integration/api_repo_file_get_test.go b/tests/integration/api_repo_file_get_test.go index 7bd7393b01..408c630a1c 100644 --- a/tests/integration/api_repo_file_get_test.go +++ b/tests/integration/api_repo_file_get_test.go @@ -27,7 +27,7 @@ func TestAPIGetRawFileOrLFS(t *testing.T) { // Test with LFS onGiteaRun(t, func(t *testing.T, u *url.URL) { httpContext := NewAPITestContext(t, "user2", "repo-lfs-test", auth_model.AccessTokenScopeWriteRepository) - doAPICreateRepository(httpContext, false, git.Sha1ObjectFormat, func(t *testing.T, repository api.Repository) { // FIXME: use forEachObjectFormat + doAPICreateRepository(httpContext, nil, git.Sha1ObjectFormat, func(t *testing.T, repository api.Repository) { // FIXME: use forEachObjectFormat u.Path = httpContext.GitPath() dstPath := t.TempDir() diff --git a/tests/integration/api_repo_lfs_test.go b/tests/integration/api_repo_lfs_test.go index b8ba54f876..b0edf7b854 100644 --- a/tests/integration/api_repo_lfs_test.go +++ b/tests/integration/api_repo_lfs_test.go @@ -64,7 +64,7 @@ func TestAPILFSMediaType(t *testing.T) { func createLFSTestRepository(t *testing.T, name string) *repo_model.Repository { ctx := NewAPITestContext(t, "user2", "lfs-"+name+"-repo", auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepo", doAPICreateRepository(ctx, false, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat + t.Run("CreateRepo", doAPICreateRepository(ctx, nil, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat repo, err := repo_model.GetRepositoryByOwnerAndName(db.DefaultContext, "user2", "lfs-"+name+"-repo") require.NoError(t, err) diff --git a/tests/integration/api_repo_test.go b/tests/integration/api_repo_test.go index fd62670eb3..e81f4307ee 100644 --- a/tests/integration/api_repo_test.go +++ b/tests/integration/api_repo_test.go @@ -415,7 +415,7 @@ func testAPIRepoMigrateConflict(t *testing.T, u *url.URL) { httpContext := baseAPITestContext httpContext.Reponame = "repo-tmp-17" - t.Run("CreateRepo", doAPICreateRepository(httpContext, false, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat + t.Run("CreateRepo", doAPICreateRepository(httpContext, nil, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat user, err := user_model.GetUserByName(db.DefaultContext, httpContext.Username) require.NoError(t, err) @@ -498,7 +498,7 @@ func testAPIRepoCreateConflict(t *testing.T, u *url.URL) { httpContext := baseAPITestContext httpContext.Reponame = "repo-tmp-17" - t.Run("CreateRepo", doAPICreateRepository(httpContext, false, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat + t.Run("CreateRepo", doAPICreateRepository(httpContext, nil, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat req := NewRequestWithJSON(t, "POST", "/api/v1/user/repos", &api.CreateRepoOption{ diff --git a/tests/integration/git_test.go b/tests/integration/git_test.go index e79f6fe802..9a66781024 100644 --- a/tests/integration/git_test.go +++ b/tests/integration/git_test.go @@ -69,7 +69,7 @@ func testGit(t *testing.T, u *url.URL) { dstPath := t.TempDir() - t.Run("CreateRepoInDifferentUser", doAPICreateRepository(forkedUserCtx, false, objectFormat)) + t.Run("CreateRepoInDifferentUser", doAPICreateRepository(forkedUserCtx, nil, objectFormat)) t.Run("AddUserAsCollaborator", doAPIAddCollaborator(forkedUserCtx, httpContext.Username, perm.AccessModeRead)) t.Run("ForkFromDifferentUser", doAPIForkRepository(httpContext, forkedUserCtx.Username)) @@ -110,7 +110,7 @@ func testGit(t *testing.T, u *url.URL) { sshContext.Reponame = "repo-tmp-18-" + objectFormat.Name() keyname := "my-testing-key" forkedUserCtx.Reponame = sshContext.Reponame - t.Run("CreateRepoInDifferentUser", doAPICreateRepository(forkedUserCtx, false, objectFormat)) + t.Run("CreateRepoInDifferentUser", doAPICreateRepository(forkedUserCtx, nil, objectFormat)) t.Run("AddUserAsCollaborator", doAPIAddCollaborator(forkedUserCtx, sshContext.Username, perm.AccessModeRead)) t.Run("ForkFromDifferentUser", doAPIForkRepository(sshContext, forkedUserCtx.Username)) @@ -529,8 +529,7 @@ func doMergeFork(ctx, baseCtx APITestContext, baseBranch, headBranch string) fun t.Run("EnsureCanSeePull", doEnsureCanSeePull(headCtx, pr, false)) t.Run("CheckPR", func(t *testing.T) { oldMergeBase := pr.MergeBase - pr2, err := doAPIGetPullRequest(baseCtx, baseCtx.Username, baseCtx.Reponame, pr.Index)(t) - require.NoError(t, err) + pr2 := doAPIGetPullRequest(baseCtx, baseCtx.Username, baseCtx.Reponame, pr.Index)(t) assert.Equal(t, oldMergeBase, pr2.MergeBase) }) t.Run("EnsurDiffNoChange", doEnsureDiffNoChange(baseCtx, pr, diffHash, diffLength)) @@ -730,24 +729,21 @@ func doAutoPRMerge(baseCtx *APITestContext, dstPath string) func(t *testing.T) { // Check pr status ctx.ExpectedCode = 0 - pr, err = doAPIGetPullRequest(ctx, baseCtx.Username, baseCtx.Reponame, pr.Index)(t) - require.NoError(t, err) + pr = doAPIGetPullRequest(ctx, baseCtx.Username, baseCtx.Reponame, pr.Index)(t) assert.False(t, pr.HasMerged) // Call API to add Failure status for commit t.Run("CreateStatus", addCommitStatus(api.CommitStatusFailure)) // Check pr status - pr, err = doAPIGetPullRequest(ctx, baseCtx.Username, baseCtx.Reponame, pr.Index)(t) - require.NoError(t, err) + pr = doAPIGetPullRequest(ctx, baseCtx.Username, baseCtx.Reponame, pr.Index)(t) assert.False(t, pr.HasMerged) // Call API to add Success status for commit t.Run("CreateStatus", addCommitStatus(api.CommitStatusSuccess)) // test pr status - pr, err = doAPIGetPullRequest(ctx, baseCtx.Username, baseCtx.Reponame, pr.Index)(t) - require.NoError(t, err) + pr = doAPIGetPullRequest(ctx, baseCtx.Username, baseCtx.Reponame, pr.Index)(t) assert.True(t, pr.HasMerged) } } @@ -836,8 +832,7 @@ func doCreateAgitFlowPull(dstPath string, ctx *APITestContext, headBranch string assert.Equal(t, 1, pr1.CommitsAhead) assert.Equal(t, 0, pr1.CommitsBehind) - prMsg, err := doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr1.Index)(t) - require.NoError(t, err) + prMsg := doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr1.Index)(t) assert.Equal(t, "user2/"+headBranch, pr1.HeadBranch) assert.False(t, prMsg.HasMerged) @@ -858,8 +853,7 @@ func doCreateAgitFlowPull(dstPath string, ctx *APITestContext, headBranch string } assert.Equal(t, 1, pr2.CommitsAhead) assert.Equal(t, 0, pr2.CommitsBehind) - prMsg, err = doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr2.Index)(t) - require.NoError(t, err) + prMsg = doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr2.Index)(t) assert.Equal(t, "user2/test/"+headBranch, pr2.HeadBranch) assert.False(t, prMsg.HasMerged) @@ -910,8 +904,7 @@ func doCreateAgitFlowPull(dstPath string, ctx *APITestContext, headBranch string require.NoError(t, err) unittest.AssertCount(t, &issues_model.PullRequest{}, pullNum+2) - prMsg, err := doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr1.Index)(t) - require.NoError(t, err) + prMsg := doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr1.Index)(t) assert.False(t, prMsg.HasMerged) assert.Equal(t, commit, prMsg.Head.Sha) @@ -928,8 +921,7 @@ func doCreateAgitFlowPull(dstPath string, ctx *APITestContext, headBranch string require.NoError(t, err) unittest.AssertCount(t, &issues_model.PullRequest{}, pullNum+2) - prMsg, err = doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr2.Index)(t) - require.NoError(t, err) + prMsg = doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr2.Index)(t) assert.False(t, prMsg.HasMerged) assert.Equal(t, commit, prMsg.Head.Sha) @@ -953,8 +945,7 @@ func doCreateAgitFlowPull(dstPath string, ctx *APITestContext, headBranch string err := pr3.LoadIssue(db.DefaultContext) require.NoError(t, err) - _, err2 := doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr3.Index)(t) - require.NoError(t, err2) + doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr3.Index)(t) assert.Equal(t, "Testing commit 2", pr3.Issue.Title) assert.Contains(t, pr3.Issue.Content, "Longer description.") @@ -975,8 +966,7 @@ func doCreateAgitFlowPull(dstPath string, ctx *APITestContext, headBranch string err := pr.LoadIssue(db.DefaultContext) require.NoError(t, err) - _, err = doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr.Index)(t) - require.NoError(t, err) + doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr.Index)(t) assert.Equal(t, "my-shiny-title", pr.Issue.Title) assert.Contains(t, pr.Issue.Content, "Longer description.") @@ -998,8 +988,7 @@ func doCreateAgitFlowPull(dstPath string, ctx *APITestContext, headBranch string err := pr.LoadIssue(db.DefaultContext) require.NoError(t, err) - _, err = doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr.Index)(t) - require.NoError(t, err) + doAPIGetPullRequest(*ctx, ctx.Username, ctx.Reponame, pr.Index)(t) assert.Equal(t, "Testing commit 2", pr.Issue.Title) assert.Contains(t, pr.Issue.Content, "custom") diff --git a/tests/integration/pull_commit_test.go b/tests/integration/pull_commit_test.go index 1de437ef46..f82fc08df4 100644 --- a/tests/integration/pull_commit_test.go +++ b/tests/integration/pull_commit_test.go @@ -95,7 +95,7 @@ func TestPullCommitSignature(t *testing.T) { testCtx := NewAPITestContext(t, user.Name, "pull-request-commit-header-signed", auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) u.Path = testCtx.GitPath() - t.Run("Create repository", doAPICreateRepository(testCtx, false, git.Sha1ObjectFormat)) + t.Run("Create repository", doAPICreateRepository(testCtx, nil, git.Sha1ObjectFormat)) t.Run("Create commit", func(t *testing.T) { defer tests.PrintCurrentTest(t)() diff --git a/tests/integration/repo_test.go b/tests/integration/repo_test.go index 329a31ace8..7370b63dcd 100644 --- a/tests/integration/repo_test.go +++ b/tests/integration/repo_test.go @@ -720,7 +720,7 @@ func TestViewCommitSignature(t *testing.T) { testCtx := NewAPITestContext(t, user.Name, "commit-header-signed", auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) u.Path = testCtx.GitPath() - t.Run("Create repository", doAPICreateRepository(testCtx, false, git.Sha1ObjectFormat)) + t.Run("Create repository", doAPICreateRepository(testCtx, nil, git.Sha1ObjectFormat)) t.Run("Create commit", func(t *testing.T) { defer tests.PrintCurrentTest(t)() diff --git a/tests/integration/signing_git_test.go b/tests/integration/signing_git_test.go index c4759aaddb..e4c0d6049b 100644 --- a/tests/integration/signing_git_test.go +++ b/tests/integration/signing_git_test.go @@ -109,13 +109,14 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O defer tests.PrintCurrentTest(t)() testCtx := NewAPITestContext(t, username, "initial-unsigned"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) - t.Run("CheckMasterBranchUnsigned", doAPIGetBranch(testCtx, "master", func(t *testing.T, branch api.Branch) { + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) + t.Run("CheckMasterBranchUnsigned", func(t *testing.T) { + branch := doAPIGetBranch(testCtx, "master")(t) assert.NotNil(t, branch.Commit) assert.NotNil(t, branch.Commit.Verification) assert.False(t, branch.Commit.Verification.Verified) assert.Empty(t, branch.Commit.Verification.Signature) - })) + }) t.Run("CreateCRUDFile-Never", crudActionCreateFile( t, testCtx, user, "master", "never", "unsigned-never.txt", func(t *testing.T, response api.FileResponse) { assert.False(t, response.Verification.Verified) @@ -191,25 +192,27 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O defer tests.PrintCurrentTest(t)() testCtx := NewAPITestContext(t, username, "initial-pubkey"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) - t.Run("CheckMasterBranchSigned", doAPIGetBranch(testCtx, "master", func(t *testing.T, branch api.Branch) { + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) + t.Run("CheckMasterBranchSigned", func(t *testing.T) { + branch := doAPIGetBranch(testCtx, "master")(t) require.NotNil(t, branch.Commit) require.NotNil(t, branch.Commit.Verification) assert.True(t, branch.Commit.Verification.Verified) assert.Equal(t, "fox@example.com", branch.Commit.Verification.Signer.Email) - })) + }) }) t.Run("No publickey", func(t *testing.T) { defer tests.PrintCurrentTest(t)() testCtx := NewAPITestContext(t, "user4", "initial-no-pubkey"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) - t.Run("CheckMasterBranchSigned", doAPIGetBranch(testCtx, "master", func(t *testing.T, branch api.Branch) { + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) + t.Run("CheckMasterBranchSigned", func(t *testing.T) { + branch := doAPIGetBranch(testCtx, "master")(t) require.NotNil(t, branch.Commit) require.NotNil(t, branch.Commit.Verification) assert.False(t, branch.Commit.Verification.Verified) - })) + }) }) }) @@ -226,25 +229,27 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O testCtx := NewAPITestContext(t, username, "initial-2fa"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) unittest.AssertSuccessfulInsert(t, &auth_model.WebAuthnCredential{UserID: user.ID}) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) - t.Run("CheckMasterBranchSigned", doAPIGetBranch(testCtx, "master", func(t *testing.T, branch api.Branch) { + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) + t.Run("CheckMasterBranchSigned", func(t *testing.T) { + branch := doAPIGetBranch(testCtx, "master")(t) require.NotNil(t, branch.Commit) require.NotNil(t, branch.Commit.Verification) assert.True(t, branch.Commit.Verification.Verified) assert.Equal(t, "fox@example.com", branch.Commit.Verification.Signer.Email) - })) + }) }) t.Run("No 2fa", func(t *testing.T) { defer tests.PrintCurrentTest(t)() testCtx := NewAPITestContext(t, "user4", "initial-no-2fa"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) - t.Run("CheckMasterBranchSigned", doAPIGetBranch(testCtx, "master", func(t *testing.T, branch api.Branch) { + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) + t.Run("CheckMasterBranchSigned", func(t *testing.T) { + branch := doAPIGetBranch(testCtx, "master")(t) require.NotNil(t, branch.Commit) require.NotNil(t, branch.Commit.Verification) assert.False(t, branch.Commit.Verification.Verified) - })) + }) }) }) @@ -253,13 +258,14 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O setting.Repository.Signing.InitialCommit = []string{"always"} testCtx := NewAPITestContext(t, username, "initial-always"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) - t.Run("CheckMasterBranchSigned", doAPIGetBranch(testCtx, "master", func(t *testing.T, branch api.Branch) { + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) + t.Run("CheckMasterBranchSigned", func(t *testing.T) { + branch := doAPIGetBranch(testCtx, "master")(t) require.NotNil(t, branch.Commit) require.NotNil(t, branch.Commit.Verification) assert.True(t, branch.Commit.Verification.Verified) assert.Equal(t, "fox@example.com", branch.Commit.Verification.Signer.Email) - })) + }) }) t.Run("AlwaysSign-Initial-CRUD-Never", func(t *testing.T) { @@ -267,7 +273,7 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O setting.Repository.Signing.CRUDActions = []string{"never"} testCtx := NewAPITestContext(t, username, "initial-always-never"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) t.Run("CreateCRUDFile-Never", crudActionCreateFile( t, testCtx, user, "master", "never", "unsigned-never.txt", func(t *testing.T, response api.FileResponse) { assert.False(t, response.Verification.Verified) @@ -279,7 +285,7 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O setting.Repository.Signing.CRUDActions = []string{"parentsigned"} testCtx := NewAPITestContext(t, username, "initial-always-parent"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) t.Run("CreateCRUDFile-ParentSigned", crudActionCreateFile( t, testCtx, user, "master", "parentsigned", "signed-parent.txt", func(t *testing.T, response api.FileResponse) { assert.True(t, response.Verification.Verified) @@ -294,7 +300,7 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O defer tests.PrintCurrentTest(t)() testCtx := NewAPITestContext(t, username, "initial-always-pubkey"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) t.Run("CreateCRUDFile-Pubkey", crudActionCreateFile( t, testCtx, user, "master", "pubkey", "signed-pubkey.txt", func(t *testing.T, response api.FileResponse) { assert.True(t, response.Verification.Verified) @@ -306,7 +312,7 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O defer tests.PrintCurrentTest(t)() testCtx := NewAPITestContext(t, "user4", "initial-always-no-pubkey"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) t.Run("CreateCRUDFile-Pubkey", crudActionCreateFile( t, testCtx, user, "master", "pubkey", "unsigned-pubkey.txt", func(t *testing.T, response api.FileResponse) { assert.False(t, response.Verification.Verified) @@ -326,7 +332,7 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O testCtx := NewAPITestContext(t, username, "initial-always-twofa"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) unittest.AssertSuccessfulInsert(t, &auth_model.WebAuthnCredential{UserID: user.ID}) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) t.Run("CreateCRUDFile-Twofa", crudActionCreateFile( t, testCtx, user, "master", "twofa", "signed-twofa.txt", func(t *testing.T, response api.FileResponse) { assert.True(t, response.Verification.Verified) @@ -338,7 +344,7 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O defer tests.PrintCurrentTest(t)() testCtx := NewAPITestContext(t, "user4", "initial-always-no-twofa"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) t.Run("CreateCRUDFile-Pubkey", crudActionCreateFile( t, testCtx, user, "master", "twofa", "unsigned-twofa.txt", func(t *testing.T, response api.FileResponse) { assert.False(t, response.Verification.Verified) @@ -351,7 +357,7 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O setting.Repository.Signing.CRUDActions = []string{"always"} testCtx := NewAPITestContext(t, username, "initial-always-always"+suffix, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - t.Run("CreateRepository", doAPICreateRepository(testCtx, false, objectFormat)) + t.Run("CreateRepository", doAPICreateRepository(testCtx, nil, objectFormat)) t.Run("CreateCRUDFile-Always", crudActionCreateFile( t, testCtx, user, "master", "always", "signed-always.txt", func(t *testing.T, response api.FileResponse) { assert.True(t, response.Verification.Verified) @@ -369,12 +375,13 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O require.NoError(t, err) t.Run("MergePR", doAPIMergePullRequest(testCtx, testCtx.Username, testCtx.Reponame, pr.Index)) }) - t.Run("CheckMasterBranchUnsigned", doAPIGetBranch(testCtx, "master", func(t *testing.T, branch api.Branch) { + t.Run("CheckMasterBranchUnsigned", func(t *testing.T) { + branch := doAPIGetBranch(testCtx, "master")(t) require.NotNil(t, branch.Commit) require.NotNil(t, branch.Commit.Verification) assert.False(t, branch.Commit.Verification.Verified) assert.Empty(t, branch.Commit.Verification.Signature) - })) + }) }) t.Run("BaseSignedMerging", func(t *testing.T) { @@ -387,12 +394,13 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O require.NoError(t, err) t.Run("MergePR", doAPIMergePullRequest(testCtx, testCtx.Username, testCtx.Reponame, pr.Index)) }) - t.Run("CheckMasterBranchUnsigned", doAPIGetBranch(testCtx, "master", func(t *testing.T, branch api.Branch) { + t.Run("CheckMasterBranchUnsigned", func(t *testing.T) { + branch := doAPIGetBranch(testCtx, "master")(t) require.NotNil(t, branch.Commit) require.NotNil(t, branch.Commit.Verification) assert.False(t, branch.Commit.Verification.Verified) assert.Empty(t, branch.Commit.Verification.Signature) - })) + }) }) t.Run("CommitsSignedMerging", func(t *testing.T) { @@ -405,11 +413,12 @@ func testCRUD(t *testing.T, u *url.URL, signingFormat string, objectFormat git.O require.NoError(t, err) t.Run("MergePR", doAPIMergePullRequest(testCtx, testCtx.Username, testCtx.Reponame, pr.Index)) }) - t.Run("CheckMasterBranchUnsigned", doAPIGetBranch(testCtx, "master", func(t *testing.T, branch api.Branch) { + t.Run("CheckMasterBranchUnsigned", func(t *testing.T) { + branch := doAPIGetBranch(testCtx, "master")(t) require.NotNil(t, branch.Commit) require.NotNil(t, branch.Commit.Verification) assert.True(t, branch.Commit.Verification.Verified) - })) + }) }) } diff --git a/tests/integration/ssh_key_test.go b/tests/integration/ssh_key_test.go index aece9c3fd9..a92694d2fa 100644 --- a/tests/integration/ssh_key_test.go +++ b/tests/integration/ssh_key_test.go @@ -55,7 +55,13 @@ func testPushDeployKeyOnEmptyRepo(t *testing.T, u *url.URL) { keyname := fmt.Sprintf("%s-push", ctx.Reponame) u.Path = ctx.GitPath() - t.Run("CreateEmptyRepository", doAPICreateRepository(ctx, true, objectFormat)) + opts := &api.CreateRepoOption{ + Description: "Temporary repo", + Name: ctx.Reponame, + Private: true, + Template: true, + } + t.Run("CreateEmptyRepository", doAPICreateRepository(ctx, opts, objectFormat)) t.Run("CheckIsEmpty", doCheckRepositoryEmptyStatus(ctx, true)) @@ -105,8 +111,8 @@ func testKeyOnlyOneType(t *testing.T, u *url.URL) { failCtx := ctx failCtx.ExpectedCode = http.StatusUnprocessableEntity - t.Run("CreateRepository", doAPICreateRepository(ctx, false, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat - t.Run("CreateOtherRepository", doAPICreateRepository(otherCtx, false, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat + t.Run("CreateRepository", doAPICreateRepository(ctx, nil, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat + t.Run("CreateOtherRepository", doAPICreateRepository(otherCtx, nil, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat withKeyFile(t, keyname, func(keyFile string) { var userKeyPublicKeyID int64 @@ -180,7 +186,7 @@ func testKeyOnlyOneType(t *testing.T, u *url.URL) { t.Run("DeleteOtherRepository", doAPIDeleteRepository(otherCtxWithDeleteRepo)) - t.Run("RecreateRepository", doAPICreateRepository(ctxWithDeleteRepo, false, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat + t.Run("RecreateRepository", doAPICreateRepository(ctxWithDeleteRepo, nil, git.Sha1ObjectFormat)) // FIXME: use forEachObjectFormat t.Run("CreateUserKey", doAPICreateUserKey(ctx, keyname, keyFile, func(t *testing.T, publicKey api.PublicKey) { userKeyPublicKeyID = publicKey.ID From b5e608f3e2d42ef3991e7def7e499cf4a1f8b566 Mon Sep 17 00:00:00 2001 From: Gusted Date: Sun, 29 Jun 2025 00:44:18 +0200 Subject: [PATCH 039/495] feat: bump the minimum required Git version from 2.0.0 to 2.34.1 (#8328) - Resolves forgejo/discussions#324 - Remove all checks of `CheckGitVersionAtLeast` that checked for a version below 2.34.1 - The version was chosen because Debian stable supports 2.39.5 and Ubuntu 22.04 LTS supports 2.34.1 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8328 Reviewed-by: 0ko <0ko@noreply.codeberg.org> Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- .forgejo/workflows/testing-integration.yml | 19 +++++-- cmd/hook.go | 44 ++++++--------- cmd/serv.go | 10 ++-- modules/git/blame.go | 2 +- modules/git/commit.go | 6 +-- modules/git/git.go | 63 +++++++--------------- modules/git/git_test.go | 12 ----- modules/git/pipeline/revlist.go | 20 ------- modules/git/remote.go | 9 +--- modules/git/repo_commit.go | 34 ++---------- modules/git/repo_commitgraph.go | 6 +-- modules/lfs/pointer_scanner.go | 11 +--- routers/private/hook_post_receive.go | 2 +- routers/private/hook_pre_receive.go | 2 +- routers/private/hook_proc_receive.go | 5 -- routers/private/serv.go | 3 +- routers/web/misc/misc.go | 5 -- routers/web/repo/githttp.go | 4 +- services/gitdiff/gitdiff.go | 2 +- services/pull/temp_repo.go | 6 +-- services/repository/files/patch.go | 6 +-- tests/integration/git_test.go | 5 -- tests/integration/repo_signed_tag_test.go | 4 -- tests/integration/signing_git_test.go | 4 -- 24 files changed, 72 insertions(+), 212 deletions(-) diff --git a/.forgejo/workflows/testing-integration.yml b/.forgejo/workflows/testing-integration.yml index 9e5cfb92ed..630de50435 100644 --- a/.forgejo/workflows/testing-integration.yml +++ b/.forgejo/workflows/testing-integration.yml @@ -33,11 +33,20 @@ jobs: steps: - uses: https://data.forgejo.org/actions/checkout@v4 - uses: ./.forgejo/workflows-composite/setup-env - - name: install git 2.30 - uses: ./.forgejo/workflows-composite/apt-install-from - with: - packages: git/bullseye git-lfs/bullseye - release: bullseye + - name: install git 2.34.1 + run: | + export DEBIAN_FRONTEND=noninteractive + + apt-get update -qq + apt-get -q install -y -qq curl ca-certificates + + curl -sS -o git-man.deb http://archive.ubuntu.com/ubuntu/pool/main/g/git/git-man_2.34.1-1ubuntu1_all.deb + curl -sS -o git.deb https://archive.ubuntu.com/ubuntu/pool/main/g/git/git_2.34.1-1ubuntu1_amd64.deb + curl -sS -o git-lfs.deb https://archive.ubuntu.com/ubuntu/pool/universe/g/git-lfs/git-lfs_3.0.2-1_amd64.deb + + apt-get -q install -y -qq ./git-man.deb + apt-get -q install -y -qq ./git.deb + apt-get -q install -y -qq ./git-lfs.deb - uses: ./.forgejo/workflows-composite/build-backend - run: | su forgejo -c 'make test-backend test-check' diff --git a/cmd/hook.go b/cmd/hook.go index 909cdfdf84..7378dc21ad 100644 --- a/cmd/hook.go +++ b/cmd/hook.go @@ -231,8 +231,6 @@ Forgejo or set your environment appropriately.`, "") } } - supportProcReceive := git.CheckGitVersionAtLeast("2.29") == nil - for scanner.Scan() { // TODO: support news feeds for wiki if isWiki { @@ -250,31 +248,25 @@ Forgejo or set your environment appropriately.`, "") total++ lastline++ - // If the ref is a branch or tag, check if it's protected - // if supportProcReceive all ref should be checked because - // permission check was delayed - if supportProcReceive || refFullName.IsBranch() || refFullName.IsTag() { - oldCommitIDs[count] = oldCommitID - newCommitIDs[count] = newCommitID - refFullNames[count] = refFullName - count++ - fmt.Fprint(out, "*") + // All references should be checked because permission check was delayed. + oldCommitIDs[count] = oldCommitID + newCommitIDs[count] = newCommitID + refFullNames[count] = refFullName + count++ + fmt.Fprint(out, "*") - if count >= hookBatchSize { - fmt.Fprintf(out, " Checking %d references\n", count) + if count >= hookBatchSize { + fmt.Fprintf(out, " Checking %d references\n", count) - hookOptions.OldCommitIDs = oldCommitIDs - hookOptions.NewCommitIDs = newCommitIDs - hookOptions.RefFullNames = refFullNames - extra := private.HookPreReceive(ctx, username, reponame, hookOptions) - if extra.HasError() { - return fail(ctx, extra.UserMsg, "HookPreReceive(batch) failed: %v", extra.Error) - } - count = 0 - lastline = 0 + hookOptions.OldCommitIDs = oldCommitIDs + hookOptions.NewCommitIDs = newCommitIDs + hookOptions.RefFullNames = refFullNames + extra := private.HookPreReceive(ctx, username, reponame, hookOptions) + if extra.HasError() { + return fail(ctx, extra.UserMsg, "HookPreReceive(batch) failed: %v", extra.Error) } - } else { - fmt.Fprint(out, ".") + count = 0 + lastline = 0 } if lastline >= hookBatchSize { fmt.Fprint(out, "\n") @@ -513,10 +505,6 @@ Forgejo or set your environment appropriately.`, "") return nil } - if git.CheckGitVersionAtLeast("2.29") != nil { - return fail(ctx, "No proc-receive support", "current git version doesn't support proc-receive.") - } - reader := bufio.NewReader(os.Stdin) repoUser := os.Getenv(repo_module.EnvRepoUsername) repoName := os.Getenv(repo_module.EnvRepoName) diff --git a/cmd/serv.go b/cmd/serv.go index 1fac2d13f5..b0571a276c 100644 --- a/cmd/serv.go +++ b/cmd/serv.go @@ -193,12 +193,10 @@ func runServ(ctx context.Context, c *cli.Command) error { } if len(words) < 2 { - if git.CheckGitVersionAtLeast("2.29") == nil { - // for AGit Flow - if cmd == "ssh_info" { - fmt.Print(`{"type":"agit","version":1}`) - return nil - } + // for AGit Flow + if cmd == "ssh_info" { + fmt.Print(`{"type":"agit","version":1}`) + return nil } return fail(ctx, "Too few arguments", "Too few arguments in cmd: %s", cmd) } diff --git a/modules/git/blame.go b/modules/git/blame.go index 4ff347e31b..868edab2b8 100644 --- a/modules/git/blame.go +++ b/modules/git/blame.go @@ -132,7 +132,7 @@ func (r *BlameReader) Close() error { // CreateBlameReader creates reader for given repository, commit and file func CreateBlameReader(ctx context.Context, objectFormat ObjectFormat, repoPath string, commit *Commit, file string, bypassBlameIgnore bool) (*BlameReader, error) { var ignoreRevsFile *string - if CheckGitVersionAtLeast("2.23") == nil && !bypassBlameIgnore { + if !bypassBlameIgnore { ignoreRevsFile = tryCreateBlameIgnoreRevsFile(commit) } diff --git a/modules/git/commit.go b/modules/git/commit.go index 96831e3ae4..1228b4523b 100644 --- a/modules/git/commit.go +++ b/modules/git/commit.go @@ -412,11 +412,7 @@ func (c *Commit) GetSubModule(entryname string) (string, error) { // GetBranchName gets the closest branch name (as returned by 'git name-rev --name-only') func (c *Commit) GetBranchName() (string, error) { - cmd := NewCommand(c.repo.Ctx, "name-rev") - if CheckGitVersionAtLeast("2.13.0") == nil { - cmd.AddArguments("--exclude", "refs/tags/*") - } - cmd.AddArguments("--name-only", "--no-undefined").AddDynamicArguments(c.ID.String()) + cmd := NewCommand(c.repo.Ctx, "name-rev", "--exclude", "refs/tags/*", "--name-only", "--no-undefined").AddDynamicArguments(c.ID.String()) data, _, err := cmd.RunStdString(&RunOpts{Dir: c.repo.Path}) if err != nil { // handle special case where git can not describe commit diff --git a/modules/git/git.go b/modules/git/git.go index 1dfd0b5134..851b090b53 100644 --- a/modules/git/git.go +++ b/modules/git/git.go @@ -23,7 +23,7 @@ import ( ) // RequiredVersion is the minimum Git version required -const RequiredVersion = "2.0.0" +const RequiredVersion = "2.34.1" var ( // GitExecutable is the command name of git @@ -33,7 +33,6 @@ var ( // DefaultContext is the default context to run git commands in, must be initialized by git.InitXxx DefaultContext context.Context - SupportProcReceive bool // >= 2.29 SupportHashSha256 bool // >= 2.42, SHA-256 repositories no longer an ‘experimental curiosity’ InvertedGitFlushEnv bool // 2.43.1 SupportCheckAttrOnBare bool // >= 2.40 @@ -113,7 +112,7 @@ func VersionInfo() string { format := "%s" args := []any{GitVersion.Original()} // Since git wire protocol has been released from git v2.18 - if setting.Git.EnableAutoGitWireProtocol && CheckGitVersionAtLeast("2.18") == nil { + if setting.Git.EnableAutoGitWireProtocol { format += ", Wire Protocol %s Enabled" args = append(args, "Version 2") // for focus color } @@ -172,16 +171,13 @@ func InitFull(ctx context.Context) (err error) { _ = os.Setenv("GNUPGHOME", filepath.Join(HomeDir(), ".gnupg")) } - // Since git wire protocol has been released from git v2.18 - if setting.Git.EnableAutoGitWireProtocol && CheckGitVersionAtLeast("2.18") == nil { + if setting.Git.EnableAutoGitWireProtocol { globalCommandArgs = append(globalCommandArgs, "-c", "protocol.version=2") } // Explicitly disable credential helper, otherwise Git credentials might leak - if CheckGitVersionAtLeast("2.9") == nil { - globalCommandArgs = append(globalCommandArgs, "-c", "credential.helper=") - } - SupportProcReceive = CheckGitVersionAtLeast("2.29") == nil + globalCommandArgs = append(globalCommandArgs, "-c", "credential.helper=") + SupportHashSha256 = CheckGitVersionAtLeast("2.42") == nil SupportCheckAttrOnBare = CheckGitVersionAtLeast("2.40") == nil if SupportHashSha256 { @@ -195,9 +191,6 @@ func InitFull(ctx context.Context) (err error) { SupportGrepMaxCount = CheckGitVersionAtLeast("2.38") == nil if setting.LFS.StartServer { - if CheckGitVersionAtLeast("2.1.2") != nil { - return errors.New("LFS server support requires Git >= 2.1.2") - } globalCommandArgs = append(globalCommandArgs, "-c", "filter.lfs.required=", "-c", "filter.lfs.smudge=", "-c", "filter.lfs.clean=") } @@ -234,38 +227,28 @@ func syncGitConfig() (err error) { } } - // Set git some configurations - these must be set to these values for gitea to work correctly + // Set git some configurations - these must be set to these values for forgejo to work correctly if err := configSet("core.quotePath", "false"); err != nil { return err } - if CheckGitVersionAtLeast("2.10") == nil { - if err := configSet("receive.advertisePushOptions", "true"); err != nil { - return err - } + if err := configSet("receive.advertisePushOptions", "true"); err != nil { + return err } - if CheckGitVersionAtLeast("2.18") == nil { - if err := configSet("core.commitGraph", "true"); err != nil { - return err - } - if err := configSet("gc.writeCommitGraph", "true"); err != nil { - return err - } - if err := configSet("fetch.writeCommitGraph", "true"); err != nil { - return err - } + if err := configSet("core.commitGraph", "true"); err != nil { + return err + } + if err := configSet("gc.writeCommitGraph", "true"); err != nil { + return err + } + if err := configSet("fetch.writeCommitGraph", "true"); err != nil { + return err } - if SupportProcReceive { - // set support for AGit flow - if err := configAddNonExist("receive.procReceiveRefs", "refs/for"); err != nil { - return err - } - } else { - if err := configUnsetAll("receive.procReceiveRefs", "refs/for"); err != nil { - return err - } + // set support for AGit flow + if err := configAddNonExist("receive.procReceiveRefs", "refs/for"); err != nil { + return err } // Due to CVE-2022-24765, git now denies access to git directories which are not owned by current user @@ -284,11 +267,6 @@ func syncGitConfig() (err error) { switch setting.Repository.Signing.Format { case "ssh": - // First do a git version check. - if CheckGitVersionAtLeast("2.34.0") != nil { - return errors.New("ssh signing requires Git >= 2.34.0") - } - // Get the ssh-keygen binary that Git will use. // This can be overridden in app.ini in [git.config] section, so we must // query this information. @@ -325,8 +303,7 @@ func syncGitConfig() (err error) { } } - // By default partial clones are disabled, enable them from git v2.22 - if !setting.Git.DisablePartialClone && CheckGitVersionAtLeast("2.22") == nil { + if !setting.Git.DisablePartialClone { if err = configSet("uploadpack.allowfilter", "true"); err != nil { return err } diff --git a/modules/git/git_test.go b/modules/git/git_test.go index 01200dba68..38d4db169c 100644 --- a/modules/git/git_test.go +++ b/modules/git/git_test.go @@ -14,7 +14,6 @@ import ( "forgejo.org/modules/test" "forgejo.org/modules/util" - "github.com/hashicorp/go-version" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -105,10 +104,6 @@ func TestSyncConfigGPGFormat(t *testing.T) { }) t.Run("SSH format", func(t *testing.T) { - if CheckGitVersionAtLeast("2.34.0") != nil { - t.SkipNow() - } - r, err := os.OpenRoot(t.TempDir()) require.NoError(t, err) f, err := r.OpenFile("ssh-keygen", os.O_CREATE|os.O_TRUNC, 0o700) @@ -121,13 +116,6 @@ func TestSyncConfigGPGFormat(t *testing.T) { assert.True(t, gitConfigContains("[gpg]")) assert.True(t, gitConfigContains("format = ssh")) - t.Run("Old version", func(t *testing.T) { - oldVersion, err := version.NewVersion("2.33.0") - require.NoError(t, err) - defer test.MockVariableValue(&GitVersion, oldVersion)() - require.ErrorContains(t, syncGitConfig(), "ssh signing requires Git >= 2.34.0") - }) - t.Run("No ssh-keygen binary", func(t *testing.T) { require.NoError(t, r.Remove("ssh-keygen")) require.ErrorContains(t, syncGitConfig(), "git signing requires a ssh-keygen binary") diff --git a/modules/git/pipeline/revlist.go b/modules/git/pipeline/revlist.go index f39b7113bb..1ee8921854 100644 --- a/modules/git/pipeline/revlist.go +++ b/modules/git/pipeline/revlist.go @@ -16,26 +16,6 @@ import ( "forgejo.org/modules/log" ) -// RevListAllObjects runs rev-list --objects --all and writes to a pipewriter -func RevListAllObjects(ctx context.Context, revListWriter *io.PipeWriter, wg *sync.WaitGroup, basePath string, errChan chan<- error) { - defer wg.Done() - defer revListWriter.Close() - - stderr := new(bytes.Buffer) - var errbuf strings.Builder - cmd := git.NewCommand(ctx, "rev-list", "--objects", "--all") - if err := cmd.Run(&git.RunOpts{ - Dir: basePath, - Stdout: revListWriter, - Stderr: stderr, - }); err != nil { - log.Error("git rev-list --objects --all [%s]: %v - %s", basePath, err, errbuf.String()) - err = fmt.Errorf("git rev-list --objects --all [%s]: %w - %s", basePath, err, errbuf.String()) - _ = revListWriter.CloseWithError(err) - errChan <- err - } -} - // RevListObjects run rev-list --objects from headSHA to baseSHA func RevListObjects(ctx context.Context, revListWriter *io.PipeWriter, wg *sync.WaitGroup, tmpBasePath, headSHA, baseSHA string, errChan chan<- error) { defer wg.Done() diff --git a/modules/git/remote.go b/modules/git/remote.go index fb66d76ff0..83a02fe2be 100644 --- a/modules/git/remote.go +++ b/modules/git/remote.go @@ -12,14 +12,7 @@ import ( // GetRemoteAddress returns remote url of git repository in the repoPath with special remote name func GetRemoteAddress(ctx context.Context, repoPath, remoteName string) (string, error) { - var cmd *Command - if CheckGitVersionAtLeast("2.7") == nil { - cmd = NewCommand(ctx, "remote", "get-url").AddDynamicArguments(remoteName) - } else { - cmd = NewCommand(ctx, "config", "--get").AddDynamicArguments("remote." + remoteName + ".url") - } - - result, _, err := cmd.RunStdString(&RunOpts{Dir: repoPath}) + result, _, err := NewCommand(ctx, "remote", "get-url").AddDynamicArguments(remoteName).RunStdString(&RunOpts{Dir: repoPath}) if err != nil { return "", err } diff --git a/modules/git/repo_commit.go b/modules/git/repo_commit.go index 4c8516f828..41ca0e39b1 100644 --- a/modules/git/repo_commit.go +++ b/modules/git/repo_commit.go @@ -443,42 +443,18 @@ func (repo *Repository) getCommitsBeforeLimit(id ObjectID, num int) ([]*Commit, } func (repo *Repository) getBranches(commit *Commit, limit int) ([]string, error) { - if CheckGitVersionAtLeast("2.7.0") == nil { - command := NewCommand(repo.Ctx, "for-each-ref", "--format=%(refname:strip=2)").AddOptionValues("--contains", commit.ID.String(), BranchPrefix) + command := NewCommand(repo.Ctx, "for-each-ref", "--format=%(refname:strip=2)").AddOptionValues("--contains", commit.ID.String(), BranchPrefix) - if limit != -1 { - command = command.AddOptionFormat("--count=%d", limit) - } - - stdout, _, err := command.RunStdString(&RunOpts{Dir: repo.Path}) - if err != nil { - return nil, err - } - - branches := strings.Fields(stdout) - return branches, nil + if limit != -1 { + command = command.AddOptionFormat("--count=%d", limit) } - stdout, _, err := NewCommand(repo.Ctx, "branch").AddOptionValues("--contains", commit.ID.String()).RunStdString(&RunOpts{Dir: repo.Path}) + stdout, _, err := command.RunStdString(&RunOpts{Dir: repo.Path}) if err != nil { return nil, err } - refs := strings.Split(stdout, "\n") - - var max int - if len(refs) > limit { - max = limit - } else { - max = len(refs) - 1 - } - - branches := make([]string, max) - for i, ref := range refs[:max] { - parts := strings.Fields(ref) - - branches[i] = parts[len(parts)-1] - } + branches := strings.Fields(stdout) return branches, nil } diff --git a/modules/git/repo_commitgraph.go b/modules/git/repo_commitgraph.go index 492438be37..c3647bd894 100644 --- a/modules/git/repo_commitgraph.go +++ b/modules/git/repo_commitgraph.go @@ -11,10 +11,8 @@ import ( // WriteCommitGraph write commit graph to speed up repo access // this requires git v2.18 to be installed func WriteCommitGraph(ctx context.Context, repoPath string) error { - if CheckGitVersionAtLeast("2.18") == nil { - if _, _, err := NewCommand(ctx, "commit-graph", "write").RunStdString(&RunOpts{Dir: repoPath}); err != nil { - return fmt.Errorf("unable to write commit-graph for '%s' : %w", repoPath, err) - } + if _, _, err := NewCommand(ctx, "commit-graph", "write").RunStdString(&RunOpts{Dir: repoPath}); err != nil { + return fmt.Errorf("unable to write commit-graph for '%s' : %w", repoPath, err) } return nil } diff --git a/modules/lfs/pointer_scanner.go b/modules/lfs/pointer_scanner.go index 632ecd19ae..80da8e5222 100644 --- a/modules/lfs/pointer_scanner.go +++ b/modules/lfs/pointer_scanner.go @@ -39,16 +39,7 @@ func SearchPointerBlobs(ctx context.Context, repo *git.Repository, pointerChan c go pipeline.BlobsLessThan1024FromCatFileBatchCheck(catFileCheckReader, shasToBatchWriter, &wg) // 1. Run batch-check on all objects in the repository - if git.CheckGitVersionAtLeast("2.6.0") != nil { - revListReader, revListWriter := io.Pipe() - shasToCheckReader, shasToCheckWriter := io.Pipe() - wg.Add(2) - go pipeline.CatFileBatchCheck(ctx, shasToCheckReader, catFileCheckWriter, &wg, basePath) - go pipeline.BlobsFromRevListObjects(revListReader, shasToCheckWriter, &wg) - go pipeline.RevListAllObjects(ctx, revListWriter, &wg, basePath, errChan) - } else { - go pipeline.CatFileBatchCheckAllObjects(ctx, catFileCheckWriter, &wg, basePath, errChan) - } + go pipeline.CatFileBatchCheckAllObjects(ctx, catFileCheckWriter, &wg, basePath, errChan) wg.Wait() close(pointerChan) diff --git a/routers/private/hook_post_receive.go b/routers/private/hook_post_receive.go index c7748b01c8..a856a7a00a 100644 --- a/routers/private/hook_post_receive.go +++ b/routers/private/hook_post_receive.go @@ -205,7 +205,7 @@ func HookPostReceive(ctx *gitea_context.PrivateContext) { // post update for agit pull request // FIXME: use pr.Flow to test whether it's an Agit PR or a GH PR - if git.SupportProcReceive && refFullName.IsPull() { + if refFullName.IsPull() { if repo == nil { repo = loadRepository(ctx, ownerName, repoName) if ctx.Written() { diff --git a/routers/private/hook_pre_receive.go b/routers/private/hook_pre_receive.go index 4c0e9a8551..45992e8522 100644 --- a/routers/private/hook_pre_receive.go +++ b/routers/private/hook_pre_receive.go @@ -205,7 +205,7 @@ func HookPreReceive(ctx *gitea_context.PrivateContext) { preReceiveBranch(ourCtx, oldCommitID, newCommitID, refFullName) case refFullName.IsTag(): preReceiveTag(ourCtx, oldCommitID, newCommitID, refFullName) - case git.SupportProcReceive && refFullName.IsFor(): + case refFullName.IsFor(): preReceiveFor(ourCtx, oldCommitID, newCommitID, refFullName) default: if ourCtx.isOverQuota { diff --git a/routers/private/hook_proc_receive.go b/routers/private/hook_proc_receive.go index cd45794261..9f6e23f158 100644 --- a/routers/private/hook_proc_receive.go +++ b/routers/private/hook_proc_receive.go @@ -7,7 +7,6 @@ import ( "net/http" repo_model "forgejo.org/models/repo" - "forgejo.org/modules/git" "forgejo.org/modules/log" "forgejo.org/modules/private" "forgejo.org/modules/web" @@ -18,10 +17,6 @@ import ( // HookProcReceive proc-receive hook - only handles agit Proc-Receive requests at present func HookProcReceive(ctx *gitea_context.PrivateContext) { opts := web.GetForm(ctx).(*private.HookOptions) - if !git.SupportProcReceive { - ctx.Status(http.StatusNotFound) - return - } results, err := agit.ProcReceive(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, opts) if err != nil { diff --git a/routers/private/serv.go b/routers/private/serv.go index 4c5b7bbccb..a4029e354c 100644 --- a/routers/private/serv.go +++ b/routers/private/serv.go @@ -14,7 +14,6 @@ import ( repo_model "forgejo.org/models/repo" "forgejo.org/models/unit" user_model "forgejo.org/models/user" - "forgejo.org/modules/git" "forgejo.org/modules/log" "forgejo.org/modules/private" "forgejo.org/modules/setting" @@ -303,7 +302,7 @@ func ServCommand(ctx *context.PrivateContext) { // the permission check to read. The pre-receive hook will do another // permission check which ensure for non AGit flow references the write // permission is checked. - if git.SupportProcReceive && unitType == unit.TypeCode && ctx.FormString("verb") == "git-receive-pack" { + if unitType == unit.TypeCode && ctx.FormString("verb") == "git-receive-pack" { mode = perm.AccessModeRead } diff --git a/routers/web/misc/misc.go b/routers/web/misc/misc.go index 87b5247599..22fdccf79f 100644 --- a/routers/web/misc/misc.go +++ b/routers/web/misc/misc.go @@ -7,7 +7,6 @@ import ( "net/http" "path" - "forgejo.org/modules/git" "forgejo.org/modules/httpcache" "forgejo.org/modules/log" "forgejo.org/modules/setting" @@ -15,10 +14,6 @@ import ( ) func SSHInfo(rw http.ResponseWriter, req *http.Request) { - if !git.SupportProcReceive { - rw.WriteHeader(http.StatusNotFound) - return - } rw.Header().Set("content-type", "text/json;charset=UTF-8") _, err := rw.Write([]byte(`{"type":"agit","version":1}`)) if err != nil { diff --git a/routers/web/repo/githttp.go b/routers/web/repo/githttp.go index 650b1d88f4..42302d0e02 100644 --- a/routers/web/repo/githttp.go +++ b/routers/web/repo/githttp.go @@ -183,9 +183,7 @@ func httpBase(ctx *context.Context) *serviceHandler { if repoExist { // Because of special ref "refs/for" .. , need delay write permission check - if git.SupportProcReceive { - accessMode = perm.AccessModeRead - } + accessMode = perm.AccessModeRead if ctx.Data["IsActionsToken"] == true { taskID := ctx.Data["ActionsTaskID"].(int64) diff --git a/services/gitdiff/gitdiff.go b/services/gitdiff/gitdiff.go index 6835dfbf36..7033264f18 100644 --- a/services/gitdiff/gitdiff.go +++ b/services/gitdiff/gitdiff.go @@ -1157,7 +1157,7 @@ func GetDiffSimple(ctx context.Context, gitRepo *git.Repository, opts *DiffOptio // so if we are using at least this version of git we don't have to tell ParsePatch to do // the skipping for us parsePatchSkipToFile := opts.SkipTo - if opts.SkipTo != "" && git.CheckGitVersionAtLeast("2.31") == nil { + if opts.SkipTo != "" { cmdDiff.AddOptionFormat("--skip-to=%s", opts.SkipTo) parsePatchSkipToFile = "" } diff --git a/services/pull/temp_repo.go b/services/pull/temp_repo.go index 1805ffc527..76ae0df018 100644 --- a/services/pull/temp_repo.go +++ b/services/pull/temp_repo.go @@ -103,11 +103,7 @@ func createTemporaryRepoForPR(ctx context.Context, pr *issues_model.PullRequest) remoteRepoName := "head_repo" baseBranch := "base" - fetchArgs := git.TrustedCmdArgs{"--no-tags"} - if git.CheckGitVersionAtLeast("2.25.0") == nil { - // Writing the commit graph can be slow and is not needed here - fetchArgs = append(fetchArgs, "--no-write-commit-graph") - } + fetchArgs := git.TrustedCmdArgs{"--no-tags", "--no-write-commit-graph"} // addCacheRepo adds git alternatives for the cacheRepoPath in the repoPath addCacheRepo := func(repoPath, cacheRepoPath string) error { diff --git a/services/repository/files/patch.go b/services/repository/files/patch.go index 5b1dd65b5a..18b5226c02 100644 --- a/services/repository/files/patch.go +++ b/services/repository/files/patch.go @@ -147,11 +147,7 @@ func ApplyDiffPatch(ctx context.Context, repo *repo_model.Repository, doer *user stdout := &strings.Builder{} stderr := &strings.Builder{} - cmdApply := git.NewCommand(ctx, "apply", "--index", "--recount", "--cached", "--ignore-whitespace", "--whitespace=fix", "--binary") - if git.CheckGitVersionAtLeast("2.32") == nil { - cmdApply.AddArguments("-3") - } - + cmdApply := git.NewCommand(ctx, "apply", "--index", "--recount", "--cached", "--ignore-whitespace", "--whitespace=fix", "--binary", "-3") if err := cmdApply.Run(&git.RunOpts{ Dir: t.basePath, Stdout: stdout, diff --git a/tests/integration/git_test.go b/tests/integration/git_test.go index 9a66781024..26cddf7288 100644 --- a/tests/integration/git_test.go +++ b/tests/integration/git_test.go @@ -771,11 +771,6 @@ func doCreateAgitFlowPull(dstPath string, ctx *APITestContext, headBranch string return func(t *testing.T) { defer tests.PrintCurrentTest(t)() - // skip this test if git version is low - if git.CheckGitVersionAtLeast("2.29") != nil { - return - } - gitRepo, err := git.OpenRepository(git.DefaultContext, dstPath) require.NoError(t, err) diff --git a/tests/integration/repo_signed_tag_test.go b/tests/integration/repo_signed_tag_test.go index 686690bd19..16d8841304 100644 --- a/tests/integration/repo_signed_tag_test.go +++ b/tests/integration/repo_signed_tag_test.go @@ -25,10 +25,6 @@ import ( ) func TestRepoSSHSignedTags(t *testing.T) { - if git.CheckGitVersionAtLeast("2.34") != nil { - t.Skip("Skipping, does not support SSH signing") - return - } defer tests.PrepareTestEnv(t)() // Preparations diff --git a/tests/integration/signing_git_test.go b/tests/integration/signing_git_test.go index e4c0d6049b..8b6b30ecab 100644 --- a/tests/integration/signing_git_test.go +++ b/tests/integration/signing_git_test.go @@ -42,10 +42,6 @@ func TestInstanceSigning(t *testing.T) { defer test.MockProtect(&setting.Repository.Signing.CRUDActions)() t.Run("SSH", func(t *testing.T) { - if git.CheckGitVersionAtLeast("2.34") != nil { - t.Skip("Skipping, does not support git SSH signing") - return - } defer tests.PrintCurrentTest(t)() pubKeyContent, err := os.ReadFile("tests/integration/ssh-signing-key.pub") From 14309837d41851ab0a33be3e6ebb928e0028cd95 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 29 Jun 2025 02:52:27 +0200 Subject: [PATCH 040/495] Update module github.com/niklasfasching/go-org to v1.9.0 (forgejo) (#8335) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8335 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 510ec9c3ae..33ad5dbc67 100644 --- a/go.mod +++ b/go.mod @@ -79,7 +79,7 @@ require ( github.com/minio/minio-go/v7 v7.0.94 github.com/msteinert/pam/v2 v2.1.0 github.com/nektos/act v0.2.52 - github.com/niklasfasching/go-org v1.8.0 + github.com/niklasfasching/go-org v1.9.0 github.com/olivere/elastic/v7 v7.0.32 github.com/opencontainers/go-digest v1.0.0 github.com/opencontainers/image-spec v1.1.1 diff --git a/go.sum b/go.sum index 53558fddd7..45497a1b49 100644 --- a/go.sum +++ b/go.sum @@ -426,8 +426,8 @@ github.com/msteinert/pam/v2 v2.1.0 h1:er5F9TKV5nGFuTt12ubtqPHEUdeBwReP7vd3wovidG github.com/msteinert/pam/v2 v2.1.0/go.mod h1:KT28NNIcDFf3PcBmNI2mIGO4zZJ+9RSs/At2PB3IDVc= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/niklasfasching/go-org v1.8.0 h1:WyGLaajLLp8JbQzkmapZ1y0MOzKuKV47HkZRloi+HGY= -github.com/niklasfasching/go-org v1.8.0/go.mod h1:e2A9zJs7cdONrEGs3gvxCcaAEpwwPNPG7csDpXckMNg= +github.com/niklasfasching/go-org v1.9.0 h1:4/Sr68Qx06hjC9MVDB/4etGP67JionLHGscLMOClpnk= +github.com/niklasfasching/go-org v1.9.0/go.mod h1:ZAGFFkWvUQcpazmi/8nHqwvARpr1xpb+Es67oUGX/48= github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc= github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= From b6c6981c300b632c8cad1d77bae2184e68aa138a Mon Sep 17 00:00:00 2001 From: Mathieu Fenniak Date: Sun, 29 Jun 2025 05:54:07 +0200 Subject: [PATCH 041/495] feat(ui): add repository description to og:image:alt (#8325) Followup to https://codeberg.org/forgejo/forgejo/pulls/6053 Adds the repository description to the "alt" tag of the OpenGraph summary card, improving accessibility when these images are displayed. Fixes #8192. Other summary cards, for issues and releases, are not modified as they already contain the issue title or release title, which seems reasonable. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8325 Reviewed-by: Gusted Reviewed-by: 0ko <0ko@noreply.codeberg.org> Co-authored-by: Mathieu Fenniak Co-committed-by: Mathieu Fenniak --- options/locale_next/locale_en-US.json | 1 + services/context/repo.go | 6 +++++- tests/integration/opengraph_test.go | 4 ++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/options/locale_next/locale_en-US.json b/options/locale_next/locale_en-US.json index b1c98e4551..a551db87dc 100644 --- a/options/locale_next/locale_en-US.json +++ b/options/locale_next/locale_en-US.json @@ -102,5 +102,6 @@ "admin.dashboard.cleanup_offline_runners": "Cleanup offline runners", "settings.visibility.description": "Profile visibility affects others' ability to access your non-private repositories. Learn more", "avatar.constraints_hint": "Custom avatar may not exceed %[1]s in size or be larger than %[2]dx%[3]d pixels", + "og.repo.summary_card.alt_description": "Summary card of repository %[1]s, described as: %[2]s", "meta.last_line": "Thank you for translating Forgejo! This line isn't seen by the users but it serves other purposes in the translation management. You can place a fun fact in the translation instead of translating it." } diff --git a/services/context/repo.go b/services/context/repo.go index cce3a5fa70..c8876d7166 100644 --- a/services/context/repo.go +++ b/services/context/repo.go @@ -644,7 +644,11 @@ func RepoAssignment(ctx *Context) context.CancelFunc { ctx.Data["OpenGraphImageURL"] = repo.SummaryCardURL() ctx.Data["OpenGraphImageWidth"] = cardWidth ctx.Data["OpenGraphImageHeight"] = cardHeight - ctx.Data["OpenGraphImageAltText"] = ctx.Tr("repo.summary_card_alt", repo.FullName()) + if util.IsEmptyString(repo.Description) { + ctx.Data["OpenGraphImageAltText"] = ctx.Tr("repo.summary_card_alt", repo.FullName()) + } else { + ctx.Data["OpenGraphImageAltText"] = ctx.Tr("og.repo.summary_card.alt_description", repo.FullName(), repo.Description) + } if repo.IsFork { RetrieveBaseRepo(ctx, repo) diff --git a/tests/integration/opengraph_test.go b/tests/integration/opengraph_test.go index 56fbedd351..aa6d8daf5c 100644 --- a/tests/integration/opengraph_test.go +++ b/tests/integration/opengraph_test.go @@ -98,7 +98,7 @@ func TestOpenGraphProperties(t *testing.T) { "og:url": setting.AppURL + "/user27/repo49/src/branch/master/test/test.txt", "og:type": "object", "og:image": setting.AppURL + "user27/repo49/-/summary-card", - "og:image:alt": "Summary card of repository user27/repo49", + "og:image:alt": "Summary card of repository user27/repo49, described as: A wonderful repository with more than just a README.md", "og:image:width": "1200", "og:image:height": "600", "og:site_name": siteName, @@ -141,7 +141,7 @@ func TestOpenGraphProperties(t *testing.T) { "og:description": "A wonderful repository with more than just a README.md", "og:type": "object", "og:image": setting.AppURL + "user27/repo49/-/summary-card", - "og:image:alt": "Summary card of repository user27/repo49", + "og:image:alt": "Summary card of repository user27/repo49, described as: A wonderful repository with more than just a README.md", "og:image:width": "1200", "og:image:height": "600", "og:site_name": siteName, From 84ed8aa740057ce9d399c9a79c36f50c33484cbe Mon Sep 17 00:00:00 2001 From: Gusted Date: Sun, 29 Jun 2025 08:06:38 +0200 Subject: [PATCH 042/495] chore: use standard library function (#8334) - As mentioned in the comment, use the standard library function now its available. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8334 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- modules/git/repo_attribute_test.go | 32 +----------------------------- 1 file changed, 1 insertion(+), 31 deletions(-) diff --git a/modules/git/repo_attribute_test.go b/modules/git/repo_attribute_test.go index c69382e245..3d2c845fa0 100644 --- a/modules/git/repo_attribute_test.go +++ b/modules/git/repo_attribute_test.go @@ -5,7 +5,6 @@ package git import ( "context" - "fmt" "io" "io/fs" "os" @@ -197,7 +196,7 @@ func TestGitAttributeCheckerError(t *testing.T) { path := t.TempDir() // we can't use unittest.CopyDir because of an import cycle (git.Init in unittest) - require.NoError(t, CopyFS(path, os.DirFS(filepath.Join(testReposDir, "language_stats_repo")))) + require.NoError(t, os.CopyFS(path, os.DirFS(filepath.Join(testReposDir, "language_stats_repo")))) gitRepo, err := openRepositoryWithDefaultContext(path) require.NoError(t, err) @@ -324,32 +323,3 @@ func TestGitAttributeCheckerError(t *testing.T) { require.ErrorIs(t, err, fs.ErrClosed) }) } - -// CopyFS is adapted from https://github.com/golang/go/issues/62484 -// which should be available with go1.23 -func CopyFS(dir string, fsys fs.FS) error { - return fs.WalkDir(fsys, ".", func(path string, d fs.DirEntry, _ error) error { - targ := filepath.Join(dir, filepath.FromSlash(path)) - if d.IsDir() { - return os.MkdirAll(targ, 0o777) - } - r, err := fsys.Open(path) - if err != nil { - return err - } - defer r.Close() - info, err := r.Stat() - if err != nil { - return err - } - w, err := os.OpenFile(targ, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0o666|info.Mode()&0o777) - if err != nil { - return err - } - if _, err := io.Copy(w, r); err != nil { - w.Close() - return fmt.Errorf("copying %s: %v", path, err) - } - return w.Close() - }) -} From 33217a36332f9af270aea0366707083a63f6a525 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 29 Jun 2025 09:37:43 +0200 Subject: [PATCH 043/495] Update dependency @stylistic/stylelint-plugin to v3.1.3 (forgejo) (#8336) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 12 ++++++------ package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 604ff38c18..8ddc99ff5d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,7 +66,7 @@ "@playwright/test": "1.52.0", "@stoplight/spectral-cli": "6.15.0", "@stylistic/eslint-plugin": "4.4.1", - "@stylistic/stylelint-plugin": "3.1.2", + "@stylistic/stylelint-plugin": "3.1.3", "@vitejs/plugin-vue": "5.2.4", "@vitest/coverage-v8": "3.2.3", "@vitest/eslint-plugin": "1.2.2", @@ -3089,9 +3089,9 @@ } }, "node_modules/@stylistic/stylelint-plugin": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.1.2.tgz", - "integrity": "sha512-tylFJGMQo62alGazK74MNxFjMagYOHmBZiePZFOJK2n13JZta0uVkB3Bh5qodUmOLtRH+uxH297EibK14UKm8g==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.1.3.tgz", + "integrity": "sha512-85fsmzgsIVmyG3/GFrjuYj6Cz8rAM7IZiPiXCMiSMfoDOC1lOrzrXPDk24WqviAghnPqGpx8b0caK2PuewWGFg==", "dev": true, "license": "MIT", "dependencies": { @@ -3099,10 +3099,10 @@ "@csstools/css-tokenizer": "^3.0.1", "@csstools/media-query-list-parser": "^3.0.1", "is-plain-object": "^5.0.0", + "postcss": "^8.4.41", "postcss-selector-parser": "^6.1.2", "postcss-value-parser": "^4.2.0", - "style-search": "^0.1.0", - "stylelint": "^16.8.2" + "style-search": "^0.1.0" }, "engines": { "node": "^18.12 || >=20.9" diff --git a/package.json b/package.json index 3d71e94cd3..90023d762e 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "@playwright/test": "1.52.0", "@stoplight/spectral-cli": "6.15.0", "@stylistic/eslint-plugin": "4.4.1", - "@stylistic/stylelint-plugin": "3.1.2", + "@stylistic/stylelint-plugin": "3.1.3", "@vitejs/plugin-vue": "5.2.4", "@vitest/coverage-v8": "3.2.3", "@vitest/eslint-plugin": "1.2.2", From ad1adabcbb72e81e513e4a9232a74fe901e78aa8 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 29 Jun 2025 09:37:44 +0200 Subject: [PATCH 044/495] Update linters (forgejo) (#8338) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 414 ++++++++++++++++++++++------------------------ package.json | 12 +- 2 files changed, 207 insertions(+), 219 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8ddc99ff5d..85d4401889 100644 --- a/package-lock.json +++ b/package-lock.json @@ -71,15 +71,15 @@ "@vitest/coverage-v8": "3.2.3", "@vitest/eslint-plugin": "1.2.2", "@vue/test-utils": "2.4.6", - "eslint": "9.28.0", - "eslint-import-resolver-typescript": "4.4.3", + "eslint": "9.30.0", + "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-array-func": "5.0.2", - "eslint-plugin-import-x": "4.15.1", + "eslint-plugin-import-x": "4.16.1", "eslint-plugin-no-jquery": "3.1.1", "eslint-plugin-no-use-extend-native": "0.7.2", "eslint-plugin-playwright": "2.2.0", "eslint-plugin-regexp": "2.9.0", - "eslint-plugin-sonarjs": "3.0.2", + "eslint-plugin-sonarjs": "3.0.4", "eslint-plugin-toml": "0.12.0", "eslint-plugin-unicorn": "59.0.1", "eslint-plugin-vitest-globals": "1.5.0", @@ -92,13 +92,13 @@ "markdownlint-cli": "0.45.0", "postcss-html": "1.8.0", "sharp": "0.34.2", - "stylelint": "16.20.0", + "stylelint": "16.21.0", "stylelint-declaration-block-no-ignored-properties": "2.8.0", "stylelint-declaration-strict-value": "1.10.11", "stylelint-value-no-unknown-custom-properties": "6.0.1", "svgo": "3.2.0", "typescript": "5.8.3", - "typescript-eslint": "8.34.0", + "typescript-eslint": "8.35.0", "vite-string-plugin": "1.3.4", "vitest": "3.2.3" }, @@ -1021,9 +1021,9 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz", - "integrity": "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1049,9 +1049,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.3.tgz", - "integrity": "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", + "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1146,9 +1146,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.28.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.28.0.tgz", - "integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==", + "version": "9.30.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.30.0.tgz", + "integrity": "sha512-Wzw3wQwPvc9sHM+NjakWTcPx11mbZyiYHuwWa/QfZ7cIRX7WK54PSk7bdyXDaoaopUcMatv1zaQvOAAO8hCdww==", "dev": true, "license": "MIT", "engines": { @@ -3561,17 +3561,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.34.0.tgz", - "integrity": "sha512-QXwAlHlbcAwNlEEMKQS2RCgJsgXrTJdjXT08xEgbPFa2yYQgVjBymxP5DrfrE7X7iodSzd9qBUHUycdyVJTW1w==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.0.tgz", + "integrity": "sha512-ijItUYaiWuce0N1SoSMrEd0b6b6lYkYt99pqCPfybd+HKVXtEvYhICfLdwp42MhiI5mp0oq7PKEL+g1cNiz/Eg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.34.0", - "@typescript-eslint/type-utils": "8.34.0", - "@typescript-eslint/utils": "8.34.0", - "@typescript-eslint/visitor-keys": "8.34.0", + "@typescript-eslint/scope-manager": "8.35.0", + "@typescript-eslint/type-utils": "8.35.0", + "@typescript-eslint/utils": "8.35.0", + "@typescript-eslint/visitor-keys": "8.35.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -3585,7 +3585,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.34.0", + "@typescript-eslint/parser": "^8.35.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } @@ -3601,16 +3601,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.34.0.tgz", - "integrity": "sha512-vxXJV1hVFx3IXz/oy2sICsJukaBrtDEQSBiV48/YIV5KWjX1dO+bcIr/kCPrW6weKXvsaGKFNlwH0v2eYdRRbA==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.0.tgz", + "integrity": "sha512-6sMvZePQrnZH2/cJkwRpkT7DxoAWh+g6+GFRK6bV3YQo7ogi3SX5rgF6099r5Q53Ma5qeT7LGmOmuIutF4t3lA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.34.0", - "@typescript-eslint/types": "8.34.0", - "@typescript-eslint/typescript-estree": "8.34.0", - "@typescript-eslint/visitor-keys": "8.34.0", + "@typescript-eslint/scope-manager": "8.35.0", + "@typescript-eslint/types": "8.35.0", + "@typescript-eslint/typescript-estree": "8.35.0", + "@typescript-eslint/visitor-keys": "8.35.0", "debug": "^4.3.4" }, "engines": { @@ -3626,14 +3626,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.34.0.tgz", - "integrity": "sha512-iEgDALRf970/B2YExmtPMPF54NenZUf4xpL3wsCRx/lgjz6ul/l13R81ozP/ZNuXfnLCS+oPmG7JIxfdNYKELw==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.0.tgz", + "integrity": "sha512-41xatqRwWZuhUMF/aZm2fcUsOFKNcG28xqRSS6ZVr9BVJtGExosLAm5A1OxTjRMagx8nJqva+P5zNIGt8RIgbQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.34.0", - "@typescript-eslint/types": "^8.34.0", + "@typescript-eslint/tsconfig-utils": "^8.35.0", + "@typescript-eslint/types": "^8.35.0", "debug": "^4.3.4" }, "engines": { @@ -3648,14 +3648,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.34.0.tgz", - "integrity": "sha512-9Ac0X8WiLykl0aj1oYQNcLZjHgBojT6cW68yAgZ19letYu+Hxd0rE0veI1XznSSst1X5lwnxhPbVdwjDRIomRw==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.0.tgz", + "integrity": "sha512-+AgL5+mcoLxl1vGjwNfiWq5fLDZM1TmTPYs2UkyHfFhgERxBbqHlNjRzhThJqz+ktBqTChRYY6zwbMwy0591AA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.34.0", - "@typescript-eslint/visitor-keys": "8.34.0" + "@typescript-eslint/types": "8.35.0", + "@typescript-eslint/visitor-keys": "8.35.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3666,9 +3666,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.34.0.tgz", - "integrity": "sha512-+W9VYHKFIzA5cBeooqQxqNriAP0QeQ7xTiDuIOr71hzgffm3EL2hxwWBIIj4GuofIbKxGNarpKqIq6Q6YrShOA==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.0.tgz", + "integrity": "sha512-04k/7247kZzFraweuEirmvUj+W3bJLI9fX6fbo1Qm2YykuBvEhRTPl8tcxlYO8kZZW+HIXfkZNoasVb8EV4jpA==", "dev": true, "license": "MIT", "engines": { @@ -3683,14 +3683,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.34.0.tgz", - "integrity": "sha512-n7zSmOcUVhcRYC75W2pnPpbO1iwhJY3NLoHEtbJwJSNlVAZuwqu05zY3f3s2SDWWDSo9FdN5szqc73DCtDObAg==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.0.tgz", + "integrity": "sha512-ceNNttjfmSEoM9PW87bWLDEIaLAyR+E6BoYJQ5PfaDau37UGca9Nyq3lBk8Bw2ad0AKvYabz6wxc7DMTO2jnNA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.34.0", - "@typescript-eslint/utils": "8.34.0", + "@typescript-eslint/typescript-estree": "8.35.0", + "@typescript-eslint/utils": "8.35.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -3707,9 +3707,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.34.0.tgz", - "integrity": "sha512-9V24k/paICYPniajHfJ4cuAWETnt7Ssy+R0Rbcqo5sSFr3QEZ/8TSoUi9XeXVBGXCaLtwTOKSLGcInCAvyZeMA==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.0.tgz", + "integrity": "sha512-0mYH3emanku0vHw2aRLNGqe7EXh9WHEhi7kZzscrMDf6IIRUQ5Jk4wp1QrledE/36KtdZrVfKnE32eZCf/vaVQ==", "dev": true, "license": "MIT", "engines": { @@ -3721,16 +3721,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.34.0.tgz", - "integrity": "sha512-rOi4KZxI7E0+BMqG7emPSK1bB4RICCpF7QD3KCLXn9ZvWoESsOMlHyZPAHyG04ujVplPaHbmEvs34m+wjgtVtg==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.0.tgz", + "integrity": "sha512-F+BhnaBemgu1Qf8oHrxyw14wq6vbL8xwWKKMwTMwYIRmFFY/1n/9T/jpbobZL8vp7QyEUcC6xGrnAO4ua8Kp7w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.34.0", - "@typescript-eslint/tsconfig-utils": "8.34.0", - "@typescript-eslint/types": "8.34.0", - "@typescript-eslint/visitor-keys": "8.34.0", + "@typescript-eslint/project-service": "8.35.0", + "@typescript-eslint/tsconfig-utils": "8.35.0", + "@typescript-eslint/types": "8.35.0", + "@typescript-eslint/visitor-keys": "8.35.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3783,16 +3783,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.34.0.tgz", - "integrity": "sha512-8L4tWatGchV9A1cKbjaavS6mwYwp39jql8xUmIIKJdm+qiaeHy5KMKlBrf30akXAWBzn2SqKsNOtSENWUwg7XQ==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.0.tgz", + "integrity": "sha512-nqoMu7WWM7ki5tPgLVsmPM8CkqtoPUG6xXGeefM5t4x3XumOEKMoUZPdi+7F+/EotukN4R9OWdmDxN80fqoZeg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.34.0", - "@typescript-eslint/types": "8.34.0", - "@typescript-eslint/typescript-estree": "8.34.0" + "@typescript-eslint/scope-manager": "8.35.0", + "@typescript-eslint/types": "8.35.0", + "@typescript-eslint/typescript-estree": "8.35.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3807,14 +3807,14 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.34.0.tgz", - "integrity": "sha512-qHV7pW7E85A0x6qyrFn+O+q1k1p3tQCsqIZ1KZ5ESLXY57aTvUd3/a4rdPTeXisvhXn2VQG0VSKUqs8KHF2zcA==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.0.tgz", + "integrity": "sha512-zTh2+1Y8ZpmeQaQVIc/ZZxsx8UzgKJyNg1PTvjzC7WMhPSVS8bfDX34k1SrwOf016qd5RU3az2UxUNue3IfQ5g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.34.0", - "eslint-visitor-keys": "^4.2.0" + "@typescript-eslint/types": "8.35.0", + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3825,9 +3825,9 @@ } }, "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.9.1.tgz", - "integrity": "sha512-dd7yIp1hfJFX9ZlVLQRrh/Re9WMUHHmF9hrKD1yIvxcyNr2BhQ3xc1upAVhy8NijadnCswAxWQu8MkkSMC1qXQ==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.9.2.tgz", + "integrity": "sha512-tS+lqTU3N0kkthU+rYp0spAYq15DU8ld9kXkaKg9sbQqJNF+WPMuNHZQGCgdxrUOEO0j22RKMwRVhF1HTl+X8A==", "cpu": [ "arm" ], @@ -3839,9 +3839,9 @@ ] }, "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.9.1.tgz", - "integrity": "sha512-EzUPcMFtDVlo5yrbzMqUsGq3HnLXw+3ZOhSd7CUaDmbTtnrzM+RO2ntw2dm2wjbbc5djWj3yX0wzbbg8pLhx8g==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.9.2.tgz", + "integrity": "sha512-MffGiZULa/KmkNjHeuuflLVqfhqLv1vZLm8lWIyeADvlElJ/GLSOkoUX+5jf4/EGtfwrNFcEaB8BRas03KT0/Q==", "cpu": [ "arm64" ], @@ -3853,9 +3853,9 @@ ] }, "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.9.1.tgz", - "integrity": "sha512-nB+dna3q4kOleKFcSZJ/wDXIsAd1kpMO9XrVAt8tG3RDWJ6vi+Ic6bpz4cmg5tWNeCfHEY4KuqJCB+pKejPEmQ==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.9.2.tgz", + "integrity": "sha512-dzJYK5rohS1sYl1DHdJ3mwfwClJj5BClQnQSyAgEfggbUwA9RlROQSSbKBLqrGfsiC/VyrDPtbO8hh56fnkbsQ==", "cpu": [ "arm64" ], @@ -3867,9 +3867,9 @@ ] }, "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.9.1.tgz", - "integrity": "sha512-aKWHCrOGaCGwZcekf3TnczQoBxk5w//W3RZ4EQyhux6rKDwBPgDU9Y2yGigCV1Z+8DWqZgVGQi+hdpnlSy3a1w==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.9.2.tgz", + "integrity": "sha512-gaIMWK+CWtXcg9gUyznkdV54LzQ90S3X3dn8zlh+QR5Xy7Y+Efqw4Rs4im61K1juy4YNb67vmJsCDAGOnIeffQ==", "cpu": [ "x64" ], @@ -3881,9 +3881,9 @@ ] }, "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.9.1.tgz", - "integrity": "sha512-4dIEMXrXt0UqDVgrsUd1I+NoIzVQWXy/CNhgpfS75rOOMK/4Abn0Mx2M2gWH4Mk9+ds/ASAiCmqoUFynmMY5hA==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.9.2.tgz", + "integrity": "sha512-S7QpkMbVoVJb0xwHFwujnwCAEDe/596xqY603rpi/ioTn9VDgBHnCCxh+UFrr5yxuMH+dliHfjwCZJXOPJGPnw==", "cpu": [ "x64" ], @@ -3895,9 +3895,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.9.1.tgz", - "integrity": "sha512-vtvS13IXPs1eE8DuS/soiosqMBeyh50YLRZ+p7EaIKAPPeevRnA9G/wu/KbVt01ZD5qiGjxS+CGIdVC7I6gTOw==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.9.2.tgz", + "integrity": "sha512-+XPUMCuCCI80I46nCDFbGum0ZODP5NWGiwS3Pj8fOgsG5/ctz+/zzuBlq/WmGa+EjWZdue6CF0aWWNv84sE1uw==", "cpu": [ "arm" ], @@ -3909,9 +3909,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.9.1.tgz", - "integrity": "sha512-BfdnN6aZ7NcX8djW8SR6GOJc+K+sFhWRF4vJueVE0vbUu5N1bLnBpxJg1TGlhSyo+ImC4SR0jcNiKN0jdoxt+A==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.9.2.tgz", + "integrity": "sha512-sqvUyAd1JUpwbz33Ce2tuTLJKM+ucSsYpPGl2vuFwZnEIg0CmdxiZ01MHQ3j6ExuRqEDUCy8yvkDKvjYFPb8Zg==", "cpu": [ "arm" ], @@ -3923,9 +3923,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.9.1.tgz", - "integrity": "sha512-Jhge7lFtH0QqfRz2PyJjJXWENqywPteITd+nOS0L6AhbZli+UmEyGBd2Sstt1c+l9C+j/YvKTl9wJo9PPmsFNg==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.9.2.tgz", + "integrity": "sha512-UYA0MA8ajkEDCFRQdng/FVx3F6szBvk3EPnkTTQuuO9lV1kPGuTB+V9TmbDxy5ikaEgyWKxa4CI3ySjklZ9lFA==", "cpu": [ "arm64" ], @@ -3937,9 +3937,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.9.1.tgz", - "integrity": "sha512-ofdK/ow+ZSbSU0pRoB7uBaiRHeaAOYQFU5Spp87LdcPL/P1RhbCTMSIYVb61XWzsVEmYKjHFtoIE0wxP6AFvrA==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.9.2.tgz", + "integrity": "sha512-P/CO3ODU9YJIHFqAkHbquKtFst0COxdphc8TKGL5yCX75GOiVpGqd1d15ahpqu8xXVsqP4MGFP2C3LRZnnL5MA==", "cpu": [ "arm64" ], @@ -3951,9 +3951,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.9.1.tgz", - "integrity": "sha512-eC8SXVn8de67HacqU7PoGdHA+9tGbqfEdD05AEFRAB81ejeQtNi5Fx7lPcxpLH79DW0BnMAHau3hi4RVkHfSCw==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.9.2.tgz", + "integrity": "sha512-uKStFlOELBxBum2s1hODPtgJhY4NxYJE9pAeyBgNEzHgTqTiVBPjfTlPFJkfxyTjQEuxZbbJlJnMCrRgD7ubzw==", "cpu": [ "ppc64" ], @@ -3965,9 +3965,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.9.1.tgz", - "integrity": "sha512-fIkwvAAQ41kfoGWfzeJ33iLGShl0JEDZHrMnwTHMErUcPkaaZRJYjQjsFhMl315NEQ4mmTlC+2nfK/J2IszDOw==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.9.2.tgz", + "integrity": "sha512-LkbNnZlhINfY9gK30AHs26IIVEZ9PEl9qOScYdmY2o81imJYI4IMnJiW0vJVtXaDHvBvxeAgEy5CflwJFIl3tQ==", "cpu": [ "riscv64" ], @@ -3979,9 +3979,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.9.1.tgz", - "integrity": "sha512-RAAszxImSOFLk44aLwnSqpcOdce8sBcxASledSzuFAd8Q5ZhhVck472SisspnzHdc7THCvGXiUeZ2hOC7NUoBQ==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.9.2.tgz", + "integrity": "sha512-vI+e6FzLyZHSLFNomPi+nT+qUWN4YSj8pFtQZSFTtmgFoxqB6NyjxSjAxEC1m93qn6hUXhIsh8WMp+fGgxCoRg==", "cpu": [ "riscv64" ], @@ -3993,9 +3993,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.9.1.tgz", - "integrity": "sha512-QoP9vkY+THuQdZi05bA6s6XwFd6HIz3qlx82v9bTOgxeqin/3C12Ye7f7EOD00RQ36OtOPWnhEMMm84sv7d1XQ==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.9.2.tgz", + "integrity": "sha512-sSO4AlAYhSM2RAzBsRpahcJB1msc6uYLAtP6pesPbZtptF8OU/CbCPhSRW6cnYOGuVmEmWVW5xVboAqCnWTeHQ==", "cpu": [ "s390x" ], @@ -4007,9 +4007,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.9.1.tgz", - "integrity": "sha512-/p77cGN/h9zbsfCseAP5gY7tK+7+DdM8fkPfr9d1ye1fsF6bmtGbtZN6e/8j4jCZ9NEIBBkT0GhdgixSelTK9g==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.9.2.tgz", + "integrity": "sha512-jkSkwch0uPFva20Mdu8orbQjv2A3G88NExTN2oPTI1AJ+7mZfYW3cDCTyoH6OnctBKbBVeJCEqh0U02lTkqD5w==", "cpu": [ "x64" ], @@ -4021,9 +4021,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.9.1.tgz", - "integrity": "sha512-wInTqT3Bu9u50mDStEig1v8uxEL2Ht+K8pir/YhyyrM5ordJtxoqzsL1vR/CQzOJuDunUTrDkMM0apjW/d7/PA==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.9.2.tgz", + "integrity": "sha512-Uk64NoiTpQbkpl+bXsbeyOPRpUoMdcUqa+hDC1KhMW7aN1lfW8PBlBH4mJ3n3Y47dYE8qi0XTxy1mBACruYBaw==", "cpu": [ "x64" ], @@ -4035,9 +4035,9 @@ ] }, "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.9.1.tgz", - "integrity": "sha512-eNwqO5kUa+1k7yFIircwwiniKWA0UFHo2Cfm8LYgkh9km7uMad+0x7X7oXbQonJXlqfitBTSjhA0un+DsHIrhw==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.9.2.tgz", + "integrity": "sha512-EpBGwkcjDicjR/ybC0g8wO5adPNdVuMrNalVgYcWi+gYtC1XYNuxe3rufcO7dA76OHGeVabcO6cSkPJKVcbCXQ==", "cpu": [ "wasm32" ], @@ -4052,9 +4052,9 @@ } }, "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.9.1.tgz", - "integrity": "sha512-Eaz1xMUnoa2mFqh20mPqSdbYl6crnk8HnIXDu6nsla9zpgZJZO8w3c1gvNN/4Eb0RXRq3K9OG6mu8vw14gIqiA==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.9.2.tgz", + "integrity": "sha512-EdFbGn7o1SxGmN6aZw9wAkehZJetFPao0VGZ9OMBwKx6TkvDuj6cNeLimF/Psi6ts9lMOe+Dt6z19fZQ9Ye2fw==", "cpu": [ "arm64" ], @@ -4066,9 +4066,9 @@ ] }, "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.9.1.tgz", - "integrity": "sha512-H/+d+5BGlnEQif0gnwWmYbYv7HJj563PUKJfn8PlmzF8UmF+8KxdvXdwCsoOqh4HHnENnoLrav9NYBrv76x1wQ==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.9.2.tgz", + "integrity": "sha512-JY9hi1p7AG+5c/dMU8o2kWemM8I6VZxfGwn1GCtf3c5i+IKcMo2NQ8OjZ4Z3/itvY/Si3K10jOBQn7qsD/whUA==", "cpu": [ "ia32" ], @@ -4080,9 +4080,9 @@ ] }, "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.9.1.tgz", - "integrity": "sha512-rS86wI4R6cknYM3is3grCb/laE8XBEbpWAMSIPjYfmYp75KL5dT87jXF2orDa4tQYg5aajP5G8Fgh34dRyR+Rw==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.9.2.tgz", + "integrity": "sha512-ryoo+EB19lMxAd80ln9BVf8pdOAxLb97amrQ3SFN9OCRn/5M5wvwDgAe4i8ZjhpbiHoDeP8yavcTEnpKBo7lZg==", "cpu": [ "x64" ], @@ -7262,19 +7262,19 @@ } }, "node_modules/eslint": { - "version": "9.28.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.28.0.tgz", - "integrity": "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==", + "version": "9.30.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.30.0.tgz", + "integrity": "sha512-iN/SiPxmQu6EVkf+m1qpBxzUhE12YqFLOSySuOyVLJLEF9nzTf+h/1AJYc1JWzCnktggeNrjvQGLngDzXirU6g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.20.0", - "@eslint/config-helpers": "^0.2.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.0", "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.30.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -7286,9 +7286,9 @@ "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.3.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -7339,14 +7339,14 @@ } }, "node_modules/eslint-import-context": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.8.tgz", - "integrity": "sha512-bq+F7nyc65sKpZGT09dY0S0QrOnQtuDVIfyTGQ8uuvtMIF7oHp6CEP3mouN0rrnYF3Jqo6Ke0BfU/5wASZue1w==", + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.9.tgz", + "integrity": "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==", "dev": true, "license": "MIT", "dependencies": { "get-tsconfig": "^4.10.1", - "stable-hash-x": "^0.1.1" + "stable-hash-x": "^0.2.0" }, "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" @@ -7364,9 +7364,9 @@ } }, "node_modules/eslint-import-resolver-typescript": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.3.tgz", - "integrity": "sha512-elVDn1eWKFrWlzxlWl9xMt8LltjKl161Ix50JFC50tHXI5/TRP32SNEqlJ/bo/HV+g7Rou/tlPQU2AcRtIhrOg==", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.4.tgz", + "integrity": "sha512-1iM2zeBvrYmUNTj2vSC/90JTHDth+dfOfiNKkxApWRsTJYNrc8rOdxxIf5vazX+BiAXTeOT0UvWpGI/7qIWQOw==", "dev": true, "license": "ISC", "dependencies": { @@ -7374,7 +7374,7 @@ "eslint-import-context": "^0.1.8", "get-tsconfig": "^4.10.1", "is-bun-module": "^2.0.0", - "stable-hash-x": "^0.1.1", + "stable-hash-x": "^0.2.0", "tinyglobby": "^0.2.14", "unrs-resolver": "^1.7.11" }, @@ -7412,21 +7412,21 @@ } }, "node_modules/eslint-plugin-import-x": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.15.1.tgz", - "integrity": "sha512-JfVpNg1qMkPD66iaSgmMoSYeUCGS8UFSm3GwHV0IbuV3Knar/SyK5qqCct9+AxoMIzaM+KSO7KK5pOeOkC/3GQ==", + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.16.1.tgz", + "integrity": "sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "^8.33.1", + "@typescript-eslint/types": "^8.35.0", "comment-parser": "^1.4.1", "debug": "^4.4.1", - "eslint-import-context": "^0.1.7", + "eslint-import-context": "^0.1.9", "is-glob": "^4.0.3", "minimatch": "^9.0.3 || ^10.0.1", "semver": "^7.7.2", - "stable-hash-x": "^0.1.1", - "unrs-resolver": "^1.7.10" + "stable-hash-x": "^0.2.0", + "unrs-resolver": "^1.9.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7535,9 +7535,9 @@ } }, "node_modules/eslint-plugin-sonarjs": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-3.0.2.tgz", - "integrity": "sha512-LxjbfwI7ypENeTmGyKmDyNux3COSkMi7H/6Cal5StSLQ6edf0naP45SZR43OclaNR7WfhVTZdhOn63q3/Y6puQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-3.0.4.tgz", + "integrity": "sha512-ftQcP811kRJNXapqpQXHErEoVOdTPfYPPYd7n3AExIPwv4qWKKHf4slFvXmodiOnfgy1Tl3waPZZLD7lcvJOtw==", "dev": true, "license": "LGPL-3.0-only", "dependencies": { @@ -7546,10 +7546,11 @@ "bytes": "3.1.2", "functional-red-black-tree": "1.0.1", "jsx-ast-utils": "3.3.5", + "lodash.merge": "4.6.2", "minimatch": "9.0.5", "scslre": "0.3.0", - "semver": "7.7.1", - "typescript": "^5" + "semver": "7.7.2", + "typescript": ">=5" }, "peerDependencies": { "eslint": "^8.0.0 || ^9.0.0" @@ -7588,19 +7589,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-plugin-toml": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/eslint-plugin-toml/-/eslint-plugin-toml-0.12.0.tgz", @@ -9993,9 +9981,9 @@ } }, "node_modules/known-css-properties": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.36.0.tgz", - "integrity": "sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA==", + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", "dev": true, "license": "MIT" }, @@ -13590,9 +13578,9 @@ } }, "node_modules/stable-hash-x": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.1.1.tgz", - "integrity": "sha512-l0x1D6vhnsNUGPFVDx45eif0y6eedVC8nm5uACTrVFJFtl2mLRW17aWtVyxFCpn5t94VUPkjU8vSLwIuwwqtJQ==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.2.0.tgz", + "integrity": "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==", "dev": true, "license": "MIT", "engines": { @@ -13801,9 +13789,9 @@ "license": "ISC" }, "node_modules/stylelint": { - "version": "16.20.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.20.0.tgz", - "integrity": "sha512-B5Myu9WRxrgKuLs3YyUXLP2H0mrbejwNxPmyADlACWwFsrL8Bmor/nTSh4OMae5sHjOz6gkSeccQH34gM4/nAw==", + "version": "16.21.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.21.0.tgz", + "integrity": "sha512-ki3PpJGG7xhm3WtINoWGnlvqAmbqSexoRMbEMJzlwewSIOqPRKPlq452c22xAdEJISVi80r+I7KL9GPUiwFgbg==", "dev": true, "funding": [ { @@ -13817,9 +13805,9 @@ ], "license": "MIT", "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/media-query-list-parser": "^4.0.2", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3", "@csstools/selector-specificity": "^5.0.0", "@dual-bundle/import-meta-resolve": "^4.1.0", "balanced-match": "^2.0.0", @@ -13830,21 +13818,21 @@ "debug": "^4.4.1", "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^10.1.0", + "file-entry-cache": "^10.1.1", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.3.1", - "ignore": "^7.0.4", + "ignore": "^7.0.5", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.36.0", + "known-css-properties": "^0.37.0", "mathml-tag-names": "^2.1.3", "meow": "^13.2.0", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.1.1", - "postcss": "^8.5.3", + "postcss": "^8.5.5", "postcss-resolve-nested-selector": "^0.1.6", "postcss-safe-parser": "^7.0.1", "postcss-selector-parser": "^7.1.0", @@ -14872,15 +14860,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.34.0.tgz", - "integrity": "sha512-MRpfN7uYjTrTGigFCt8sRyNqJFhjN0WwZecldaqhWm+wy0gaRt8Edb/3cuUy0zdq2opJWT6iXINKAtewnDOltQ==", + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.35.0.tgz", + "integrity": "sha512-uEnz70b7kBz6eg/j0Czy6K5NivaYopgxRjsnAJ2Fx5oTLo3wefTHIbL7AkQr1+7tJCRVpTs/wiM8JR/11Loq9A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.34.0", - "@typescript-eslint/parser": "8.34.0", - "@typescript-eslint/utils": "8.34.0" + "@typescript-eslint/eslint-plugin": "8.35.0", + "@typescript-eslint/parser": "8.35.0", + "@typescript-eslint/utils": "8.35.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -14955,38 +14943,38 @@ } }, "node_modules/unrs-resolver": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.9.1.tgz", - "integrity": "sha512-4AZVxP05JGN6DwqIkSP4VKLOcwQa5l37SWHF/ahcuqBMbfxbpN1L1QKafEhWCziHhzKex9H/AR09H0OuVyU+9g==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.9.2.tgz", + "integrity": "sha512-VUyWiTNQD7itdiMuJy+EuLEErLj3uwX/EpHQF8EOf33Dq3Ju6VW1GXm+swk6+1h7a49uv9fKZ+dft9jU7esdLA==", "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { - "napi-postinstall": "^0.2.2" + "napi-postinstall": "^0.2.4" }, "funding": { "url": "https://opencollective.com/unrs-resolver" }, "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.9.1", - "@unrs/resolver-binding-android-arm64": "1.9.1", - "@unrs/resolver-binding-darwin-arm64": "1.9.1", - "@unrs/resolver-binding-darwin-x64": "1.9.1", - "@unrs/resolver-binding-freebsd-x64": "1.9.1", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.9.1", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.9.1", - "@unrs/resolver-binding-linux-arm64-gnu": "1.9.1", - "@unrs/resolver-binding-linux-arm64-musl": "1.9.1", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.9.1", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.9.1", - "@unrs/resolver-binding-linux-riscv64-musl": "1.9.1", - "@unrs/resolver-binding-linux-s390x-gnu": "1.9.1", - "@unrs/resolver-binding-linux-x64-gnu": "1.9.1", - "@unrs/resolver-binding-linux-x64-musl": "1.9.1", - "@unrs/resolver-binding-wasm32-wasi": "1.9.1", - "@unrs/resolver-binding-win32-arm64-msvc": "1.9.1", - "@unrs/resolver-binding-win32-ia32-msvc": "1.9.1", - "@unrs/resolver-binding-win32-x64-msvc": "1.9.1" + "@unrs/resolver-binding-android-arm-eabi": "1.9.2", + "@unrs/resolver-binding-android-arm64": "1.9.2", + "@unrs/resolver-binding-darwin-arm64": "1.9.2", + "@unrs/resolver-binding-darwin-x64": "1.9.2", + "@unrs/resolver-binding-freebsd-x64": "1.9.2", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.9.2", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.9.2", + "@unrs/resolver-binding-linux-arm64-gnu": "1.9.2", + "@unrs/resolver-binding-linux-arm64-musl": "1.9.2", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.9.2", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.9.2", + "@unrs/resolver-binding-linux-riscv64-musl": "1.9.2", + "@unrs/resolver-binding-linux-s390x-gnu": "1.9.2", + "@unrs/resolver-binding-linux-x64-gnu": "1.9.2", + "@unrs/resolver-binding-linux-x64-musl": "1.9.2", + "@unrs/resolver-binding-wasm32-wasi": "1.9.2", + "@unrs/resolver-binding-win32-arm64-msvc": "1.9.2", + "@unrs/resolver-binding-win32-ia32-msvc": "1.9.2", + "@unrs/resolver-binding-win32-x64-msvc": "1.9.2" } }, "node_modules/update-browserslist-db": { diff --git a/package.json b/package.json index 90023d762e..c9afea9a99 100644 --- a/package.json +++ b/package.json @@ -70,15 +70,15 @@ "@vitest/coverage-v8": "3.2.3", "@vitest/eslint-plugin": "1.2.2", "@vue/test-utils": "2.4.6", - "eslint": "9.28.0", - "eslint-import-resolver-typescript": "4.4.3", + "eslint": "9.30.0", + "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-array-func": "5.0.2", - "eslint-plugin-import-x": "4.15.1", + "eslint-plugin-import-x": "4.16.1", "eslint-plugin-no-jquery": "3.1.1", "eslint-plugin-no-use-extend-native": "0.7.2", "eslint-plugin-playwright": "2.2.0", "eslint-plugin-regexp": "2.9.0", - "eslint-plugin-sonarjs": "3.0.2", + "eslint-plugin-sonarjs": "3.0.4", "eslint-plugin-toml": "0.12.0", "eslint-plugin-unicorn": "59.0.1", "eslint-plugin-vitest-globals": "1.5.0", @@ -91,13 +91,13 @@ "markdownlint-cli": "0.45.0", "postcss-html": "1.8.0", "sharp": "0.34.2", - "stylelint": "16.20.0", + "stylelint": "16.21.0", "stylelint-declaration-block-no-ignored-properties": "2.8.0", "stylelint-declaration-strict-value": "1.10.11", "stylelint-value-no-unknown-custom-properties": "6.0.1", "svgo": "3.2.0", "typescript": "5.8.3", - "typescript-eslint": "8.34.0", + "typescript-eslint": "8.35.0", "vite-string-plugin": "1.3.4", "vitest": "3.2.3" }, From 7a881e2f2648b724a905a0f61e694055ec667e24 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 29 Jun 2025 10:59:35 +0200 Subject: [PATCH 045/495] Update dependency happy-dom to v18.0.1 (forgejo) (#8337) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 85d4401889..076882bb07 100644 --- a/package-lock.json +++ b/package-lock.json @@ -87,7 +87,7 @@ "eslint-plugin-vue-scoped-css": "2.10.0", "eslint-plugin-wc": "3.0.1", "globals": "16.1.0", - "happy-dom": "18.0.0", + "happy-dom": "18.0.1", "license-checker-rseidelsohn": "4.4.2", "markdownlint-cli": "0.45.0", "postcss-html": "1.8.0", @@ -8551,9 +8551,9 @@ } }, "node_modules/happy-dom": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-18.0.0.tgz", - "integrity": "sha512-o3p2Axi1EdIfMaOUulDzO/5yXzLLV0g/54eLPVrkt3u20r3yOuOenHpyp2clAJ0eHMc+HyE139ulQxl+8pEJIw==", + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-18.0.1.tgz", + "integrity": "sha512-qn+rKOW7KWpVTtgIUi6RVmTBZJSe2k0Db0vh1f7CWrWclkkc7/Q+FrOfkZIb2eiErLyqu5AXEzE7XthO9JVxRA==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index c9afea9a99..c88721a647 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "eslint-plugin-vue-scoped-css": "2.10.0", "eslint-plugin-wc": "3.0.1", "globals": "16.1.0", - "happy-dom": "18.0.0", + "happy-dom": "18.0.1", "license-checker-rseidelsohn": "4.4.2", "markdownlint-cli": "0.45.0", "postcss-html": "1.8.0", From 3feceb10c79974e74bc078a7292c836dbb883c57 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 29 Jun 2025 11:40:47 +0200 Subject: [PATCH 046/495] Update dependency @stylistic/eslint-plugin to v5 (forgejo) (#8340) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 15 ++++++++------- package.json | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 076882bb07..63bb2d4cf6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -65,7 +65,7 @@ "@eslint-community/eslint-plugin-eslint-comments": "4.5.0", "@playwright/test": "1.52.0", "@stoplight/spectral-cli": "6.15.0", - "@stylistic/eslint-plugin": "4.4.1", + "@stylistic/eslint-plugin": "5.0.0", "@stylistic/stylelint-plugin": "3.1.3", "@vitejs/plugin-vue": "5.2.4", "@vitest/coverage-v8": "3.2.3", @@ -3056,15 +3056,16 @@ } }, "node_modules/@stylistic/eslint-plugin": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-4.4.1.tgz", - "integrity": "sha512-CEigAk7eOLyHvdgmpZsKFwtiqS2wFwI1fn4j09IU9GmD4euFM4jEBAViWeCqaNLlbX2k2+A/Fq9cje4HQBXuJQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.0.0.tgz", + "integrity": "sha512-nVV2FSzeTJ3oFKw+3t9gQYQcrgbopgCASSY27QOtkhEGgSfdQQjDmzZd41NeT1myQ8Wc6l+pZllST9qIu4NKzg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^8.32.1", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/types": "^8.34.1", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "estraverse": "^5.3.0", "picomatch": "^4.0.2" }, diff --git a/package.json b/package.json index c88721a647..258a041451 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "@eslint-community/eslint-plugin-eslint-comments": "4.5.0", "@playwright/test": "1.52.0", "@stoplight/spectral-cli": "6.15.0", - "@stylistic/eslint-plugin": "4.4.1", + "@stylistic/eslint-plugin": "5.0.0", "@stylistic/stylelint-plugin": "3.1.3", "@vitejs/plugin-vue": "5.2.4", "@vitest/coverage-v8": "3.2.3", From 216074122163ce5161be78a1ad747c0c47f357c0 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 29 Jun 2025 11:50:41 +0200 Subject: [PATCH 047/495] Update dependency @vitejs/plugin-vue to v6 (forgejo) (#8341) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 22 ++++++++++++++++------ package.json | 2 +- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 63bb2d4cf6..b8d258e28f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -67,7 +67,7 @@ "@stoplight/spectral-cli": "6.15.0", "@stylistic/eslint-plugin": "5.0.0", "@stylistic/stylelint-plugin": "3.1.3", - "@vitejs/plugin-vue": "5.2.4", + "@vitejs/plugin-vue": "6.0.0", "@vitest/coverage-v8": "3.2.3", "@vitest/eslint-plugin": "1.2.2", "@vue/test-utils": "2.4.6", @@ -2221,6 +2221,13 @@ "object-assign": "^4.1.1" } }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.19", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz", + "integrity": "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==", + "dev": true, + "license": "MIT" + }, "node_modules/@rollup/plugin-commonjs": { "version": "22.0.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-22.0.2.tgz", @@ -4095,16 +4102,19 @@ ] }, "node_modules/@vitejs/plugin-vue": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", - "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.0.tgz", + "integrity": "sha512-iAliE72WsdhjzTOp2DtvKThq1VBC4REhwRcaA+zPAAph6I+OQhUXv+Xu2KS7ElxYtb7Zc/3R30Hwv1DxEo7NXQ==", "dev": true, "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-beta.19" + }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", "vue": "^3.2.25" } }, diff --git a/package.json b/package.json index 258a041451..2bcf441081 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "@stoplight/spectral-cli": "6.15.0", "@stylistic/eslint-plugin": "5.0.0", "@stylistic/stylelint-plugin": "3.1.3", - "@vitejs/plugin-vue": "5.2.4", + "@vitejs/plugin-vue": "6.0.0", "@vitest/coverage-v8": "3.2.3", "@vitest/eslint-plugin": "1.2.2", "@vue/test-utils": "2.4.6", From 920f6d24d28d2c044eb3ed10e6a281a4523b9fbb Mon Sep 17 00:00:00 2001 From: floss4good Date: Sun, 29 Jun 2025 12:08:03 +0200 Subject: [PATCH 048/495] fix: load OldMilestone based on OldMilestoneID, not MilestoneID (#8330) Fixes #8329 ## Checklist The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org). ### Tests - I added test coverage for Go changes... - [ ] in their respective `*_test.go` for unit tests. - [x] in the `tests/integration` directory if it involves interactions with a live Forgejo server. ### Documentation - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [ ] I do not want this change to show in the release notes. - [x] I want the title to show in the release notes with a link to this pull request. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8330 Reviewed-by: Robert Wolff Co-authored-by: floss4good Co-committed-by: floss4good --- models/fixtures/comment.yml | 38 ++++++++++++++++++++++++- models/issues/comment_list.go | 16 +++++------ tests/integration/issue_comment_test.go | 26 ++++++++++++++++- 3 files changed, 70 insertions(+), 10 deletions(-) diff --git a/models/fixtures/comment.yml b/models/fixtures/comment.yml index 34407d6f81..6908d85dda 100644 --- a/models/fixtures/comment.yml +++ b/models/fixtures/comment.yml @@ -186,10 +186,46 @@ type: 8 # milestone poster_id: 1 issue_id: 1 # in repo_id 1 - milestone_id: 10 # not exsting milestone + milestone_id: 10 # not existing milestone old_milestone_id: 0 created_unix: 946685080 +- + id: 2004 + type: 8 # milestone + poster_id: 1 + issue_id: 1 # in repo_id 1 + milestone_id: 1 + old_milestone_id: 10 # not existing (ghost) milestone + created_unix: 946685085 + +- + id: 2005 + type: 8 # milestone + poster_id: 1 + issue_id: 1 # in repo_id 1 + milestone_id: 10 # not existing (ghost) milestone + old_milestone_id: 1 + created_unix: 946685090 + +- + id: 2006 + type: 8 # milestone + poster_id: 1 + issue_id: 1 # in repo_id 1 + milestone_id: 11 # not existing (ghost) milestone + old_milestone_id: 10 # not existing (ghost) milestone + created_unix: 946685095 + +- + id: 2007 + type: 8 # milestone + poster_id: 1 + issue_id: 1 # in repo_id 1 + milestone_id: 0 + old_milestone_id: 11 # not existing (ghost) milestone + created_unix: 946685100 + - id: 2010 type: 30 # project diff --git a/models/issues/comment_list.go b/models/issues/comment_list.go index 7285e347b4..9b502d1c91 100644 --- a/models/issues/comment_list.go +++ b/models/issues/comment_list.go @@ -101,7 +101,7 @@ func (comments CommentList) loadMilestones(ctx context.Context) error { return nil } - milestoneMaps := make(map[int64]*Milestone, len(milestoneIDs)) + milestones := make(map[int64]*Milestone, len(milestoneIDs)) left := len(milestoneIDs) for left > 0 { limit := db.DefaultMaxInSize @@ -110,7 +110,7 @@ func (comments CommentList) loadMilestones(ctx context.Context) error { } err := db.GetEngine(ctx). In("id", milestoneIDs[:limit]). - Find(&milestoneMaps) + Find(&milestones) if err != nil { return err } @@ -118,8 +118,8 @@ func (comments CommentList) loadMilestones(ctx context.Context) error { milestoneIDs = milestoneIDs[limit:] } - for _, issue := range comments { - issue.Milestone = milestoneMaps[issue.MilestoneID] + for _, comment := range comments { + comment.Milestone = milestones[comment.MilestoneID] } return nil } @@ -140,7 +140,7 @@ func (comments CommentList) loadOldMilestones(ctx context.Context) error { return nil } - milestoneMaps := make(map[int64]*Milestone, len(milestoneIDs)) + milestones := make(map[int64]*Milestone, len(milestoneIDs)) left := len(milestoneIDs) for left > 0 { limit := db.DefaultMaxInSize @@ -149,7 +149,7 @@ func (comments CommentList) loadOldMilestones(ctx context.Context) error { } err := db.GetEngine(ctx). In("id", milestoneIDs[:limit]). - Find(&milestoneMaps) + Find(&milestones) if err != nil { return err } @@ -157,8 +157,8 @@ func (comments CommentList) loadOldMilestones(ctx context.Context) error { milestoneIDs = milestoneIDs[limit:] } - for _, issue := range comments { - issue.OldMilestone = milestoneMaps[issue.MilestoneID] + for _, comment := range comments { + comment.OldMilestone = milestones[comment.OldMilestoneID] } return nil } diff --git a/tests/integration/issue_comment_test.go b/tests/integration/issue_comment_test.go index f77bfaa9bd..0c53c3028b 100644 --- a/tests/integration/issue_comment_test.go +++ b/tests/integration/issue_comment_test.go @@ -102,11 +102,35 @@ func TestIssueCommentChangeMilestone(t *testing.T) { []string{"user1 removed this from the milestone2 milestone"}, []string{"/user1", "/user2/repo1/milestone/2"}) - // Deleted milestone + // Added milestone that in the meantime was deleted testIssueCommentChangeEvent(t, htmlDoc, "2003", "octicon-milestone", "User One", "/user1", []string{"user1 added this to the (deleted) milestone"}, []string{"/user1"}) + + // Modified milestone - from a meantime deleted one to a valid one + testIssueCommentChangeEvent(t, htmlDoc, "2004", + "octicon-milestone", "User One", "/user1", + []string{"user1 modified the milestone from (deleted) to milestone1"}, + []string{"/user1", "/user2/repo1/milestone/1"}) + + // Modified milestone - from a valid one to a meantime deleted one + testIssueCommentChangeEvent(t, htmlDoc, "2005", + "octicon-milestone", "User One", "/user1", + []string{"user1 modified the milestone from milestone1 to (deleted)"}, + []string{"/user1", "/user2/repo1/milestone/1"}) + + // Modified milestone - from a meantime deleted one to a meantime deleted one + testIssueCommentChangeEvent(t, htmlDoc, "2006", + "octicon-milestone", "User One", "/user1", + []string{"user1 modified the milestone from (deleted) to (deleted)"}, + []string{"/user1"}) + + // Removed milestone that in the meantime was deleted + testIssueCommentChangeEvent(t, htmlDoc, "2007", + "octicon-milestone", "User One", "/user1", + []string{"user1 removed this from the (deleted) milestone"}, + []string{"/user1"}) } func TestIssueCommentChangeProject(t *testing.T) { From 447c5789bdaf092dca6af7282bb20931999ff456 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Sun, 29 Jun 2025 13:04:28 +0200 Subject: [PATCH 049/495] fix(ci): add install-minimum-git-version helper for workflows (#8345) https://codeberg.org/forgejo-integration/forgejo/actions/runs/10592#jobstep-3-14 failed with > E: Packages were downgraded and -y was used without --allow-downgrades. Running the tests is done following the instructions in the workflow: ``` # - uncomment [on].pull_request # - swap 'forgejo-integration' and 'forgejo-coding' # - open a pull request at https://codeberg.org/forgejo/forgejo and fix things # - swap 'forgejo-integration' and 'forgejo-coding' # - comment [on].pull_request ``` The result of the test is available at https://codeberg.org/forgejo/forgejo/actions/runs/85408/jobs/0 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8345 Reviewed-by: Gusted Co-authored-by: Earl Warren Co-committed-by: Earl Warren --- .../install-minimum-git-version/action.yaml | 22 ++++++++++++++++++ .forgejo/workflows/testing-integration.yml | 23 ++++--------------- 2 files changed, 26 insertions(+), 19 deletions(-) create mode 100644 .forgejo/workflows-composite/install-minimum-git-version/action.yaml diff --git a/.forgejo/workflows-composite/install-minimum-git-version/action.yaml b/.forgejo/workflows-composite/install-minimum-git-version/action.yaml new file mode 100644 index 0000000000..d4e6e3f2a7 --- /dev/null +++ b/.forgejo/workflows-composite/install-minimum-git-version/action.yaml @@ -0,0 +1,22 @@ +# +# Install the minimal version of Git supported by Forgejo +# +runs: + using: "composite" + steps: + - name: install git and git-lfs + run: | + set -x + + export DEBIAN_FRONTEND=noninteractive + + apt-get update -qq + apt-get -q install -y -qq curl ca-certificates + + curl -sS -o /tmp/git-man.deb http://archive.ubuntu.com/ubuntu/pool/main/g/git/git-man_2.34.1-1ubuntu1_all.deb + curl -sS -o /tmp/git.deb https://archive.ubuntu.com/ubuntu/pool/main/g/git/git_2.34.1-1ubuntu1_amd64.deb + curl -sS -o /tmp/git-lfs.deb https://archive.ubuntu.com/ubuntu/pool/universe/g/git-lfs/git-lfs_3.0.2-1_amd64.deb + + apt-get -q install --allow-downgrades -y -qq /tmp/git-man.deb + apt-get -q install --allow-downgrades -y -qq /tmp/git.deb + apt-get -q install --allow-downgrades -y -qq /tmp/git-lfs.deb diff --git a/.forgejo/workflows/testing-integration.yml b/.forgejo/workflows/testing-integration.yml index 630de50435..102a2d9774 100644 --- a/.forgejo/workflows/testing-integration.yml +++ b/.forgejo/workflows/testing-integration.yml @@ -33,20 +33,8 @@ jobs: steps: - uses: https://data.forgejo.org/actions/checkout@v4 - uses: ./.forgejo/workflows-composite/setup-env - - name: install git 2.34.1 - run: | - export DEBIAN_FRONTEND=noninteractive - - apt-get update -qq - apt-get -q install -y -qq curl ca-certificates - - curl -sS -o git-man.deb http://archive.ubuntu.com/ubuntu/pool/main/g/git/git-man_2.34.1-1ubuntu1_all.deb - curl -sS -o git.deb https://archive.ubuntu.com/ubuntu/pool/main/g/git/git_2.34.1-1ubuntu1_amd64.deb - curl -sS -o git-lfs.deb https://archive.ubuntu.com/ubuntu/pool/universe/g/git-lfs/git-lfs_3.0.2-1_amd64.deb - - apt-get -q install -y -qq ./git-man.deb - apt-get -q install -y -qq ./git.deb - apt-get -q install -y -qq ./git-lfs.deb + - name: install git 2.34.1 and git-lfs 3.0.2 + uses: ./.forgejo/workflows-composite/install-minimum-git-version - uses: ./.forgejo/workflows-composite/build-backend - run: | su forgejo -c 'make test-backend test-check' @@ -64,11 +52,8 @@ jobs: steps: - uses: https://data.forgejo.org/actions/checkout@v4 - uses: ./.forgejo/workflows-composite/setup-env - - name: install git 2.30 - uses: ./.forgejo/workflows-composite/apt-install-from - with: - packages: git/bullseye git-lfs/bullseye - release: bullseye + - name: install git 2.34.1 and git-lfs 3.0.2 + uses: ./.forgejo/workflows-composite/install-minimum-git-version - uses: ./.forgejo/workflows-composite/build-backend - run: | su forgejo -c 'make test-sqlite-migration test-sqlite' From 1a0ceec5e20e1ee0ebf72e99856c8380b3adda6e Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Sun, 29 Jun 2025 13:29:45 +0200 Subject: [PATCH 050/495] [v12.0/forgejo] fix: load OldMilestone based on OldMilestoneID, not MilestoneID (#8349) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8330 Fixes #8329 ## Checklist The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org). ### Tests - I added test coverage for Go changes... - [ ] in their respective `*_test.go` for unit tests. - [x] in the `tests/integration` directory if it involves interactions with a live Forgejo server. ### Documentation - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [ ] I do not want this change to show in the release notes. - [x] I want the title to show in the release notes with a link to this pull request. Co-authored-by: floss4good Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8349 Reviewed-by: floss4good Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- models/fixtures/comment.yml | 38 ++++++++++++++++++++++++- models/issues/comment_list.go | 16 +++++------ tests/integration/issue_comment_test.go | 26 ++++++++++++++++- 3 files changed, 70 insertions(+), 10 deletions(-) diff --git a/models/fixtures/comment.yml b/models/fixtures/comment.yml index 34407d6f81..6908d85dda 100644 --- a/models/fixtures/comment.yml +++ b/models/fixtures/comment.yml @@ -186,10 +186,46 @@ type: 8 # milestone poster_id: 1 issue_id: 1 # in repo_id 1 - milestone_id: 10 # not exsting milestone + milestone_id: 10 # not existing milestone old_milestone_id: 0 created_unix: 946685080 +- + id: 2004 + type: 8 # milestone + poster_id: 1 + issue_id: 1 # in repo_id 1 + milestone_id: 1 + old_milestone_id: 10 # not existing (ghost) milestone + created_unix: 946685085 + +- + id: 2005 + type: 8 # milestone + poster_id: 1 + issue_id: 1 # in repo_id 1 + milestone_id: 10 # not existing (ghost) milestone + old_milestone_id: 1 + created_unix: 946685090 + +- + id: 2006 + type: 8 # milestone + poster_id: 1 + issue_id: 1 # in repo_id 1 + milestone_id: 11 # not existing (ghost) milestone + old_milestone_id: 10 # not existing (ghost) milestone + created_unix: 946685095 + +- + id: 2007 + type: 8 # milestone + poster_id: 1 + issue_id: 1 # in repo_id 1 + milestone_id: 0 + old_milestone_id: 11 # not existing (ghost) milestone + created_unix: 946685100 + - id: 2010 type: 30 # project diff --git a/models/issues/comment_list.go b/models/issues/comment_list.go index 7285e347b4..9b502d1c91 100644 --- a/models/issues/comment_list.go +++ b/models/issues/comment_list.go @@ -101,7 +101,7 @@ func (comments CommentList) loadMilestones(ctx context.Context) error { return nil } - milestoneMaps := make(map[int64]*Milestone, len(milestoneIDs)) + milestones := make(map[int64]*Milestone, len(milestoneIDs)) left := len(milestoneIDs) for left > 0 { limit := db.DefaultMaxInSize @@ -110,7 +110,7 @@ func (comments CommentList) loadMilestones(ctx context.Context) error { } err := db.GetEngine(ctx). In("id", milestoneIDs[:limit]). - Find(&milestoneMaps) + Find(&milestones) if err != nil { return err } @@ -118,8 +118,8 @@ func (comments CommentList) loadMilestones(ctx context.Context) error { milestoneIDs = milestoneIDs[limit:] } - for _, issue := range comments { - issue.Milestone = milestoneMaps[issue.MilestoneID] + for _, comment := range comments { + comment.Milestone = milestones[comment.MilestoneID] } return nil } @@ -140,7 +140,7 @@ func (comments CommentList) loadOldMilestones(ctx context.Context) error { return nil } - milestoneMaps := make(map[int64]*Milestone, len(milestoneIDs)) + milestones := make(map[int64]*Milestone, len(milestoneIDs)) left := len(milestoneIDs) for left > 0 { limit := db.DefaultMaxInSize @@ -149,7 +149,7 @@ func (comments CommentList) loadOldMilestones(ctx context.Context) error { } err := db.GetEngine(ctx). In("id", milestoneIDs[:limit]). - Find(&milestoneMaps) + Find(&milestones) if err != nil { return err } @@ -157,8 +157,8 @@ func (comments CommentList) loadOldMilestones(ctx context.Context) error { milestoneIDs = milestoneIDs[limit:] } - for _, issue := range comments { - issue.OldMilestone = milestoneMaps[issue.MilestoneID] + for _, comment := range comments { + comment.OldMilestone = milestones[comment.OldMilestoneID] } return nil } diff --git a/tests/integration/issue_comment_test.go b/tests/integration/issue_comment_test.go index f77bfaa9bd..0c53c3028b 100644 --- a/tests/integration/issue_comment_test.go +++ b/tests/integration/issue_comment_test.go @@ -102,11 +102,35 @@ func TestIssueCommentChangeMilestone(t *testing.T) { []string{"user1 removed this from the milestone2 milestone"}, []string{"/user1", "/user2/repo1/milestone/2"}) - // Deleted milestone + // Added milestone that in the meantime was deleted testIssueCommentChangeEvent(t, htmlDoc, "2003", "octicon-milestone", "User One", "/user1", []string{"user1 added this to the (deleted) milestone"}, []string{"/user1"}) + + // Modified milestone - from a meantime deleted one to a valid one + testIssueCommentChangeEvent(t, htmlDoc, "2004", + "octicon-milestone", "User One", "/user1", + []string{"user1 modified the milestone from (deleted) to milestone1"}, + []string{"/user1", "/user2/repo1/milestone/1"}) + + // Modified milestone - from a valid one to a meantime deleted one + testIssueCommentChangeEvent(t, htmlDoc, "2005", + "octicon-milestone", "User One", "/user1", + []string{"user1 modified the milestone from milestone1 to (deleted)"}, + []string{"/user1", "/user2/repo1/milestone/1"}) + + // Modified milestone - from a meantime deleted one to a meantime deleted one + testIssueCommentChangeEvent(t, htmlDoc, "2006", + "octicon-milestone", "User One", "/user1", + []string{"user1 modified the milestone from (deleted) to (deleted)"}, + []string{"/user1"}) + + // Removed milestone that in the meantime was deleted + testIssueCommentChangeEvent(t, htmlDoc, "2007", + "octicon-milestone", "User One", "/user1", + []string{"user1 removed this from the (deleted) milestone"}, + []string{"/user1"}) } func TestIssueCommentChangeProject(t *testing.T) { From 878ce241a40503bd716a9f711ac49fd14695da8a Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 29 Jun 2025 13:52:24 +0200 Subject: [PATCH 051/495] Update dependency htmx.org to v2 (forgejo) (#8342) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8342 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 8 ++++---- package.json | 2 +- web_src/js/htmx.js | 2 +- webpack.config.js | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index b8d258e28f..15b3243b33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,7 @@ "esbuild-loader": "4.3.0", "escape-goat": "4.0.0", "fast-glob": "3.3.3", - "htmx.org": "1.9.12", + "htmx.org": "2.0.6", "idiomorph": "0.3.0", "jquery": "3.7.1", "katex": "0.16.22", @@ -8745,9 +8745,9 @@ } }, "node_modules/htmx.org": { - "version": "1.9.12", - "resolved": "https://registry.npmjs.org/htmx.org/-/htmx.org-1.9.12.tgz", - "integrity": "sha512-VZAohXyF7xPGS52IM8d1T1283y+X4D+Owf3qY1NZ9RuBypyu9l8cGsxUMAG5fEAb/DhT7rDoJ9Hpu5/HxFD3cw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/htmx.org/-/htmx.org-2.0.6.tgz", + "integrity": "sha512-7ythjYneGSk3yCHgtCnQeaoF+D+o7U2LF37WU3O0JYv3gTZSicdEFiI/Ai/NJyC5ZpYJWMpUb11OC5Lr6AfAqA==", "license": "0BSD" }, "node_modules/iconv-lite": { diff --git a/package.json b/package.json index 2bcf441081..ff4dd825f4 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "esbuild-loader": "4.3.0", "escape-goat": "4.0.0", "fast-glob": "3.3.3", - "htmx.org": "1.9.12", + "htmx.org": "2.0.6", "idiomorph": "0.3.0", "jquery": "3.7.1", "katex": "0.16.22", diff --git a/web_src/js/htmx.js b/web_src/js/htmx.js index 5ca3018308..c4893f7c1b 100644 --- a/web_src/js/htmx.js +++ b/web_src/js/htmx.js @@ -1,4 +1,4 @@ -import * as htmx from 'htmx.org'; +import htmx from 'htmx.org'; import {showErrorToast} from './modules/toast.js'; // https://github.com/bigskysoftware/idiomorph#htmx diff --git a/webpack.config.js b/webpack.config.js index 7729035972..8f9949d7b1 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -238,7 +238,7 @@ export default { activeModules: true, }), new webpack.ProvidePlugin({ // for htmx extensions - htmx: 'htmx.org', + htmx: ['htmx.org', 'default'], }), new DefinePlugin({ __VUE_OPTIONS_API__: true, // at the moment, many Vue components still use the Vue Options API From 31fc02332a6ad7b2dea19ff70344253d2ebc1a3a Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 29 Jun 2025 13:57:15 +0200 Subject: [PATCH 052/495] Update dependency svgo to v4 (forgejo) (#8343) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8343 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 62 ++++++------------- package.json | 2 +- public/assets/img/svg/gitea-alt.svg | 2 +- public/assets/img/svg/gitea-chef.svg | 2 +- public/assets/img/svg/gitea-debian.svg | 2 +- public/assets/img/svg/gitea-gitbucket.svg | 2 +- public/assets/img/svg/gitea-gitlab.svg | 2 +- public/assets/img/svg/gitea-google.svg | 2 +- public/assets/img/svg/gitea-maven.svg | 2 +- .../assets/img/svg/gitea-microsoftonline.svg | 2 +- public/assets/img/svg/gitea-npm.svg | 2 +- public/assets/img/svg/gitea-onedev.svg | 2 +- public/assets/img/svg/gitea-openid.svg | 2 +- public/assets/img/svg/gitea-rubygems.svg | 2 +- public/assets/img/svg/gitea-swift.svg | 2 +- public/assets/img/svg/gitea-vagrant.svg | 2 +- 16 files changed, 34 insertions(+), 58 deletions(-) diff --git a/package-lock.json b/package-lock.json index 15b3243b33..3a87a54f97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -96,7 +96,7 @@ "stylelint-declaration-block-no-ignored-properties": "2.8.0", "stylelint-declaration-strict-value": "1.10.11", "stylelint-value-no-unknown-custom-properties": "6.0.1", - "svgo": "3.2.0", + "svgo": "4.0.0", "typescript": "5.8.3", "typescript-eslint": "8.35.0", "vite-string-plugin": "1.3.4", @@ -3125,16 +3125,6 @@ "integrity": "sha512-wpCQMhf5p5GhNg2MmGKXzUNwxe7zRiCsmqYsamez2beP7mKPCSiu+BjZcdN95yYSzO857kr0VfQewmGpS77nqA==", "license": "MIT" }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/@tybys/wasm-util": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", @@ -14201,25 +14191,25 @@ "dev": true }, "node_modules/svgo": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.2.0.tgz", - "integrity": "sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.0.tgz", + "integrity": "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==", "dev": true, "license": "MIT", "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", + "commander": "^11.1.0", "css-select": "^5.1.0", - "css-tree": "^2.3.1", + "css-tree": "^3.0.1", "css-what": "^6.1.0", "csso": "^5.0.5", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1", + "sax": "^1.4.1" }, "bin": { - "svgo": "bin/svgo" + "svgo": "bin/svgo.js" }, "engines": { - "node": ">=14.0.0" + "node": ">=16" }, "funding": { "type": "opencollective", @@ -14227,35 +14217,21 @@ } }, "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 10" + "node": ">=16" } }, - "node_modules/svgo/node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "node_modules/svgo/node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/svgo/node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true, - "license": "CC0-1.0" + "license": "ISC" }, "node_modules/swagger-ui-dist": { "version": "5.17.14", diff --git a/package.json b/package.json index ff4dd825f4..88f904c44b 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "stylelint-declaration-block-no-ignored-properties": "2.8.0", "stylelint-declaration-strict-value": "1.10.11", "stylelint-value-no-unknown-custom-properties": "6.0.1", - "svgo": "3.2.0", + "svgo": "4.0.0", "typescript": "5.8.3", "typescript-eslint": "8.35.0", "vite-string-plugin": "1.3.4", diff --git a/public/assets/img/svg/gitea-alt.svg b/public/assets/img/svg/gitea-alt.svg index 53e3f17c13..efe4830a0b 100644 --- a/public/assets/img/svg/gitea-alt.svg +++ b/public/assets/img/svg/gitea-alt.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/assets/img/svg/gitea-chef.svg b/public/assets/img/svg/gitea-chef.svg index c5e8a721cc..8fd8ed325d 100644 --- a/public/assets/img/svg/gitea-chef.svg +++ b/public/assets/img/svg/gitea-chef.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/assets/img/svg/gitea-debian.svg b/public/assets/img/svg/gitea-debian.svg index fa2f2f49dc..e92d0b6937 100644 --- a/public/assets/img/svg/gitea-debian.svg +++ b/public/assets/img/svg/gitea-debian.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/assets/img/svg/gitea-gitbucket.svg b/public/assets/img/svg/gitea-gitbucket.svg index 62f603484e..b9e99724b2 100644 --- a/public/assets/img/svg/gitea-gitbucket.svg +++ b/public/assets/img/svg/gitea-gitbucket.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/assets/img/svg/gitea-gitlab.svg b/public/assets/img/svg/gitea-gitlab.svg index 03fcb0b87e..e2d708e7be 100644 --- a/public/assets/img/svg/gitea-gitlab.svg +++ b/public/assets/img/svg/gitea-gitlab.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/assets/img/svg/gitea-google.svg b/public/assets/img/svg/gitea-google.svg index 7dd2622df6..26ee04cb64 100644 --- a/public/assets/img/svg/gitea-google.svg +++ b/public/assets/img/svg/gitea-google.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/assets/img/svg/gitea-maven.svg b/public/assets/img/svg/gitea-maven.svg index 320d01a234..f6ece7dc28 100644 --- a/public/assets/img/svg/gitea-maven.svg +++ b/public/assets/img/svg/gitea-maven.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/assets/img/svg/gitea-microsoftonline.svg b/public/assets/img/svg/gitea-microsoftonline.svg index f2ce13ac22..c143eccbb6 100644 --- a/public/assets/img/svg/gitea-microsoftonline.svg +++ b/public/assets/img/svg/gitea-microsoftonline.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/assets/img/svg/gitea-npm.svg b/public/assets/img/svg/gitea-npm.svg index 7ef74e72bd..2b05c79353 100644 --- a/public/assets/img/svg/gitea-npm.svg +++ b/public/assets/img/svg/gitea-npm.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/assets/img/svg/gitea-onedev.svg b/public/assets/img/svg/gitea-onedev.svg index 94ad1bab31..7ecd18895d 100644 --- a/public/assets/img/svg/gitea-onedev.svg +++ b/public/assets/img/svg/gitea-onedev.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/assets/img/svg/gitea-openid.svg b/public/assets/img/svg/gitea-openid.svg index f4702d2cdf..10c37145a3 100644 --- a/public/assets/img/svg/gitea-openid.svg +++ b/public/assets/img/svg/gitea-openid.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/assets/img/svg/gitea-rubygems.svg b/public/assets/img/svg/gitea-rubygems.svg index 4e43bdf2f4..7cd9d34e6a 100644 --- a/public/assets/img/svg/gitea-rubygems.svg +++ b/public/assets/img/svg/gitea-rubygems.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/assets/img/svg/gitea-swift.svg b/public/assets/img/svg/gitea-swift.svg index 4182100185..891ac12b56 100644 --- a/public/assets/img/svg/gitea-swift.svg +++ b/public/assets/img/svg/gitea-swift.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/assets/img/svg/gitea-vagrant.svg b/public/assets/img/svg/gitea-vagrant.svg index ba50101d52..18b05e900d 100644 --- a/public/assets/img/svg/gitea-vagrant.svg +++ b/public/assets/img/svg/gitea-vagrant.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file From c57dea336c2ad3dcff7dc4b791af69b195abe01a Mon Sep 17 00:00:00 2001 From: 0ko <0ko@noreply.codeberg.org> Date: Sun, 29 Jun 2025 16:22:07 +0200 Subject: [PATCH 053/495] fix(ui): small org dashboard ui cleanup (#8327) Small UI cleanups in this area with no visual changes: https://codeberg.org/attachments/4282f225-63e0-41b7-9edb-8b64877092b2 * remove classes `ui`, `top`, `attached`: following https://codeberg.org/forgejo/forgejo/pulls/2593, it is no longer a fomantic ui segment for those classes to be relevant to it * use gap in flexbox as it is a cleaner way than setting margins Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8327 Reviewed-by: Gusted Reviewed-by: Robert Wolff Reviewed-by: Beowulf --- web_src/js/components/DashboardRepoList.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web_src/js/components/DashboardRepoList.vue b/web_src/js/components/DashboardRepoList.vue index 58c5461baa..35f1082a93 100644 --- a/web_src/js/components/DashboardRepoList.vue +++ b/web_src/js/components/DashboardRepoList.vue @@ -340,10 +340,10 @@ export default sfc; // activate the IDE's Vue plugin {{ textMyOrgs }} {{ organizationsTotalCount }}
-

-
+

+
{{ textMyRepos }} - {{ reposTotalCount }} + {{ reposTotalCount }}

-`)).IsSvgImage()) - assert.False(t, DetectContentType([]byte(``)).IsSvgImage()) - assert.False(t, DetectContentType([]byte(``)).IsSvgImage()) +`), "").IsSvgImage()) + assert.False(t, DetectContentType([]byte(``), "").IsSvgImage()) + assert.False(t, DetectContentType([]byte(``), "").IsSvgImage()) } func TestIsPDF(t *testing.T) { pdf, _ := base64.StdEncoding.DecodeString("JVBERi0xLjYKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0ZpbHRlci9GbGF0ZURlY29kZT4+CnN0cmVhbQp4nF3NPwsCMQwF8D2f4s2CNYk1baF0EHRwOwg4iJt/NsFb/PpevUE4Mjwe") - assert.True(t, DetectContentType(pdf).IsPDF()) - assert.False(t, DetectContentType([]byte("plain text")).IsPDF()) + assert.True(t, DetectContentType(pdf, "").IsPDF()) + assert.False(t, DetectContentType([]byte("plain text"), "").IsPDF()) } func TestIsVideo(t *testing.T) { mp4, _ := base64.StdEncoding.DecodeString("AAAAGGZ0eXBtcDQyAAAAAGlzb21tcDQyAAEI721vb3YAAABsbXZoZAAAAADaBlwX2gZcFwAAA+gA") - assert.True(t, DetectContentType(mp4).IsVideo()) - assert.False(t, DetectContentType([]byte("plain text")).IsVideo()) + assert.True(t, DetectContentType(mp4, "").IsVideo()) + assert.False(t, DetectContentType([]byte("plain text"), "").IsVideo()) } func TestIsAudio(t *testing.T) { mp3, _ := base64.StdEncoding.DecodeString("SUQzBAAAAAABAFRYWFgAAAASAAADbWFqb3JfYnJhbmQAbXA0MgBUWFhYAAAAEQAAA21pbm9yX3Zl") - assert.True(t, DetectContentType(mp3).IsAudio()) - assert.False(t, DetectContentType([]byte("plain text")).IsAudio()) + assert.True(t, DetectContentType(mp3, "").IsAudio()) + assert.False(t, DetectContentType([]byte("plain text"), "").IsAudio()) - assert.True(t, DetectContentType([]byte("ID3Toy\000")).IsAudio()) - assert.True(t, DetectContentType([]byte("ID3Toy\n====\t* hi 🌞, ...")).IsText()) // test ID3 tag for plain text - assert.True(t, DetectContentType([]byte("ID3Toy\n====\t* hi 🌞, ..."+"🌛"[0:2])).IsText()) // test ID3 tag with incomplete UTF8 char + assert.True(t, DetectContentType([]byte("ID3Toy\000"), "").IsAudio()) + assert.True(t, DetectContentType([]byte("ID3Toy\n====\t* hi 🌞, ..."), "").IsText()) // test ID3 tag for plain text + assert.True(t, DetectContentType([]byte("ID3Toy\n====\t* hi 🌞, ..."+"🌛"[0:2]), "").IsText()) // test ID3 tag with incomplete UTF8 char } func TestIsGLB(t *testing.T) { glb, _ := hex.DecodeString("676c5446") - assert.True(t, DetectContentType(glb).IsGLB()) - assert.True(t, DetectContentType(glb).Is3DModel()) - assert.False(t, DetectContentType([]byte("plain text")).IsGLB()) - assert.False(t, DetectContentType([]byte("plain text")).Is3DModel()) + assert.True(t, DetectContentType(glb, "").IsGLB()) + assert.True(t, DetectContentType(glb, "").Is3DModel()) + assert.False(t, DetectContentType([]byte("plain text"), "").IsGLB()) + assert.False(t, DetectContentType([]byte("plain text"), "").Is3DModel()) } func TestDetectContentTypeFromReader(t *testing.T) { mp3, _ := base64.StdEncoding.DecodeString("SUQzBAAAAAABAFRYWFgAAAASAAADbWFqb3JfYnJhbmQAbXA0MgBUWFhYAAAAEQAAA21pbm9yX3Zl") - st, err := DetectContentTypeFromReader(bytes.NewReader(mp3)) + st, err := DetectContentTypeFromReader(bytes.NewReader(mp3), "") require.NoError(t, err) assert.True(t, st.IsAudio()) } func TestDetectContentTypeOgg(t *testing.T) { oggAudio, _ := hex.DecodeString("4f67675300020000000000000000352f0000000000007dc39163011e01766f72626973000000000244ac0000000000000071020000000000b8014f6767530000") - st, err := DetectContentTypeFromReader(bytes.NewReader(oggAudio)) + st, err := DetectContentTypeFromReader(bytes.NewReader(oggAudio), "") require.NoError(t, err) assert.True(t, st.IsAudio()) oggVideo, _ := hex.DecodeString("4f676753000200000000000000007d9747ef000000009b59daf3012a807468656f7261030201001e00110001e000010e00020000001e00000001000001000001") - st, err = DetectContentTypeFromReader(bytes.NewReader(oggVideo)) + st, err = DetectContentTypeFromReader(bytes.NewReader(oggVideo), "") require.NoError(t, err) assert.True(t, st.IsVideo()) } @@ -148,7 +148,7 @@ func TestDetectContentTypeAvif(t *testing.T) { avifImage, err := hex.DecodeString("000000206674797061766966") require.NoError(t, err) - st, err := DetectContentTypeFromReader(bytes.NewReader(avifImage)) + st, err := DetectContentTypeFromReader(bytes.NewReader(avifImage), "") require.NoError(t, err) assert.True(t, st.IsImage()) @@ -158,10 +158,24 @@ func TestDetectContentTypeModelGLB(t *testing.T) { glb, err := hex.DecodeString("676c5446") require.NoError(t, err) - st, err := DetectContentTypeFromReader(bytes.NewReader(glb)) + st, err := DetectContentTypeFromReader(bytes.NewReader(glb), "") require.NoError(t, err) // print st for debugging assert.Equal(t, "model/gltf-binary", st.GetMimeType()) assert.True(t, st.IsGLB()) } + +func TestDetectInterlisp(t *testing.T) { + interlisp, err := base64.StdEncoding.DecodeString("ICAKKERFRklORS1GSUxFLUlORk8gHlBBQ0tBR0UgIklOVEVSTElTUCIgHlJFQURUQUJMRSAiSU5URVJMSVNQIiAeQkFTRSAxMCkKCgYB") + require.NoError(t, err) + st, err := DetectContentTypeFromReader(bytes.NewReader(interlisp), "test") + require.NoError(t, err) + assert.True(t, st.IsText()) + st, err = DetectContentTypeFromReader(bytes.NewReader(interlisp), "") + require.NoError(t, err) + assert.False(t, st.IsText()) + st, err = DetectContentTypeFromReader(bytes.NewReader(interlisp), "test.lcom") + require.NoError(t, err) + assert.False(t, st.IsText()) +} diff --git a/routers/web/repo/editor.go b/routers/web/repo/editor.go index 5114cc9c05..3e3cb0016d 100644 --- a/routers/web/repo/editor.go +++ b/routers/web/repo/editor.go @@ -189,7 +189,7 @@ func editFile(ctx *context.Context, isNewFile bool) { buf = buf[:n] // Only some file types are editable online as text. - if !typesniffer.DetectContentType(buf).IsRepresentableAsText() { + if !typesniffer.DetectContentType(buf, blob.Name()).IsRepresentableAsText() { ctx.NotFound("typesniffer.IsRepresentableAsText", nil) return } diff --git a/routers/web/repo/render.go b/routers/web/repo/render.go index b31e2e203a..05eeadc519 100644 --- a/routers/web/repo/render.go +++ b/routers/web/repo/render.go @@ -41,7 +41,7 @@ func RenderFile(ctx *context.Context) { n, _ := util.ReadAtMost(dataRc, buf) buf = buf[:n] - st := typesniffer.DetectContentType(buf) + st := typesniffer.DetectContentType(buf, blob.Name()) isTextFile := st.IsText() rd := charset.ToUTF8WithFallbackReader(io.MultiReader(bytes.NewReader(buf), dataRc), charset.ConvertOpts{}) diff --git a/routers/web/repo/setting/avatar.go b/routers/web/repo/setting/avatar.go index 84d7cccdb8..20e211316d 100644 --- a/routers/web/repo/setting/avatar.go +++ b/routers/web/repo/setting/avatar.go @@ -45,7 +45,7 @@ func UpdateAvatarSetting(ctx *context.Context, form forms.AvatarForm) error { if err != nil { return fmt.Errorf("io.ReadAll: %w", err) } - st := typesniffer.DetectContentType(data) + st := typesniffer.DetectContentType(data, "") if !st.IsImage() || st.IsSvgImage() { return errors.New(ctx.Locale.TrString("settings.uploaded_avatar_not_a_image")) } diff --git a/routers/web/repo/setting/lfs.go b/routers/web/repo/setting/lfs.go index b9cb86bd08..9930d03e8e 100644 --- a/routers/web/repo/setting/lfs.go +++ b/routers/web/repo/setting/lfs.go @@ -291,7 +291,7 @@ func LFSFileGet(ctx *context.Context) { } buf = buf[:n] - st := typesniffer.DetectContentType(buf) + st := typesniffer.DetectContentType(buf, "") ctx.Data["IsTextFile"] = st.IsText() isRepresentableAsText := st.IsRepresentableAsText() diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go index bb3e1388a8..d00f85a134 100644 --- a/routers/web/repo/view.go +++ b/routers/web/repo/view.go @@ -228,7 +228,7 @@ func getFileReader(ctx gocontext.Context, repoID int64, blob *git.Blob) ([]byte, n, _ := util.ReadAtMost(dataRc, buf) buf = buf[:n] - st := typesniffer.DetectContentType(buf) + st := typesniffer.DetectContentType(buf, blob.Name()) isTextFile := st.IsText() // FIXME: what happens when README file is an image? @@ -262,7 +262,7 @@ func getFileReader(ctx gocontext.Context, repoID int64, blob *git.Blob) ([]byte, } buf = buf[:n] - st = typesniffer.DetectContentType(buf) + st = typesniffer.DetectContentType(buf, blob.Name()) return buf, dataRc, &fileInfo{st.IsText(), true, meta.Size, &meta.Pointer, st}, nil } diff --git a/routers/web/user/setting/profile.go b/routers/web/user/setting/profile.go index 400ee71f08..e0ce88b582 100644 --- a/routers/web/user/setting/profile.go +++ b/routers/web/user/setting/profile.go @@ -151,7 +151,7 @@ func UpdateAvatarSetting(ctx *context.Context, form *forms.AvatarForm, ctxUser * return fmt.Errorf("io.ReadAll: %w", err) } - st := typesniffer.DetectContentType(data) + st := typesniffer.DetectContentType(data, "") if !st.IsImage() || st.IsSvgImage() { return errors.New(ctx.Locale.TrString("settings.uploaded_avatar_not_a_image")) } From 0ecd9d968202d1766e5867dfbee13277e4683791 Mon Sep 17 00:00:00 2001 From: Gusted Date: Wed, 2 Jul 2025 13:04:22 +0200 Subject: [PATCH 067/495] fix: user activation with uppercase email address (#8367) - Right before the call to user email activation, the user is updated [^1]. This causes the email to be lowered, which in turn makes the call to activate the user activation fail (on database where collation is case sensitive, which is the recommend collation by Forgejo). - The code in `BeforeUpdate` is quite confusing, the comment has become slightly out of date and was reworded to reflect reality and its purpose. The code is also slightly reworked to only lower the email for the `AvatarEmail` field to avoid causing side-effect. - Added unit test. - Resolves forgejo/forgejo#8354 [^1]: https://codeberg.org/forgejo/forgejo/src/commit/4927d4ee3d53ad79fe88dfe862c33339c0a9cdc6/routers/web/auth/auth.go#L785 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8367 Reviewed-by: Otto Co-authored-by: Gusted Co-committed-by: Gusted --- .../TestActivateUserEmail/email_address.yml | 7 +++++++ models/fixtures/TestActivateUserEmail/user.yml | 12 ++++++++++++ models/user/email_address_test.go | 17 +++++++++++++++++ models/user/user.go | 6 +++--- 4 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 models/fixtures/TestActivateUserEmail/email_address.yml create mode 100644 models/fixtures/TestActivateUserEmail/user.yml diff --git a/models/fixtures/TestActivateUserEmail/email_address.yml b/models/fixtures/TestActivateUserEmail/email_address.yml new file mode 100644 index 0000000000..cf41ff8241 --- /dev/null +++ b/models/fixtures/TestActivateUserEmail/email_address.yml @@ -0,0 +1,7 @@ +- + id: 1001 + uid: 1001 + email: AnotherTestUserWithUpperCaseEmail@otto.splvs.net + lower_email: anothertestuserwithuppercaseemail@otto.splvs.net + is_activated: false + is_primary: true diff --git a/models/fixtures/TestActivateUserEmail/user.yml b/models/fixtures/TestActivateUserEmail/user.yml new file mode 100644 index 0000000000..0a68e70a4a --- /dev/null +++ b/models/fixtures/TestActivateUserEmail/user.yml @@ -0,0 +1,12 @@ +- + id: 1001 + lower_name: user1001 + name: user1001 + full_name: User That loves Upper Cases + email: AnotherTestUserWithUpperCaseEmail@otto.splvs.net + passwd: ZogKvWdyEx:password + passwd_hash_algo: dummy + avatar: '' + avatar_email: anothertestuserwithuppercaseemail@otto.splvs.net + login_name: user1 + created_unix: 1672578000 diff --git a/models/user/email_address_test.go b/models/user/email_address_test.go index 1801f57a23..85f5b16c65 100644 --- a/models/user/email_address_test.go +++ b/models/user/email_address_test.go @@ -181,3 +181,20 @@ func TestDeletePrimaryEmailAddressOfUser(t *testing.T) { assert.True(t, user_model.IsErrEmailAddressNotExist(err)) assert.Nil(t, email) } + +func TestActivateUserEmail(t *testing.T) { + defer unittest.OverrideFixtures("models/fixtures/TestActivateUserEmail")() + require.NoError(t, unittest.PrepareTestDatabase()) + + t.Run("Activate email", func(t *testing.T) { + require.NoError(t, user_model.ActivateUserEmail(t.Context(), 1001, "AnotherTestUserWithUpperCaseEmail@otto.splvs.net", true)) + + unittest.AssertExistsAndLoadBean(t, &user_model.EmailAddress{UID: 1001}, "is_activated = true") + }) + + t.Run("Deactivate email", func(t *testing.T) { + require.NoError(t, user_model.ActivateUserEmail(t.Context(), 1001, "AnotherTestUserWithUpperCaseEmail@otto.splvs.net", false)) + + unittest.AssertExistsAndLoadBean(t, &user_model.EmailAddress{UID: 1001}, "is_activated = false") + }) +} diff --git a/models/user/user.go b/models/user/user.go index eedd1db80e..b124572bb6 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -182,11 +182,11 @@ func (u *User) BeforeUpdate() { u.MaxRepoCreation = -1 } - // Organization does not need email - u.Email = strings.ToLower(u.Email) + // Ensure AvatarEmail is set for non-organization users, because organization + // are not required to have a email set. if !u.IsOrganization() { if len(u.AvatarEmail) == 0 { - u.AvatarEmail = u.Email + u.AvatarEmail = strings.ToLower(u.Email) } } From 1ccd539b6c98b18080ee7189641a1d701ded78ec Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Wed, 2 Jul 2025 13:54:45 +0200 Subject: [PATCH 068/495] [v12.0/forgejo] fix: user activation with uppercase email address (#8386) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8367 - Right before the call to user email activation, the user is updated [^1]. This causes the email to be lowered, which in turn makes the call to activate the user activation fail (on database where collation is case sensitive, which is the recommend collation by Forgejo). - The code in `BeforeUpdate` is quite confusing, the comment has become slightly out of date and was reworded to reflect reality and its purpose. The code is also slightly reworked to only lower the email for the `AvatarEmail` field to avoid causing side-effect. - Added unit test. - Resolves forgejo/forgejo#8354 [^1]: https://codeberg.org/forgejo/forgejo/src/commit/4927d4ee3d53ad79fe88dfe862c33339c0a9cdc6/routers/web/auth/auth.go#L785 Co-authored-by: Gusted Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8386 Reviewed-by: Earl Warren Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- .../TestActivateUserEmail/email_address.yml | 7 +++++++ models/fixtures/TestActivateUserEmail/user.yml | 12 ++++++++++++ models/user/email_address_test.go | 17 +++++++++++++++++ models/user/user.go | 6 +++--- 4 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 models/fixtures/TestActivateUserEmail/email_address.yml create mode 100644 models/fixtures/TestActivateUserEmail/user.yml diff --git a/models/fixtures/TestActivateUserEmail/email_address.yml b/models/fixtures/TestActivateUserEmail/email_address.yml new file mode 100644 index 0000000000..cf41ff8241 --- /dev/null +++ b/models/fixtures/TestActivateUserEmail/email_address.yml @@ -0,0 +1,7 @@ +- + id: 1001 + uid: 1001 + email: AnotherTestUserWithUpperCaseEmail@otto.splvs.net + lower_email: anothertestuserwithuppercaseemail@otto.splvs.net + is_activated: false + is_primary: true diff --git a/models/fixtures/TestActivateUserEmail/user.yml b/models/fixtures/TestActivateUserEmail/user.yml new file mode 100644 index 0000000000..0a68e70a4a --- /dev/null +++ b/models/fixtures/TestActivateUserEmail/user.yml @@ -0,0 +1,12 @@ +- + id: 1001 + lower_name: user1001 + name: user1001 + full_name: User That loves Upper Cases + email: AnotherTestUserWithUpperCaseEmail@otto.splvs.net + passwd: ZogKvWdyEx:password + passwd_hash_algo: dummy + avatar: '' + avatar_email: anothertestuserwithuppercaseemail@otto.splvs.net + login_name: user1 + created_unix: 1672578000 diff --git a/models/user/email_address_test.go b/models/user/email_address_test.go index 1801f57a23..85f5b16c65 100644 --- a/models/user/email_address_test.go +++ b/models/user/email_address_test.go @@ -181,3 +181,20 @@ func TestDeletePrimaryEmailAddressOfUser(t *testing.T) { assert.True(t, user_model.IsErrEmailAddressNotExist(err)) assert.Nil(t, email) } + +func TestActivateUserEmail(t *testing.T) { + defer unittest.OverrideFixtures("models/fixtures/TestActivateUserEmail")() + require.NoError(t, unittest.PrepareTestDatabase()) + + t.Run("Activate email", func(t *testing.T) { + require.NoError(t, user_model.ActivateUserEmail(t.Context(), 1001, "AnotherTestUserWithUpperCaseEmail@otto.splvs.net", true)) + + unittest.AssertExistsAndLoadBean(t, &user_model.EmailAddress{UID: 1001}, "is_activated = true") + }) + + t.Run("Deactivate email", func(t *testing.T) { + require.NoError(t, user_model.ActivateUserEmail(t.Context(), 1001, "AnotherTestUserWithUpperCaseEmail@otto.splvs.net", false)) + + unittest.AssertExistsAndLoadBean(t, &user_model.EmailAddress{UID: 1001}, "is_activated = false") + }) +} diff --git a/models/user/user.go b/models/user/user.go index eedd1db80e..b124572bb6 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -182,11 +182,11 @@ func (u *User) BeforeUpdate() { u.MaxRepoCreation = -1 } - // Organization does not need email - u.Email = strings.ToLower(u.Email) + // Ensure AvatarEmail is set for non-organization users, because organization + // are not required to have a email set. if !u.IsOrganization() { if len(u.AvatarEmail) == 0 { - u.AvatarEmail = u.Email + u.AvatarEmail = strings.ToLower(u.Email) } } From abb95c8c92318c9a98910b36e78c9a60672930a7 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 2 Jul 2025 16:34:56 +0200 Subject: [PATCH 069/495] Update dependency globals to v16.3.0 (forgejo) (#8381) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8381 Reviewed-by: Michael Kriese Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 18e007e5a6..4555b299bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -86,7 +86,7 @@ "eslint-plugin-vue": "10.2.0", "eslint-plugin-vue-scoped-css": "2.10.0", "eslint-plugin-wc": "3.0.1", - "globals": "16.1.0", + "globals": "16.3.0", "happy-dom": "18.0.1", "license-checker-rseidelsohn": "4.4.2", "markdownlint-cli": "0.45.0", @@ -8440,9 +8440,9 @@ } }, "node_modules/globals": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.1.0.tgz", - "integrity": "sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==", + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", + "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index c6e96d68ec..3623c143e0 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "eslint-plugin-vue": "10.2.0", "eslint-plugin-vue-scoped-css": "2.10.0", "eslint-plugin-wc": "3.0.1", - "globals": "16.1.0", + "globals": "16.3.0", "happy-dom": "18.0.1", "license-checker-rseidelsohn": "4.4.2", "markdownlint-cli": "0.45.0", From bcde3aea4fa66e6e64ec1eebf8fd6de9b7f33b53 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 2 Jul 2025 16:40:48 +0200 Subject: [PATCH 070/495] Update module github.com/go-chi/cors to v1.2.2 (forgejo) (#8380) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8380 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 70db6ef875..1602f1ef19 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( github.com/go-ap/activitypub v0.0.0-20231114162308-e219254dc5c9 github.com/go-ap/jsonld v0.0.0-20221030091449-f2a191312c73 github.com/go-chi/chi/v5 v5.2.2 - github.com/go-chi/cors v1.2.1 + github.com/go-chi/cors v1.2.2 github.com/go-co-op/gocron v1.37.0 github.com/go-enry/go-enry/v2 v2.9.2 github.com/go-git/go-git/v5 v5.13.2 diff --git a/go.sum b/go.sum index e9cf6413cd..1aa2380161 100644 --- a/go.sum +++ b/go.sum @@ -215,8 +215,8 @@ github.com/go-asn1-ber/asn1-ber v1.5.5/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkPro github.com/go-chi/chi/v5 v5.0.1/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-chi/chi/v5 v5.2.2 h1:CMwsvRVTbXVytCk1Wd72Zy1LAsAh9GxMmSNWLHCG618= github.com/go-chi/chi/v5 v5.2.2/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops= -github.com/go-chi/cors v1.2.1 h1:xEC8UT3Rlp2QuWNEr4Fs/c2EAGVKBwy/1vHx3bppil4= -github.com/go-chi/cors v1.2.1/go.mod h1:sSbTewc+6wYHBBCW7ytsFSn836hqM7JxpglAy2Vzc58= +github.com/go-chi/cors v1.2.2 h1:Jmey33TE+b+rB7fT8MUy1u0I4L+NARQlK6LhzKPSyQE= +github.com/go-chi/cors v1.2.2/go.mod h1:sSbTewc+6wYHBBCW7ytsFSn836hqM7JxpglAy2Vzc58= github.com/go-co-op/gocron v1.37.0 h1:ZYDJGtQ4OMhTLKOKMIch+/CY70Brbb1dGdooLEhh7b0= github.com/go-co-op/gocron v1.37.0/go.mod h1:3L/n6BkO7ABj+TrfSVXLRzsP26zmikL4ISkLQ0O8iNY= github.com/go-enry/go-enry/v2 v2.9.2 h1:giOQAtCgBX08kosrX818DCQJTCNtKwoPBGu0qb6nKTY= From c0eeb75322fcb62ae09130c9e7d864acd241613d Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Wed, 2 Jul 2025 19:23:07 +0200 Subject: [PATCH 071/495] fix: disable Forgejo Actions email notifications on recovery (#8374) - Make the migration to add an index a noop - do not remove it as it would break v12.next & v13.next - Keep the logic that relies on finding the last run, only always fail to find which is the same as assuming each run is one of a kind Refs forgejo/forgejo#8373 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8374 Reviewed-by: Gusted Co-authored-by: Earl Warren Co-committed-by: Earl Warren --- models/actions/run.go | 14 +-- models/actions/run_test.go | 85 ------------------- models/forgejo_migrations/migrate.go | 2 +- models/forgejo_migrations/v35.go | 12 +-- services/actions/notifier.go | 2 +- .../actions_run_now_done_notification_test.go | 39 +-------- 6 files changed, 10 insertions(+), 144 deletions(-) diff --git a/models/actions/run.go b/models/actions/run.go index 55def805ed..69592120e9 100644 --- a/models/actions/run.go +++ b/models/actions/run.go @@ -284,16 +284,10 @@ func GetLatestRun(ctx context.Context, repoID int64) (*ActionRun, error) { return &run, nil } -// GetRunBefore returns the last run that completed a given timestamp (not inclusive). -func GetRunBefore(ctx context.Context, repoID int64, timestamp timeutil.TimeStamp) (*ActionRun, error) { - var run ActionRun - has, err := db.GetEngine(ctx).Where("repo_id=? AND stopped IS NOT NULL AND stopped v34 NewMigration("Add `notify-email` column to `action_run` table", AddNotifyEmailToActionRun), // v34 -> v35 - NewMigration("Add index to `stopped` column in `action_run` table", AddIndexToActionRunStopped), + NewMigration("Noop because of https://codeberg.org/forgejo/forgejo/issues/8373", NoopAddIndexToActionRunStopped), } // GetCurrentDBVersion returns the current Forgejo database version. diff --git a/models/forgejo_migrations/v35.go b/models/forgejo_migrations/v35.go index 0fb3b43e2c..ca412d7951 100644 --- a/models/forgejo_migrations/v35.go +++ b/models/forgejo_migrations/v35.go @@ -4,16 +4,10 @@ package forgejo_migrations //nolint:revive import ( - "forgejo.org/modules/timeutil" - "xorm.io/xorm" ) -func AddIndexToActionRunStopped(x *xorm.Engine) error { - type ActionRun struct { - ID int64 - Stopped timeutil.TimeStamp `xorm:"index"` - } - - return x.Sync(&ActionRun{}) +// see https://codeberg.org/forgejo/forgejo/issues/8373 +func NoopAddIndexToActionRunStopped(x *xorm.Engine) error { + return nil } diff --git a/services/actions/notifier.go b/services/actions/notifier.go index f1e9a6d7e9..a5bac730be 100644 --- a/services/actions/notifier.go +++ b/services/actions/notifier.go @@ -788,7 +788,7 @@ func (n *actionsNotifier) MigrateRepository(ctx context.Context, doer, u *user_m // the ActionRun of the same workflow that finished before priorRun/updatedRun. func sendActionRunNowDoneNotificationIfNeeded(ctx context.Context, priorRun, updatedRun *actions_model.ActionRun) error { if !priorRun.Status.IsDone() && updatedRun.Status.IsDone() { - lastRun, err := actions_model.GetRunBefore(ctx, updatedRun.RepoID, updatedRun.Stopped) + lastRun, err := actions_model.GetRunBefore(ctx, updatedRun) if err != nil && !errors.Is(err, util.ErrNotExist) { return err } diff --git a/tests/integration/actions_run_now_done_notification_test.go b/tests/integration/actions_run_now_done_notification_test.go index d5142096c5..480d67a73d 100644 --- a/tests/integration/actions_run_now_done_notification_test.go +++ b/tests/integration/actions_run_now_done_notification_test.go @@ -49,41 +49,22 @@ func (m *mockNotifier) ActionRunNowDone(ctx context.Context, run *actions_model. assert.Equal(m.t, m.runID, run.ID) assert.Equal(m.t, actions_model.StatusFailure, run.Status) assert.Equal(m.t, actions_model.StatusRunning, priorStatus) - assert.Equal(m.t, m.lastRunID, lastRun.ID) - assert.Equal(m.t, actions_model.StatusSuccess, lastRun.Status) assert.True(m.t, run.NotifyEmail) case 2: assert.Equal(m.t, m.runID, run.ID) assert.Equal(m.t, actions_model.StatusCancelled, run.Status) assert.Equal(m.t, actions_model.StatusRunning, priorStatus) - assert.Equal(m.t, m.lastRunID, lastRun.ID) - assert.Equal(m.t, actions_model.StatusFailure, lastRun.Status) - assert.True(m.t, run.NotifyEmail) - case 3: - assert.Equal(m.t, m.runID, run.ID) - assert.Equal(m.t, actions_model.StatusSuccess, run.Status) - assert.Equal(m.t, actions_model.StatusRunning, priorStatus) - assert.Equal(m.t, m.lastRunID, lastRun.ID) - assert.Equal(m.t, actions_model.StatusCancelled, lastRun.Status) - assert.True(m.t, run.NotifyEmail) - case 4: - assert.Equal(m.t, m.runID, run.ID) - assert.Equal(m.t, actions_model.StatusSuccess, run.Status) - assert.Equal(m.t, actions_model.StatusRunning, priorStatus) - assert.Equal(m.t, m.lastRunID, lastRun.ID) - assert.Equal(m.t, actions_model.StatusSuccess, lastRun.Status) assert.True(m.t, run.NotifyEmail) default: assert.Fail(m.t, "too many notifications") } - m.lastRunID = m.runID m.runID++ m.testIdx++ } // ensure all tests have been run func (m *mockNotifier) complete() { - assert.Equal(m.t, 5, m.testIdx) + assert.Equal(m.t, 3, m.testIdx) } func TestActionNowDoneNotification(t *testing.T) { @@ -159,24 +140,6 @@ func TestActionNowDoneNotification(t *testing.T) { task = runner.fetchTask(t) require.NoError(t, actions_service.StopTask(db.DefaultContext, task.Id, actions_model.StatusCancelled)) - // we can't differentiate different runs without a delay - time.Sleep(time.Millisecond * 2000) - - // 3: successful run after failure - _, _, err = workflow.Dispatch(db.DefaultContext, inputGetter, repo, user2) - require.NoError(t, err) - task = runner.fetchTask(t) - runner.succeedAtTask(t, task) - - // we can't differentiate different runs without a delay - time.Sleep(time.Millisecond * 2000) - - // 4: successful run after success - _, _, err = workflow.Dispatch(db.DefaultContext, inputGetter, repo, user2) - require.NoError(t, err) - task = runner.fetchTask(t) - runner.succeedAtTask(t, task) - notifier.complete() }) } From d1bb75eea0381f696166868c0e88c12f7168484c Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Wed, 2 Jul 2025 20:03:18 +0200 Subject: [PATCH 072/495] [v12.0/forgejo] fix: disable Forgejo Actions email notifications on recovery (#8390) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8374 - Make the migration to add an index a noop - do not remove it as it would break v12.next & v13.next - Keep the logic that relies on finding the last run, only always fail to find which is the same as assuming each run is one of a kind Refs forgejo/forgejo#8373 Co-authored-by: Earl Warren Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8390 Reviewed-by: Earl Warren Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- models/actions/run.go | 14 +-- models/actions/run_test.go | 85 ------------------- models/forgejo_migrations/migrate.go | 2 +- models/forgejo_migrations/v35.go | 12 +-- services/actions/notifier.go | 2 +- .../actions_run_now_done_notification_test.go | 39 +-------- 6 files changed, 10 insertions(+), 144 deletions(-) diff --git a/models/actions/run.go b/models/actions/run.go index 55def805ed..69592120e9 100644 --- a/models/actions/run.go +++ b/models/actions/run.go @@ -284,16 +284,10 @@ func GetLatestRun(ctx context.Context, repoID int64) (*ActionRun, error) { return &run, nil } -// GetRunBefore returns the last run that completed a given timestamp (not inclusive). -func GetRunBefore(ctx context.Context, repoID int64, timestamp timeutil.TimeStamp) (*ActionRun, error) { - var run ActionRun - has, err := db.GetEngine(ctx).Where("repo_id=? AND stopped IS NOT NULL AND stopped v34 NewMigration("Add `notify-email` column to `action_run` table", AddNotifyEmailToActionRun), // v34 -> v35 - NewMigration("Add index to `stopped` column in `action_run` table", AddIndexToActionRunStopped), + NewMigration("Noop because of https://codeberg.org/forgejo/forgejo/issues/8373", NoopAddIndexToActionRunStopped), } // GetCurrentDBVersion returns the current Forgejo database version. diff --git a/models/forgejo_migrations/v35.go b/models/forgejo_migrations/v35.go index 0fb3b43e2c..ca412d7951 100644 --- a/models/forgejo_migrations/v35.go +++ b/models/forgejo_migrations/v35.go @@ -4,16 +4,10 @@ package forgejo_migrations //nolint:revive import ( - "forgejo.org/modules/timeutil" - "xorm.io/xorm" ) -func AddIndexToActionRunStopped(x *xorm.Engine) error { - type ActionRun struct { - ID int64 - Stopped timeutil.TimeStamp `xorm:"index"` - } - - return x.Sync(&ActionRun{}) +// see https://codeberg.org/forgejo/forgejo/issues/8373 +func NoopAddIndexToActionRunStopped(x *xorm.Engine) error { + return nil } diff --git a/services/actions/notifier.go b/services/actions/notifier.go index f1e9a6d7e9..a5bac730be 100644 --- a/services/actions/notifier.go +++ b/services/actions/notifier.go @@ -788,7 +788,7 @@ func (n *actionsNotifier) MigrateRepository(ctx context.Context, doer, u *user_m // the ActionRun of the same workflow that finished before priorRun/updatedRun. func sendActionRunNowDoneNotificationIfNeeded(ctx context.Context, priorRun, updatedRun *actions_model.ActionRun) error { if !priorRun.Status.IsDone() && updatedRun.Status.IsDone() { - lastRun, err := actions_model.GetRunBefore(ctx, updatedRun.RepoID, updatedRun.Stopped) + lastRun, err := actions_model.GetRunBefore(ctx, updatedRun) if err != nil && !errors.Is(err, util.ErrNotExist) { return err } diff --git a/tests/integration/actions_run_now_done_notification_test.go b/tests/integration/actions_run_now_done_notification_test.go index d5142096c5..480d67a73d 100644 --- a/tests/integration/actions_run_now_done_notification_test.go +++ b/tests/integration/actions_run_now_done_notification_test.go @@ -49,41 +49,22 @@ func (m *mockNotifier) ActionRunNowDone(ctx context.Context, run *actions_model. assert.Equal(m.t, m.runID, run.ID) assert.Equal(m.t, actions_model.StatusFailure, run.Status) assert.Equal(m.t, actions_model.StatusRunning, priorStatus) - assert.Equal(m.t, m.lastRunID, lastRun.ID) - assert.Equal(m.t, actions_model.StatusSuccess, lastRun.Status) assert.True(m.t, run.NotifyEmail) case 2: assert.Equal(m.t, m.runID, run.ID) assert.Equal(m.t, actions_model.StatusCancelled, run.Status) assert.Equal(m.t, actions_model.StatusRunning, priorStatus) - assert.Equal(m.t, m.lastRunID, lastRun.ID) - assert.Equal(m.t, actions_model.StatusFailure, lastRun.Status) - assert.True(m.t, run.NotifyEmail) - case 3: - assert.Equal(m.t, m.runID, run.ID) - assert.Equal(m.t, actions_model.StatusSuccess, run.Status) - assert.Equal(m.t, actions_model.StatusRunning, priorStatus) - assert.Equal(m.t, m.lastRunID, lastRun.ID) - assert.Equal(m.t, actions_model.StatusCancelled, lastRun.Status) - assert.True(m.t, run.NotifyEmail) - case 4: - assert.Equal(m.t, m.runID, run.ID) - assert.Equal(m.t, actions_model.StatusSuccess, run.Status) - assert.Equal(m.t, actions_model.StatusRunning, priorStatus) - assert.Equal(m.t, m.lastRunID, lastRun.ID) - assert.Equal(m.t, actions_model.StatusSuccess, lastRun.Status) assert.True(m.t, run.NotifyEmail) default: assert.Fail(m.t, "too many notifications") } - m.lastRunID = m.runID m.runID++ m.testIdx++ } // ensure all tests have been run func (m *mockNotifier) complete() { - assert.Equal(m.t, 5, m.testIdx) + assert.Equal(m.t, 3, m.testIdx) } func TestActionNowDoneNotification(t *testing.T) { @@ -159,24 +140,6 @@ func TestActionNowDoneNotification(t *testing.T) { task = runner.fetchTask(t) require.NoError(t, actions_service.StopTask(db.DefaultContext, task.Id, actions_model.StatusCancelled)) - // we can't differentiate different runs without a delay - time.Sleep(time.Millisecond * 2000) - - // 3: successful run after failure - _, _, err = workflow.Dispatch(db.DefaultContext, inputGetter, repo, user2) - require.NoError(t, err) - task = runner.fetchTask(t) - runner.succeedAtTask(t, task) - - // we can't differentiate different runs without a delay - time.Sleep(time.Millisecond * 2000) - - // 4: successful run after success - _, _, err = workflow.Dispatch(db.DefaultContext, inputGetter, repo, user2) - require.NoError(t, err) - task = runner.fetchTask(t) - runner.succeedAtTask(t, task) - notifier.complete() }) } From 8cc20864029ff0ee705f0705da0b3790880c49d1 Mon Sep 17 00:00:00 2001 From: Codeberg Translate Date: Thu, 3 Jul 2025 03:51:11 +0000 Subject: [PATCH 073/495] i18n: update of translations from Codeberg Translate Co-authored-by: Benedikt Straub Co-authored-by: Codeberg Translate Co-authored-by: Dirk Co-authored-by: Edgarsons Co-authored-by: Fjuro Co-authored-by: Gusted Co-authored-by: Juno Takano Co-authored-by: Outbreak2096 Co-authored-by: SomeTr Co-authored-by: Vyxie Co-authored-by: Xinayder Co-authored-by: artnay Co-authored-by: earl-warren Co-authored-by: jedik Co-authored-by: justbispo Co-authored-by: kwoot Co-authored-by: leandro-costa Co-authored-by: xtex Co-authored-by: yeager Co-authored-by: zub Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/cs/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/de/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/fil/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/lv/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/nb_NO/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/nds/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/nl/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/pt_BR/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/pt_PT/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/sv/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/uk/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/zh_Hans/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/cs/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/fi/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/fr/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/lv/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/nb_NO/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/nds/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/nl/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/pt_BR/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/pt_PT/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/sv/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/uk/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/zh_Hans/ Translation: Forgejo/forgejo Translation: Forgejo/forgejo-next --- options/locale/locale_cs-CZ.ini | 6 +- options/locale/locale_fi-FI.ini | 4 +- options/locale/locale_fr-FR.ini | 4 +- options/locale/locale_lv-LV.ini | 2 +- options/locale/locale_nb_NO.ini | 118 +++++++++++++++++++++++++- options/locale/locale_nds.ini | 2 +- options/locale/locale_nl-NL.ini | 14 ++- options/locale/locale_pt-BR.ini | 18 ++-- options/locale/locale_pt-PT.ini | 11 +-- options/locale/locale_sv-SE.ini | 12 +-- options/locale/locale_uk-UA.ini | 47 ++++++++-- options/locale/locale_zh-CN.ini | 2 +- options/locale_next/locale_cs-CZ.json | 8 +- options/locale_next/locale_de-DE.json | 3 +- options/locale_next/locale_fil.json | 3 +- options/locale_next/locale_lv-LV.json | 8 +- options/locale_next/locale_nb_NO.json | 108 ++++++++++++++++++++++- options/locale_next/locale_nds.json | 3 +- options/locale_next/locale_nl-NL.json | 13 ++- options/locale_next/locale_pt-BR.json | 8 +- options/locale_next/locale_pt-PT.json | 9 +- options/locale_next/locale_sv-SE.json | 10 ++- options/locale_next/locale_uk-UA.json | 3 +- options/locale_next/locale_zh-CN.json | 3 +- 24 files changed, 366 insertions(+), 53 deletions(-) diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index 830065fb64..168965a740 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -1063,7 +1063,7 @@ language.localization_project = Pomozte nám s překladem Forgejo do vašeho jaz user_block_yourself = Nemůžete zablokovat sami sebe. pronouns_custom_label = Vlastní zájmena change_username_redirect_prompt.with_cooldown.few = Staré uživatelské jméno bude dostupné ostatním po %[1]d dnech. Do té doby budete moci své staré uživatelské jméno znovu získat. -change_username_redirect_prompt.with_cooldown.one = Staré uživatelské jméno bude dostupné ostatním po %[1]d dni. Do té doby budete moci své staré uživatelské jméno znovu získat. +change_username_redirect_prompt.with_cooldown.one = Staré uživatelské jméno bude dostupné ostatním po %[1]d dnu. Do té doby budete moci své staré uživatelské jméno znovu získat. keep_pronouns_private = Zobrazovat zájmena pouze přihlášeným uživatelům keep_pronouns_private.description = Toto nastavení skryje vaše zájmena před návštěvníky, kteří nejsou přihlášeni. quota = Kvóta @@ -1579,7 +1579,7 @@ issues.remove_ref_at=`odstranil/a referenci %s %s` issues.add_ref_at=`přidal/a referenci %s %s` issues.delete_branch_at=`odstranil/a větev %s %s` issues.filter_label=Štítek -issues.filter_label_exclude=`Chcete-li vyloučit štítky, použijte alt + click/enter` +issues.filter_label_exclude=Chcete-li vyloučit štítky, použijte Alt + kliknutí issues.filter_label_no_select=Všechny štítky issues.filter_label_select_no_label=Bez štítku issues.filter_milestone=Milník @@ -3058,7 +3058,7 @@ teams.invite.by=Pozvání od %s teams.invite.description=Pro připojení k týmu klikněte na tlačítko níže. follow_blocked_user = Tuto organizaci nemůžete sledovat, protože jste v ní zablokováni. open_dashboard = Otevřít nástěnku -settings.change_orgname_redirect_prompt.with_cooldown.one = Starý název organizace bude dostupný ostatním po %[1]d dni. Do té doby budete moci staré jméno znovu získat. +settings.change_orgname_redirect_prompt.with_cooldown.one = Starý název organizace bude dostupný ostatním po %[1]d dnu. Do té doby budete moci staré jméno znovu získat. settings.change_orgname_redirect_prompt.with_cooldown.few = Starý název organizace bude dostupný ostatním po %[1]d dnech. Do té doby budete moci starý název znovu získat. [admin] diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini index 164a60cc8d..efd8a16526 100644 --- a/options/locale/locale_fi-FI.ini +++ b/options/locale/locale_fi-FI.ini @@ -2255,14 +2255,14 @@ pulls.cmd_instruction_merge_warning = Varoitus: Asetusta ”Tunnista manu pulls.cmd_instruction_merge_desc = Yhdistä muutokset ja päivitä Forgejossa. pulls.cannot_auto_merge_desc = Tätä vetopyyntöä ei voida yhdistää automaattisesti ristiriitojen vuoksi. adopt_preexisting_success = Omaksuttu tiedostot ja luotu tietovarasto lähteestä %s -issues.comment_manually_pull_merged_at = manuaalisesti yhdistetty kommitti %[1]s %[2]s tietovarastoon %[3]s +issues.comment_manually_pull_merged_at = manuaalisesti yhdisti kommitin %[1]s %[2]s tietovarastoon %[3]s pulls.cmd_instruction_merge_title = Yhdistä pulls.has_merged = Epäonnistui: vetopyyntö on yhdistetty, joten et voi yhdistää uudelleen tai muuttaa kohdehaaraa. pulls.cmd_instruction_checkout_title = Uloskuittaus pulls.cmd_instruction_checkout_desc = Kuittaa ulos uusi haara projektitietovarastostasi ja testaa muutokset. pulls.clear_merge_message_hint = Yhdistämisviestin tyhjentäminen poistaa vain kommittiviestin sisällön ja säilyttää luodut git-trailerit, kuten "Co-Authored-By…". settings.protect_check_status_contexts_desc = Vaadi tilatarkistusten läpäisy ennen yhdistämistä. Kun käytössä, kommitit on ensin työnnettävä toiseen haaraan ja sitten yhdistettävä tai työnnettävä suoraan tätä sääntöä vastaavaan haaraan tilantarkistuksen jälkeen. Jos konteksteja ei löydy, viimeisen kommitin on oltava onnistunut kontekstista riippumatta. -issues.comment_pull_merged_at = yhdistetty kommitti %[1]s %[2]s tietovarastoon %[3]s +issues.comment_pull_merged_at = yhdisti kommitin %[1]s %[2]s haaraan %[3]s settings.pulls.enable_autodetect_manual_merge = Ota Tunnista manuaalinen yhdistäminen automaattisesti -asetus käyttöön (Huomaa: joissakin erityistapauksissa voi esiintyä virhearviointeja) pulls.no_merge_desc = Tätä vetopyyntöä ei voida yhdistää, koska kaikki tietovaraston yhdistämisvaihtoehdot ovat poistettu käytöstä. pulls.no_merge_not_ready = Tämä vetopyyntö ei ole valmis yhdistettäväksi. Tarkista katselmoinnin tila ja tilantarkistukset. diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 1cb7103bc0..e522d5ab92 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -1579,7 +1579,7 @@ issues.remove_ref_at=`a supprimé la référence %s %s.` issues.add_ref_at=`a ajouté la référence %s %s.` issues.delete_branch_at=`a supprimé la branche %s %s.` issues.filter_label=Label -issues.filter_label_exclude=`Utilisez Alt + Clic/entrée pour exclure les labels.` +issues.filter_label_exclude=`Utilisez Alt + Click pour exclure les étiquettes.` issues.filter_label_no_select=Toutes les labels issues.filter_label_select_no_label=Aucun label issues.filter_milestone=Jalon @@ -4091,4 +4091,4 @@ issues.write = Écrire : Fermer des tickets et gérer les métadonnées t pulls.read = Lire : Lire et créer des demandes de tirage. [translation_meta] -test = Ceci est une chaîne de test. Elle n'est pas affichée dans l'interface de Forgejo mais est utilisée à des fins de test. N'hésitez pas à entrer 'ok' pour gagner du temps (ou un fait amusant de votre choix) pour atteindre ce difficile 100 % de complétion. :-) +test = Ceci est une chaîne de test. Elle n'est pas affichée dans Forgejo mais est utilisée à des fins de test. N'hésitez pas à entrer 'ok' pour gagner du temps (ou un fait amusant de votre choix) pour atteindre ce difficile 100 % de complétion. :-) diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 98baff217b..4a98e1aa9d 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -1577,7 +1577,7 @@ issues.remove_ref_at=`noņēma atsauci no %s %s` issues.add_ref_at=`pievienoja atsauci uz %s %s` issues.delete_branch_at=`izdzēsa zaru %s %s` issues.filter_label=Iezīme -issues.filter_label_exclude=`Jāizmanto alt + klikšķis/Enter, lai neiekļautu iezīmes` +issues.filter_label_exclude=Jāizmanto Alt + klikšķis, lai neiekļautu iezīmes issues.filter_label_no_select=Visas iezīmes issues.filter_label_select_no_label=Bez iezīmes issues.filter_milestone=Atskaites punkts diff --git a/options/locale/locale_nb_NO.ini b/options/locale/locale_nb_NO.ini index 2c8b5cfc64..59673fd4e3 100644 --- a/options/locale/locale_nb_NO.ini +++ b/options/locale/locale_nb_NO.ini @@ -60,7 +60,7 @@ rerun = Kjør på nytt rerun_all = Kjør alle jobber på nytt save = Lagre cancel = Avbryt -forks = Forks +forks = Kopier milestones = Milepæler ok = OK test = Test @@ -133,14 +133,42 @@ webauthn_error_duplicated = Sikkerhetsnøkkelen er ikke tillatt for denne foresp webauthn_error_timeout = Et tidsavbrudd oppsto før nøkkelen din kunne leses. Vennligst last inn siden på nytt og prøv igjen. new_fork = Ny fork av repository collaborative = Samarbeidende +error413 = Du har brukt opp kvoten din. +issues = Saker +unpin = Løsne +filter.is_fork = Forks +filter.not_fork = Ikke forks +pull_requests = Pull requests +copy_branch = Kopier branch navn +error404 = Siden du forsøker å nå eksisterer ikke, er blitt fjernet eller du har ikke tilgang til å se den. +tracked_time_summary = Oppsummering av sporet tid basert på problemfiltre [search] -search = Søk... +search = Søk… type_tooltip = Søketype fuzzy = Fuzzy union = Union regexp = RegExp exact = Nøyaktig +team_kind = Søk i teams… +code_kind = Søk i kode… +package_kind = Søk i pakker… +project_kind = Søk i prosjekter… +branch_kind = Søk i brancher… +commit_kind = Søk i commits… +regexp_tooltip = Tolk søkeordet som et regulæruttrykk +pull_kind = Søk i pulls… +keyword_search_unavailable = Søk etter nøkkelord er for øyeblikket ikke tilgjengelig. Kontakt administratoren. +exact_tooltip = Inkluder kun resultater som samsvarer nøyaktig med søkeordet +repo_kind = Søk i repositorer… +fuzzy_tooltip = Inkluder resultater som også stemmer godt overens med søketermen +org_kind = Søk i organisasjoner… +issue_kind = Søk i saker… +runner_kind = Søk i runners… +no_results = Ingen treff funnet. +union_tooltip = Inkluder resultater som samsvarer med ett eller flere av nøkkelordene adskilt med mellomrom +code_search_unavailable = Kodesøk er ikke tilgjengelig. Kontakt administratoren. +user_kind = Søk i brukere… [auth] verify = Bekreft @@ -152,4 +180,88 @@ oauth_signup_title = Fullfør ny konto oauth_signup_submit = Fullfør konto [home] -uname_holder = Brukernavn eller e-postadresse \ No newline at end of file +uname_holder = Brukernavn eller e-postadresse + +[heatmap] +contributions_zero = Ingen bidrag +number_of_contributions_in_the_last_12_months = %s bidrag de siste 12 månedene +contributions_one = bidrag +contributions_format = {contributions} den {day} {month} {year} +less = Mindre +contributions_few = bidrag +more = Mer + +[editor] +buttons.heading.tooltip = Legg til overskrift +buttons.bold.tooltip = Legg til uthevet tekst +buttons.italic.tooltip = Legg til kursiv text +buttons.list.unordered.tooltip = Legg til punktliste +buttons.list.ordered.tooltip = Legg til nummerert liste +buttons.link.tooltip = Legg til link +buttons.quote.tooltip = Siter tekst +buttons.mention.tooltip = Nevn en bruker eller team +buttons.list.task.tooltip = Legg til liste over saker +buttons.code.tooltip = Legg til kode +table_modal.header = Legg til tabell +table_modal.placeholder.header = Overskrift +table_modal.placeholder.content = Innhold +table_modal.label.columns = Kolonner +buttons.new_table.tooltip = Legg til tabell +table_modal.label.rows = Rader +buttons.switch_to_legacy.tooltip = Bruk den gamle editoren istedenfor +buttons.disable_monospace_font = Deaktiver monospace font +buttons.ref.tooltip = Referanse til en sak eller pull request +buttons.indent.tooltip = Grupper elementene med et nivå +buttons.unindent.tooltip = Pakk ut elementene med et nivå +link_modal.url = Url +link_modal.description = Beskrivelse +link_modal.header = Legg til en link +buttons.enable_monospace_font = Aktiver monospace font +link_modal.paste_reminder = Tips: Når du har en URL i utklippstavlen kan du lime den direkte inn i editoren for å lage en lenke. + +[aria] +footer = Bunntekst +navbar = Navigasjonslinje +footer.links = Linker +footer.software = Om dette programmet + +[filter] +string.asc = A - Z +string.desc = Z - A + +[error] +occurred = En feil oppstod +not_found = Kunne ikke finne målet. +report_message = Hvis du mener dette er en feil i Forgejo kan du søke på Codeberg eller åpne en ny sak. +network_error = Nettverks feil +server_internal = Intern server feil + +[install] +docker_helper = Dersom du bruker Forgejo med Docker, anbefales det å lese dokumentasjonen før du gjør endringer i konfigurasjonen. +db_title = Database innstillinger +require_db_desc = Forgejo krever MySQL, PostgreSQL, SQLite3 eller TiDB (MySQL protokoll). +db_type = Database type +password = Passord +user = Brukernavn +install = Installasjon +title = Førstegangsoppsett +host = Server +db_name = Database navn +db_schema = Skjema +db_schema_helper = La stå tomt for databasens standardverdi ("public"). +ssl_mode = SSL +path = Sti +sqlite_helper = Sti til SQLite3-databasen.
Bruk absolutt filsti dersom Forgejo kjøres som en tjeneste. +reinstall_error = Du prøver å installere i en eksisterende Forgejo-database +reinstall_confirm_message = Å installere på nytt med en eksisterende Forgejo-database kan føre til problemer. I de fleste tilfeller bør du bruke din eksisterende "app.ini" for å kjøre Forgejo. Hvis du vet hva du gjør, og vil fortsette, bekreft følgende: + +[startpage] +install = Enkel å installere +platform = Plattformuavhengig +install_desc = Du kan enkelt kjøre programfilen for din platform, bruke Docker, eller hente den som en ferdig pakke. +lightweight_desc = Forgejo krever lite ressurser og kan kjøres på en rimelig Raspberry Pi. Spar strøm og miljøet! +app_desc = En enkel Git-tjeneste du kan drifte selv +lightweight = Lettvekt +license = Åpen kildekode +platform_desc = Forgejo fungerer på frie operativsystemer som Linux og FreeBSD, og støtter flere CPU-arkitekturer. Velg den plattformen du foretrekker! +license_desc = Last ned Forgejo! Bli med ved å bidra for å gjøre prosjektet enda bedre. Ikke vær redd for å bli en bidragsyter! \ No newline at end of file diff --git a/options/locale/locale_nds.ini b/options/locale/locale_nds.ini index 68fe899d6e..cd91f7c35a 100644 --- a/options/locale/locale_nds.ini +++ b/options/locale/locale_nds.ini @@ -1552,7 +1552,7 @@ issues.dependency.pr_close_blocks = Deeser Haalvörslag blockeert dat Dichtmaken issues.dependency.issue_batch_close_blocked = Kann de utköört Gefallens nich all tosamen dichtmaken, denn Gefall #%d hett noch open Ofhangens issues.dependency.pr_close_blocked = Du muttst all Gefallens, wat deesen Haalvörslag blockeren, dichtmaken, ehr du dat hier tosamenföhren kannst. issues.dependency.blocks_short = Blockeert -issues.dependency.blocked_by_short = Hang of vun +issues.dependency.blocked_by_short = Hangt of vun issues.dependency.remove_header = Ofhangen wegdoon issues.dependency.setting = Ofhangens för Gefallens un Haalvörslagen anknipsen issues.dependency.add_error_same_issue = Du kannst een Gefall nich vun sik sülvst ofhangen laten. diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index 48442bc39f..7e08c8036c 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -1495,7 +1495,7 @@ issues.remove_ref_at=`heeft referentie %s verwijderd %s` issues.add_ref_at=`heeft referentie %s toegevoegd %s` issues.delete_branch_at=`heeft %[2]s de branch %[1]s verwijderd.` issues.filter_label=Label -issues.filter_label_exclude=Gebruik alt + klik/voer in om labels uit te sluiten +issues.filter_label_exclude=Gebruik alt + klik om labels uit te sluiten issues.filter_label_no_select=Alle labels issues.filter_milestone=Mijlpaal issues.filter_project=Project @@ -1554,8 +1554,8 @@ issues.close_comment_issue=Sluit met commentaar issues.reopen_issue=Heropen issues.reopen_comment_issue=Heropen met commentaar issues.create_comment=Reageer -issues.closed_at=`heeft dit probleem gesloten %s` -issues.reopened_at=`heropende dit probleem %s` +issues.closed_at=`heeft deze issue gesloten %s` +issues.reopened_at=`heropende deze issue %s` issues.commit_ref_at=`verwees naar dit probleem vanuit commit %s` issues.ref_issue_from=`refereerde aan dit issue %[3]s %[1]s` issues.ref_pull_from=`refereerde aan deze pull request %[3]s %[1]s` @@ -2912,6 +2912,14 @@ comment.blocked_by_user = Commentaar geven is niet mogelijk omdat u geblokkeerd sync_fork.button = Synchroniseer sync_fork.branch_behind_one = Deze branch is %[1]d commit achter %[2]s sync_fork.branch_behind_few = Deze branch is %[1]d commits achter %[2]s +settings.event_action_failure = Mislukking +settings.event_action_failure_desc = Action run is mislukt. +settings.event_action_recover = Herstel +settings.event_action_success = Succes +settings.event_action_success_desc = Action run is geslaagd. +settings.event_header_action = Actie run evenementen +issues.filter_type.all_pull_requests = Alle pull requests +settings.event_action_recover_desc = Action run is geslaagd nadat de laatste action run in dezelfde workflow is mislukt. diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 8de0374eb2..cd5cc14833 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -1278,7 +1278,7 @@ star_guest_user=Entre para adicionar este repositório aos favoritos. unwatch=Deixar de observar watch=Observar unstar=Retirar dos favoritos -star=Juntar aos favoritos +star=Adicionar aos favoritos fork=Fork download_archive=Baixar repositório more_operations=Mais operações @@ -1934,7 +1934,7 @@ pulls.status_checks_success=Todas as verificações foram bem sucedidas pulls.status_checks_warning=Algumas verificações reportaram avisos pulls.status_checks_failure=Algumas verificações falharam pulls.status_checks_error=Algumas verificações reportaram erros -pulls.status_checks_requested=Obrigatário +pulls.status_checks_requested=Obrigatório pulls.status_checks_details=Detalhes pulls.update_branch=Atualizar branch por merge pulls.update_branch_rebase=Atualizar branch por rebase @@ -2803,7 +2803,7 @@ mirror_use_ssh.helper = Forgejo irá espelhar o repositório via Git através de mirror_denied_combination = Não é possível combinar o uso de chave pública e autenticação baseada em senha. mirror_public_key = Chave SSH pública mirror_use_ssh.text = Usar autenticação por SSH -mirror_use_ssh.not_available = Autenticação por SSH não está disponível. +mirror_use_ssh.not_available = A autenticação via SSH não está disponível. settings.push_mirror_sync_in_progress = Fazendo push das mudanças para o remoto %s nesse momento. settings.federation_apapiurl = URL de federação deste repositório. Copie e cole isso nas Configurações de Federação de outro repositório como uma URL de um Repositório Seguidor. pulls.agit_explanation = Criado usando o fluxo de trabalho AGit. AGit permite que contribuidores proponham mudanças usando "git push" sem criar um fork ou novo branch. @@ -2817,7 +2817,7 @@ settings.mirror_settings.pushed_repository = Repositório enviado settings.mirror_settings.docs.disabled_pull_mirror.instructions = Configure seu projeto para automaticamente fazer push de commits, tags e branches para outro repositório. Espelhos de pull foram desativados pelo administrador do seu site. settings.mirror_settings.docs.disabled_push_mirror.instructions = Configure seu projeto para automaticamente fazer pull de commits, tags e branches de outro repositório. settings.mirror_settings.docs.doc_link_pull_section = a seção "Fazendo pull de um repositório remoto" da documentação. -subscribe.pull.guest.tooltip = Entre para receber notificações deste pull request. +subscribe.pull.guest.tooltip = Inicie a sessão para receber notificações deste pull request. settings.pull_mirror_sync_quota_exceeded = Cota excedida, não será feito pull das mudanças. settings.mirror_settings.docs.more_information_if_disabled = Saiba mais sobre espelhos de push e pull aqui: settings.transfer_quota_exceeded = O novo dono (%s) excedeu a cota. O repositório não foi transferido. @@ -3900,7 +3900,7 @@ deletion=Excluir segredo deletion.description=A exclusão de um segredo é permanente e não pode ser desfeita. Continuar? deletion.success=O segredo foi excluído. deletion.failed=Falha ao excluir segredo. -management=Gerenciar segredos +management=Gerenciamento de segredos [actions] actions=Ações @@ -3909,12 +3909,12 @@ unit.desc=Gerenciar pipelines integradas de CI/CD com Forgejo Actions. status.unknown=Desconhecido status.waiting=Aguardando -status.running=Rodando +status.running=Executando status.success=Sucesso status.failure=Falha -status.cancelled=Cancelado -status.skipped=Ignorado -status.blocked=Bloqueado +status.cancelled=Cancelada +status.skipped=Ignorada +status.blocked=Bloqueada runners=Runners runners.runner_manage_panel=Gerenciar runners diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index 0e8f2d485e..9e1c7f7f63 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -1063,8 +1063,8 @@ language.description = Este idioma vai ser guardado na sua conta e ser usado com language.localization_project = Ajude-nos a traduzir o Forgejo para o seu idioma! Ler mais. pronouns_custom_label = Pronomes personalizados user_block_yourself = Não se pode bloquear a si próprio. -change_username_redirect_prompt.with_cooldown.one = O nome de utilizador antigo estará disponível para todos após um período de espera de %[1]d dia, podendo ainda reivindicar o nome de utilizador antigo durante o período de espera. -change_username_redirect_prompt.with_cooldown.few = O nome de utilizador antigo ficará disponível para todos após um período de espera de %[1]d dias, podendo ainda reivindicar o nome de utilizador antigo durante o período de espera. +change_username_redirect_prompt.with_cooldown.one = O nome de utilizador antigo estará disponível para todos após um período de espera de %[1]d dia. Pode ainda reivindicar o nome de utilizador antigo durante o período de espera. +change_username_redirect_prompt.with_cooldown.few = O nome de utilizador antigo ficará disponível para todos após um período de espera de %[1]d dias. Pode ainda reivindicar o nome de utilizador antigo durante o período de espera. quota.applies_to_user = As seguintes regras de quotas aplicam-se à sua conta quota.sizes.assets.artifacts = Artefactos quota.rule.exceeded.helper = O tamanho total dos objectos para esta regra excedeu a quota. @@ -1583,7 +1583,7 @@ issues.remove_ref_at=`removeu a referência %s %s` issues.add_ref_at=`adicionou a referência %s %s` issues.delete_branch_at=`eliminou o ramo %s %s` issues.filter_label=Rótulo -issues.filter_label_exclude=`Use alt + clique/enter para excluir rótulos` +issues.filter_label_exclude=Use Alt + Clique para excluir rótulos issues.filter_label_no_select=Todos os rótulos issues.filter_label_select_no_label=Sem rótulo issues.filter_milestone=Etapa @@ -2922,6 +2922,7 @@ settings.event_header_action = Eventos da execução de ações settings.event_action_recover_desc = A execução de ação foi bem sucedida depois da última execução de ação na mesma sequência de trabalho ter falhado. settings.event_action_success = Sucesso settings.event_action_success_desc = A Execução de ação foi bem sucedida. +issues.filter_type.all_pull_requests = Todos os pedidos de integração [graphs] component_loading=A carregar %s… @@ -3057,8 +3058,8 @@ teams.invite.by=Convidado(a) por %s teams.invite.description=Clique no botão abaixo para se juntar à equipa. follow_blocked_user = Não pode seguir esta organização porque esta organização bloqueou-o/a. open_dashboard = Abrir painel de controlo -settings.change_orgname_redirect_prompt.with_cooldown.one = O nome antigo da organização estará disponível para todos após um período de espera de %[1]d dia, podendo ainda reivindicar o nome antigo durante o período de espera. -settings.change_orgname_redirect_prompt.with_cooldown.few = O nome antigo da organização estará disponível para todos após um período de espera de %[1]d dias, podendo ainda reivindicar o nome antigo durante o período de espera. +settings.change_orgname_redirect_prompt.with_cooldown.one = O nome antigo da organização estará disponível para todos após um período de espera de %[1]d dia. Pode ainda reivindicar o nome antigo durante o período de espera. +settings.change_orgname_redirect_prompt.with_cooldown.few = O nome antigo da organização estará disponível para todos após um período de espera de %[1]d dias. Pode ainda reivindicar o nome antigo durante o período de espera. [admin] dashboard=Painel de controlo diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index 8b43cb29b8..2e212c8c49 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -918,7 +918,7 @@ migrate.migrate_items_options=Åtkomsttoken krävs för att migrera ytterligare migrated_from=Migrerad från %[2]s migrated_from_fake=Migrerad från %[1]s migrate.migrate=Migrera från %s -migrate.migrating=Migrerar från %s ... +migrate.migrating=Migrerar från %s … migrate.migrating_failed=Migrering från %s misslyckades. migrate.migrating_issues=Migrerar ärenden @@ -2324,15 +2324,15 @@ exact = Exakt exact_tooltip = Inkludera bara resultat som exakt matchar söktermen repo_kind = Sök repon… user_kind = Sök användare… -code_kind = Sök kod... -package_kind = Sök paket... +code_kind = Sök kod… +package_kind = Sök paket… runner_kind = Sök exekutorer... -branch_kind = Sök grenar... +branch_kind = Sök grenar… commit_kind = Sök commiter... -project_kind = Sök projekt... +project_kind = Sök projekt… search = Sök… type_tooltip = Söktyp -team_kind = Sök lag... +team_kind = Sök team… org_kind = Sök organisationer… issue_kind = Sök ärenden... regexp_tooltip = Tolka söktermen som ett reguljärt uttryck diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index faa3f2a56e..331c7403eb 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -198,7 +198,7 @@ buttons.disable_monospace_font = Вимкнути моноширинний шр buttons.indent.tooltip = Вкласти предмет на один рівень buttons.unindent.tooltip = Викласти об'єкт на один рівень buttons.mention.tooltip = Згадати користувача чи команду -buttons.ref.tooltip = Послатись на задачу чи на запит на злиття +buttons.ref.tooltip = Послатися на задачу чи на запит на злиття buttons.enable_monospace_font = Увімкнути моноширинний шрифт buttons.new_table.tooltip = Додати таблицю table_modal.label.columns = Стовпці @@ -1276,7 +1276,7 @@ file_raw=Неформатований file_history=Історія file_view_source=Переглянути вихідний код file_view_rendered=Переглянути відрендерено -file_view_raw=Перегляд Raw +file_view_raw=Переглянути неформатований file_permalink=Постійне посилання file_too_large=Цей файл завеликий щоб бути показаним. @@ -2669,6 +2669,31 @@ settings.event_action_recover = Відновлено commitstatus.success = Успіх commitstatus.failure = Збій issues.filter_type.all_pull_requests = Усі запити на злиття +broken_message = Неможливо прочитати дані Git, що лежать в основі цього репозиторію. Зверніться до адміністратора цього екземпляра або видаліть репозиторій. +migrate.invalid_local_path = Локальний шлях недійсний. Він не існує або не є каталогом. +editor.filename_is_a_directory = Назва файлу «%s» уже використовується в цьому репозиторії як назва каталогу. +editor.filename_is_invalid = Хибна назва файлу: «%s». +migrate_options_lfs_endpoint.placeholder = Якщо залишити порожнім, то кінцеву точку буде визначено з URL-адреси клону +cite_this_repo = Послатися на цей репозиторій +editor.directory_is_a_file = Назва каталогу «%s» уже використовується в цьому репозиторії як назва файлу. +subscribe.issue.guest.tooltip = Увійдіть, щоб підписатися на цю задачу. +invisible_runes_header = `Цей файл містить невидимі символи Юнікоду` +invisible_runes_line = `У цьому рядку є невидимі символи Юнікоду` +subscribe.pull.guest.tooltip = Увійдіть, щоб підписатися на цей запит на злиття. +ambiguous_runes_header = `Цей файл містить неоднозначні символи Юнікоду` +ambiguous_runes_line = `У цьому рядку є неоднозначні символи Юнікоду` +issues.choose.invalid_config = У конфігурації задачі є помилки: +escape_control_characters = Escape +ambiguous_runes_description = `Цей файл містить символи Юнікоду, які легко сплутати з іншими символами. Якщо так зроблено навмисно, можете ігнорувати це попередження. Щоб показати ці символи, скористайтеся кнопкою «Escape».` +unescape_control_characters = Unescape +invisible_runes_description = `Цей файл містить невидимі символи Юнікоду, які людині неможливо розрізнити, але які по-різному обробляються комп'ютером. Якщо так зроблено навмисно, можете ігнорувати це попередження. Щоб показати ці символи, скористайтеся кнопкою «Escape».` +ambiguous_character = `%[1]c [U+%04[1]X] можна сплутати з %[2]c [U+%04[2]X]` +settings.sourcehut_builds.secrets_helper = Надати завданню доступ до секретів збірки (потрібен дозвіл SECRETS:RO) +no_eol.text = Без EOL +settings.remove_protected_branch_failed = Не вдалося видалити правило захисту гілок «%s». +summary_card_alt = Підсумкова картка репозиторію %s +issues.summary_card_alt = Підсумкова картка задачі «%s» в репозиторії %s +release.summary_card_alt = Підсумкова картка випуску «%s» в репозиторії %s [graphs] contributors.what = внески @@ -3193,7 +3218,7 @@ config.git_gc_timeout=Тайм-аут операції збирача смітт config.log_config=Конфігурація журналу config.disabled_logger=Вимкнено -config.access_log_mode=Режим доступу до журналу +config.access_log_mode=Режим журналювання доступу config.xorm_log_sql=Журнал SQL @@ -3250,7 +3275,7 @@ packages.package_manage_panel = Керування пакунками packages.published = Опубліковано notices.operations = Дії packages.cleanup = Очистити недійсні дані -packages.cleanup.success = Успішно очищено недійсні дані +packages.cleanup.success = Недійсні дані успішно очищено users.still_own_packages = Цей користувач досі володіє одним чи більше пакунками, спочатку видаліть ці пакунки. users.purge_help = Примусово видалити користувача і будь-які репозиторії, організації та пакунки, якими він володіє. Всі коментарі та задачі, створені цим користувачем, також будуть видалені. dashboard.cleanup_packages = Очистити непридатні пакунки @@ -3306,6 +3331,12 @@ defaulthooks.desc = Вебхуки автоматично сповіщають H assets = Ресурси коду auths.invalid_openIdConnectAutoDiscoveryURL = Неправильна URL-адреса автоматичного виявлення (повинна бути дійсна URL-адреса, що починається з http:// або https://) settings = Налаштування адміністратора +dashboard.start_schedule_tasks = Запустити заплановані завдання дій +config.logger_name_fmt = Журнал: %s +config.set_setting_failed = Не вдалося встановити параметр %s +config.access_log_template = Шаблон журналу доступу +dashboard.cancel_abandoned_jobs = Скасувати покинуті завдання дій +monitor.download_diagnosis_report = Завантажити діагностичний звіт [action] @@ -3526,6 +3557,8 @@ cran.registry = Налаштуйте цей реєстр у файлі Rpr npm.registry = Налаштуйте цей реєстр у файлі .npmrc свого проєкту: chef.registry = Налаштуйте цей реєстр у файлі ~/.chef/config.rb: owner.settings.chef.keypair.description = Запити до реєстру Chef повинні бути криптографічно підписані як засіб автентифікації. При генерації пари ключів на Forgejo зберігається тільки публічний ключ. Приватний ключ надається вам для використання команд knife. Генерація нової пари ключів замінить попередню. +nuget.dependency.framework = Цільовий фреймворк +owner.settings.cleanuprules.preview.overview = Заплановано видалити %d пакунків. [secrets] deletion = Видалити секрет @@ -3629,6 +3662,10 @@ runners.update_runner_success = Ранер оновлено runners.delete_runner_header = Підтвердіть видалення ранера runners.status.offline = Неактивний runners.status.idle = Простоює +runs.invalid_workflow_helper = Недійсний файл конфігурації робочого потоку. Будь ласка, перевірте файл конфігурації: %s +runs.no_job = Робочий потік повинен містити принаймні одне завдання +workflow.dispatch.use_from = Використати робочий потік із +runs.no_job_without_needs = Робочий потік повинен містити принаймні одне завдання без залежностей. @@ -3641,7 +3678,7 @@ deleted.display_name = Видалений проєкт [git.filemode] symbolic_link=Символічне посилання -directory = Тека +directory = Каталог submodule = Підмодуль normal_file = Звичайний файл executable_file = Виконуваний файл diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index c6c534df9f..d87ad53676 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -171,7 +171,7 @@ copy_path = 复制路径 [aria] navbar=导航栏 footer=页脚 -footer.software=关于软件 +footer.software=关于此软件 footer.links=链接 [heatmap] diff --git a/options/locale_next/locale_cs-CZ.json b/options/locale_next/locale_cs-CZ.json index 97a8536d4f..24380bea1b 100644 --- a/options/locale_next/locale_cs-CZ.json +++ b/options/locale_next/locale_cs-CZ.json @@ -105,5 +105,11 @@ "settings.visibility.description": "Viditelnost profilu ovlivňuje možnost ostatních přistupovat k vašim veřejným repozitářům. Zjistit více", "avatar.constraints_hint": "Velikost vlastního avataru nesmí překročit %[1]s nebo být větší než %[2]dx%[3]d pixelů", "repo.diff.commit.next-short": "Další", - "repo.diff.commit.previous-short": "Předchozí" + "repo.diff.commit.previous-short": "Předchozí", + "profile.actions.tooltip": "Další akce", + "keys.gpg.link": "Klíče GPG", + "profile.edit.link": "Upravit profil", + "feed.atom.link": "Zdroj Atom", + "keys.ssh.link": "Klíče SSH", + "og.repo.summary_card.alt_description": "Karta se souhrnem repozitáře %[1]s, popsaným jako: %[2]s" } diff --git a/options/locale_next/locale_de-DE.json b/options/locale_next/locale_de-DE.json index 3847de2b43..d256c54dc6 100644 --- a/options/locale_next/locale_de-DE.json +++ b/options/locale_next/locale_de-DE.json @@ -102,5 +102,6 @@ "feed.atom.link": "Atom-Feed", "keys.ssh.link": "SSH-Schlüssel", "keys.gpg.link": "GPG-Schlüssel", - "profile.actions.tooltip": "Mehr Aktionen" + "profile.actions.tooltip": "Mehr Aktionen", + "og.repo.summary_card.alt_description": "Zusammenfassungskarte des Repositorys %[1]s, beschrieben als %[2]s" } diff --git a/options/locale_next/locale_fil.json b/options/locale_next/locale_fil.json index 884a7b44eb..84b537fbdc 100644 --- a/options/locale_next/locale_fil.json +++ b/options/locale_next/locale_fil.json @@ -102,5 +102,6 @@ "feed.atom.link": "Atom feed", "keys.ssh.link": "Mga SSH key", "keys.gpg.link": "Mga GPG key", - "profile.actions.tooltip": "Higit pang mga aksyon" + "profile.actions.tooltip": "Higit pang mga aksyon", + "og.repo.summary_card.alt_description": "Card ng pangkalahatang ideya ng repositoryong %[1]s, inilalarawan bilang: %[2]s" } diff --git a/options/locale_next/locale_lv-LV.json b/options/locale_next/locale_lv-LV.json index f71cfa227d..4deae220bf 100644 --- a/options/locale_next/locale_lv-LV.json +++ b/options/locale_next/locale_lv-LV.json @@ -105,5 +105,11 @@ "settings.visibility.description": "Profila redzamība ietekmē iespēju citiem piekļūt Tavām glabātavām, kas nav privātas. Uzzināt vairāk", "avatar.constraints_hint": "Pielāgots profila attēls nevar pārsniegt %[1]s vai būt lielāks par %[2]dx%[3]d pikseļiem", "repo.diff.commit.next-short": "Nāk.", - "repo.diff.commit.previous-short": "Iepr." + "repo.diff.commit.previous-short": "Iepr.", + "profile.actions.tooltip": "Vairāk darbību", + "profile.edit.link": "Labot profilu", + "feed.atom.link": "Atom barotne", + "keys.ssh.link": "SSH atslēgas", + "keys.gpg.link": "GPG atslēgas", + "og.repo.summary_card.alt_description": "Glabātavas %[1]s kopsavilkuma kartīte, aprakstīta kā: %[2]s" } diff --git a/options/locale_next/locale_nb_NO.json b/options/locale_next/locale_nb_NO.json index 0967ef424b..3349e136b5 100644 --- a/options/locale_next/locale_nb_NO.json +++ b/options/locale_next/locale_nb_NO.json @@ -1 +1,107 @@ -{} +{ + "relativetime.1day": "i går", + "moderation.abuse_category.other_violations": "Andre regel overtredelser", + "moderation.report_remarks": "Kommentar", + "moderation.report_remarks.placeholder": "Skriv noen detaljer rundt missbruket du rapporterer.", + "moderation.submit_report": "Send rapport", + "moderation.reporting_failed": "Missbruk rapporten kunne ikke sendes inn: %v", + "relativetime.hours": { + "one": "%d time siden", + "other": "%d timer siden" + }, + "repo.form.cannot_create": "Det maksimale antallet repositories er nådd i alle områdene du har tilgang til.", + "repo.issue_indexer.title": "Saksindekserer", + "moderation.abuse_category.illegal_content": "Ulovlig innhold", + "error.not_found.title": "Fant ikke siden", + "themes.names.forgejo-light": "Forgejo lyst", + "themes.names.forgejo-dark": "Forgejo mørk", + "stars.list.none": "Ingen har gitt stjerner til dette repoet.", + "watch.list.none": "Ingen følger dette repoet.", + "followers.incoming.list.none": "Ingen følger denne brukeren.", + "followers.outgoing.list.self.none": "Du følger ikke noen.", + "followers.outgoing.list.none": "%s følger ikke noen.", + "relativetime.2days": "to dager siden", + "relativetime.1week": "forrige uke", + "relativetime.2weeks": "to uker siden", + "relativetime.1month": "forrige måned", + "relativetime.2months": "to måneder siden", + "relativetime.1year": "i fjor", + "relativetime.2years": "to år siden", + "alert.asset_load_failed": "Kunne ikke laste inn ressursfiler fra {path}. Sørg for at ressursfilene er tilgjengelige.", + "search.milestone_kind": "Søker i milepæler…", + "home.welcome.no_activity": "Ingen aktivitet", + "home.explore_repos": "Utforsk repositorier", + "home.explore_users": "Utforsk brukere", + "home.explore_orgs": "Utforsk organisasjoner", + "relativetime.mins": { + "one": "%d minutt siden", + "other": "%d minutter siden" + }, + "relativetime.months": { + "one": "%d måned siden", + "other": "%d måneder siden" + }, + "relativetime.years": { + "one": "%d år siden", + "other": "%d år siden" + }, + "repo.pulls.title_desc": { + "one": "ønsker å slå sammen %[1]d commit fra %[2]s inn i %[3]s", + "other": "ønsker å slå sammen %[1]d commits fra %[2]s inn i %[3]s" + }, + "og.repo.summary_card.alt_description": "Sammendrag for repository %[1]s, beskrevet som: %[2]s", + "followers.incoming.list.self.none": "Ingen følger profilen din.", + "install.invalid_lfs_path": "Kan ikke opprette LFS-root på: %[1]s", + "relativetime.now": "nå", + "relativetime.future": "i fremtiden", + "repo.pulls.merged_title_desc": { + "one": "slo sammen %[1]d commit fra %[2]s inn i %[3]s %[4]s", + "other": "slo sammen %[1]d commits fra %[2]s inn i %[3]s %[4]s" + }, + "editor.textarea.tab_hint": "Linjen er allerede innrykket. Trykk Tab igjen eller trykk Escape for å gå ut av editoren.", + "editor.textarea.shift_tab_hint": "Ingen innrykk på denne linjen. Trykk Shift + Tab igjen eller Escape for å gå ut av editoren.", + "alert.range_error": " må være et nummer mellom %[1]s og %[2]s.", + "themes.names.forgejo-auto": "Forgejo (følg systemtema)", + "home.welcome.activity_hint": "Det er foreløpig ingenting i feeden din. Aktivitetene dine og handlingene dine fra repositorier du følger, vil vises her etter hvert.", + "incorrect_root_url": "Denne Forgejo instansen er konfigurert til å bruke \"%s\". Du bruker Forgejo via en annen URL, noe som kan forårsake at deler av applikasjonen ikke fungerer. Den kanoniske URL-en styres av Forgejo-administratorer via innstillingen ROOT_URL i app.ini-filen.", + "mail.actions.run_info_trigger": "Startet på grunn av: %[1]s by: %[2]s", + "admin.dashboard.cleanup_offline_runners": "Rydd opp offline runners", + "settings.visibility.description": "Profilens synlighet påvirker andres mulighet til å få tilgang til dine ikke-private repositorier. Les mer", + "profile.actions.tooltip": "Flere handlinger", + "profile.edit.link": "Rediger profil", + "relativetime.days": { + "one": "%d dag siden", + "other": "%d dager siden" + }, + "relativetime.weeks": { + "one": "%d uke siden", + "other": "%d uker siden" + }, + "feed.atom.link": "Atom feed", + "keys.ssh.link": "SSH nøkler", + "keys.gpg.link": "GPG nøkler", + "admin.config.moderation_config": "Moderasjonskonfigurasjon", + "moderation.report_abuse": "Rapporter missbruk", + "moderation.report_content": "Rapporter innhold", + "moderation.report_abuse_form.header": "Rapporter missbruk til en administrator", + "moderation.report_abuse_form.details": "Denne formen skal brukes for å rapporterer brukere som oppretter spam profiler, repositorier, saker, kommentarer eller oppfører seg upassende.", + "moderation.report_abuse_form.invalid": "Ugyldige argumenter", + "moderation.report_abuse_form.already_reported": "Du har allerede rapportert dette innholdet", + "moderation.abuse_category": "Kategori", + "moderation.abuse_category.placeholder": "Velg en kategori", + "moderation.abuse_category.spam": "Spam", + "moderation.abuse_category.malware": "Skadelig programvare", + "moderation.reported_thank_you": "Takk for meldingen. Vi har varslet administratorene.", + "mail.actions.successful_run_after_failure_subject": "Arbeidsflyten %[1]s er gjenopprettet i repository %[2]s", + "mail.actions.not_successful_run_subject": "Arbeidsflyten %[1]s feilet i repository %[2]s", + "mail.actions.successful_run_after_failure": "Arbeidsflyten %[1]s er gjenopprettet i repository %[2]s", + "mail.actions.not_successful_run": "Arbeidsflyten %[1]s feilet i repository %[2]s", + "mail.actions.run_info_cur_status": "Status for denne kjøringen: %[1]s (oppdatert fra %[2]s)", + "mail.actions.run_info_previous_status": "Status for forrige kjøring: %[1]s", + "mail.actions.run_info_ref": "Branch: %[1]s (%[2]s)", + "repo.diff.commit.next-short": "Neste", + "repo.diff.commit.previous-short": "Forrige", + "discussion.locked": "Denne diskusjonen er låst. Kommentarer kan kun gjøres av bidragsytere.", + "avatar.constraints_hint": "Egendefinert avatar kan ikke overstige %[1]s i størrelse eller være større enn %[2]d × %[3]d piksler", + "meta.last_line": "Vi gir oss ikke. Kongen har sagt nei!" +} diff --git a/options/locale_next/locale_nds.json b/options/locale_next/locale_nds.json index 24268e2082..207a138926 100644 --- a/options/locale_next/locale_nds.json +++ b/options/locale_next/locale_nds.json @@ -102,5 +102,6 @@ "keys.ssh.link": "SSH-Slötels", "keys.gpg.link": "GPG-Slötels", "profile.actions.tooltip": "Mehr Aktioonen", - "profile.edit.link": "Profil bewarken" + "profile.edit.link": "Profil bewarken", + "og.repo.summary_card.alt_description": "Tosamenfatens-Kaart vun de Repositorium %[1]s, beschrieven as: %[2]s" } diff --git a/options/locale_next/locale_nl-NL.json b/options/locale_next/locale_nl-NL.json index 4f109825aa..5df7db2b9d 100644 --- a/options/locale_next/locale_nl-NL.json +++ b/options/locale_next/locale_nl-NL.json @@ -92,5 +92,16 @@ "watch.list.none": "Niemand houdt deze repo in de gaten.", "followers.incoming.list.self.none": "Niemand volgt uw profiel.", "followers.incoming.list.none": "Deze gebruiker wordt door niemand gevolgd.", - "followers.outgoing.list.self.none": "U volgt niemand." + "followers.outgoing.list.self.none": "U volgt niemand.", + "settings.visibility.description": "Profielzichtbaarheid beïnvloedt de mogelijkheid van anderen om toegang te krijgen tot je niet-privé repositories. Lees meer", + "repo.diff.commit.next-short": "Volgende", + "admin.dashboard.cleanup_offline_runners": "Offline runners opruimen", + "keys.ssh.link": "SSH sleutels", + "keys.gpg.link": "GPG sleutels", + "profile.actions.tooltip": "Meer acties", + "profile.edit.link": "Profiel bewerken", + "feed.atom.link": "Atom-feed", + "repo.diff.commit.previous-short": "Vorige", + "avatar.constraints_hint": "Eigen avatars mogen niet groter zijn dan %[1]s in grootte of groter zijn dan %[2]dx%[3]d pixels", + "og.repo.summary_card.alt_description": "Samenvattingsoverzicht van repositorie %[1]s, omschreven als: %[2]s" } diff --git a/options/locale_next/locale_pt-BR.json b/options/locale_next/locale_pt-BR.json index 1a5eca6d34..336dd5a484 100644 --- a/options/locale_next/locale_pt-BR.json +++ b/options/locale_next/locale_pt-BR.json @@ -105,5 +105,11 @@ "avatar.constraints_hint": "Imagem de perfil personalizada não pode exceder %[1]s em tamanho ou ser maior que %[2]dx%[3]d pixels", "settings.visibility.description": "A visibilidade do perfil afeta a habilidade de acessarem seus repositórios não-privados. Saiba mais", "repo.diff.commit.next-short": "Próximo", - "repo.diff.commit.previous-short": "Anterior" + "repo.diff.commit.previous-short": "Anterior", + "profile.edit.link": "Editar perfil", + "feed.atom.link": "Feed Atom", + "keys.gpg.link": "Chaves GPG", + "og.repo.summary_card.alt_description": "Cartão de resumo do repositório %[1]s, descrito como: %[2]s", + "profile.actions.tooltip": "Mais Actions", + "keys.ssh.link": "Chaves SSH" } diff --git a/options/locale_next/locale_pt-PT.json b/options/locale_next/locale_pt-PT.json index 78e6dc4493..a0caa90b68 100644 --- a/options/locale_next/locale_pt-PT.json +++ b/options/locale_next/locale_pt-PT.json @@ -103,5 +103,12 @@ "stars.list.none": "Ninguém juntou este repositório aos favoritos.", "admin.dashboard.cleanup_offline_runners": "Limpeza de executores offline", "settings.visibility.description": "A visibilidade do perfil afecta a capacidade de outros acederem aos seus repositórios não privados. Ler mais", - "avatar.constraints_hint": "O avatar personalizado não pode exceder %[1]s de tamanho ou ser maior do que %[2]dx%[3]d pixéis" + "avatar.constraints_hint": "O avatar personalizado não pode exceder %[1]s de tamanho ou ser maior do que %[2]dx%[3]d pixéis", + "repo.diff.commit.next-short": "Seg.", + "profile.actions.tooltip": "Mais Actions", + "profile.edit.link": "Editar perfil", + "feed.atom.link": "Feed Atom", + "keys.ssh.link": "Chaves SSH", + "keys.gpg.link": "Chaves GPG", + "repo.diff.commit.previous-short": "Ant." } diff --git a/options/locale_next/locale_sv-SE.json b/options/locale_next/locale_sv-SE.json index 9a8762212c..3bc37deff8 100644 --- a/options/locale_next/locale_sv-SE.json +++ b/options/locale_next/locale_sv-SE.json @@ -95,5 +95,13 @@ "moderation.abuse_category.spam": "Skräppost", "moderation.abuse_category.malware": "Skadlig kod", "settings.visibility.description": "Profilens synlighet påverkar andras möjlighet att komma åt dina icke-privata förråd. Läs mer", - "avatar.constraints_hint": "Anpassade avatarer får inte vara större än %[1] eller %[2]dx%[3] bildpunkter" + "avatar.constraints_hint": "Anpassade avatarer får inte vara större än %[1] eller %[2]dx%[3] bildpunkter", + "og.repo.summary_card.alt_description": "Sammanfattningskort för arkivet %[1]s, beskrivet som: %[2]s", + "profile.actions.tooltip": "Fler åtgärder", + "keys.gpg.link": "GPG-nycklar", + "profile.edit.link": "Redigera profil", + "keys.ssh.link": "SSH-nycklar", + "repo.diff.commit.next-short": "Nästa", + "repo.diff.commit.previous-short": "Föreg", + "feed.atom.link": "Atom-flöde" } diff --git a/options/locale_next/locale_uk-UA.json b/options/locale_next/locale_uk-UA.json index 33cb5a41a3..af219b50d0 100644 --- a/options/locale_next/locale_uk-UA.json +++ b/options/locale_next/locale_uk-UA.json @@ -110,5 +110,6 @@ "keys.gpg.link": "Ключі GPG", "profile.edit.link": "Редагувати профіль", "feed.atom.link": "Стрічка Atom", - "profile.actions.tooltip": "Більше дій" + "profile.actions.tooltip": "Більше дій", + "og.repo.summary_card.alt_description": "Підсумкова картка репозиторію %[1]s з описом: %[2]s" } diff --git a/options/locale_next/locale_zh-CN.json b/options/locale_next/locale_zh-CN.json index 0f408997bf..62277acb95 100644 --- a/options/locale_next/locale_zh-CN.json +++ b/options/locale_next/locale_zh-CN.json @@ -78,5 +78,6 @@ "repo.diff.commit.next-short": "下个", "repo.diff.commit.previous-short": "上个", "feed.atom.link": "Atom 订阅源", - "profile.edit.link": "编辑个人资料" + "profile.edit.link": "编辑个人资料", + "og.repo.summary_card.alt_description": "仓库 %[1]s 的摘要卡片,描述为:%[2]s" } From 4935e6e1a331d60c5e4ca93e59901fe96e557b53 Mon Sep 17 00:00:00 2001 From: Danko Aleksejevs Date: Thu, 3 Jul 2025 11:29:04 +0200 Subject: [PATCH 074/495] fix: skip empty tokens in SearchOptions.Tokens() (#8261) Query string tokenizer could return a list containing empty tokens when the query string was `\` or `"` (probably in other scenarios as well). This seems undesirable and is what triggered #8260, but I'm posting this separately from that fix in case I'm wrong. Feel free to reject if so. The actual change in behavior is that now searching for `\` or `"` behaves the same as if the query were empty (the bleve/elastic code checks that the tokenizer actually returned, anything rather than just query being non-empty). ### Tests - I added test coverage for Go changes... - [x] in their respective `*_test.go` for unit tests. ### Documentation - [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [x] I do not want this change to show in the release notes. - [ ] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/.md` to be be used for the release notes instead of the title. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8261 Reviewed-by: Shiny Nematoda Co-authored-by: Danko Aleksejevs Co-committed-by: Danko Aleksejevs --- modules/indexer/issues/bleve/bleve.go | 11 ++- .../issues/elasticsearch/elasticsearch.go | 11 ++- modules/indexer/issues/internal/qstring.go | 15 +-- .../indexer/issues/internal/qstring_test.go | 92 +++++++++++++++++++ .../indexer/issues/internal/tests/tests.go | 36 +++++++- 5 files changed, 146 insertions(+), 19 deletions(-) diff --git a/modules/indexer/issues/bleve/bleve.go b/modules/indexer/issues/bleve/bleve.go index 8549ba8dfc..cb98f722c5 100644 --- a/modules/indexer/issues/bleve/bleve.go +++ b/modules/indexer/issues/bleve/bleve.go @@ -156,11 +156,12 @@ func (b *Indexer) Delete(_ context.Context, ids ...int64) error { func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) (*internal.SearchResult, error) { var queries []query.Query - if options.Keyword != "" { - tokens, err := options.Tokens() - if err != nil { - return nil, err - } + tokens, err := options.Tokens() + if err != nil { + return nil, err + } + + if len(tokens) > 0 { q := bleve.NewBooleanQuery() for _, token := range tokens { innerQ := bleve.NewDisjunctionQuery( diff --git a/modules/indexer/issues/elasticsearch/elasticsearch.go b/modules/indexer/issues/elasticsearch/elasticsearch.go index d632a22b2a..311e92730e 100644 --- a/modules/indexer/issues/elasticsearch/elasticsearch.go +++ b/modules/indexer/issues/elasticsearch/elasticsearch.go @@ -149,12 +149,13 @@ func (b *Indexer) Delete(ctx context.Context, ids ...int64) error { func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) (*internal.SearchResult, error) { query := elastic.NewBoolQuery() - if options.Keyword != "" { + tokens, err := options.Tokens() + if err != nil { + return nil, err + } + + if len(tokens) > 0 { q := elastic.NewBoolQuery() - tokens, err := options.Tokens() - if err != nil { - return nil, err - } for _, token := range tokens { innerQ := elastic.NewMultiMatchQuery(token.Term, "content", "comments").FieldWithBoost("title", 2.0).TieBreaker(0.5) if token.Fuzzy { diff --git a/modules/indexer/issues/internal/qstring.go b/modules/indexer/issues/internal/qstring.go index 6b60b4c5f6..348f7a564b 100644 --- a/modules/indexer/issues/internal/qstring.go +++ b/modules/indexer/issues/internal/qstring.go @@ -45,12 +45,9 @@ func (t *Tokenizer) next() (tk Token, err error) { // skip all leading white space for { - if r, _, err = t.in.ReadRune(); err == nil && r == ' ' { - //nolint:staticcheck,wastedassign // SA4006 the variable is used after the loop - r, _, err = t.in.ReadRune() - continue + if r, _, err = t.in.ReadRune(); err != nil || r != ' ' { + break } - break } if err != nil { return tk, err @@ -107,11 +104,17 @@ nextEnd: // Tokenize the keyword func (o *SearchOptions) Tokens() (tokens []Token, err error) { + if o.Keyword == "" { + return nil, nil + } + in := strings.NewReader(o.Keyword) it := Tokenizer{in: in} for token, err := it.next(); err == nil; token, err = it.next() { - tokens = append(tokens, token) + if token.Term != "" { + tokens = append(tokens, token) + } } if err != nil && err != io.EOF { return nil, err diff --git a/modules/indexer/issues/internal/qstring_test.go b/modules/indexer/issues/internal/qstring_test.go index 835491707c..eb4bdb306f 100644 --- a/modules/indexer/issues/internal/qstring_test.go +++ b/modules/indexer/issues/internal/qstring_test.go @@ -41,6 +41,36 @@ var testOpts = []testIssueQueryStringOpt{ }, }, }, + { + Keyword: "Hello World", + Results: []Token{ + { + Term: "Hello", + Fuzzy: true, + Kind: BoolOptShould, + }, + { + Term: "World", + Fuzzy: true, + Kind: BoolOptShould, + }, + }, + }, + { + Keyword: " Hello World ", + Results: []Token{ + { + Term: "Hello", + Fuzzy: true, + Kind: BoolOptShould, + }, + { + Term: "World", + Fuzzy: true, + Kind: BoolOptShould, + }, + }, + }, { Keyword: "+Hello +World", Results: []Token{ @@ -156,6 +186,68 @@ var testOpts = []testIssueQueryStringOpt{ }, }, }, + { + Keyword: "\\", + Results: nil, + }, + { + Keyword: "\"", + Results: nil, + }, + { + Keyword: "Hello \\", + Results: []Token{ + { + Term: "Hello", + Fuzzy: true, + Kind: BoolOptShould, + }, + }, + }, + { + Keyword: "\"\"", + Results: nil, + }, + { + Keyword: "\" World \"", + Results: []Token{ + { + Term: " World ", + Fuzzy: false, + Kind: BoolOptShould, + }, + }, + }, + { + Keyword: "\"\" World \"\"", + Results: []Token{ + { + Term: "World", + Fuzzy: true, + Kind: BoolOptShould, + }, + }, + }, + { + Keyword: "Best \"Hello World\" Ever", + Results: []Token{ + { + Term: "Best", + Fuzzy: true, + Kind: BoolOptShould, + }, + { + Term: "Hello World", + Fuzzy: false, + Kind: BoolOptShould, + }, + { + Term: "Ever", + Fuzzy: true, + Kind: BoolOptShould, + }, + }, + }, } func TestIssueQueryString(t *testing.T) { diff --git a/modules/indexer/issues/internal/tests/tests.go b/modules/indexer/issues/internal/tests/tests.go index b63957ff84..46014994a0 100644 --- a/modules/indexer/issues/internal/tests/tests.go +++ b/modules/indexer/issues/internal/tests/tests.go @@ -87,14 +87,44 @@ func TestIndexer(t *testing.T, indexer internal.Indexer) { } } +func allResults(t *testing.T, data map[int64]*internal.IndexerData, result *internal.SearchResult) { + assert.Len(t, result.Hits, len(data)) + assert.Equal(t, len(data), int(result.Total)) +} + var cases = []*testIndexerCase{ { Name: "default", SearchOptions: &internal.SearchOptions{}, - Expected: func(t *testing.T, data map[int64]*internal.IndexerData, result *internal.SearchResult) { - assert.Len(t, result.Hits, len(data)) - assert.Equal(t, len(data), int(result.Total)) + Expected: allResults, + }, + { + Name: "empty keyword", + SearchOptions: &internal.SearchOptions{ + Keyword: "", }, + Expected: allResults, + }, + { + Name: "whitespace keyword", + SearchOptions: &internal.SearchOptions{ + Keyword: " ", + }, + Expected: allResults, + }, + { + Name: "dangling slash in keyword", + SearchOptions: &internal.SearchOptions{ + Keyword: "\\", + }, + Expected: allResults, + }, + { + Name: "dangling quote in keyword", + SearchOptions: &internal.SearchOptions{ + Keyword: "\"", + }, + Expected: allResults, }, { Name: "empty", From 7781c8bae4cbaadfeddc50a886f7a2689a001641 Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Thu, 3 Jul 2025 15:56:58 +0200 Subject: [PATCH 075/495] [v12.0/forgejo] fix: skip empty tokens in SearchOptions.Tokens() (#8398) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8261 Query string tokenizer could return a list containing empty tokens when the query string was `\` or `"` (probably in other scenarios as well). This seems undesirable and is what triggered #8260, but I'm posting this separately from that fix in case I'm wrong. Feel free to reject if so. The actual change in behavior is that now searching for `\` or `"` behaves the same as if the query were empty (the bleve/elastic code checks that the tokenizer actually returned, anything rather than just query being non-empty). ### Tests - I added test coverage for Go changes... - [x] in their respective `*_test.go` for unit tests. ### Documentation - [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [x] I do not want this change to show in the release notes. - [ ] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/.md` to be be used for the release notes instead of the title. Co-authored-by: Danko Aleksejevs Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8398 Reviewed-by: Gusted Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- modules/indexer/issues/bleve/bleve.go | 11 ++- .../issues/elasticsearch/elasticsearch.go | 11 ++- modules/indexer/issues/internal/qstring.go | 15 +-- .../indexer/issues/internal/qstring_test.go | 92 +++++++++++++++++++ .../indexer/issues/internal/tests/tests.go | 36 +++++++- 5 files changed, 146 insertions(+), 19 deletions(-) diff --git a/modules/indexer/issues/bleve/bleve.go b/modules/indexer/issues/bleve/bleve.go index 573d63a446..80af7bac45 100644 --- a/modules/indexer/issues/bleve/bleve.go +++ b/modules/indexer/issues/bleve/bleve.go @@ -156,11 +156,12 @@ func (b *Indexer) Delete(_ context.Context, ids ...int64) error { func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) (*internal.SearchResult, error) { var queries []query.Query - if options.Keyword != "" { - tokens, err := options.Tokens() - if err != nil { - return nil, err - } + tokens, err := options.Tokens() + if err != nil { + return nil, err + } + + if len(tokens) > 0 { q := bleve.NewBooleanQuery() for _, token := range tokens { innerQ := bleve.NewDisjunctionQuery( diff --git a/modules/indexer/issues/elasticsearch/elasticsearch.go b/modules/indexer/issues/elasticsearch/elasticsearch.go index 9d2786e101..0c4e5fae02 100644 --- a/modules/indexer/issues/elasticsearch/elasticsearch.go +++ b/modules/indexer/issues/elasticsearch/elasticsearch.go @@ -149,12 +149,13 @@ func (b *Indexer) Delete(ctx context.Context, ids ...int64) error { func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) (*internal.SearchResult, error) { query := elastic.NewBoolQuery() - if options.Keyword != "" { + tokens, err := options.Tokens() + if err != nil { + return nil, err + } + + if len(tokens) > 0 { q := elastic.NewBoolQuery() - tokens, err := options.Tokens() - if err != nil { - return nil, err - } for _, token := range tokens { innerQ := elastic.NewMultiMatchQuery(token.Term, "content", "comments").FieldWithBoost("title", 2.0).TieBreaker(0.5) if token.Fuzzy { diff --git a/modules/indexer/issues/internal/qstring.go b/modules/indexer/issues/internal/qstring.go index 6b60b4c5f6..348f7a564b 100644 --- a/modules/indexer/issues/internal/qstring.go +++ b/modules/indexer/issues/internal/qstring.go @@ -45,12 +45,9 @@ func (t *Tokenizer) next() (tk Token, err error) { // skip all leading white space for { - if r, _, err = t.in.ReadRune(); err == nil && r == ' ' { - //nolint:staticcheck,wastedassign // SA4006 the variable is used after the loop - r, _, err = t.in.ReadRune() - continue + if r, _, err = t.in.ReadRune(); err != nil || r != ' ' { + break } - break } if err != nil { return tk, err @@ -107,11 +104,17 @@ nextEnd: // Tokenize the keyword func (o *SearchOptions) Tokens() (tokens []Token, err error) { + if o.Keyword == "" { + return nil, nil + } + in := strings.NewReader(o.Keyword) it := Tokenizer{in: in} for token, err := it.next(); err == nil; token, err = it.next() { - tokens = append(tokens, token) + if token.Term != "" { + tokens = append(tokens, token) + } } if err != nil && err != io.EOF { return nil, err diff --git a/modules/indexer/issues/internal/qstring_test.go b/modules/indexer/issues/internal/qstring_test.go index 835491707c..eb4bdb306f 100644 --- a/modules/indexer/issues/internal/qstring_test.go +++ b/modules/indexer/issues/internal/qstring_test.go @@ -41,6 +41,36 @@ var testOpts = []testIssueQueryStringOpt{ }, }, }, + { + Keyword: "Hello World", + Results: []Token{ + { + Term: "Hello", + Fuzzy: true, + Kind: BoolOptShould, + }, + { + Term: "World", + Fuzzy: true, + Kind: BoolOptShould, + }, + }, + }, + { + Keyword: " Hello World ", + Results: []Token{ + { + Term: "Hello", + Fuzzy: true, + Kind: BoolOptShould, + }, + { + Term: "World", + Fuzzy: true, + Kind: BoolOptShould, + }, + }, + }, { Keyword: "+Hello +World", Results: []Token{ @@ -156,6 +186,68 @@ var testOpts = []testIssueQueryStringOpt{ }, }, }, + { + Keyword: "\\", + Results: nil, + }, + { + Keyword: "\"", + Results: nil, + }, + { + Keyword: "Hello \\", + Results: []Token{ + { + Term: "Hello", + Fuzzy: true, + Kind: BoolOptShould, + }, + }, + }, + { + Keyword: "\"\"", + Results: nil, + }, + { + Keyword: "\" World \"", + Results: []Token{ + { + Term: " World ", + Fuzzy: false, + Kind: BoolOptShould, + }, + }, + }, + { + Keyword: "\"\" World \"\"", + Results: []Token{ + { + Term: "World", + Fuzzy: true, + Kind: BoolOptShould, + }, + }, + }, + { + Keyword: "Best \"Hello World\" Ever", + Results: []Token{ + { + Term: "Best", + Fuzzy: true, + Kind: BoolOptShould, + }, + { + Term: "Hello World", + Fuzzy: false, + Kind: BoolOptShould, + }, + { + Term: "Ever", + Fuzzy: true, + Kind: BoolOptShould, + }, + }, + }, } func TestIssueQueryString(t *testing.T) { diff --git a/modules/indexer/issues/internal/tests/tests.go b/modules/indexer/issues/internal/tests/tests.go index ef75955a14..e7723ea69d 100644 --- a/modules/indexer/issues/internal/tests/tests.go +++ b/modules/indexer/issues/internal/tests/tests.go @@ -87,14 +87,44 @@ func TestIndexer(t *testing.T, indexer internal.Indexer) { } } +func allResults(t *testing.T, data map[int64]*internal.IndexerData, result *internal.SearchResult) { + assert.Len(t, result.Hits, len(data)) + assert.Equal(t, len(data), int(result.Total)) +} + var cases = []*testIndexerCase{ { Name: "default", SearchOptions: &internal.SearchOptions{}, - Expected: func(t *testing.T, data map[int64]*internal.IndexerData, result *internal.SearchResult) { - assert.Len(t, result.Hits, len(data)) - assert.Equal(t, len(data), int(result.Total)) + Expected: allResults, + }, + { + Name: "empty keyword", + SearchOptions: &internal.SearchOptions{ + Keyword: "", }, + Expected: allResults, + }, + { + Name: "whitespace keyword", + SearchOptions: &internal.SearchOptions{ + Keyword: " ", + }, + Expected: allResults, + }, + { + Name: "dangling slash in keyword", + SearchOptions: &internal.SearchOptions{ + Keyword: "\\", + }, + Expected: allResults, + }, + { + Name: "dangling quote in keyword", + SearchOptions: &internal.SearchOptions{ + Keyword: "\"", + }, + Expected: allResults, }, { Name: "empty", From b580c830e04125cac756c6868b570310eaa42035 Mon Sep 17 00:00:00 2001 From: Gusted Date: Thu, 3 Jul 2025 20:10:58 +0200 Subject: [PATCH 076/495] chore: improve reliability of webauthn e2e test (#8400) - This test is the source of many transient errors https://codeberg.org/forgejo/forgejo/issues/8359#issuecomment-5655557 and is semi-reproducible locally. Any debugging code that is added will result in the error no longer being reproducible, making it hard to say why this is failing. - It no longer seems necessary to add this `waitForURL` call as Playwright now seems to gracefully handle the case where we want to go to a specific page while playwright might still be navigating to another URL that was initiated by clicking on a button - thus removing the source of the transient error altogether. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8400 Reviewed-by: Beowulf Co-authored-by: Gusted Co-committed-by: Gusted --- tests/e2e/webauthn.test.e2e.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/e2e/webauthn.test.e2e.ts b/tests/e2e/webauthn.test.e2e.ts index 0b5a6a6c2b..d4b81621d2 100644 --- a/tests/e2e/webauthn.test.e2e.ts +++ b/tests/e2e/webauthn.test.e2e.ts @@ -42,7 +42,6 @@ test('WebAuthn register & login flow', async ({browser, request}, workerInfo) => await page.locator('div[aria-label="Profile and settings…"]').click(); await page.getByText('Sign out').click(); }).toPass(); - await page.waitForURL(`${workerInfo.project.use.baseURL}/`); // Login. response = await page.goto('/user/login'); From 36777a3a9e571a4c2e932bd565014dd68dd4a10c Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Thu, 3 Jul 2025 21:32:18 +0200 Subject: [PATCH 077/495] [v12.0/forgejo] chore: improve reliability of webauthn e2e test (#8402) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8400 - This test is the source of many transient errors https://codeberg.org/forgejo/forgejo/issues/8359#issuecomment-5655557 and is semi-reproducible locally. Any debugging code that is added will result in the error no longer being reproducible, making it hard to say why this is failing. - It no longer seems necessary to add this `waitForURL` call as Playwright now seems to gracefully handle the case where we want to go to a specific page while playwright might still be navigating to another URL that was initiated by clicking on a button - thus removing the source of the transient error altogether. Co-authored-by: Gusted Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8402 Reviewed-by: Gusted Reviewed-by: Beowulf Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- tests/e2e/webauthn.test.e2e.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/e2e/webauthn.test.e2e.ts b/tests/e2e/webauthn.test.e2e.ts index 0b5a6a6c2b..d4b81621d2 100644 --- a/tests/e2e/webauthn.test.e2e.ts +++ b/tests/e2e/webauthn.test.e2e.ts @@ -42,7 +42,6 @@ test('WebAuthn register & login flow', async ({browser, request}, workerInfo) => await page.locator('div[aria-label="Profile and settings…"]').click(); await page.getByText('Sign out').click(); }).toPass(); - await page.waitForURL(`${workerInfo.project.use.baseURL}/`); // Login. response = await page.goto('/user/login'); From aca7e8a9afbad8b3419656c5089fb571508a68b1 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Thu, 3 Jul 2025 22:53:55 +0200 Subject: [PATCH 078/495] fix: cancelled or skipped runs are not failures for notifications (#8366) From the point of view of a notification, the only status which must be considered a fail is `StatusFailure`. All others are either success `StatusSuccess` or undetermined `StatusCancelled` and `StatusSkipped`. Those are the only four status in which a run can be when it reaches the `ActionRunNowDone` function because it is filtered on `IsDone` which is only true for those. ## Checklist The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org). ### Tests - I added test coverage for Go changes... - [x] in their respective `*_test.go` for unit tests. ### Documentation - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [x] I do not want this change to show in the release notes. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8366 Reviewed-by: Antonin Delpeuch Co-authored-by: Earl Warren Co-committed-by: Earl Warren --- services/mailer/mail_actions.go | 4 +- services/mailer/mail_actions_now_done_test.go | 85 +++++++++++++++++++ services/mailer/notify.go | 2 +- 3 files changed, 88 insertions(+), 3 deletions(-) diff --git a/services/mailer/mail_actions.go b/services/mailer/mail_actions.go index 09763e164e..fa0d2635f1 100644 --- a/services/mailer/mail_actions.go +++ b/services/mailer/mail_actions.go @@ -16,8 +16,8 @@ const ( tplActionNowDone base.TplName = "actions/now_done" ) -// requires !run.Status.IsSuccess() or !lastRun.Status.IsSuccess() -func MailActionRun(run *actions_model.ActionRun, priorStatus actions_model.Status, lastRun *actions_model.ActionRun) error { +var MailActionRun = mailActionRun // make it mockable +func mailActionRun(run *actions_model.ActionRun, priorStatus actions_model.Status, lastRun *actions_model.ActionRun) error { if setting.MailService == nil { // No mail service configured return nil diff --git a/services/mailer/mail_actions_now_done_test.go b/services/mailer/mail_actions_now_done_test.go index 6a01ea7631..f4c597c99c 100644 --- a/services/mailer/mail_actions_now_done_test.go +++ b/services/mailer/mail_actions_now_done_test.go @@ -57,6 +57,91 @@ func assertTranslatedLocaleMailActionsNowDone(t *testing.T, msgBody string) { AssertTranslatedLocale(t, msgBody, "mail.actions.successful_run_after_failure", "mail.actions.not_successful_run", "mail.actions.run_info_cur_status", "mail.actions.run_info_ref", "mail.actions.run_info_previous_status", "mail.actions.run_info_trigger", "mail.view_it_on") } +func TestActionRunNowDoneStatusMatrix(t *testing.T) { + successStatuses := []actions_model.Status{ + actions_model.StatusSuccess, + actions_model.StatusSkipped, + actions_model.StatusCancelled, + } + failureStatuses := []actions_model.Status{ + actions_model.StatusFailure, + } + + for _, testCase := range []struct { + name string + statuses []actions_model.Status + hasLastRun bool + lastStatuses []actions_model.Status + run bool + }{ + { + name: "FailureNoLastRun", + statuses: failureStatuses, + run: true, + }, + { + name: "SuccessNoLastRun", + statuses: successStatuses, + run: false, + }, + { + name: "FailureLastRunSuccess", + statuses: failureStatuses, + hasLastRun: true, + lastStatuses: successStatuses, + run: true, + }, + { + name: "FailureLastRunFailure", + statuses: failureStatuses, + hasLastRun: true, + lastStatuses: failureStatuses, + run: true, + }, + { + name: "SuccessLastRunFailure", + statuses: successStatuses, + hasLastRun: true, + lastStatuses: failureStatuses, + run: true, + }, + { + name: "SuccessLastRunSuccess", + statuses: successStatuses, + hasLastRun: true, + lastStatuses: successStatuses, + run: false, + }, + } { + t.Run(testCase.name, func(t *testing.T) { + var called bool + defer test.MockVariableValue(&MailActionRun, func(run *actions_model.ActionRun, priorStatus actions_model.Status, lastRun *actions_model.ActionRun) error { + called = true + return nil + })() + for _, status := range testCase.statuses { + for _, lastStatus := range testCase.lastStatuses { + called = false + n := NewNotifier() + var lastRun *actions_model.ActionRun + if testCase.hasLastRun { + lastRun = &actions_model.ActionRun{ + Status: lastStatus, + } + } + n.ActionRunNowDone(t.Context(), + &actions_model.ActionRun{ + Status: status, + }, + actions_model.StatusUnknown, + lastRun) + assert.Equal(t, testCase.run, called, "status = %s, lastStatus = %s", status, lastStatus) + } + } + }) + } +} + func TestActionRunNowDoneNotificationMail(t *testing.T) { ctx := t.Context() diff --git a/services/mailer/notify.go b/services/mailer/notify.go index 7461a67181..640de31fcc 100644 --- a/services/mailer/notify.go +++ b/services/mailer/notify.go @@ -212,7 +212,7 @@ func (m *mailNotifier) NewUserSignUp(ctx context.Context, newUser *user_model.Us func (m *mailNotifier) ActionRunNowDone(ctx context.Context, run *actions_model.ActionRun, priorStatus actions_model.Status, lastRun *actions_model.ActionRun) { // Only send a mail on a successful run when the workflow recovered (i.e., the run before failed). - if run.Status.IsSuccess() && (lastRun == nil || lastRun.Status.IsSuccess()) { + if !run.Status.IsFailure() && (lastRun == nil || !lastRun.Status.IsFailure()) { return } if err := MailActionRun(run, priorStatus, lastRun); err != nil { From d4c9c01f2d64bc8a702e59e2a0924416250d36d2 Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Thu, 3 Jul 2025 23:28:01 +0200 Subject: [PATCH 079/495] [v12.0/forgejo] fix: cancelled or skipped runs are not failures for notifications (#8404) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8366 From the point of view of a notification, the only status which must be considered a fail is `StatusFailure`. All others are either success `StatusSuccess` or undetermined `StatusCancelled` and `StatusSkipped`. Those are the only four status in which a run can be when it reaches the `ActionRunNowDone` function because it is filtered on `IsDone` which is only true for those. ## Checklist The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org). ### Tests - I added test coverage for Go changes... - [x] in their respective `*_test.go` for unit tests. ### Documentation - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [x] I do not want this change to show in the release notes. Co-authored-by: Earl Warren Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8404 Reviewed-by: Earl Warren Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- services/mailer/mail_actions.go | 4 +- services/mailer/mail_actions_now_done_test.go | 85 +++++++++++++++++++ services/mailer/notify.go | 2 +- 3 files changed, 88 insertions(+), 3 deletions(-) diff --git a/services/mailer/mail_actions.go b/services/mailer/mail_actions.go index 09763e164e..fa0d2635f1 100644 --- a/services/mailer/mail_actions.go +++ b/services/mailer/mail_actions.go @@ -16,8 +16,8 @@ const ( tplActionNowDone base.TplName = "actions/now_done" ) -// requires !run.Status.IsSuccess() or !lastRun.Status.IsSuccess() -func MailActionRun(run *actions_model.ActionRun, priorStatus actions_model.Status, lastRun *actions_model.ActionRun) error { +var MailActionRun = mailActionRun // make it mockable +func mailActionRun(run *actions_model.ActionRun, priorStatus actions_model.Status, lastRun *actions_model.ActionRun) error { if setting.MailService == nil { // No mail service configured return nil diff --git a/services/mailer/mail_actions_now_done_test.go b/services/mailer/mail_actions_now_done_test.go index 6a01ea7631..f4c597c99c 100644 --- a/services/mailer/mail_actions_now_done_test.go +++ b/services/mailer/mail_actions_now_done_test.go @@ -57,6 +57,91 @@ func assertTranslatedLocaleMailActionsNowDone(t *testing.T, msgBody string) { AssertTranslatedLocale(t, msgBody, "mail.actions.successful_run_after_failure", "mail.actions.not_successful_run", "mail.actions.run_info_cur_status", "mail.actions.run_info_ref", "mail.actions.run_info_previous_status", "mail.actions.run_info_trigger", "mail.view_it_on") } +func TestActionRunNowDoneStatusMatrix(t *testing.T) { + successStatuses := []actions_model.Status{ + actions_model.StatusSuccess, + actions_model.StatusSkipped, + actions_model.StatusCancelled, + } + failureStatuses := []actions_model.Status{ + actions_model.StatusFailure, + } + + for _, testCase := range []struct { + name string + statuses []actions_model.Status + hasLastRun bool + lastStatuses []actions_model.Status + run bool + }{ + { + name: "FailureNoLastRun", + statuses: failureStatuses, + run: true, + }, + { + name: "SuccessNoLastRun", + statuses: successStatuses, + run: false, + }, + { + name: "FailureLastRunSuccess", + statuses: failureStatuses, + hasLastRun: true, + lastStatuses: successStatuses, + run: true, + }, + { + name: "FailureLastRunFailure", + statuses: failureStatuses, + hasLastRun: true, + lastStatuses: failureStatuses, + run: true, + }, + { + name: "SuccessLastRunFailure", + statuses: successStatuses, + hasLastRun: true, + lastStatuses: failureStatuses, + run: true, + }, + { + name: "SuccessLastRunSuccess", + statuses: successStatuses, + hasLastRun: true, + lastStatuses: successStatuses, + run: false, + }, + } { + t.Run(testCase.name, func(t *testing.T) { + var called bool + defer test.MockVariableValue(&MailActionRun, func(run *actions_model.ActionRun, priorStatus actions_model.Status, lastRun *actions_model.ActionRun) error { + called = true + return nil + })() + for _, status := range testCase.statuses { + for _, lastStatus := range testCase.lastStatuses { + called = false + n := NewNotifier() + var lastRun *actions_model.ActionRun + if testCase.hasLastRun { + lastRun = &actions_model.ActionRun{ + Status: lastStatus, + } + } + n.ActionRunNowDone(t.Context(), + &actions_model.ActionRun{ + Status: status, + }, + actions_model.StatusUnknown, + lastRun) + assert.Equal(t, testCase.run, called, "status = %s, lastStatus = %s", status, lastStatus) + } + } + }) + } +} + func TestActionRunNowDoneNotificationMail(t *testing.T) { ctx := t.Context() diff --git a/services/mailer/notify.go b/services/mailer/notify.go index 7461a67181..640de31fcc 100644 --- a/services/mailer/notify.go +++ b/services/mailer/notify.go @@ -212,7 +212,7 @@ func (m *mailNotifier) NewUserSignUp(ctx context.Context, newUser *user_model.Us func (m *mailNotifier) ActionRunNowDone(ctx context.Context, run *actions_model.ActionRun, priorStatus actions_model.Status, lastRun *actions_model.ActionRun) { // Only send a mail on a successful run when the workflow recovered (i.e., the run before failed). - if run.Status.IsSuccess() && (lastRun == nil || lastRun.Status.IsSuccess()) { + if !run.Status.IsFailure() && (lastRun == nil || !lastRun.Status.IsFailure()) { return } if err := MailActionRun(run, priorStatus, lastRun); err != nil { From b669564f391baa98241107d183d03954486e08df Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 4 Jul 2025 00:06:28 +0200 Subject: [PATCH 080/495] Update module github.com/alecthomas/chroma/v2 to v2.19.0 (forgejo) (#8393) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8393 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1602f1ef19..de6331722b 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( github.com/ProtonMail/go-crypto v1.3.0 github.com/PuerkitoBio/goquery v1.10.3 github.com/SaveTheRbtz/zstd-seekable-format-go/pkg v0.7.2 - github.com/alecthomas/chroma/v2 v2.18.0 + github.com/alecthomas/chroma/v2 v2.19.0 github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb github.com/blevesearch/bleve/v2 v2.5.2 github.com/buildkite/terminal-to-html/v3 v3.16.8 diff --git a/go.sum b/go.sum index 1aa2380161..38a9dd5708 100644 --- a/go.sum +++ b/go.sum @@ -62,8 +62,8 @@ github.com/SaveTheRbtz/zstd-seekable-format-go/pkg v0.7.2/go.mod h1:JitQWJ8JuV4Y github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs= -github.com/alecthomas/chroma/v2 v2.18.0 h1:6h53Q4hW83SuF+jcsp7CVhLsMozzvQvO8HBbKQW+gn4= -github.com/alecthomas/chroma/v2 v2.18.0/go.mod h1:RVX6AvYm4VfYe/zsk7mjHueLDZor3aWCNE14TFlepBk= +github.com/alecthomas/chroma/v2 v2.19.0 h1:Im+SLRgT8maArxv81mULDWN8oKxkzboH07CHesxElq4= +github.com/alecthomas/chroma/v2 v2.19.0/go.mod h1:RVX6AvYm4VfYe/zsk7mjHueLDZor3aWCNE14TFlepBk= github.com/alecthomas/repr v0.0.0-20220113201626-b1b626ac65ae/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8= github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= From 72620db8dfa654630603b9e8d49d994823cbe8d3 Mon Sep 17 00:00:00 2001 From: zokki Date: Fri, 4 Jul 2025 00:08:23 +0200 Subject: [PATCH 081/495] feat: add a `EXCLUSION` to the logger (#8212) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This feature is intended to help reduce noisy logs generated by routine Kubernetes probes and Prometheus scraping. While logs are essential, these specific requests (e.g., to /metrics and /api/healthz) generally don't provide useful information and tend to clutter the output. The goal is to introduce functionality that effectively acts as the inverse of the existing EXPRESSION mode—allowing logging to be excluded based on a condition, rather than included. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8212 Reviewed-by: Gusted Co-authored-by: zokki Co-committed-by: zokki --- cmd/manager_logging.go | 8 +++++ custom/conf/app.example.ini | 1 + modules/log/event_writer.go | 1 + modules/log/event_writer_base.go | 15 ++++++++ modules/log/event_writer_buffer_test.go | 46 +++++++++++++++++++++++++ modules/log/logger_test.go | 16 +++++++++ modules/setting/log.go | 1 + modules/setting/log_test.go | 11 ++++++ routers/private/manager.go | 1 + 9 files changed, 100 insertions(+) diff --git a/cmd/manager_logging.go b/cmd/manager_logging.go index c543afe872..c18bfa919b 100644 --- a/cmd/manager_logging.go +++ b/cmd/manager_logging.go @@ -44,6 +44,11 @@ func defaultLoggingFlags() []cli.Flag { Aliases: []string{"e"}, Usage: "Matching expression for the logger", }, + &cli.StringFlag{ + Name: "exclusion", + Aliases: []string{"x"}, + Usage: "Exclusion for the logger", + }, &cli.StringFlag{ Name: "prefix", Aliases: []string{"p"}, @@ -286,6 +291,9 @@ func commonAddLogger(ctx context.Context, c *cli.Command, mode string, vals map[ if len(c.String("expression")) > 0 { vals["expression"] = c.String("expression") } + if len(c.String("exclusion")) > 0 { + vals["exclusion"] = c.String("exclusion") + } if len(c.String("prefix")) > 0 { vals["prefix"] = c.String("prefix") } diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index 1b8d4c6697..37d67df5f0 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -631,6 +631,7 @@ LEVEL = Info ;LEVEL= ;FLAGS = stdflags or journald ;EXPRESSION = +;EXCLUSION = ;PREFIX = ;COLORIZE = false ;; diff --git a/modules/log/event_writer.go b/modules/log/event_writer.go index 4b77e488de..32b5b582c5 100644 --- a/modules/log/event_writer.go +++ b/modules/log/event_writer.go @@ -26,6 +26,7 @@ type WriterMode struct { Flags Flags Expression string + Exclusion string StacktraceLevel Level diff --git a/modules/log/event_writer_base.go b/modules/log/event_writer_base.go index 9189ca4e90..4de2b953c7 100644 --- a/modules/log/event_writer_base.go +++ b/modules/log/event_writer_base.go @@ -68,6 +68,14 @@ func (b *EventWriterBaseImpl) Run(ctx context.Context) { } } + var exclusionRegexp *regexp.Regexp + if b.Mode.Exclusion != "" { + var err error + if exclusionRegexp, err = regexp.Compile(b.Mode.Exclusion); err != nil { + FallbackErrorf("unable to compile exclusion %q for writer %q: %v", b.Mode.Exclusion, b.Name, err) + } + } + handlePaused := func() { if pause := b.GetPauseChan(); pause != nil { select { @@ -95,6 +103,13 @@ func (b *EventWriterBaseImpl) Run(ctx context.Context) { continue } } + if exclusionRegexp != nil { + fileLineCaller := fmt.Sprintf("%s:%d:%s", event.Origin.Filename, event.Origin.Line, event.Origin.Caller) + matched := exclusionRegexp.MatchString(fileLineCaller) || exclusionRegexp.MatchString(event.Origin.MsgSimpleText) + if matched { + continue + } + } var err error switch msg := event.Msg.(type) { diff --git a/modules/log/event_writer_buffer_test.go b/modules/log/event_writer_buffer_test.go index ba9455ba69..d1e37c3673 100644 --- a/modules/log/event_writer_buffer_test.go +++ b/modules/log/event_writer_buffer_test.go @@ -31,3 +31,49 @@ func TestBufferLogger(t *testing.T) { logger.Close() assert.Contains(t, bufferWriter.Buffer.String(), expected) } + +func TestBufferLoggerWithExclusion(t *testing.T) { + prefix := "ExclusionPrefix " + level := log.INFO + message := "something" + + bufferWriter := log.NewEventWriterBuffer("test-buffer", log.WriterMode{ + Level: level, + Prefix: prefix, + Exclusion: message, + }) + + logger := log.NewLoggerWithWriters(t.Context(), "test", bufferWriter) + + logger.SendLogEvent(&log.Event{ + Level: log.INFO, + MsgSimpleText: message, + }) + logger.Close() + assert.NotContains(t, bufferWriter.Buffer.String(), message) +} + +func TestBufferLoggerWithExpressionAndExclusion(t *testing.T) { + prefix := "BothPrefix " + level := log.INFO + expression := ".*foo.*" + exclusion := ".*bar.*" + + bufferWriter := log.NewEventWriterBuffer("test-buffer", log.WriterMode{ + Level: level, + Prefix: prefix, + Expression: expression, + Exclusion: exclusion, + }) + + logger := log.NewLoggerWithWriters(t.Context(), "test", bufferWriter) + + logger.SendLogEvent(&log.Event{Level: log.INFO, MsgSimpleText: "foo expression"}) + logger.SendLogEvent(&log.Event{Level: log.INFO, MsgSimpleText: "bar exclusion"}) + logger.SendLogEvent(&log.Event{Level: log.INFO, MsgSimpleText: "foo bar both"}) + logger.SendLogEvent(&log.Event{Level: log.INFO, MsgSimpleText: "none"}) + logger.Close() + + assert.Contains(t, bufferWriter.Buffer.String(), "foo expression") + assert.NotContains(t, bufferWriter.Buffer.String(), "bar") +} diff --git a/modules/log/logger_test.go b/modules/log/logger_test.go index 6d6ceb69d7..99045b0f4f 100644 --- a/modules/log/logger_test.go +++ b/modules/log/logger_test.go @@ -143,3 +143,19 @@ func TestLoggerExpressionFilter(t *testing.T) { assert.Equal(t, []string{"foo\n", "foo bar\n", "by filename\n"}, w1.GetLogs()) } + +func TestLoggerExclusionFilter(t *testing.T) { + logger := NewLoggerWithWriters(t.Context(), "test") + + w1 := newDummyWriter("dummy-1", DEBUG, 0) + w1.Mode.Exclusion = "foo.*" + logger.AddWriters(w1) + + logger.Info("foo") + logger.Info("bar") + logger.Info("foo bar") + logger.SendLogEvent(&Event{Level: INFO, Filename: "foo.go", MsgSimpleText: "by filename"}) + logger.Close() + + assert.Equal(t, []string{"bar\n"}, w1.GetLogs()) +} diff --git a/modules/setting/log.go b/modules/setting/log.go index 0747ac4dac..6d069d0e9c 100644 --- a/modules/setting/log.go +++ b/modules/setting/log.go @@ -133,6 +133,7 @@ func loadLogModeByName(rootCfg ConfigProvider, loggerName, modeName string) (wri writerMode.StacktraceLevel = log.LevelFromString(ConfigInheritedKeyString(sec, "STACKTRACE_LEVEL", Log.StacktraceLogLevel.String())) writerMode.Prefix = ConfigInheritedKeyString(sec, "PREFIX") writerMode.Expression = ConfigInheritedKeyString(sec, "EXPRESSION") + writerMode.Exclusion = ConfigInheritedKeyString(sec, "EXCLUSION") // flags are updated and set below switch writerType { diff --git a/modules/setting/log_test.go b/modules/setting/log_test.go index eda6dc36af..223bd68285 100644 --- a/modules/setting/log_test.go +++ b/modules/setting/log_test.go @@ -44,6 +44,7 @@ func TestLogConfigDefault(t *testing.T) { "BufferLen": 10000, "Colorize": false, "Expression": "", + "Exclusion": "", "Flags": "stdflags", "Level": "info", "Prefix": "", @@ -83,6 +84,7 @@ logger.xorm.MODE = "BufferLen": 10000, "Colorize": false, "Expression": "", + "Exclusion": "", "Flags": "stdflags", "Level": "info", "Prefix": "", @@ -121,6 +123,7 @@ MODE = console "BufferLen": 10000, "Colorize": false, "Expression": "", + "Exclusion": "", "Flags": "stdflags", "Level": "info", "Prefix": "", @@ -168,6 +171,7 @@ ACCESS = file "BufferLen": 10000, "Colorize": false, "Expression": "", + "Exclusion": "", "Flags": "stdflags", "Level": "info", "Prefix": "", @@ -191,6 +195,7 @@ ACCESS = file "BufferLen": 10000, "Colorize": false, "Expression": "", + "Exclusion": "", "Flags": "none", "Level": "info", "Prefix": "", @@ -257,6 +262,7 @@ STDERR = true "BufferLen": 10000, "Colorize": false, "Expression": "", + "Exclusion": "", "Flags": "stdflags", "Level": "warn", "Prefix": "", @@ -270,6 +276,7 @@ STDERR = true "BufferLen": 10000, "Colorize": false, "Expression": "", + "Exclusion": "", "Flags": "stdflags", "Level": "error", "Prefix": "", @@ -287,6 +294,7 @@ STDERR = true "BufferLen": 10000, "Colorize": false, "Expression": "", + "Exclusion": "", "Flags": "none", "Level": "warn", "Prefix": "", @@ -323,6 +331,7 @@ MODE = file LEVEL = error STACKTRACE_LEVEL = fatal EXPRESSION = filter +EXCLUSION = not FLAGS = medfile PREFIX = "[Prefix] " FILE_NAME = file-xxx.log @@ -341,6 +350,7 @@ COMPRESSION_LEVEL = 4 "BufferLen": 10, "Colorize": false, "Expression": "", + "Exclusion": "", "Flags": "stdflags", "Level": "info", "Prefix": "", @@ -360,6 +370,7 @@ COMPRESSION_LEVEL = 4 "BufferLen": 10, "Colorize": false, "Expression": "filter", + "Exclusion": "not", "Flags": "medfile", "Level": "error", "Prefix": "[Prefix] ", diff --git a/routers/private/manager.go b/routers/private/manager.go index 7ab198f71b..90b48256df 100644 --- a/routers/private/manager.go +++ b/routers/private/manager.go @@ -145,6 +145,7 @@ func AddLogger(ctx *context.PrivateContext) { writerMode.Prefix, _ = opts.Config["prefix"].(string) writerMode.Expression, _ = opts.Config["expression"].(string) + writerMode.Exclusion, _ = opts.Config["exclusion"].(string) switch writerType { case "console": From a789dd76d5648191f2414aafd16f4c05e8ca7faf Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 4 Jul 2025 23:09:26 +0200 Subject: [PATCH 082/495] Update dependency mermaid to v11.8.0 (forgejo) (#8405) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8405 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4555b299bf..1a1c527c58 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "idiomorph": "0.3.0", "jquery": "3.7.1", "katex": "0.16.22", - "mermaid": "11.7.0", + "mermaid": "11.8.0", "mini-css-extract-plugin": "2.9.2", "minimatch": "10.0.3", "monaco-editor": "0.52.2", @@ -2075,9 +2075,9 @@ } }, "node_modules/@mermaid-js/parser": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.5.0.tgz", - "integrity": "sha512-AiaN7+VjXC+3BYE+GwNezkpjIcCI2qIMB/K4S2/vMWe0q/XJCBbx5+K7iteuz7VyltX9iAK4FmVTvGc9kjOV4w==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.0.tgz", + "integrity": "sha512-7DNESgpyZ5WG1SIkrYafVBhWmImtmQuoxOO1lawI3gQYWxBX3v1FW3IyuuRfKJAO06XrZR71W0Kif5VEGGd4VA==", "license": "MIT", "dependencies": { "langium": "3.3.1" @@ -10538,14 +10538,14 @@ } }, "node_modules/mermaid": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.7.0.tgz", - "integrity": "sha512-/1/5R0rt0Z1Ak0CuznAnCF3HtQgayRXUz6SguzOwN4L+DuCobz0UxnQ+ZdTSZ3AugKVVh78tiVmsHpHWV25TCw==", + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.8.0.tgz", + "integrity": "sha512-uAZUwnBiqREZcUrFw3G5iQ5Pj3hTYUP95EZc3ec/nGBzHddJZydzYGE09tGZDBS1VoSoDn0symZ85FmypSTo5g==", "license": "MIT", "dependencies": { "@braintree/sanitize-url": "^7.0.4", "@iconify/utils": "^2.1.33", - "@mermaid-js/parser": "^0.5.0", + "@mermaid-js/parser": "^0.6.0", "@types/d3": "^7.4.3", "cytoscape": "^3.29.3", "cytoscape-cose-bilkent": "^4.1.0", diff --git a/package.json b/package.json index 3623c143e0..c651ecfa13 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "idiomorph": "0.3.0", "jquery": "3.7.1", "katex": "0.16.22", - "mermaid": "11.7.0", + "mermaid": "11.8.0", "mini-css-extract-plugin": "2.9.2", "minimatch": "10.0.3", "monaco-editor": "0.52.2", From d4873965c8f9758df57d13dda2479fcb72954387 Mon Sep 17 00:00:00 2001 From: joneshf Date: Sat, 5 Jul 2025 13:53:00 +0200 Subject: [PATCH 083/495] feat: add `--attribute-ssh-pubic-key` to forgejo admin auth add-oauth and update-oauth CLI (#8383) As explained in https://codeberg.org/forgejo/forgejo/issues/8072, the CLI was missing a way to set the `AttributeSSHPublicKey` field that was added in https://codeberg.org/forgejo/forgejo/pulls/6232. We add a flag to do that, and thread it through where necessary. The checklist mentions adding tests, but the code in `cmd/admin_auth_oauth.go` seems to not have a `cmd/admin_auth_oauth_test.go`, and I'm not sure if there's something else that's testing this behavior. I can try to add tests if there's already a good spot to slot them in. If not, it seems like adding a `cmd/cmd/admin_auth_oauth_test.go` that worked similar to the current `cmd/admin_auth_ldap_test.go` might be a bit big of a change. As far as documentation, I might be wrong about this, but it seems like the CLI docs are only updated once there's a new release. I can't do that yet, so I don't think that either of the checkboxes apply to this PR. ## Manual testing There are two CLI commands that can be validated: `forgejo admin auth add-oauth` and `forgejo admin auth update-oauth`. 1. `forgejo admin auth add-oauth` requires an actual auto-discovery URL that responds appropriately. - If there is not already an OIDC provider set up that has an auto-discovery URL, the sample OIDC provider at https://openidconnect.net/ can be used with it's auto-discovery URL of https://samples.auth0.com/.well-known/openid-configuration. 1. Run the following command to create a new OAuth2 authentication source: ```Console forgejo admin auth add-oauth --attribute-ssh-public-key=ssh_public_key_field --auto-discover-url=https://samples.auth0.com/.well-known/openid-configuration --name='Delete this later' --provider=openidConnect ``` - This should create a new OAuth2 authentication source named "Delete this later" with the "Public SSH key attribute" field set to `ssh_public_key_field`.
Screenshot of newly created OAuth2 authentication source ![forgejo-admin-auth-add-oauth](/attachments/166f3f82-adc8-4ef9-9128-fb8a923fdc0d)
1. `forgejo admin auth update-oauth` requires the id of the newly created OAuth2 authentication source. - This id can be found on either the "Authentication sources" page (`/admin/auths`) or as the URL of the newly created OAuth2 authentication source (`/admins/auths/{id}`). 1. Run the following command to update the OAuth2 authentication source: ```Console forgejo admin auth update-oauth --attribute-ssh-public-key=ssh_public_key_field_new_name --id= ``` - This should change the "Public SSH key attribute" to `ssh_public_key_field_new_name`.
Screenshot of updated OAuth2 authentication source ![forgejo-admin-auth-update-oauth](/attachments/9674dba0-6ed1-4fb8-8eb8-d7f33cbf8c3a)
## Checklist The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org). ### Tests - I added test coverage for Go changes... - [ ] in their respective `*_test.go` for unit tests. - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server. - I added test coverage for JavaScript changes... - [ ] in `web_src/js/*.test.js` if it can be unit tested. - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)). ### Documentation - [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [ ] I did not document these changes and I do not expect someone else to do it. ### Release notes - [ ] I do not want this change to show in the release notes. - [x] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/.md` to be be used for the release notes instead of the title. ## Release notes - Features - [PR](https://codeberg.org/forgejo/forgejo/pulls/8383): add `--attribute-ssh-pubic-key` to forgejo admin auth add-oauth and update-oauth CLI Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8383 Reviewed-by: Earl Warren Co-authored-by: joneshf Co-committed-by: joneshf --- cmd/admin_auth_oauth.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cmd/admin_auth_oauth.go b/cmd/admin_auth_oauth.go index abdcd5d48a..a638bf0210 100644 --- a/cmd/admin_auth_oauth.go +++ b/cmd/admin_auth_oauth.go @@ -86,6 +86,11 @@ func oauthCLIFlags() []cli.Flag { Value: nil, Usage: "Scopes to request when to authenticate against this OAuth2 source", }, + &cli.StringFlag{ + Name: "attribute-ssh-public-key", + Value: "", + Usage: "Claim name providing SSH public keys for this source", + }, &cli.StringFlag{ Name: "required-claim-name", Value: "", @@ -163,6 +168,7 @@ func parseOAuth2Config(_ context.Context, c *cli.Command) *oauth2.Source { IconURL: c.String("icon-url"), SkipLocalTwoFA: c.Bool("skip-local-2fa"), Scopes: c.StringSlice("scopes"), + AttributeSSHPublicKey: c.String("attribute-ssh-public-key"), RequiredClaimName: c.String("required-claim-name"), RequiredClaimValue: c.String("required-claim-value"), GroupClaimName: c.String("group-claim-name"), @@ -244,6 +250,10 @@ func runUpdateOauth(ctx context.Context, c *cli.Command) error { oAuth2Config.Scopes = c.StringSlice("scopes") } + if c.IsSet("attribute-ssh-public-key") { + oAuth2Config.AttributeSSHPublicKey = c.String("attribute-ssh-public-key") + } + if c.IsSet("required-claim-name") { oAuth2Config.RequiredClaimName = c.String("required-claim-name") } From d8c5083c6fbf8e02051d841a6a677591ecc65045 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 5 Jul 2025 16:16:10 +0200 Subject: [PATCH 084/495] Update linters (forgejo) (#8421) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8421 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 243 ++++++++++++++++++++++++++++------------------ package.json | 12 +-- 2 files changed, 152 insertions(+), 103 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1a1c527c58..b1f0e1126c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -65,13 +65,13 @@ "@eslint-community/eslint-plugin-eslint-comments": "4.5.0", "@playwright/test": "1.53.2", "@stoplight/spectral-cli": "6.15.0", - "@stylistic/eslint-plugin": "5.0.0", + "@stylistic/eslint-plugin": "5.1.0", "@stylistic/stylelint-plugin": "3.1.3", "@vitejs/plugin-vue": "6.0.0", "@vitest/coverage-v8": "3.2.4", "@vitest/eslint-plugin": "1.2.2", "@vue/test-utils": "2.4.6", - "eslint": "9.30.0", + "eslint": "9.30.1", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-array-func": "5.0.2", "eslint-plugin-import-x": "4.16.1", @@ -83,8 +83,8 @@ "eslint-plugin-toml": "0.12.0", "eslint-plugin-unicorn": "59.0.1", "eslint-plugin-vitest-globals": "1.5.0", - "eslint-plugin-vue": "10.2.0", - "eslint-plugin-vue-scoped-css": "2.10.0", + "eslint-plugin-vue": "10.3.0", + "eslint-plugin-vue-scoped-css": "2.11.0", "eslint-plugin-wc": "3.0.1", "globals": "16.3.0", "happy-dom": "18.0.1", @@ -92,13 +92,13 @@ "markdownlint-cli": "0.45.0", "postcss-html": "1.8.0", "sharp": "0.34.2", - "stylelint": "16.21.0", + "stylelint": "16.21.1", "stylelint-declaration-block-no-ignored-properties": "2.8.0", "stylelint-declaration-strict-value": "1.10.11", "stylelint-value-no-unknown-custom-properties": "6.0.1", "svgo": "4.0.0", "typescript": "5.8.3", - "typescript-eslint": "8.35.0", + "typescript-eslint": "8.35.1", "vite-string-plugin": "1.3.4", "vitest": "3.2.4" }, @@ -1146,9 +1146,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.30.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.30.0.tgz", - "integrity": "sha512-Wzw3wQwPvc9sHM+NjakWTcPx11mbZyiYHuwWa/QfZ7cIRX7WK54PSk7bdyXDaoaopUcMatv1zaQvOAAO8hCdww==", + "version": "9.30.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.30.1.tgz", + "integrity": "sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==", "dev": true, "license": "MIT", "engines": { @@ -3050,9 +3050,9 @@ } }, "node_modules/@stylistic/eslint-plugin": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.0.0.tgz", - "integrity": "sha512-nVV2FSzeTJ3oFKw+3t9gQYQcrgbopgCASSY27QOtkhEGgSfdQQjDmzZd41NeT1myQ8Wc6l+pZllST9qIu4NKzg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.1.0.tgz", + "integrity": "sha512-TJRJul4u/lmry5N/kyCU+7RWWOk0wyXN+BncRlDYBqpLFnzXkd7QGVfN7KewarFIXv0IX0jSF/Ksu7aHWEDeuw==", "dev": true, "license": "MIT", "dependencies": { @@ -3546,17 +3546,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.0.tgz", - "integrity": "sha512-ijItUYaiWuce0N1SoSMrEd0b6b6lYkYt99pqCPfybd+HKVXtEvYhICfLdwp42MhiI5mp0oq7PKEL+g1cNiz/Eg==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz", + "integrity": "sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.35.0", - "@typescript-eslint/type-utils": "8.35.0", - "@typescript-eslint/utils": "8.35.0", - "@typescript-eslint/visitor-keys": "8.35.0", + "@typescript-eslint/scope-manager": "8.35.1", + "@typescript-eslint/type-utils": "8.35.1", + "@typescript-eslint/utils": "8.35.1", + "@typescript-eslint/visitor-keys": "8.35.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -3570,7 +3570,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.35.0", + "@typescript-eslint/parser": "^8.35.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } @@ -3586,16 +3586,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.0.tgz", - "integrity": "sha512-6sMvZePQrnZH2/cJkwRpkT7DxoAWh+g6+GFRK6bV3YQo7ogi3SX5rgF6099r5Q53Ma5qeT7LGmOmuIutF4t3lA==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.1.tgz", + "integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.35.0", - "@typescript-eslint/types": "8.35.0", - "@typescript-eslint/typescript-estree": "8.35.0", - "@typescript-eslint/visitor-keys": "8.35.0", + "@typescript-eslint/scope-manager": "8.35.1", + "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/typescript-estree": "8.35.1", + "@typescript-eslint/visitor-keys": "8.35.1", "debug": "^4.3.4" }, "engines": { @@ -3611,14 +3611,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.0.tgz", - "integrity": "sha512-41xatqRwWZuhUMF/aZm2fcUsOFKNcG28xqRSS6ZVr9BVJtGExosLAm5A1OxTjRMagx8nJqva+P5zNIGt8RIgbQ==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz", + "integrity": "sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.35.0", - "@typescript-eslint/types": "^8.35.0", + "@typescript-eslint/tsconfig-utils": "^8.35.1", + "@typescript-eslint/types": "^8.35.1", "debug": "^4.3.4" }, "engines": { @@ -3633,14 +3633,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.0.tgz", - "integrity": "sha512-+AgL5+mcoLxl1vGjwNfiWq5fLDZM1TmTPYs2UkyHfFhgERxBbqHlNjRzhThJqz+ktBqTChRYY6zwbMwy0591AA==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz", + "integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.35.0", - "@typescript-eslint/visitor-keys": "8.35.0" + "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/visitor-keys": "8.35.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3651,9 +3651,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.0.tgz", - "integrity": "sha512-04k/7247kZzFraweuEirmvUj+W3bJLI9fX6fbo1Qm2YykuBvEhRTPl8tcxlYO8kZZW+HIXfkZNoasVb8EV4jpA==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz", + "integrity": "sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==", "dev": true, "license": "MIT", "engines": { @@ -3668,14 +3668,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.0.tgz", - "integrity": "sha512-ceNNttjfmSEoM9PW87bWLDEIaLAyR+E6BoYJQ5PfaDau37UGca9Nyq3lBk8Bw2ad0AKvYabz6wxc7DMTO2jnNA==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz", + "integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.35.0", - "@typescript-eslint/utils": "8.35.0", + "@typescript-eslint/typescript-estree": "8.35.1", + "@typescript-eslint/utils": "8.35.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -3692,9 +3692,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.0.tgz", - "integrity": "sha512-0mYH3emanku0vHw2aRLNGqe7EXh9WHEhi7kZzscrMDf6IIRUQ5Jk4wp1QrledE/36KtdZrVfKnE32eZCf/vaVQ==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz", + "integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==", "dev": true, "license": "MIT", "engines": { @@ -3706,16 +3706,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.0.tgz", - "integrity": "sha512-F+BhnaBemgu1Qf8oHrxyw14wq6vbL8xwWKKMwTMwYIRmFFY/1n/9T/jpbobZL8vp7QyEUcC6xGrnAO4ua8Kp7w==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz", + "integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.35.0", - "@typescript-eslint/tsconfig-utils": "8.35.0", - "@typescript-eslint/types": "8.35.0", - "@typescript-eslint/visitor-keys": "8.35.0", + "@typescript-eslint/project-service": "8.35.1", + "@typescript-eslint/tsconfig-utils": "8.35.1", + "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/visitor-keys": "8.35.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3768,16 +3768,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.0.tgz", - "integrity": "sha512-nqoMu7WWM7ki5tPgLVsmPM8CkqtoPUG6xXGeefM5t4x3XumOEKMoUZPdi+7F+/EotukN4R9OWdmDxN80fqoZeg==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz", + "integrity": "sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.35.0", - "@typescript-eslint/types": "8.35.0", - "@typescript-eslint/typescript-estree": "8.35.0" + "@typescript-eslint/scope-manager": "8.35.1", + "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/typescript-estree": "8.35.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3792,13 +3792,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.0.tgz", - "integrity": "sha512-zTh2+1Y8ZpmeQaQVIc/ZZxsx8UzgKJyNg1PTvjzC7WMhPSVS8bfDX34k1SrwOf016qd5RU3az2UxUNue3IfQ5g==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz", + "integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.35.0", + "@typescript-eslint/types": "8.35.1", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -5245,14 +5245,14 @@ } }, "node_modules/cacheable": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.0.tgz", - "integrity": "sha512-SSgQTAnhd7WlJXnGlIi4jJJOiHzgnM5wRMEPaXAU4kECTAMpBoYKoZ9i5zHmclIEZbxcu3j7yY/CF8DTmwIsHg==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.1.tgz", + "integrity": "sha512-Fa2BZY0CS9F0PFc/6aVA6tgpOdw+hmv9dkZOlHXII5v5Hw+meJBIWDcPrG9q/dXxGcNbym5t77fzmawrBQfTmQ==", "dev": true, "license": "MIT", "dependencies": { - "hookified": "^1.8.2", - "keyv": "^5.3.3" + "hookified": "^1.10.0", + "keyv": "^5.3.4" } }, "node_modules/cacheable/node_modules/keyv": { @@ -7250,9 +7250,9 @@ } }, "node_modules/eslint": { - "version": "9.30.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.30.0.tgz", - "integrity": "sha512-iN/SiPxmQu6EVkf+m1qpBxzUhE12YqFLOSySuOyVLJLEF9nzTf+h/1AJYc1JWzCnktggeNrjvQGLngDzXirU6g==", + "version": "9.30.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.30.1.tgz", + "integrity": "sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7262,7 +7262,7 @@ "@eslint/config-helpers": "^0.3.0", "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.30.0", + "@eslint/js": "9.30.1", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -7669,9 +7669,9 @@ "license": "MIT" }, "node_modules/eslint-plugin-vue": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.2.0.tgz", - "integrity": "sha512-tl9s+KN3z0hN2b8fV2xSs5ytGl7Esk1oSCxULLwFcdaElhZ8btYYZFrWxvh4En+czrSDtuLCeCOGa8HhEZuBdQ==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.3.0.tgz", + "integrity": "sha512-A0u9snqjCfYaPnqqOaH6MBLVWDUIN4trXn8J3x67uDcXvR7X6Ut8p16N+nYhMCQ9Y7edg2BIRGzfyZsY0IdqoQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7686,24 +7686,30 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", "vue-eslint-parser": "^10.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/parser": { + "optional": true + } } }, "node_modules/eslint-plugin-vue-scoped-css": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue-scoped-css/-/eslint-plugin-vue-scoped-css-2.10.0.tgz", - "integrity": "sha512-oH2NY7XFHF3EGOotvuPdnhB0x4uOmjoRoWZVfMnJ2PILDKVgZgM8WZ0rhDlh+fsr9jO9P8CAXO5/9s9v/GZNhg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue-scoped-css/-/eslint-plugin-vue-scoped-css-2.11.0.tgz", + "integrity": "sha512-rrJgLY8iroTIUMSyxhyhJzFcRxABbk3gFrOLkl41F9G1VBqNNpDShyf6PmDoBEWDk07/bJlnqYlvnQ3giUrRYQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "eslint-compat-utils": "^0.6.0", + "eslint-compat-utils": "^0.6.5", "lodash": "^4.17.21", "postcss": "^8.4.31", "postcss-safe-parser": "^6.0.0", "postcss-scss": "^4.0.3", - "postcss-selector-parser": "^6.0.9", + "postcss-selector-parser": "^7.0.0", "postcss-styl": "^0.12.0" }, "engines": { @@ -7717,6 +7723,20 @@ "vue-eslint-parser": ">=7.1.0" } }, + "node_modules/eslint-plugin-vue-scoped-css/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/eslint-plugin-wc": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-wc/-/eslint-plugin-wc-3.0.1.tgz", @@ -13777,9 +13797,9 @@ "license": "ISC" }, "node_modules/stylelint": { - "version": "16.21.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.21.0.tgz", - "integrity": "sha512-ki3PpJGG7xhm3WtINoWGnlvqAmbqSexoRMbEMJzlwewSIOqPRKPlq452c22xAdEJISVi80r+I7KL9GPUiwFgbg==", + "version": "16.21.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.21.1.tgz", + "integrity": "sha512-WCXdXnYK2tpCbebgMF0Bme3YZH/Rh/UXerj75twYo4uLULlcrLwFVdZTvTEF8idFnAcW21YUDJFyKOfaf6xJRw==", "dev": true, "funding": [ { @@ -13820,7 +13840,7 @@ "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.1.1", - "postcss": "^8.5.5", + "postcss": "^8.5.6", "postcss-resolve-nested-selector": "^0.1.6", "postcss-safe-parser": "^7.0.1", "postcss-selector-parser": "^7.1.0", @@ -13940,15 +13960,15 @@ } }, "node_modules/stylelint/node_modules/flat-cache": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.10.tgz", - "integrity": "sha512-B6/v1f0NwjxzmeOhzfXPGWpKBVA207LS7lehaVKQnFrVktcFRfkzjZZ2gwj2i1TkEUMQht7ZMJbABUT5N+V1Nw==", + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.11.tgz", + "integrity": "sha512-zfOAns94mp7bHG/vCn9Ru2eDCmIxVQ5dELUHKjHfDEOJmHNzE+uGa6208kfkgmtym4a0FFjEuFksCXFacbVhSg==", "dev": true, "license": "MIT", "dependencies": { - "cacheable": "^1.10.0", + "cacheable": "^1.10.1", "flatted": "^3.3.3", - "hookified": "^1.9.1" + "hookified": "^1.10.0" } }, "node_modules/stylelint/node_modules/ignore": { @@ -13961,6 +13981,35 @@ "node": ">= 4" } }, + "node_modules/stylelint/node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "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.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/stylelint/node_modules/postcss-safe-parser": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", @@ -14834,15 +14883,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.35.0.tgz", - "integrity": "sha512-uEnz70b7kBz6eg/j0Czy6K5NivaYopgxRjsnAJ2Fx5oTLo3wefTHIbL7AkQr1+7tJCRVpTs/wiM8JR/11Loq9A==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.35.1.tgz", + "integrity": "sha512-xslJjFzhOmHYQzSB/QTeASAHbjmxOGEP6Coh93TXmUBFQoJ1VU35UHIDmG06Jd6taf3wqqC1ntBnCMeymy5Ovw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.35.0", - "@typescript-eslint/parser": "8.35.0", - "@typescript-eslint/utils": "8.35.0" + "@typescript-eslint/eslint-plugin": "8.35.1", + "@typescript-eslint/parser": "8.35.1", + "@typescript-eslint/utils": "8.35.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" diff --git a/package.json b/package.json index c651ecfa13..63a056ad3a 100644 --- a/package.json +++ b/package.json @@ -64,13 +64,13 @@ "@eslint-community/eslint-plugin-eslint-comments": "4.5.0", "@playwright/test": "1.53.2", "@stoplight/spectral-cli": "6.15.0", - "@stylistic/eslint-plugin": "5.0.0", + "@stylistic/eslint-plugin": "5.1.0", "@stylistic/stylelint-plugin": "3.1.3", "@vitejs/plugin-vue": "6.0.0", "@vitest/coverage-v8": "3.2.4", "@vitest/eslint-plugin": "1.2.2", "@vue/test-utils": "2.4.6", - "eslint": "9.30.0", + "eslint": "9.30.1", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-array-func": "5.0.2", "eslint-plugin-import-x": "4.16.1", @@ -82,8 +82,8 @@ "eslint-plugin-toml": "0.12.0", "eslint-plugin-unicorn": "59.0.1", "eslint-plugin-vitest-globals": "1.5.0", - "eslint-plugin-vue": "10.2.0", - "eslint-plugin-vue-scoped-css": "2.10.0", + "eslint-plugin-vue": "10.3.0", + "eslint-plugin-vue-scoped-css": "2.11.0", "eslint-plugin-wc": "3.0.1", "globals": "16.3.0", "happy-dom": "18.0.1", @@ -91,13 +91,13 @@ "markdownlint-cli": "0.45.0", "postcss-html": "1.8.0", "sharp": "0.34.2", - "stylelint": "16.21.0", + "stylelint": "16.21.1", "stylelint-declaration-block-no-ignored-properties": "2.8.0", "stylelint-declaration-strict-value": "1.10.11", "stylelint-value-no-unknown-custom-properties": "6.0.1", "svgo": "4.0.0", "typescript": "5.8.3", - "typescript-eslint": "8.35.0", + "typescript-eslint": "8.35.1", "vite-string-plugin": "1.3.4", "vitest": "3.2.4" }, From 5f514a6e4dc5277337bfc77e28c9a116961ba2a4 Mon Sep 17 00:00:00 2001 From: Gusted Date: Sat, 5 Jul 2025 16:31:53 +0200 Subject: [PATCH 085/495] chore: refactor `LineBlame` (#8419) - Refactor arguments of the function to make more sense. - `path` can be inferred from `repo` receiver. - `line` can be `uint64`. - The two calls to this function check for specific errors, do this error checking in the function. - The ID of a object format is not 40 in the case of SHA256, get the object format and use the correct length. - Add test coverage for `LineBlame`, notably it checks for the errors that can legitimately happen. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8419 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- modules/git/repo_blame.go | 38 +++++++++++++++++++++---- modules/git/repo_blame_test.go | 52 ++++++++++++++++++++++++++++++++++ services/pull/review.go | 12 +++----- 3 files changed, 88 insertions(+), 14 deletions(-) create mode 100644 modules/git/repo_blame_test.go diff --git a/modules/git/repo_blame.go b/modules/git/repo_blame.go index 139cdd7be9..d812354af5 100644 --- a/modules/git/repo_blame.go +++ b/modules/git/repo_blame.go @@ -4,20 +4,46 @@ package git import ( + "errors" "fmt" + "regexp" +) + +var ( + ErrBlameFileDoesNotExist = errors.New("the blamed file does not exist") + ErrBlameFileNotEnoughLines = errors.New("the blamed file has not enough lines") + + notEnoughLinesRe = regexp.MustCompile(`^fatal: file .+ has only \d+ lines?\n$`) ) // LineBlame returns the latest commit at the given line -func (repo *Repository) LineBlame(revision, path, file string, line uint) (*Commit, error) { - res, _, err := NewCommand(repo.Ctx, "blame"). +func (repo *Repository) LineBlame(revision, file string, line uint64) (*Commit, error) { + res, _, gitErr := NewCommand(repo.Ctx, "blame"). AddOptionFormat("-L %d,%d", line, line). AddOptionValues("-p", revision). - AddDashesAndList(file).RunStdString(&RunOpts{Dir: path}) + AddDashesAndList(file).RunStdString(&RunOpts{Dir: repo.Path}) + if gitErr != nil { + stdErr := gitErr.Stderr() + + if stdErr == fmt.Sprintf("fatal: no such path %s in %s\n", file, revision) { + return nil, ErrBlameFileDoesNotExist + } + if notEnoughLinesRe.MatchString(stdErr) { + return nil, ErrBlameFileNotEnoughLines + } + + return nil, gitErr + } + + objectFormat, err := repo.GetObjectFormat() if err != nil { return nil, err } - if len(res) < 40 { - return nil, fmt.Errorf("invalid result of blame: %s", res) + + objectIDLen := objectFormat.FullLength() + if len(res) < objectIDLen { + return nil, fmt.Errorf("output of blame is invalid, cannot contain commit ID: %s", res) } - return repo.GetCommit(res[:40]) + + return repo.GetCommit(res[:objectIDLen]) } diff --git a/modules/git/repo_blame_test.go b/modules/git/repo_blame_test.go new file mode 100644 index 0000000000..126b95386d --- /dev/null +++ b/modules/git/repo_blame_test.go @@ -0,0 +1,52 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package git + +import ( + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestLineBlame(t *testing.T) { + t.Run("SHA1", func(t *testing.T) { + repo, err := OpenRepository(t.Context(), filepath.Join(testReposDir, "repo1_bare")) + require.NoError(t, err) + defer repo.Close() + + commit, err := repo.LineBlame("HEAD", "foo/link_short", 1) + require.NoError(t, err) + assert.Equal(t, "37991dec2c8e592043f47155ce4808d4580f9123", commit.ID.String()) + + commit, err = repo.LineBlame("HEAD", "foo/link_short", 512) + require.ErrorIs(t, err, ErrBlameFileNotEnoughLines) + assert.Nil(t, commit) + + commit, err = repo.LineBlame("HEAD", "non-existent/path", 512) + require.ErrorIs(t, err, ErrBlameFileDoesNotExist) + assert.Nil(t, commit) + }) + + t.Run("SHA256", func(t *testing.T) { + skipIfSHA256NotSupported(t) + + repo, err := OpenRepository(t.Context(), filepath.Join(testReposDir, "repo1_bare_sha256")) + require.NoError(t, err) + defer repo.Close() + + commit, err := repo.LineBlame("HEAD", "foo/link_short", 1) + require.NoError(t, err) + assert.Equal(t, "6aae864a3d1d0d6a5be0cc64028c1e7021e2632b031fd8eb82afc5a283d1c3d1", commit.ID.String()) + + commit, err = repo.LineBlame("HEAD", "foo/link_short", 512) + require.ErrorIs(t, err, ErrBlameFileNotEnoughLines) + assert.Nil(t, commit) + + commit, err = repo.LineBlame("HEAD", "non-existent/path", 512) + require.ErrorIs(t, err, ErrBlameFileDoesNotExist) + assert.Nil(t, commit) + }) +} diff --git a/services/pull/review.go b/services/pull/review.go index c740328e4c..7d232d6d79 100644 --- a/services/pull/review.go +++ b/services/pull/review.go @@ -9,8 +9,6 @@ import ( "errors" "fmt" "io" - "regexp" - "strings" "forgejo.org/models/db" issues_model "forgejo.org/models/issues" @@ -25,8 +23,6 @@ import ( notify_service "forgejo.org/services/notify" ) -var notEnoughLines = regexp.MustCompile(`fatal: file .* has only \d+ lines?`) - // ErrDismissRequestOnClosedPR represents an error when an user tries to dismiss a review associated to a closed or merged PR. type ErrDismissRequestOnClosedPR struct{} @@ -48,8 +44,8 @@ func (err ErrDismissRequestOnClosedPR) Unwrap() error { // If the line got changed the comment is going to be invalidated. func checkInvalidation(ctx context.Context, c *issues_model.Comment, repo *git.Repository, branch string) error { // FIXME differentiate between previous and proposed line - commit, err := repo.LineBlame(branch, repo.Path, c.TreePath, uint(c.UnsignedLine())) - if err != nil && (strings.Contains(err.Error(), "fatal: no such path") || notEnoughLines.MatchString(err.Error())) { + commit, err := repo.LineBlame(branch, c.TreePath, c.UnsignedLine()) + if err != nil && (errors.Is(err, git.ErrBlameFileDoesNotExist) || errors.Is(err, git.ErrBlameFileNotEnoughLines)) { c.Invalidated = true return issues_model.UpdateCommentInvalidate(ctx, c) } @@ -230,10 +226,10 @@ func CreateCodeCommentKnownReviewID(ctx context.Context, doer *user_model.User, // FIXME validate treePath // Get latest commit referencing the commented line // No need for get commit for base branch changes - commit, err := gitRepo.LineBlame(head, gitRepo.Path, treePath, uint(line)) + commit, err := gitRepo.LineBlame(head, treePath, uint64(line)) if err == nil { commitID = commit.ID.String() - } else if !strings.Contains(err.Error(), "exit status 128 - fatal: no such path") && !notEnoughLines.MatchString(err.Error()) { + } else if !errors.Is(err, git.ErrBlameFileDoesNotExist) && !errors.Is(err, git.ErrBlameFileNotEnoughLines) { return nil, fmt.Errorf("LineBlame[%s, %s, %s, %d]: %w", pr.GetGitRefName(), gitRepo.Path, treePath, line, err) } } From 6e239a7f65ccb9a690f2aabd66a219e61dae545e Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 5 Jul 2025 16:38:18 +0200 Subject: [PATCH 086/495] Update dependency @vitest/eslint-plugin to v1.3.4 (forgejo) (#8420) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index b1f0e1126c..bc5f65fea9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -69,7 +69,7 @@ "@stylistic/stylelint-plugin": "3.1.3", "@vitejs/plugin-vue": "6.0.0", "@vitest/coverage-v8": "3.2.4", - "@vitest/eslint-plugin": "1.2.2", + "@vitest/eslint-plugin": "1.3.4", "@vue/test-utils": "2.4.6", "eslint": "9.30.1", "eslint-import-resolver-typescript": "4.4.4", @@ -4140,13 +4140,13 @@ } }, "node_modules/@vitest/eslint-plugin": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.2.2.tgz", - "integrity": "sha512-R8NwW+VxyKqVGcMfYsUbdThQyMbtNcoeg+jJeTgMHqWdFdcS0nrODAQXhkplvWzgd7jIJ+GQeydGqFLibsxMxg==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.3.4.tgz", + "integrity": "sha512-EOg8d0jn3BAiKnR55WkFxmxfWA3nmzrbIIuOXyTe6A72duryNgyU+bdBEauA97Aab3ho9kLmAwgPX63Ckj4QEg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^8.24.0" + "@typescript-eslint/utils": "^8.24.1" }, "peerDependencies": { "eslint": ">= 8.57.0", diff --git a/package.json b/package.json index 63a056ad3a..8fceed4534 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "@stylistic/stylelint-plugin": "3.1.3", "@vitejs/plugin-vue": "6.0.0", "@vitest/coverage-v8": "3.2.4", - "@vitest/eslint-plugin": "1.2.2", + "@vitest/eslint-plugin": "1.3.4", "@vue/test-utils": "2.4.6", "eslint": "9.30.1", "eslint-import-resolver-typescript": "4.4.4", From 212e8ac348b5ff5b92edb1d6ea702fd81496f831 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 5 Jul 2025 18:33:45 +0200 Subject: [PATCH 087/495] Update module github.com/golangci/golangci-lint/v2/cmd/golangci-lint to v2.2.1 (forgejo) (#8422) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8422 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- .golangci.yml | 4 ++++ Makefile | 2 +- models/forgejo_migrations/main_test.go | 2 +- models/forgejo_migrations/migrate.go | 2 +- models/forgejo_migrations/migrate_test.go | 2 +- models/forgejo_migrations/v13.go | 2 +- models/forgejo_migrations/v14.go | 2 +- models/forgejo_migrations/v15.go | 2 +- models/forgejo_migrations/v16.go | 2 +- models/forgejo_migrations/v17.go | 2 +- models/forgejo_migrations/v18.go | 2 +- models/forgejo_migrations/v19.go | 2 +- models/forgejo_migrations/v1_20/v1.go | 2 +- models/forgejo_migrations/v1_20/v2.go | 2 +- models/forgejo_migrations/v1_20/v3.go | 2 +- models/forgejo_migrations/v1_22/main_test.go | 2 +- models/forgejo_migrations/v1_22/v10.go | 2 +- models/forgejo_migrations/v1_22/v11.go | 2 +- models/forgejo_migrations/v1_22/v12.go | 2 +- models/forgejo_migrations/v1_22/v4.go | 2 +- models/forgejo_migrations/v1_22/v5.go | 2 +- models/forgejo_migrations/v1_22/v6.go | 2 +- models/forgejo_migrations/v1_22/v7.go | 2 +- models/forgejo_migrations/v1_22/v8.go | 2 +- models/forgejo_migrations/v1_22/v8_test.go | 2 +- models/forgejo_migrations/v1_22/v9.go | 2 +- models/forgejo_migrations/v20.go | 2 +- models/forgejo_migrations/v21.go | 2 +- models/forgejo_migrations/v22.go | 2 +- models/forgejo_migrations/v23.go | 2 +- models/forgejo_migrations/v24.go | 2 +- models/forgejo_migrations/v25.go | 2 +- models/forgejo_migrations/v25_test.go | 2 +- models/forgejo_migrations/v26.go | 2 +- models/forgejo_migrations/v27.go | 2 +- models/forgejo_migrations/v28.go | 2 +- models/forgejo_migrations/v29.go | 2 +- models/forgejo_migrations/v30.go | 2 +- models/forgejo_migrations/v30_test.go | 2 +- models/forgejo_migrations/v31.go | 2 +- models/forgejo_migrations/v31_test.go | 2 +- models/forgejo_migrations/v32.go | 2 +- models/forgejo_migrations/v32_test.go | 2 +- models/forgejo_migrations/v33.go | 2 +- models/forgejo_migrations/v33_test.go | 2 +- models/forgejo_migrations/v34.go | 2 +- models/forgejo_migrations/v35.go | 2 +- models/migrations/v1_10/v100.go | 2 +- models/migrations/v1_10/v101.go | 2 +- models/migrations/v1_10/v88.go | 2 +- models/migrations/v1_10/v89.go | 2 +- models/migrations/v1_10/v90.go | 2 +- models/migrations/v1_10/v91.go | 2 +- models/migrations/v1_10/v92.go | 2 +- models/migrations/v1_10/v93.go | 2 +- models/migrations/v1_10/v94.go | 2 +- models/migrations/v1_10/v95.go | 2 +- models/migrations/v1_10/v96.go | 2 +- models/migrations/v1_10/v97.go | 2 +- models/migrations/v1_10/v98.go | 2 +- models/migrations/v1_10/v99.go | 2 +- models/migrations/v1_11/v102.go | 2 +- models/migrations/v1_11/v103.go | 2 +- models/migrations/v1_11/v104.go | 2 +- models/migrations/v1_11/v105.go | 2 +- models/migrations/v1_11/v106.go | 2 +- models/migrations/v1_11/v107.go | 2 +- models/migrations/v1_11/v108.go | 2 +- models/migrations/v1_11/v109.go | 2 +- models/migrations/v1_11/v110.go | 2 +- models/migrations/v1_11/v111.go | 2 +- models/migrations/v1_11/v112.go | 2 +- models/migrations/v1_11/v113.go | 2 +- models/migrations/v1_11/v114.go | 2 +- models/migrations/v1_11/v115.go | 2 +- models/migrations/v1_11/v116.go | 2 +- models/migrations/v1_12/v117.go | 2 +- models/migrations/v1_12/v118.go | 2 +- models/migrations/v1_12/v119.go | 2 +- models/migrations/v1_12/v120.go | 2 +- models/migrations/v1_12/v121.go | 2 +- models/migrations/v1_12/v122.go | 2 +- models/migrations/v1_12/v123.go | 2 +- models/migrations/v1_12/v124.go | 2 +- models/migrations/v1_12/v125.go | 2 +- models/migrations/v1_12/v126.go | 2 +- models/migrations/v1_12/v127.go | 2 +- models/migrations/v1_12/v128.go | 2 +- models/migrations/v1_12/v129.go | 2 +- models/migrations/v1_12/v130.go | 2 +- models/migrations/v1_12/v131.go | 2 +- models/migrations/v1_12/v132.go | 2 +- models/migrations/v1_12/v133.go | 2 +- models/migrations/v1_12/v134.go | 2 +- models/migrations/v1_12/v135.go | 2 +- models/migrations/v1_12/v136.go | 2 +- models/migrations/v1_12/v137.go | 2 +- models/migrations/v1_12/v138.go | 2 +- models/migrations/v1_12/v139.go | 2 +- models/migrations/v1_13/v140.go | 2 +- models/migrations/v1_13/v141.go | 2 +- models/migrations/v1_13/v142.go | 2 +- models/migrations/v1_13/v143.go | 2 +- models/migrations/v1_13/v144.go | 2 +- models/migrations/v1_13/v145.go | 2 +- models/migrations/v1_13/v146.go | 2 +- models/migrations/v1_13/v147.go | 2 +- models/migrations/v1_13/v148.go | 2 +- models/migrations/v1_13/v149.go | 2 +- models/migrations/v1_13/v150.go | 2 +- models/migrations/v1_13/v151.go | 2 +- models/migrations/v1_13/v152.go | 2 +- models/migrations/v1_13/v153.go | 2 +- models/migrations/v1_13/v154.go | 2 +- models/migrations/v1_14/main_test.go | 2 +- models/migrations/v1_14/v155.go | 2 +- models/migrations/v1_14/v156.go | 2 +- models/migrations/v1_14/v157.go | 2 +- models/migrations/v1_14/v158.go | 2 +- models/migrations/v1_14/v159.go | 2 +- models/migrations/v1_14/v160.go | 2 +- models/migrations/v1_14/v161.go | 2 +- models/migrations/v1_14/v162.go | 2 +- models/migrations/v1_14/v163.go | 2 +- models/migrations/v1_14/v164.go | 2 +- models/migrations/v1_14/v165.go | 2 +- models/migrations/v1_14/v166.go | 2 +- models/migrations/v1_14/v167.go | 2 +- models/migrations/v1_14/v168.go | 2 +- models/migrations/v1_14/v169.go | 2 +- models/migrations/v1_14/v170.go | 2 +- models/migrations/v1_14/v171.go | 2 +- models/migrations/v1_14/v172.go | 2 +- models/migrations/v1_14/v173.go | 2 +- models/migrations/v1_14/v174.go | 2 +- models/migrations/v1_14/v175.go | 2 +- models/migrations/v1_14/v176.go | 2 +- models/migrations/v1_14/v176_test.go | 2 +- models/migrations/v1_14/v177.go | 2 +- models/migrations/v1_14/v177_test.go | 2 +- models/migrations/v1_15/main_test.go | 2 +- models/migrations/v1_15/v178.go | 2 +- models/migrations/v1_15/v179.go | 2 +- models/migrations/v1_15/v180.go | 2 +- models/migrations/v1_15/v181.go | 2 +- models/migrations/v1_15/v181_test.go | 2 +- models/migrations/v1_15/v182.go | 2 +- models/migrations/v1_15/v182_test.go | 2 +- models/migrations/v1_15/v183.go | 2 +- models/migrations/v1_15/v184.go | 2 +- models/migrations/v1_15/v185.go | 2 +- models/migrations/v1_15/v186.go | 2 +- models/migrations/v1_15/v187.go | 2 +- models/migrations/v1_15/v188.go | 2 +- models/migrations/v1_16/main_test.go | 2 +- models/migrations/v1_16/v189.go | 2 +- models/migrations/v1_16/v189_test.go | 2 +- models/migrations/v1_16/v190.go | 2 +- models/migrations/v1_16/v191.go | 2 +- models/migrations/v1_16/v192.go | 2 +- models/migrations/v1_16/v193.go | 2 +- models/migrations/v1_16/v193_test.go | 2 +- models/migrations/v1_16/v194.go | 2 +- models/migrations/v1_16/v195.go | 2 +- models/migrations/v1_16/v195_test.go | 2 +- models/migrations/v1_16/v196.go | 2 +- models/migrations/v1_16/v197.go | 2 +- models/migrations/v1_16/v198.go | 2 +- models/migrations/v1_16/v199.go | 2 +- models/migrations/v1_16/v200.go | 2 +- models/migrations/v1_16/v201.go | 2 +- models/migrations/v1_16/v202.go | 2 +- models/migrations/v1_16/v203.go | 2 +- models/migrations/v1_16/v204.go | 2 +- models/migrations/v1_16/v205.go | 2 +- models/migrations/v1_16/v206.go | 2 +- models/migrations/v1_16/v207.go | 2 +- models/migrations/v1_16/v208.go | 2 +- models/migrations/v1_16/v209.go | 2 +- models/migrations/v1_16/v210.go | 2 +- models/migrations/v1_16/v210_test.go | 2 +- models/migrations/v1_17/main_test.go | 2 +- models/migrations/v1_17/v211.go | 2 +- models/migrations/v1_17/v212.go | 2 +- models/migrations/v1_17/v213.go | 2 +- models/migrations/v1_17/v214.go | 2 +- models/migrations/v1_17/v215.go | 2 +- models/migrations/v1_17/v216.go | 2 +- models/migrations/v1_17/v217.go | 2 +- models/migrations/v1_17/v218.go | 2 +- models/migrations/v1_17/v219.go | 2 +- models/migrations/v1_17/v220.go | 2 +- models/migrations/v1_17/v221.go | 2 +- models/migrations/v1_17/v221_test.go | 2 +- models/migrations/v1_17/v222.go | 2 +- models/migrations/v1_17/v223.go | 2 +- models/migrations/v1_18/main_test.go | 2 +- models/migrations/v1_18/v224.go | 2 +- models/migrations/v1_18/v225.go | 2 +- models/migrations/v1_18/v226.go | 2 +- models/migrations/v1_18/v227.go | 2 +- models/migrations/v1_18/v228.go | 2 +- models/migrations/v1_18/v229.go | 2 +- models/migrations/v1_18/v229_test.go | 2 +- models/migrations/v1_18/v230.go | 2 +- models/migrations/v1_18/v230_test.go | 2 +- models/migrations/v1_19/main_test.go | 2 +- models/migrations/v1_19/v231.go | 2 +- models/migrations/v1_19/v232.go | 2 +- models/migrations/v1_19/v233.go | 2 +- models/migrations/v1_19/v233_test.go | 2 +- models/migrations/v1_19/v234.go | 2 +- models/migrations/v1_19/v235.go | 2 +- models/migrations/v1_19/v236.go | 2 +- models/migrations/v1_19/v237.go | 2 +- models/migrations/v1_19/v238.go | 2 +- models/migrations/v1_19/v239.go | 2 +- models/migrations/v1_19/v240.go | 2 +- models/migrations/v1_19/v241.go | 2 +- models/migrations/v1_19/v242.go | 2 +- models/migrations/v1_19/v243.go | 2 +- models/migrations/v1_20/main_test.go | 2 +- models/migrations/v1_20/v244.go | 2 +- models/migrations/v1_20/v245.go | 2 +- models/migrations/v1_20/v246.go | 2 +- models/migrations/v1_20/v247.go | 2 +- models/migrations/v1_20/v248.go | 2 +- models/migrations/v1_20/v249.go | 2 +- models/migrations/v1_20/v250.go | 2 +- models/migrations/v1_20/v251.go | 2 +- models/migrations/v1_20/v252.go | 2 +- models/migrations/v1_20/v253.go | 2 +- models/migrations/v1_20/v254.go | 2 +- models/migrations/v1_20/v255.go | 2 +- models/migrations/v1_20/v256.go | 2 +- models/migrations/v1_20/v257.go | 2 +- models/migrations/v1_20/v258.go | 2 +- models/migrations/v1_20/v259.go | 2 +- models/migrations/v1_20/v259_test.go | 2 +- models/migrations/v1_21/main_test.go | 2 +- models/migrations/v1_21/v260.go | 2 +- models/migrations/v1_21/v261.go | 2 +- models/migrations/v1_21/v262.go | 2 +- models/migrations/v1_21/v263.go | 2 +- models/migrations/v1_21/v264.go | 2 +- models/migrations/v1_21/v265.go | 2 +- models/migrations/v1_21/v266.go | 2 +- models/migrations/v1_21/v267.go | 2 +- models/migrations/v1_21/v268.go | 2 +- models/migrations/v1_21/v269.go | 2 +- models/migrations/v1_21/v270.go | 2 +- models/migrations/v1_21/v271.go | 3 ++- models/migrations/v1_21/v272.go | 3 ++- models/migrations/v1_21/v273.go | 3 ++- models/migrations/v1_21/v274.go | 3 ++- models/migrations/v1_21/v275.go | 2 +- models/migrations/v1_21/v276.go | 2 +- models/migrations/v1_21/v277.go | 2 +- models/migrations/v1_21/v278.go | 2 +- models/migrations/v1_21/v279.go | 2 +- models/migrations/v1_22/main_test.go | 2 +- models/migrations/v1_22/v280.go | 2 +- models/migrations/v1_22/v281.go | 2 +- models/migrations/v1_22/v282.go | 2 +- models/migrations/v1_22/v283.go | 2 +- models/migrations/v1_22/v283_test.go | 2 +- models/migrations/v1_22/v284.go | 3 ++- models/migrations/v1_22/v285.go | 2 +- models/migrations/v1_22/v286.go | 2 +- models/migrations/v1_22/v286_test.go | 2 +- models/migrations/v1_22/v287.go | 2 +- models/migrations/v1_22/v288.go | 2 +- models/migrations/v1_22/v289.go | 2 +- models/migrations/v1_22/v290.go | 2 +- models/migrations/v1_22/v290_test.go | 2 +- models/migrations/v1_22/v291.go | 2 +- models/migrations/v1_22/v292.go | 2 +- models/migrations/v1_22/v293.go | 2 +- models/migrations/v1_22/v293_test.go | 2 +- models/migrations/v1_22/v294.go | 2 +- models/migrations/v1_22/v294_test.go | 5 +++-- models/migrations/v1_22/v295.go | 2 +- models/migrations/v1_22/v296.go | 2 +- models/migrations/v1_22/v298.go | 2 +- models/migrations/v1_23/main_test.go | 2 +- models/migrations/v1_23/v299.go | 2 +- models/migrations/v1_23/v300.go | 2 +- models/migrations/v1_23/v301.go | 2 +- models/migrations/v1_23/v302.go | 2 +- models/migrations/v1_23/v303.go | 2 +- models/migrations/v1_23/v303_test.go | 2 +- models/migrations/v1_6/v70.go | 2 +- models/migrations/v1_6/v71.go | 2 +- models/migrations/v1_6/v72.go | 2 +- models/migrations/v1_7/v73.go | 2 +- models/migrations/v1_7/v74.go | 2 +- models/migrations/v1_7/v75.go | 2 +- models/migrations/v1_8/v76.go | 2 +- models/migrations/v1_8/v77.go | 2 +- models/migrations/v1_8/v78.go | 2 +- models/migrations/v1_8/v79.go | 2 +- models/migrations/v1_8/v80.go | 2 +- models/migrations/v1_8/v81.go | 2 +- models/migrations/v1_9/v82.go | 2 +- models/migrations/v1_9/v83.go | 2 +- models/migrations/v1_9/v84.go | 2 +- models/migrations/v1_9/v85.go | 2 +- models/migrations/v1_9/v86.go | 2 +- models/migrations/v1_9/v87.go | 2 +- tests/integration/pull_commit_test.go | 2 +- tests/integration/repo_test.go | 2 +- tests/integration/signing_git_test.go | 2 +- 312 files changed, 322 insertions(+), 312 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 532132838d..6679a1850e 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -79,6 +79,10 @@ linters: - name: unreachable-code - name: var-declaration - name: var-naming + arguments: + - [] + - [] + - - skip-package-name-checks: true - name: redefines-builtin-id disabled: true staticcheck: diff --git a/Makefile b/Makefile index db4ec2fbd5..54becdc8dc 100644 --- a/Makefile +++ b/Makefile @@ -39,7 +39,7 @@ XGO_VERSION := go-1.21.x AIR_PACKAGE ?= github.com/air-verse/air@v1 # renovate: datasource=go EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-checker/v3/cmd/editorconfig-checker@v3.3.0 # renovate: datasource=go GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.8.0 # renovate: datasource=go -GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.1.6 # renovate: datasource=go +GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.2.1 # renovate: datasource=go GXZ_PACKAGE ?= github.com/ulikunitz/xz/cmd/gxz@v0.5.11 # renovate: datasource=go SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.31.0 # renovate: datasource=go XGO_PACKAGE ?= src.techknowlogick.com/xgo@latest diff --git a/models/forgejo_migrations/main_test.go b/models/forgejo_migrations/main_test.go index 031fe8090d..2246e327f0 100644 --- a/models/forgejo_migrations/main_test.go +++ b/models/forgejo_migrations/main_test.go @@ -1,7 +1,7 @@ // Copyright 2023 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations //nolint:revive +package forgejo_migrations import ( "testing" diff --git a/models/forgejo_migrations/migrate.go b/models/forgejo_migrations/migrate.go index bc64f07013..50391ff650 100644 --- a/models/forgejo_migrations/migrate.go +++ b/models/forgejo_migrations/migrate.go @@ -1,7 +1,7 @@ // Copyright 2023 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations //nolint:revive +package forgejo_migrations import ( "context" diff --git a/models/forgejo_migrations/migrate_test.go b/models/forgejo_migrations/migrate_test.go index 20653929a3..9d16c9fe1c 100644 --- a/models/forgejo_migrations/migrate_test.go +++ b/models/forgejo_migrations/migrate_test.go @@ -1,7 +1,7 @@ // Copyright 2023 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations //nolint:revive +package forgejo_migrations import ( "testing" diff --git a/models/forgejo_migrations/v13.go b/models/forgejo_migrations/v13.go index 614f68249d..ba4183885e 100644 --- a/models/forgejo_migrations/v13.go +++ b/models/forgejo_migrations/v13.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations //nolint:revive +package forgejo_migrations import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v14.go b/models/forgejo_migrations/v14.go index 53f1ef2223..65b857d343 100644 --- a/models/forgejo_migrations/v14.go +++ b/models/forgejo_migrations/v14.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations //nolint:revive +package forgejo_migrations import ( "forgejo.org/models/migrations/base" diff --git a/models/forgejo_migrations/v15.go b/models/forgejo_migrations/v15.go index 5e5588dd05..a63199ab19 100644 --- a/models/forgejo_migrations/v15.go +++ b/models/forgejo_migrations/v15.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations //nolint:revive +package forgejo_migrations import ( "time" diff --git a/models/forgejo_migrations/v16.go b/models/forgejo_migrations/v16.go index f80bfc5268..a7d4d5d590 100644 --- a/models/forgejo_migrations/v16.go +++ b/models/forgejo_migrations/v16.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations //nolint:revive +package forgejo_migrations import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v17.go b/models/forgejo_migrations/v17.go index d6e2983d00..8ef6f2c681 100644 --- a/models/forgejo_migrations/v17.go +++ b/models/forgejo_migrations/v17.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations //nolint:revive +package forgejo_migrations import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v18.go b/models/forgejo_migrations/v18.go index e6c1493f0e..e39b0cbf10 100644 --- a/models/forgejo_migrations/v18.go +++ b/models/forgejo_migrations/v18.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations //nolint:revive +package forgejo_migrations import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v19.go b/models/forgejo_migrations/v19.go index 69b7746eb1..43d279dcb0 100644 --- a/models/forgejo_migrations/v19.go +++ b/models/forgejo_migrations/v19.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations //nolint:revive +package forgejo_migrations import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v1_20/v1.go b/models/forgejo_migrations/v1_20/v1.go index 72beaf23de..f0cb125557 100644 --- a/models/forgejo_migrations/v1_20/v1.go +++ b/models/forgejo_migrations/v1_20/v1.go @@ -1,7 +1,7 @@ // Copyright 2023 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_v1_20 //nolint:revive +package forgejo_v1_20 import ( "forgejo.org/modules/timeutil" diff --git a/models/forgejo_migrations/v1_20/v2.go b/models/forgejo_migrations/v1_20/v2.go index 39f3b58924..3f79ac3801 100644 --- a/models/forgejo_migrations/v1_20/v2.go +++ b/models/forgejo_migrations/v1_20/v2.go @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -package forgejo_v1_20 //nolint:revive +package forgejo_v1_20 import ( "xorm.io/xorm" diff --git a/models/forgejo_migrations/v1_20/v3.go b/models/forgejo_migrations/v1_20/v3.go index cce227e6eb..49530df556 100644 --- a/models/forgejo_migrations/v1_20/v3.go +++ b/models/forgejo_migrations/v1_20/v3.go @@ -1,7 +1,7 @@ // Copyright 2023 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_v1_20 //nolint:revive +package forgejo_v1_20 import ( "forgejo.org/modules/timeutil" diff --git a/models/forgejo_migrations/v1_22/main_test.go b/models/forgejo_migrations/v1_22/main_test.go index 03c4c5272c..d6a5bdacee 100644 --- a/models/forgejo_migrations/v1_22/main_test.go +++ b/models/forgejo_migrations/v1_22/main_test.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "testing" diff --git a/models/forgejo_migrations/v1_22/v10.go b/models/forgejo_migrations/v1_22/v10.go index 819800ae71..cf45abdd24 100644 --- a/models/forgejo_migrations/v1_22/v10.go +++ b/models/forgejo_migrations/v1_22/v10.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "xorm.io/xorm" diff --git a/models/forgejo_migrations/v1_22/v11.go b/models/forgejo_migrations/v1_22/v11.go index 17bb592379..f0f92bd04c 100644 --- a/models/forgejo_migrations/v1_22/v11.go +++ b/models/forgejo_migrations/v1_22/v11.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "forgejo.org/modules/timeutil" diff --git a/models/forgejo_migrations/v1_22/v12.go b/models/forgejo_migrations/v1_22/v12.go index 6822524705..51354bd3c2 100644 --- a/models/forgejo_migrations/v1_22/v12.go +++ b/models/forgejo_migrations/v1_22/v12.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v1_22/v4.go b/models/forgejo_migrations/v1_22/v4.go index f1195f5f66..499d377bb4 100644 --- a/models/forgejo_migrations/v1_22/v4.go +++ b/models/forgejo_migrations/v1_22/v4.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "xorm.io/xorm" diff --git a/models/forgejo_migrations/v1_22/v5.go b/models/forgejo_migrations/v1_22/v5.go index 55f9fe1338..1671d3eed2 100644 --- a/models/forgejo_migrations/v1_22/v5.go +++ b/models/forgejo_migrations/v1_22/v5.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors c/o Codeberg e.V.. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "xorm.io/xorm" diff --git a/models/forgejo_migrations/v1_22/v6.go b/models/forgejo_migrations/v1_22/v6.go index 1a4874872c..072f8e6a15 100644 --- a/models/forgejo_migrations/v1_22/v6.go +++ b/models/forgejo_migrations/v1_22/v6.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors c/o Codeberg e.V.. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "xorm.io/xorm" diff --git a/models/forgejo_migrations/v1_22/v7.go b/models/forgejo_migrations/v1_22/v7.go index b42dd1af67..e7f6eb412b 100644 --- a/models/forgejo_migrations/v1_22/v7.go +++ b/models/forgejo_migrations/v1_22/v7.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "xorm.io/xorm" diff --git a/models/forgejo_migrations/v1_22/v8.go b/models/forgejo_migrations/v1_22/v8.go index 2d3c0c594b..f23b00d2ad 100644 --- a/models/forgejo_migrations/v1_22/v8.go +++ b/models/forgejo_migrations/v1_22/v8.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "strings" diff --git a/models/forgejo_migrations/v1_22/v8_test.go b/models/forgejo_migrations/v1_22/v8_test.go index baaba7290f..5117dd2dfb 100644 --- a/models/forgejo_migrations/v1_22/v8_test.go +++ b/models/forgejo_migrations/v1_22/v8_test.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "testing" diff --git a/models/forgejo_migrations/v1_22/v9.go b/models/forgejo_migrations/v1_22/v9.go index 34c2844c39..e3cdea97f2 100644 --- a/models/forgejo_migrations/v1_22/v9.go +++ b/models/forgejo_migrations/v1_22/v9.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v20.go b/models/forgejo_migrations/v20.go index 8ca9e91f73..91c7b8e911 100644 --- a/models/forgejo_migrations/v20.go +++ b/models/forgejo_migrations/v20.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations //nolint:revive +package forgejo_migrations import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v21.go b/models/forgejo_migrations/v21.go index 53f141b2ab..61d7950c5a 100644 --- a/models/forgejo_migrations/v21.go +++ b/models/forgejo_migrations/v21.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations //nolint:revive +package forgejo_migrations import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v22.go b/models/forgejo_migrations/v22.go index eeb738799c..8078591da6 100644 --- a/models/forgejo_migrations/v22.go +++ b/models/forgejo_migrations/v22.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations //nolint:revive +package forgejo_migrations import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v23.go b/models/forgejo_migrations/v23.go index 20a916a716..a79a4f3d6e 100644 --- a/models/forgejo_migrations/v23.go +++ b/models/forgejo_migrations/v23.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations //nolint:revive +package forgejo_migrations import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v24.go b/models/forgejo_migrations/v24.go index ebfb5fc1c4..084a57e1ce 100644 --- a/models/forgejo_migrations/v24.go +++ b/models/forgejo_migrations/v24.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations //nolint:revive +package forgejo_migrations import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v25.go b/models/forgejo_migrations/v25.go index 8e3032a40c..56cde499a3 100644 --- a/models/forgejo_migrations/v25.go +++ b/models/forgejo_migrations/v25.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations //nolint:revive +package forgejo_migrations import ( "context" diff --git a/models/forgejo_migrations/v25_test.go b/models/forgejo_migrations/v25_test.go index e7402fd021..68e71da012 100644 --- a/models/forgejo_migrations/v25_test.go +++ b/models/forgejo_migrations/v25_test.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations //nolint:revive +package forgejo_migrations import ( "testing" diff --git a/models/forgejo_migrations/v26.go b/models/forgejo_migrations/v26.go index 3292d93ffd..a0c47799c2 100644 --- a/models/forgejo_migrations/v26.go +++ b/models/forgejo_migrations/v26.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations //nolint:revive +package forgejo_migrations import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v27.go b/models/forgejo_migrations/v27.go index 2efa3485a8..9cfbc64370 100644 --- a/models/forgejo_migrations/v27.go +++ b/models/forgejo_migrations/v27.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations //nolint:revive +package forgejo_migrations import ( "forgejo.org/modules/timeutil" diff --git a/models/forgejo_migrations/v28.go b/models/forgejo_migrations/v28.go index cba888d2ec..19f0dcd862 100644 --- a/models/forgejo_migrations/v28.go +++ b/models/forgejo_migrations/v28.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations //nolint:revive +package forgejo_migrations import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v29.go b/models/forgejo_migrations/v29.go index d0c2f723ae..92eb05e8b3 100644 --- a/models/forgejo_migrations/v29.go +++ b/models/forgejo_migrations/v29.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations //nolint:revive +package forgejo_migrations import ( "database/sql" diff --git a/models/forgejo_migrations/v30.go b/models/forgejo_migrations/v30.go index 6c41a55316..05a1dff898 100644 --- a/models/forgejo_migrations/v30.go +++ b/models/forgejo_migrations/v30.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations //nolint:revive +package forgejo_migrations import ( "time" diff --git a/models/forgejo_migrations/v30_test.go b/models/forgejo_migrations/v30_test.go index f826dab815..152fddeb47 100644 --- a/models/forgejo_migrations/v30_test.go +++ b/models/forgejo_migrations/v30_test.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations //nolint:revive +package forgejo_migrations import ( "testing" diff --git a/models/forgejo_migrations/v31.go b/models/forgejo_migrations/v31.go index fdcab21b1a..23397c7c13 100644 --- a/models/forgejo_migrations/v31.go +++ b/models/forgejo_migrations/v31.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations //nolint:revive +package forgejo_migrations import ( "xorm.io/xorm" diff --git a/models/forgejo_migrations/v31_test.go b/models/forgejo_migrations/v31_test.go index 5b4aac2a60..6d1690aae0 100644 --- a/models/forgejo_migrations/v31_test.go +++ b/models/forgejo_migrations/v31_test.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations //nolint:revive +package forgejo_migrations import ( "testing" diff --git a/models/forgejo_migrations/v32.go b/models/forgejo_migrations/v32.go index bed335ab6b..81b22c585c 100644 --- a/models/forgejo_migrations/v32.go +++ b/models/forgejo_migrations/v32.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations //nolint:revive +package forgejo_migrations import ( "encoding/xml" diff --git a/models/forgejo_migrations/v32_test.go b/models/forgejo_migrations/v32_test.go index cd33de2608..24cda891bc 100644 --- a/models/forgejo_migrations/v32_test.go +++ b/models/forgejo_migrations/v32_test.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations //nolint:revive +package forgejo_migrations import ( "bytes" diff --git a/models/forgejo_migrations/v33.go b/models/forgejo_migrations/v33.go index 272035fc23..b9ea8efe47 100644 --- a/models/forgejo_migrations/v33.go +++ b/models/forgejo_migrations/v33.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT -package forgejo_migrations //nolint:revive +package forgejo_migrations import ( "fmt" diff --git a/models/forgejo_migrations/v33_test.go b/models/forgejo_migrations/v33_test.go index 664c704bbc..1d3298da15 100644 --- a/models/forgejo_migrations/v33_test.go +++ b/models/forgejo_migrations/v33_test.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations //nolint:revive +package forgejo_migrations import ( "testing" diff --git a/models/forgejo_migrations/v34.go b/models/forgejo_migrations/v34.go index 9e958b934f..d193d799e7 100644 --- a/models/forgejo_migrations/v34.go +++ b/models/forgejo_migrations/v34.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations //nolint:revive +package forgejo_migrations import "xorm.io/xorm" diff --git a/models/forgejo_migrations/v35.go b/models/forgejo_migrations/v35.go index ca412d7951..9b389fcc12 100644 --- a/models/forgejo_migrations/v35.go +++ b/models/forgejo_migrations/v35.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: GPL-3.0-or-later -package forgejo_migrations //nolint:revive +package forgejo_migrations import ( "xorm.io/xorm" diff --git a/models/migrations/v1_10/v100.go b/models/migrations/v1_10/v100.go index 5d2fd8e244..1742bea296 100644 --- a/models/migrations/v1_10/v100.go +++ b/models/migrations/v1_10/v100.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_10 //nolint +package v1_10 import ( "net/url" diff --git a/models/migrations/v1_10/v101.go b/models/migrations/v1_10/v101.go index f023a2a0e7..6c8dfe2486 100644 --- a/models/migrations/v1_10/v101.go +++ b/models/migrations/v1_10/v101.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_10 //nolint +package v1_10 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_10/v88.go b/models/migrations/v1_10/v88.go index 7e86ac364f..eb8e81c19e 100644 --- a/models/migrations/v1_10/v88.go +++ b/models/migrations/v1_10/v88.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_10 //nolint +package v1_10 import ( "crypto/sha1" diff --git a/models/migrations/v1_10/v89.go b/models/migrations/v1_10/v89.go index d5f27ffdc6..0df2a6e17b 100644 --- a/models/migrations/v1_10/v89.go +++ b/models/migrations/v1_10/v89.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_10 //nolint +package v1_10 import "xorm.io/xorm" diff --git a/models/migrations/v1_10/v90.go b/models/migrations/v1_10/v90.go index 295d4b1c1b..5521a97e32 100644 --- a/models/migrations/v1_10/v90.go +++ b/models/migrations/v1_10/v90.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_10 //nolint +package v1_10 import "xorm.io/xorm" diff --git a/models/migrations/v1_10/v91.go b/models/migrations/v1_10/v91.go index 48cac2de70..08db6c2742 100644 --- a/models/migrations/v1_10/v91.go +++ b/models/migrations/v1_10/v91.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_10 //nolint +package v1_10 import "xorm.io/xorm" diff --git a/models/migrations/v1_10/v92.go b/models/migrations/v1_10/v92.go index 9080108594..b6c04a9234 100644 --- a/models/migrations/v1_10/v92.go +++ b/models/migrations/v1_10/v92.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_10 //nolint +package v1_10 import ( "xorm.io/builder" diff --git a/models/migrations/v1_10/v93.go b/models/migrations/v1_10/v93.go index ee59a8db39..c131be9a8d 100644 --- a/models/migrations/v1_10/v93.go +++ b/models/migrations/v1_10/v93.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_10 //nolint +package v1_10 import "xorm.io/xorm" diff --git a/models/migrations/v1_10/v94.go b/models/migrations/v1_10/v94.go index c131af162b..13b7d7b303 100644 --- a/models/migrations/v1_10/v94.go +++ b/models/migrations/v1_10/v94.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_10 //nolint +package v1_10 import "xorm.io/xorm" diff --git a/models/migrations/v1_10/v95.go b/models/migrations/v1_10/v95.go index 3b1f67fd9c..86b52026bf 100644 --- a/models/migrations/v1_10/v95.go +++ b/models/migrations/v1_10/v95.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_10 //nolint +package v1_10 import "xorm.io/xorm" diff --git a/models/migrations/v1_10/v96.go b/models/migrations/v1_10/v96.go index 3bfb770f24..bcbd618b49 100644 --- a/models/migrations/v1_10/v96.go +++ b/models/migrations/v1_10/v96.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_10 //nolint +package v1_10 import ( "path/filepath" diff --git a/models/migrations/v1_10/v97.go b/models/migrations/v1_10/v97.go index dee45b32e3..5872bb63e5 100644 --- a/models/migrations/v1_10/v97.go +++ b/models/migrations/v1_10/v97.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_10 //nolint +package v1_10 import "xorm.io/xorm" diff --git a/models/migrations/v1_10/v98.go b/models/migrations/v1_10/v98.go index bdd9aed089..d21c326459 100644 --- a/models/migrations/v1_10/v98.go +++ b/models/migrations/v1_10/v98.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_10 //nolint +package v1_10 import "xorm.io/xorm" diff --git a/models/migrations/v1_10/v99.go b/models/migrations/v1_10/v99.go index 7f287b77aa..addae66be9 100644 --- a/models/migrations/v1_10/v99.go +++ b/models/migrations/v1_10/v99.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_10 //nolint +package v1_10 import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_11/v102.go b/models/migrations/v1_11/v102.go index a585d9c423..15f0c83c36 100644 --- a/models/migrations/v1_11/v102.go +++ b/models/migrations/v1_11/v102.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_11 //nolint +package v1_11 import ( "forgejo.org/models/migrations/base" diff --git a/models/migrations/v1_11/v103.go b/models/migrations/v1_11/v103.go index 53527dac58..a515710160 100644 --- a/models/migrations/v1_11/v103.go +++ b/models/migrations/v1_11/v103.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_11 //nolint +package v1_11 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_11/v104.go b/models/migrations/v1_11/v104.go index af3578ca4a..7461f0cda3 100644 --- a/models/migrations/v1_11/v104.go +++ b/models/migrations/v1_11/v104.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_11 //nolint +package v1_11 import ( "forgejo.org/models/migrations/base" diff --git a/models/migrations/v1_11/v105.go b/models/migrations/v1_11/v105.go index b91340c30a..d86973a0f6 100644 --- a/models/migrations/v1_11/v105.go +++ b/models/migrations/v1_11/v105.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_11 //nolint +package v1_11 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_11/v106.go b/models/migrations/v1_11/v106.go index ecb11cdd1e..edffe18683 100644 --- a/models/migrations/v1_11/v106.go +++ b/models/migrations/v1_11/v106.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_11 //nolint +package v1_11 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_11/v107.go b/models/migrations/v1_11/v107.go index f0bfe5862c..a158e3bb50 100644 --- a/models/migrations/v1_11/v107.go +++ b/models/migrations/v1_11/v107.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_11 //nolint +package v1_11 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_11/v108.go b/models/migrations/v1_11/v108.go index a85096234d..8f14504ceb 100644 --- a/models/migrations/v1_11/v108.go +++ b/models/migrations/v1_11/v108.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_11 //nolint +package v1_11 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_11/v109.go b/models/migrations/v1_11/v109.go index ea565ccda3..f7616aec7b 100644 --- a/models/migrations/v1_11/v109.go +++ b/models/migrations/v1_11/v109.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_11 //nolint +package v1_11 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_11/v110.go b/models/migrations/v1_11/v110.go index fce9be847e..e94a738f67 100644 --- a/models/migrations/v1_11/v110.go +++ b/models/migrations/v1_11/v110.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_11 //nolint +package v1_11 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_11/v111.go b/models/migrations/v1_11/v111.go index cc3dc0d545..6f531e4858 100644 --- a/models/migrations/v1_11/v111.go +++ b/models/migrations/v1_11/v111.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_11 //nolint +package v1_11 import ( "fmt" diff --git a/models/migrations/v1_11/v112.go b/models/migrations/v1_11/v112.go index 6112ab51a5..22054e6f68 100644 --- a/models/migrations/v1_11/v112.go +++ b/models/migrations/v1_11/v112.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_11 //nolint +package v1_11 import ( "fmt" diff --git a/models/migrations/v1_11/v113.go b/models/migrations/v1_11/v113.go index dea344a44f..a4d54f66fb 100644 --- a/models/migrations/v1_11/v113.go +++ b/models/migrations/v1_11/v113.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_11 //nolint +package v1_11 import ( "fmt" diff --git a/models/migrations/v1_11/v114.go b/models/migrations/v1_11/v114.go index 95adcee989..9467a8a90c 100644 --- a/models/migrations/v1_11/v114.go +++ b/models/migrations/v1_11/v114.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_11 //nolint +package v1_11 import ( "net/url" diff --git a/models/migrations/v1_11/v115.go b/models/migrations/v1_11/v115.go index 3d4b41017b..65094df93d 100644 --- a/models/migrations/v1_11/v115.go +++ b/models/migrations/v1_11/v115.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_11 //nolint +package v1_11 import ( "crypto/md5" diff --git a/models/migrations/v1_11/v116.go b/models/migrations/v1_11/v116.go index 85aa76c1e0..729fbad18b 100644 --- a/models/migrations/v1_11/v116.go +++ b/models/migrations/v1_11/v116.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_11 //nolint +package v1_11 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_12/v117.go b/models/migrations/v1_12/v117.go index 8eadcdef2b..73b58ca34b 100644 --- a/models/migrations/v1_12/v117.go +++ b/models/migrations/v1_12/v117.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_12 //nolint +package v1_12 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_12/v118.go b/models/migrations/v1_12/v118.go index eb022dc5e4..e8b4249743 100644 --- a/models/migrations/v1_12/v118.go +++ b/models/migrations/v1_12/v118.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_12 //nolint +package v1_12 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_12/v119.go b/models/migrations/v1_12/v119.go index 60bfe6a57d..b4bf29a935 100644 --- a/models/migrations/v1_12/v119.go +++ b/models/migrations/v1_12/v119.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_12 //nolint +package v1_12 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_12/v120.go b/models/migrations/v1_12/v120.go index 3f7ed8d373..14d515f5a7 100644 --- a/models/migrations/v1_12/v120.go +++ b/models/migrations/v1_12/v120.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_12 //nolint +package v1_12 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_12/v121.go b/models/migrations/v1_12/v121.go index 175ec9164d..a28ae4e1c9 100644 --- a/models/migrations/v1_12/v121.go +++ b/models/migrations/v1_12/v121.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_12 //nolint +package v1_12 import "xorm.io/xorm" diff --git a/models/migrations/v1_12/v122.go b/models/migrations/v1_12/v122.go index 6e31d863a1..bc1b175f6a 100644 --- a/models/migrations/v1_12/v122.go +++ b/models/migrations/v1_12/v122.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_12 //nolint +package v1_12 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_12/v123.go b/models/migrations/v1_12/v123.go index b0c3af07a3..52b10bb850 100644 --- a/models/migrations/v1_12/v123.go +++ b/models/migrations/v1_12/v123.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_12 //nolint +package v1_12 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_12/v124.go b/models/migrations/v1_12/v124.go index d2ba03ffe0..9a93f436d4 100644 --- a/models/migrations/v1_12/v124.go +++ b/models/migrations/v1_12/v124.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_12 //nolint +package v1_12 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_12/v125.go b/models/migrations/v1_12/v125.go index ec4ffaab25..7f582ecff5 100644 --- a/models/migrations/v1_12/v125.go +++ b/models/migrations/v1_12/v125.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_12 //nolint +package v1_12 import ( "fmt" diff --git a/models/migrations/v1_12/v126.go b/models/migrations/v1_12/v126.go index ca9ec3aa3f..64fd7f7478 100644 --- a/models/migrations/v1_12/v126.go +++ b/models/migrations/v1_12/v126.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_12 //nolint +package v1_12 import ( "xorm.io/builder" diff --git a/models/migrations/v1_12/v127.go b/models/migrations/v1_12/v127.go index 11a4042973..f686fa617c 100644 --- a/models/migrations/v1_12/v127.go +++ b/models/migrations/v1_12/v127.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_12 //nolint +package v1_12 import ( "fmt" diff --git a/models/migrations/v1_12/v128.go b/models/migrations/v1_12/v128.go index 6d7307f470..8fca974616 100644 --- a/models/migrations/v1_12/v128.go +++ b/models/migrations/v1_12/v128.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_12 //nolint +package v1_12 import ( "fmt" diff --git a/models/migrations/v1_12/v129.go b/models/migrations/v1_12/v129.go index cf228242b9..3e4d3aca68 100644 --- a/models/migrations/v1_12/v129.go +++ b/models/migrations/v1_12/v129.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_12 //nolint +package v1_12 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_12/v130.go b/models/migrations/v1_12/v130.go index bfa856796a..383ef47492 100644 --- a/models/migrations/v1_12/v130.go +++ b/models/migrations/v1_12/v130.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_12 //nolint +package v1_12 import ( "forgejo.org/modules/json" diff --git a/models/migrations/v1_12/v131.go b/models/migrations/v1_12/v131.go index 5184bc3590..1266c2f185 100644 --- a/models/migrations/v1_12/v131.go +++ b/models/migrations/v1_12/v131.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_12 //nolint +package v1_12 import ( "fmt" diff --git a/models/migrations/v1_12/v132.go b/models/migrations/v1_12/v132.go index 3b2b28f7ab..8b1ae6db93 100644 --- a/models/migrations/v1_12/v132.go +++ b/models/migrations/v1_12/v132.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_12 //nolint +package v1_12 import ( "fmt" diff --git a/models/migrations/v1_12/v133.go b/models/migrations/v1_12/v133.go index c9087fc8c1..69e20597d8 100644 --- a/models/migrations/v1_12/v133.go +++ b/models/migrations/v1_12/v133.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_12 //nolint +package v1_12 import "xorm.io/xorm" diff --git a/models/migrations/v1_12/v134.go b/models/migrations/v1_12/v134.go index bba996fd40..1fabdcae96 100644 --- a/models/migrations/v1_12/v134.go +++ b/models/migrations/v1_12/v134.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_12 //nolint +package v1_12 import ( "fmt" diff --git a/models/migrations/v1_12/v135.go b/models/migrations/v1_12/v135.go index 8898011df5..5df0ad7fc4 100644 --- a/models/migrations/v1_12/v135.go +++ b/models/migrations/v1_12/v135.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_12 //nolint +package v1_12 import ( "fmt" diff --git a/models/migrations/v1_12/v136.go b/models/migrations/v1_12/v136.go index e2557ae002..7d246a82be 100644 --- a/models/migrations/v1_12/v136.go +++ b/models/migrations/v1_12/v136.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_12 //nolint +package v1_12 import ( "fmt" diff --git a/models/migrations/v1_12/v137.go b/models/migrations/v1_12/v137.go index 0d86b72010..9d38483488 100644 --- a/models/migrations/v1_12/v137.go +++ b/models/migrations/v1_12/v137.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_12 //nolint +package v1_12 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_12/v138.go b/models/migrations/v1_12/v138.go index 8c8d353f40..4485adeb2d 100644 --- a/models/migrations/v1_12/v138.go +++ b/models/migrations/v1_12/v138.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_12 //nolint +package v1_12 import ( "fmt" diff --git a/models/migrations/v1_12/v139.go b/models/migrations/v1_12/v139.go index cd7963524e..51e57b984a 100644 --- a/models/migrations/v1_12/v139.go +++ b/models/migrations/v1_12/v139.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_12 //nolint +package v1_12 import ( "forgejo.org/modules/setting" diff --git a/models/migrations/v1_13/v140.go b/models/migrations/v1_13/v140.go index d74f808e9f..5bb612c098 100644 --- a/models/migrations/v1_13/v140.go +++ b/models/migrations/v1_13/v140.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_13 //nolint +package v1_13 import ( "fmt" diff --git a/models/migrations/v1_13/v141.go b/models/migrations/v1_13/v141.go index ae211e0e44..b54bc1727c 100644 --- a/models/migrations/v1_13/v141.go +++ b/models/migrations/v1_13/v141.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_13 //nolint +package v1_13 import ( "fmt" diff --git a/models/migrations/v1_13/v142.go b/models/migrations/v1_13/v142.go index 7490e0f3b4..8939f6f2f8 100644 --- a/models/migrations/v1_13/v142.go +++ b/models/migrations/v1_13/v142.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_13 //nolint +package v1_13 import ( "forgejo.org/modules/log" diff --git a/models/migrations/v1_13/v143.go b/models/migrations/v1_13/v143.go index 1f9120e2ba..6a8da8b06d 100644 --- a/models/migrations/v1_13/v143.go +++ b/models/migrations/v1_13/v143.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_13 //nolint +package v1_13 import ( "forgejo.org/modules/log" diff --git a/models/migrations/v1_13/v144.go b/models/migrations/v1_13/v144.go index 7e801eab8a..f138338514 100644 --- a/models/migrations/v1_13/v144.go +++ b/models/migrations/v1_13/v144.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_13 //nolint +package v1_13 import ( "forgejo.org/modules/log" diff --git a/models/migrations/v1_13/v145.go b/models/migrations/v1_13/v145.go index a01f577ed1..f7d3895c84 100644 --- a/models/migrations/v1_13/v145.go +++ b/models/migrations/v1_13/v145.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_13 //nolint +package v1_13 import ( "fmt" diff --git a/models/migrations/v1_13/v146.go b/models/migrations/v1_13/v146.go index a1b54ee3aa..e6a476a288 100644 --- a/models/migrations/v1_13/v146.go +++ b/models/migrations/v1_13/v146.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_13 //nolint +package v1_13 import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_13/v147.go b/models/migrations/v1_13/v147.go index cc57504c74..831ef5842a 100644 --- a/models/migrations/v1_13/v147.go +++ b/models/migrations/v1_13/v147.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_13 //nolint +package v1_13 import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_13/v148.go b/models/migrations/v1_13/v148.go index 7bb8ab700b..d276db3d61 100644 --- a/models/migrations/v1_13/v148.go +++ b/models/migrations/v1_13/v148.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_13 //nolint +package v1_13 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_13/v149.go b/models/migrations/v1_13/v149.go index 3a0c5909d5..c1bfe8b09e 100644 --- a/models/migrations/v1_13/v149.go +++ b/models/migrations/v1_13/v149.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_13 //nolint +package v1_13 import ( "fmt" diff --git a/models/migrations/v1_13/v150.go b/models/migrations/v1_13/v150.go index be14fd130c..471a531024 100644 --- a/models/migrations/v1_13/v150.go +++ b/models/migrations/v1_13/v150.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_13 //nolint +package v1_13 import ( "forgejo.org/models/migrations/base" diff --git a/models/migrations/v1_13/v151.go b/models/migrations/v1_13/v151.go index ff584fff67..691b86062d 100644 --- a/models/migrations/v1_13/v151.go +++ b/models/migrations/v1_13/v151.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_13 //nolint +package v1_13 import ( "context" diff --git a/models/migrations/v1_13/v152.go b/models/migrations/v1_13/v152.go index 502c82a40d..648e26446f 100644 --- a/models/migrations/v1_13/v152.go +++ b/models/migrations/v1_13/v152.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_13 //nolint +package v1_13 import "xorm.io/xorm" diff --git a/models/migrations/v1_13/v153.go b/models/migrations/v1_13/v153.go index 0b2dd3eb62..e5462fc162 100644 --- a/models/migrations/v1_13/v153.go +++ b/models/migrations/v1_13/v153.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_13 //nolint +package v1_13 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_13/v154.go b/models/migrations/v1_13/v154.go index cf31190781..89dc7821b2 100644 --- a/models/migrations/v1_13/v154.go +++ b/models/migrations/v1_13/v154.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_13 //nolint +package v1_13 import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_14/main_test.go b/models/migrations/v1_14/main_test.go index c01faedc35..57cf995be1 100644 --- a/models/migrations/v1_14/main_test.go +++ b/models/migrations/v1_14/main_test.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "testing" diff --git a/models/migrations/v1_14/v155.go b/models/migrations/v1_14/v155.go index e814f59938..505a9ae033 100644 --- a/models/migrations/v1_14/v155.go +++ b/models/migrations/v1_14/v155.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "fmt" diff --git a/models/migrations/v1_14/v156.go b/models/migrations/v1_14/v156.go index b6dc91a054..7bbd9f4c85 100644 --- a/models/migrations/v1_14/v156.go +++ b/models/migrations/v1_14/v156.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "fmt" diff --git a/models/migrations/v1_14/v157.go b/models/migrations/v1_14/v157.go index 7187278d29..ba69f71130 100644 --- a/models/migrations/v1_14/v157.go +++ b/models/migrations/v1_14/v157.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_14/v158.go b/models/migrations/v1_14/v158.go index 3fa27cfecd..2ab3c8a1f0 100644 --- a/models/migrations/v1_14/v158.go +++ b/models/migrations/v1_14/v158.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "errors" diff --git a/models/migrations/v1_14/v159.go b/models/migrations/v1_14/v159.go index fdd7e12449..4e921ea1c6 100644 --- a/models/migrations/v1_14/v159.go +++ b/models/migrations/v1_14/v159.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "forgejo.org/models/migrations/base" diff --git a/models/migrations/v1_14/v160.go b/models/migrations/v1_14/v160.go index 4dea91b514..73f3798954 100644 --- a/models/migrations/v1_14/v160.go +++ b/models/migrations/v1_14/v160.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_14/v161.go b/models/migrations/v1_14/v161.go index 6e904cfab6..9c850ad0c2 100644 --- a/models/migrations/v1_14/v161.go +++ b/models/migrations/v1_14/v161.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "context" diff --git a/models/migrations/v1_14/v162.go b/models/migrations/v1_14/v162.go index 5d6d7c2e3f..ead63f16f4 100644 --- a/models/migrations/v1_14/v162.go +++ b/models/migrations/v1_14/v162.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "forgejo.org/models/migrations/base" diff --git a/models/migrations/v1_14/v163.go b/models/migrations/v1_14/v163.go index 60fc98c0a4..06ac36cbc7 100644 --- a/models/migrations/v1_14/v163.go +++ b/models/migrations/v1_14/v163.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "forgejo.org/models/migrations/base" diff --git a/models/migrations/v1_14/v164.go b/models/migrations/v1_14/v164.go index 54f6951427..d2fd9b8464 100644 --- a/models/migrations/v1_14/v164.go +++ b/models/migrations/v1_14/v164.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "fmt" diff --git a/models/migrations/v1_14/v165.go b/models/migrations/v1_14/v165.go index 9315e44197..90fd2b1e46 100644 --- a/models/migrations/v1_14/v165.go +++ b/models/migrations/v1_14/v165.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "forgejo.org/models/migrations/base" diff --git a/models/migrations/v1_14/v166.go b/models/migrations/v1_14/v166.go index e5731582fd..4c106bd7da 100644 --- a/models/migrations/v1_14/v166.go +++ b/models/migrations/v1_14/v166.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "crypto/sha256" diff --git a/models/migrations/v1_14/v167.go b/models/migrations/v1_14/v167.go index 9d416f6a32..d77bbc401e 100644 --- a/models/migrations/v1_14/v167.go +++ b/models/migrations/v1_14/v167.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "fmt" diff --git a/models/migrations/v1_14/v168.go b/models/migrations/v1_14/v168.go index a30a8859f7..aa93eec19b 100644 --- a/models/migrations/v1_14/v168.go +++ b/models/migrations/v1_14/v168.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import "xorm.io/xorm" diff --git a/models/migrations/v1_14/v169.go b/models/migrations/v1_14/v169.go index 5b81bb58b1..4f9df0d96f 100644 --- a/models/migrations/v1_14/v169.go +++ b/models/migrations/v1_14/v169.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_14/v170.go b/models/migrations/v1_14/v170.go index 7b6498a3e9..a2ff4623e1 100644 --- a/models/migrations/v1_14/v170.go +++ b/models/migrations/v1_14/v170.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "fmt" diff --git a/models/migrations/v1_14/v171.go b/models/migrations/v1_14/v171.go index 51a35a02ad..7b200e960a 100644 --- a/models/migrations/v1_14/v171.go +++ b/models/migrations/v1_14/v171.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "fmt" diff --git a/models/migrations/v1_14/v172.go b/models/migrations/v1_14/v172.go index d49b70f5ad..c410d393f1 100644 --- a/models/migrations/v1_14/v172.go +++ b/models/migrations/v1_14/v172.go @@ -1,7 +1,7 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_14/v173.go b/models/migrations/v1_14/v173.go index 2d9eee9197..7752fbe966 100644 --- a/models/migrations/v1_14/v173.go +++ b/models/migrations/v1_14/v173.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "fmt" diff --git a/models/migrations/v1_14/v174.go b/models/migrations/v1_14/v174.go index c839e15db8..4049e43070 100644 --- a/models/migrations/v1_14/v174.go +++ b/models/migrations/v1_14/v174.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "fmt" diff --git a/models/migrations/v1_14/v175.go b/models/migrations/v1_14/v175.go index 3cda5772a0..49fa17d046 100644 --- a/models/migrations/v1_14/v175.go +++ b/models/migrations/v1_14/v175.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "fmt" diff --git a/models/migrations/v1_14/v176.go b/models/migrations/v1_14/v176.go index 1ed49f75fa..ef5dce9a02 100644 --- a/models/migrations/v1_14/v176.go +++ b/models/migrations/v1_14/v176.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_14/v176_test.go b/models/migrations/v1_14/v176_test.go index d88ff207e7..d56b3e0470 100644 --- a/models/migrations/v1_14/v176_test.go +++ b/models/migrations/v1_14/v176_test.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "testing" diff --git a/models/migrations/v1_14/v177.go b/models/migrations/v1_14/v177.go index 6e1838f369..96676bf8d9 100644 --- a/models/migrations/v1_14/v177.go +++ b/models/migrations/v1_14/v177.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "fmt" diff --git a/models/migrations/v1_14/v177_test.go b/models/migrations/v1_14/v177_test.go index bffc6f92e3..0e0a67fd33 100644 --- a/models/migrations/v1_14/v177_test.go +++ b/models/migrations/v1_14/v177_test.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_14 //nolint +package v1_14 import ( "testing" diff --git a/models/migrations/v1_15/main_test.go b/models/migrations/v1_15/main_test.go index 6c04d3f5ee..4cf6d6f695 100644 --- a/models/migrations/v1_15/main_test.go +++ b/models/migrations/v1_15/main_test.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_15 //nolint +package v1_15 import ( "testing" diff --git a/models/migrations/v1_15/v178.go b/models/migrations/v1_15/v178.go index 6d236eb049..ca3a5c262e 100644 --- a/models/migrations/v1_15/v178.go +++ b/models/migrations/v1_15/v178.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_15 //nolint +package v1_15 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_15/v179.go b/models/migrations/v1_15/v179.go index b990583303..ce514cc4a9 100644 --- a/models/migrations/v1_15/v179.go +++ b/models/migrations/v1_15/v179.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_15 //nolint +package v1_15 import ( "forgejo.org/models/migrations/base" diff --git a/models/migrations/v1_15/v180.go b/models/migrations/v1_15/v180.go index 02fbd57cdb..0b68c3ceb7 100644 --- a/models/migrations/v1_15/v180.go +++ b/models/migrations/v1_15/v180.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_15 //nolint +package v1_15 import ( "forgejo.org/modules/json" diff --git a/models/migrations/v1_15/v181.go b/models/migrations/v1_15/v181.go index 2185ed0213..fb1d3d7a75 100644 --- a/models/migrations/v1_15/v181.go +++ b/models/migrations/v1_15/v181.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_15 //nolint +package v1_15 import ( "strings" diff --git a/models/migrations/v1_15/v181_test.go b/models/migrations/v1_15/v181_test.go index 4154e0b1e9..8196f751e5 100644 --- a/models/migrations/v1_15/v181_test.go +++ b/models/migrations/v1_15/v181_test.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_15 //nolint +package v1_15 import ( "strings" diff --git a/models/migrations/v1_15/v182.go b/models/migrations/v1_15/v182.go index 9ca500c0f9..f53ff11df9 100644 --- a/models/migrations/v1_15/v182.go +++ b/models/migrations/v1_15/v182.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_15 //nolint +package v1_15 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_15/v182_test.go b/models/migrations/v1_15/v182_test.go index 6865cafac4..2baf90d06a 100644 --- a/models/migrations/v1_15/v182_test.go +++ b/models/migrations/v1_15/v182_test.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_15 //nolint +package v1_15 import ( "testing" diff --git a/models/migrations/v1_15/v183.go b/models/migrations/v1_15/v183.go index aaad64c220..5684e35699 100644 --- a/models/migrations/v1_15/v183.go +++ b/models/migrations/v1_15/v183.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_15 //nolint +package v1_15 import ( "fmt" diff --git a/models/migrations/v1_15/v184.go b/models/migrations/v1_15/v184.go index 41b64d4743..fbe0dcd780 100644 --- a/models/migrations/v1_15/v184.go +++ b/models/migrations/v1_15/v184.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_15 //nolint +package v1_15 import ( "context" diff --git a/models/migrations/v1_15/v185.go b/models/migrations/v1_15/v185.go index e5878ec193..60af59edca 100644 --- a/models/migrations/v1_15/v185.go +++ b/models/migrations/v1_15/v185.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_15 //nolint +package v1_15 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_15/v186.go b/models/migrations/v1_15/v186.go index ad75822de5..55d3199335 100644 --- a/models/migrations/v1_15/v186.go +++ b/models/migrations/v1_15/v186.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_15 //nolint +package v1_15 import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_15/v187.go b/models/migrations/v1_15/v187.go index b573fc52ef..fabef14779 100644 --- a/models/migrations/v1_15/v187.go +++ b/models/migrations/v1_15/v187.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_15 //nolint +package v1_15 import ( "forgejo.org/models/migrations/base" diff --git a/models/migrations/v1_15/v188.go b/models/migrations/v1_15/v188.go index 71e45cab0e..4494e6ff05 100644 --- a/models/migrations/v1_15/v188.go +++ b/models/migrations/v1_15/v188.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_15 //nolint +package v1_15 import "xorm.io/xorm" diff --git a/models/migrations/v1_16/main_test.go b/models/migrations/v1_16/main_test.go index 6f891f3e94..8c0a043be6 100644 --- a/models/migrations/v1_16/main_test.go +++ b/models/migrations/v1_16/main_test.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "testing" diff --git a/models/migrations/v1_16/v189.go b/models/migrations/v1_16/v189.go index 1ee72d9c39..19bfcb2423 100644 --- a/models/migrations/v1_16/v189.go +++ b/models/migrations/v1_16/v189.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "encoding/binary" diff --git a/models/migrations/v1_16/v189_test.go b/models/migrations/v1_16/v189_test.go index 90b721d5f1..9d74462a92 100644 --- a/models/migrations/v1_16/v189_test.go +++ b/models/migrations/v1_16/v189_test.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "testing" diff --git a/models/migrations/v1_16/v190.go b/models/migrations/v1_16/v190.go index 5953802849..1eb6b6ddb4 100644 --- a/models/migrations/v1_16/v190.go +++ b/models/migrations/v1_16/v190.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "fmt" diff --git a/models/migrations/v1_16/v191.go b/models/migrations/v1_16/v191.go index 567f88d6d1..427476b70b 100644 --- a/models/migrations/v1_16/v191.go +++ b/models/migrations/v1_16/v191.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "forgejo.org/modules/setting" diff --git a/models/migrations/v1_16/v192.go b/models/migrations/v1_16/v192.go index 731b9fb43a..31e8c36346 100644 --- a/models/migrations/v1_16/v192.go +++ b/models/migrations/v1_16/v192.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "forgejo.org/models/migrations/base" diff --git a/models/migrations/v1_16/v193.go b/models/migrations/v1_16/v193.go index 8d3ce7a558..a5af2de380 100644 --- a/models/migrations/v1_16/v193.go +++ b/models/migrations/v1_16/v193.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_16/v193_test.go b/models/migrations/v1_16/v193_test.go index 8260acf32d..bf8d8a7dc6 100644 --- a/models/migrations/v1_16/v193_test.go +++ b/models/migrations/v1_16/v193_test.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "testing" diff --git a/models/migrations/v1_16/v194.go b/models/migrations/v1_16/v194.go index 6aa13c50cf..2e4ed8340e 100644 --- a/models/migrations/v1_16/v194.go +++ b/models/migrations/v1_16/v194.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "fmt" diff --git a/models/migrations/v1_16/v195.go b/models/migrations/v1_16/v195.go index 6d7e94141e..4fd42b7bd2 100644 --- a/models/migrations/v1_16/v195.go +++ b/models/migrations/v1_16/v195.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "fmt" diff --git a/models/migrations/v1_16/v195_test.go b/models/migrations/v1_16/v195_test.go index 71234a6fb3..1fc7b51f3c 100644 --- a/models/migrations/v1_16/v195_test.go +++ b/models/migrations/v1_16/v195_test.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "testing" diff --git a/models/migrations/v1_16/v196.go b/models/migrations/v1_16/v196.go index 7cbafc61e5..6c9caa100f 100644 --- a/models/migrations/v1_16/v196.go +++ b/models/migrations/v1_16/v196.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "fmt" diff --git a/models/migrations/v1_16/v197.go b/models/migrations/v1_16/v197.go index 97888b2847..862bdfdcbd 100644 --- a/models/migrations/v1_16/v197.go +++ b/models/migrations/v1_16/v197.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_16/v198.go b/models/migrations/v1_16/v198.go index 8b3c73addc..5d3043eb46 100644 --- a/models/migrations/v1_16/v198.go +++ b/models/migrations/v1_16/v198.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "fmt" diff --git a/models/migrations/v1_16/v199.go b/models/migrations/v1_16/v199.go index 6adcf890af..4020352f2b 100644 --- a/models/migrations/v1_16/v199.go +++ b/models/migrations/v1_16/v199.go @@ -1,6 +1,6 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 // We used to use a table `remote_version` to store information for updater, now we use `AppState`, so this migration task is a no-op now. diff --git a/models/migrations/v1_16/v200.go b/models/migrations/v1_16/v200.go index c08c20e51d..de57fad8fe 100644 --- a/models/migrations/v1_16/v200.go +++ b/models/migrations/v1_16/v200.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "fmt" diff --git a/models/migrations/v1_16/v201.go b/models/migrations/v1_16/v201.go index 35e0c9f2fb..2c43698b0c 100644 --- a/models/migrations/v1_16/v201.go +++ b/models/migrations/v1_16/v201.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_16/v202.go b/models/migrations/v1_16/v202.go index 6ba36152f1..d8c8fdcadc 100644 --- a/models/migrations/v1_16/v202.go +++ b/models/migrations/v1_16/v202.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "fmt" diff --git a/models/migrations/v1_16/v203.go b/models/migrations/v1_16/v203.go index e8e6b52453..c3241cba57 100644 --- a/models/migrations/v1_16/v203.go +++ b/models/migrations/v1_16/v203.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_16/v204.go b/models/migrations/v1_16/v204.go index ece03e1305..4d375307e7 100644 --- a/models/migrations/v1_16/v204.go +++ b/models/migrations/v1_16/v204.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import "xorm.io/xorm" diff --git a/models/migrations/v1_16/v205.go b/models/migrations/v1_16/v205.go index a064b9830d..cb452dfd7f 100644 --- a/models/migrations/v1_16/v205.go +++ b/models/migrations/v1_16/v205.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "forgejo.org/models/migrations/base" diff --git a/models/migrations/v1_16/v206.go b/models/migrations/v1_16/v206.go index 581a7d76e9..01a9c386eb 100644 --- a/models/migrations/v1_16/v206.go +++ b/models/migrations/v1_16/v206.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "fmt" diff --git a/models/migrations/v1_16/v207.go b/models/migrations/v1_16/v207.go index 91208f066c..19126ead1f 100644 --- a/models/migrations/v1_16/v207.go +++ b/models/migrations/v1_16/v207.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_16/v208.go b/models/migrations/v1_16/v208.go index 1a11ef096a..fb643324f4 100644 --- a/models/migrations/v1_16/v208.go +++ b/models/migrations/v1_16/v208.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_16/v209.go b/models/migrations/v1_16/v209.go index be3100e02a..230838647b 100644 --- a/models/migrations/v1_16/v209.go +++ b/models/migrations/v1_16/v209.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_16/v210.go b/models/migrations/v1_16/v210.go index 375a008e18..f48ab11db6 100644 --- a/models/migrations/v1_16/v210.go +++ b/models/migrations/v1_16/v210.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "crypto/ecdh" diff --git a/models/migrations/v1_16/v210_test.go b/models/migrations/v1_16/v210_test.go index f6423a5821..8454920aa0 100644 --- a/models/migrations/v1_16/v210_test.go +++ b/models/migrations/v1_16/v210_test.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_16 //nolint +package v1_16 import ( "encoding/hex" diff --git a/models/migrations/v1_17/main_test.go b/models/migrations/v1_17/main_test.go index 0a8e05ab5f..166860b3b1 100644 --- a/models/migrations/v1_17/main_test.go +++ b/models/migrations/v1_17/main_test.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_17 //nolint +package v1_17 import ( "testing" diff --git a/models/migrations/v1_17/v211.go b/models/migrations/v1_17/v211.go index 9b72c8610b..517cf19388 100644 --- a/models/migrations/v1_17/v211.go +++ b/models/migrations/v1_17/v211.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_17 //nolint +package v1_17 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_17/v212.go b/models/migrations/v1_17/v212.go index 2337adcc80..23868c0bb2 100644 --- a/models/migrations/v1_17/v212.go +++ b/models/migrations/v1_17/v212.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_17 //nolint +package v1_17 import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_17/v213.go b/models/migrations/v1_17/v213.go index bb3f466e52..b2bbdf7279 100644 --- a/models/migrations/v1_17/v213.go +++ b/models/migrations/v1_17/v213.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_17 //nolint +package v1_17 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_17/v214.go b/models/migrations/v1_17/v214.go index 2268164919..1925324f0f 100644 --- a/models/migrations/v1_17/v214.go +++ b/models/migrations/v1_17/v214.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_17 //nolint +package v1_17 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_17/v215.go b/models/migrations/v1_17/v215.go index 5aae798562..431103c98e 100644 --- a/models/migrations/v1_17/v215.go +++ b/models/migrations/v1_17/v215.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_17 //nolint +package v1_17 import ( "forgejo.org/models/pull" diff --git a/models/migrations/v1_17/v216.go b/models/migrations/v1_17/v216.go index 268f472a42..37aeacb6fc 100644 --- a/models/migrations/v1_17/v216.go +++ b/models/migrations/v1_17/v216.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_17 //nolint +package v1_17 // This migration added non-ideal indices to the action table which on larger datasets slowed things down // it has been superseded by v218.go diff --git a/models/migrations/v1_17/v217.go b/models/migrations/v1_17/v217.go index 5f096d4824..fef48b7a5b 100644 --- a/models/migrations/v1_17/v217.go +++ b/models/migrations/v1_17/v217.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_17 //nolint +package v1_17 import ( "forgejo.org/modules/setting" diff --git a/models/migrations/v1_17/v218.go b/models/migrations/v1_17/v218.go index 5e3dcd0841..412d124286 100644 --- a/models/migrations/v1_17/v218.go +++ b/models/migrations/v1_17/v218.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_17 //nolint +package v1_17 import ( "forgejo.org/modules/setting" diff --git a/models/migrations/v1_17/v219.go b/models/migrations/v1_17/v219.go index e90656090f..7ca6a26be6 100644 --- a/models/migrations/v1_17/v219.go +++ b/models/migrations/v1_17/v219.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_17 //nolint +package v1_17 import ( "time" diff --git a/models/migrations/v1_17/v220.go b/models/migrations/v1_17/v220.go index 61bbf19725..4e010e5b76 100644 --- a/models/migrations/v1_17/v220.go +++ b/models/migrations/v1_17/v220.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_17 //nolint +package v1_17 import ( packages_model "forgejo.org/models/packages" diff --git a/models/migrations/v1_17/v221.go b/models/migrations/v1_17/v221.go index 84e9a238af..3ef34e3f06 100644 --- a/models/migrations/v1_17/v221.go +++ b/models/migrations/v1_17/v221.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_17 //nolint +package v1_17 import ( "encoding/base32" diff --git a/models/migrations/v1_17/v221_test.go b/models/migrations/v1_17/v221_test.go index 02607d6b32..a9c47136b2 100644 --- a/models/migrations/v1_17/v221_test.go +++ b/models/migrations/v1_17/v221_test.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_17 //nolint +package v1_17 import ( "encoding/base32" diff --git a/models/migrations/v1_17/v222.go b/models/migrations/v1_17/v222.go index ae910cbcb6..873769881e 100644 --- a/models/migrations/v1_17/v222.go +++ b/models/migrations/v1_17/v222.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_17 //nolint +package v1_17 import ( "context" diff --git a/models/migrations/v1_17/v223.go b/models/migrations/v1_17/v223.go index 7d92dcf5ae..4f5d34d841 100644 --- a/models/migrations/v1_17/v223.go +++ b/models/migrations/v1_17/v223.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_17 //nolint +package v1_17 import ( "context" diff --git a/models/migrations/v1_18/main_test.go b/models/migrations/v1_18/main_test.go index 33f5c51222..0c20934cea 100644 --- a/models/migrations/v1_18/main_test.go +++ b/models/migrations/v1_18/main_test.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_18 //nolint +package v1_18 import ( "testing" diff --git a/models/migrations/v1_18/v224.go b/models/migrations/v1_18/v224.go index f3d522b91a..6dc12020ea 100644 --- a/models/migrations/v1_18/v224.go +++ b/models/migrations/v1_18/v224.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_18 //nolint +package v1_18 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_18/v225.go b/models/migrations/v1_18/v225.go index 86bcb1323d..266eccfff8 100644 --- a/models/migrations/v1_18/v225.go +++ b/models/migrations/v1_18/v225.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_18 //nolint +package v1_18 import ( "forgejo.org/modules/setting" diff --git a/models/migrations/v1_18/v226.go b/models/migrations/v1_18/v226.go index f87e24b11d..8ed9761476 100644 --- a/models/migrations/v1_18/v226.go +++ b/models/migrations/v1_18/v226.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_18 //nolint +package v1_18 import ( "xorm.io/builder" diff --git a/models/migrations/v1_18/v227.go b/models/migrations/v1_18/v227.go index b6250fb76c..d39a010159 100644 --- a/models/migrations/v1_18/v227.go +++ b/models/migrations/v1_18/v227.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_18 //nolint +package v1_18 import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_18/v228.go b/models/migrations/v1_18/v228.go index 1161c8a4c9..3f5b69734d 100644 --- a/models/migrations/v1_18/v228.go +++ b/models/migrations/v1_18/v228.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_18 //nolint +package v1_18 import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_18/v229.go b/models/migrations/v1_18/v229.go index f96dde9840..00d794725f 100644 --- a/models/migrations/v1_18/v229.go +++ b/models/migrations/v1_18/v229.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_18 //nolint +package v1_18 import ( "fmt" diff --git a/models/migrations/v1_18/v229_test.go b/models/migrations/v1_18/v229_test.go index ac5e726a79..903a60c851 100644 --- a/models/migrations/v1_18/v229_test.go +++ b/models/migrations/v1_18/v229_test.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_18 //nolint +package v1_18 import ( "testing" diff --git a/models/migrations/v1_18/v230.go b/models/migrations/v1_18/v230.go index ea5b4d02e1..078fce7643 100644 --- a/models/migrations/v1_18/v230.go +++ b/models/migrations/v1_18/v230.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_18 //nolint +package v1_18 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_18/v230_test.go b/models/migrations/v1_18/v230_test.go index 7dd6675673..da31b0dc9b 100644 --- a/models/migrations/v1_18/v230_test.go +++ b/models/migrations/v1_18/v230_test.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_18 //nolint +package v1_18 import ( "testing" diff --git a/models/migrations/v1_19/main_test.go b/models/migrations/v1_19/main_test.go index 7c56926f4c..9d1c3a57ea 100644 --- a/models/migrations/v1_19/main_test.go +++ b/models/migrations/v1_19/main_test.go @@ -1,7 +1,7 @@ // Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_19 //nolint +package v1_19 import ( "testing" diff --git a/models/migrations/v1_19/v231.go b/models/migrations/v1_19/v231.go index 79e46132f0..8ef1e4e743 100644 --- a/models/migrations/v1_19/v231.go +++ b/models/migrations/v1_19/v231.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_19 //nolint +package v1_19 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_19/v232.go b/models/migrations/v1_19/v232.go index 7fb4a5ac8d..2aab2cf830 100644 --- a/models/migrations/v1_19/v232.go +++ b/models/migrations/v1_19/v232.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_19 //nolint +package v1_19 import ( "forgejo.org/modules/setting" diff --git a/models/migrations/v1_19/v233.go b/models/migrations/v1_19/v233.go index 191afd4868..e62e8a9356 100644 --- a/models/migrations/v1_19/v233.go +++ b/models/migrations/v1_19/v233.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_19 //nolint +package v1_19 import ( "fmt" diff --git a/models/migrations/v1_19/v233_test.go b/models/migrations/v1_19/v233_test.go index 4dc35d1e27..3d5eac9887 100644 --- a/models/migrations/v1_19/v233_test.go +++ b/models/migrations/v1_19/v233_test.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_19 //nolint +package v1_19 import ( "testing" diff --git a/models/migrations/v1_19/v234.go b/models/migrations/v1_19/v234.go index c610a423dd..e00b1cc2b6 100644 --- a/models/migrations/v1_19/v234.go +++ b/models/migrations/v1_19/v234.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_19 //nolint +package v1_19 import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_19/v235.go b/models/migrations/v1_19/v235.go index 3715de3920..297d90f65a 100644 --- a/models/migrations/v1_19/v235.go +++ b/models/migrations/v1_19/v235.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_19 //nolint +package v1_19 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_19/v236.go b/models/migrations/v1_19/v236.go index fa01a6ab80..c453f95e04 100644 --- a/models/migrations/v1_19/v236.go +++ b/models/migrations/v1_19/v236.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_19 //nolint +package v1_19 import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_19/v237.go b/models/migrations/v1_19/v237.go index b23c765aa5..cf30226ccd 100644 --- a/models/migrations/v1_19/v237.go +++ b/models/migrations/v1_19/v237.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_19 //nolint +package v1_19 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_19/v238.go b/models/migrations/v1_19/v238.go index 7c912a8341..b257315319 100644 --- a/models/migrations/v1_19/v238.go +++ b/models/migrations/v1_19/v238.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_19 //nolint +package v1_19 import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_19/v239.go b/models/migrations/v1_19/v239.go index 10076f2401..8f4a65be95 100644 --- a/models/migrations/v1_19/v239.go +++ b/models/migrations/v1_19/v239.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_19 //nolint +package v1_19 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_19/v240.go b/models/migrations/v1_19/v240.go index 4ca5becede..c49ce2f49a 100644 --- a/models/migrations/v1_19/v240.go +++ b/models/migrations/v1_19/v240.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_19 //nolint +package v1_19 import ( "forgejo.org/models/db" diff --git a/models/migrations/v1_19/v241.go b/models/migrations/v1_19/v241.go index a617d6fd2f..e35801a057 100644 --- a/models/migrations/v1_19/v241.go +++ b/models/migrations/v1_19/v241.go @@ -1,7 +1,7 @@ // Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_19 //nolint +package v1_19 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_19/v242.go b/models/migrations/v1_19/v242.go index bbf227ef77..87ca9cf214 100644 --- a/models/migrations/v1_19/v242.go +++ b/models/migrations/v1_19/v242.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_19 //nolint +package v1_19 import ( "forgejo.org/modules/setting" diff --git a/models/migrations/v1_19/v243.go b/models/migrations/v1_19/v243.go index 55bbfafb2f..9c3f372594 100644 --- a/models/migrations/v1_19/v243.go +++ b/models/migrations/v1_19/v243.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_19 //nolint +package v1_19 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_20/main_test.go b/models/migrations/v1_20/main_test.go index f870dca429..ee5eec5ef6 100644 --- a/models/migrations/v1_20/main_test.go +++ b/models/migrations/v1_20/main_test.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_20 //nolint +package v1_20 import ( "testing" diff --git a/models/migrations/v1_20/v244.go b/models/migrations/v1_20/v244.go index 977566ad7d..76cdccaca5 100644 --- a/models/migrations/v1_20/v244.go +++ b/models/migrations/v1_20/v244.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_20 //nolint +package v1_20 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_20/v245.go b/models/migrations/v1_20/v245.go index 7e6585388b..5e034568c4 100644 --- a/models/migrations/v1_20/v245.go +++ b/models/migrations/v1_20/v245.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_20 //nolint +package v1_20 import ( "context" diff --git a/models/migrations/v1_20/v246.go b/models/migrations/v1_20/v246.go index e6340ef079..22bf723404 100644 --- a/models/migrations/v1_20/v246.go +++ b/models/migrations/v1_20/v246.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_20 //nolint +package v1_20 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_20/v247.go b/models/migrations/v1_20/v247.go index 9ed810a623..056699d744 100644 --- a/models/migrations/v1_20/v247.go +++ b/models/migrations/v1_20/v247.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_20 //nolint +package v1_20 import ( "forgejo.org/modules/log" diff --git a/models/migrations/v1_20/v248.go b/models/migrations/v1_20/v248.go index 40555210e7..4f2091e4bc 100644 --- a/models/migrations/v1_20/v248.go +++ b/models/migrations/v1_20/v248.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_20 //nolint +package v1_20 import "xorm.io/xorm" diff --git a/models/migrations/v1_20/v249.go b/models/migrations/v1_20/v249.go index d2b096bf58..0aebb2a343 100644 --- a/models/migrations/v1_20/v249.go +++ b/models/migrations/v1_20/v249.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_20 //nolint +package v1_20 import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_20/v250.go b/models/migrations/v1_20/v250.go index cfcde2fc9b..e12223691f 100644 --- a/models/migrations/v1_20/v250.go +++ b/models/migrations/v1_20/v250.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_20 //nolint +package v1_20 import ( "strings" diff --git a/models/migrations/v1_20/v251.go b/models/migrations/v1_20/v251.go index c8665ba7eb..7d2d259df6 100644 --- a/models/migrations/v1_20/v251.go +++ b/models/migrations/v1_20/v251.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_20 //nolint +package v1_20 import ( "forgejo.org/modules/log" diff --git a/models/migrations/v1_20/v252.go b/models/migrations/v1_20/v252.go index bb85c78309..435cce7ebe 100644 --- a/models/migrations/v1_20/v252.go +++ b/models/migrations/v1_20/v252.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_20 //nolint +package v1_20 import ( "forgejo.org/modules/log" diff --git a/models/migrations/v1_20/v253.go b/models/migrations/v1_20/v253.go index 5f4057e9d9..73354fd485 100644 --- a/models/migrations/v1_20/v253.go +++ b/models/migrations/v1_20/v253.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_20 //nolint +package v1_20 import ( "forgejo.org/modules/log" diff --git a/models/migrations/v1_20/v254.go b/models/migrations/v1_20/v254.go index 1e26979a5b..9cdbfb3916 100644 --- a/models/migrations/v1_20/v254.go +++ b/models/migrations/v1_20/v254.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_20 //nolint +package v1_20 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_20/v255.go b/models/migrations/v1_20/v255.go index 49b0ecf220..baa3c4b6d8 100644 --- a/models/migrations/v1_20/v255.go +++ b/models/migrations/v1_20/v255.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_20 //nolint +package v1_20 import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_20/v256.go b/models/migrations/v1_20/v256.go index 822153b93e..7b84c1e154 100644 --- a/models/migrations/v1_20/v256.go +++ b/models/migrations/v1_20/v256.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_20 //nolint +package v1_20 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_20/v257.go b/models/migrations/v1_20/v257.go index 70f229d73f..8045909dba 100644 --- a/models/migrations/v1_20/v257.go +++ b/models/migrations/v1_20/v257.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_20 //nolint +package v1_20 import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_20/v258.go b/models/migrations/v1_20/v258.go index 47174ce805..1d3faffdae 100644 --- a/models/migrations/v1_20/v258.go +++ b/models/migrations/v1_20/v258.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_20 //nolint +package v1_20 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_20/v259.go b/models/migrations/v1_20/v259.go index f10b94fa9c..9b2b68263e 100644 --- a/models/migrations/v1_20/v259.go +++ b/models/migrations/v1_20/v259.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_20 //nolint +package v1_20 import ( "fmt" diff --git a/models/migrations/v1_20/v259_test.go b/models/migrations/v1_20/v259_test.go index 32e4aa3050..b41b6c7995 100644 --- a/models/migrations/v1_20/v259_test.go +++ b/models/migrations/v1_20/v259_test.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_20 //nolint +package v1_20 import ( "sort" diff --git a/models/migrations/v1_21/main_test.go b/models/migrations/v1_21/main_test.go index 7104887afb..3f10a39a94 100644 --- a/models/migrations/v1_21/main_test.go +++ b/models/migrations/v1_21/main_test.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_21 //nolint +package v1_21 import ( "testing" diff --git a/models/migrations/v1_21/v260.go b/models/migrations/v1_21/v260.go index 245f3011ab..b73b53bd61 100644 --- a/models/migrations/v1_21/v260.go +++ b/models/migrations/v1_21/v260.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_21 //nolint +package v1_21 import ( "forgejo.org/models/migrations/base" diff --git a/models/migrations/v1_21/v261.go b/models/migrations/v1_21/v261.go index 743bef152d..83a4927704 100644 --- a/models/migrations/v1_21/v261.go +++ b/models/migrations/v1_21/v261.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_21 //nolint +package v1_21 import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_21/v262.go b/models/migrations/v1_21/v262.go index 23e900572a..6e88e29b9d 100644 --- a/models/migrations/v1_21/v262.go +++ b/models/migrations/v1_21/v262.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_21 //nolint +package v1_21 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_21/v263.go b/models/migrations/v1_21/v263.go index 2c7cbadf0d..55c418bde0 100644 --- a/models/migrations/v1_21/v263.go +++ b/models/migrations/v1_21/v263.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_21 //nolint +package v1_21 import ( "fmt" diff --git a/models/migrations/v1_21/v264.go b/models/migrations/v1_21/v264.go index 5615600072..acd2c9bb48 100644 --- a/models/migrations/v1_21/v264.go +++ b/models/migrations/v1_21/v264.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_21 //nolint +package v1_21 import ( "context" diff --git a/models/migrations/v1_21/v265.go b/models/migrations/v1_21/v265.go index 800eb95f72..b6892acc27 100644 --- a/models/migrations/v1_21/v265.go +++ b/models/migrations/v1_21/v265.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_21 //nolint +package v1_21 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_21/v266.go b/models/migrations/v1_21/v266.go index 79a5f5e14c..440549e868 100644 --- a/models/migrations/v1_21/v266.go +++ b/models/migrations/v1_21/v266.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_21 //nolint +package v1_21 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_21/v267.go b/models/migrations/v1_21/v267.go index f94696a22b..13992d8776 100644 --- a/models/migrations/v1_21/v267.go +++ b/models/migrations/v1_21/v267.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_21 //nolint +package v1_21 import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_21/v268.go b/models/migrations/v1_21/v268.go index 332793ff07..b677d2383e 100644 --- a/models/migrations/v1_21/v268.go +++ b/models/migrations/v1_21/v268.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_21 //nolint +package v1_21 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_21/v269.go b/models/migrations/v1_21/v269.go index 475ec02380..042040927d 100644 --- a/models/migrations/v1_21/v269.go +++ b/models/migrations/v1_21/v269.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_21 //nolint +package v1_21 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_21/v270.go b/models/migrations/v1_21/v270.go index b9cc84d3ac..ab7c5660ba 100644 --- a/models/migrations/v1_21/v270.go +++ b/models/migrations/v1_21/v270.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_21 //nolint +package v1_21 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_21/v271.go b/models/migrations/v1_21/v271.go index f45c113c1f..e3ce2d4b74 100644 --- a/models/migrations/v1_21/v271.go +++ b/models/migrations/v1_21/v271.go @@ -1,7 +1,8 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_21 //nolint +package v1_21 + import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_21/v272.go b/models/migrations/v1_21/v272.go index a729c49f1b..14c1e0c4b0 100644 --- a/models/migrations/v1_21/v272.go +++ b/models/migrations/v1_21/v272.go @@ -1,7 +1,8 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_21 //nolint +package v1_21 + import ( "xorm.io/xorm" ) diff --git a/models/migrations/v1_21/v273.go b/models/migrations/v1_21/v273.go index 1ec6ade566..d6ec80d3d5 100644 --- a/models/migrations/v1_21/v273.go +++ b/models/migrations/v1_21/v273.go @@ -1,7 +1,8 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_21 //nolint +package v1_21 + import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_21/v274.go b/models/migrations/v1_21/v274.go index b74e5fed51..a1211d1fdd 100644 --- a/models/migrations/v1_21/v274.go +++ b/models/migrations/v1_21/v274.go @@ -1,7 +1,8 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_21 //nolint +package v1_21 + import ( "time" diff --git a/models/migrations/v1_21/v275.go b/models/migrations/v1_21/v275.go index 78804a59d6..2bfe5c72fa 100644 --- a/models/migrations/v1_21/v275.go +++ b/models/migrations/v1_21/v275.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_21 //nolint +package v1_21 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_21/v276.go b/models/migrations/v1_21/v276.go index 0830c3bd92..3b0bc23da7 100644 --- a/models/migrations/v1_21/v276.go +++ b/models/migrations/v1_21/v276.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_21 //nolint +package v1_21 import ( repo_model "forgejo.org/models/repo" diff --git a/models/migrations/v1_21/v277.go b/models/migrations/v1_21/v277.go index 12529160b7..0c102eddde 100644 --- a/models/migrations/v1_21/v277.go +++ b/models/migrations/v1_21/v277.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_21 //nolint +package v1_21 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_21/v278.go b/models/migrations/v1_21/v278.go index d6a462d1e7..846f228678 100644 --- a/models/migrations/v1_21/v278.go +++ b/models/migrations/v1_21/v278.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_21 //nolint +package v1_21 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_21/v279.go b/models/migrations/v1_21/v279.go index 2abd1bbe84..beb39effe1 100644 --- a/models/migrations/v1_21/v279.go +++ b/models/migrations/v1_21/v279.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_21 //nolint +package v1_21 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_22/main_test.go b/models/migrations/v1_22/main_test.go index dc991b78fe..7b05993e09 100644 --- a/models/migrations/v1_22/main_test.go +++ b/models/migrations/v1_22/main_test.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "testing" diff --git a/models/migrations/v1_22/v280.go b/models/migrations/v1_22/v280.go index a8ee4a3bf7..2271cb6089 100644 --- a/models/migrations/v1_22/v280.go +++ b/models/migrations/v1_22/v280.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_22/v281.go b/models/migrations/v1_22/v281.go index 5271c786be..2eeca9be82 100644 --- a/models/migrations/v1_22/v281.go +++ b/models/migrations/v1_22/v281.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_22/v282.go b/models/migrations/v1_22/v282.go index baad9e0916..eed64c30f7 100644 --- a/models/migrations/v1_22/v282.go +++ b/models/migrations/v1_22/v282.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_22/v283.go b/models/migrations/v1_22/v283.go index 86946d1c39..33a2513069 100644 --- a/models/migrations/v1_22/v283.go +++ b/models/migrations/v1_22/v283.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_22/v283_test.go b/models/migrations/v1_22/v283_test.go index d8e147a131..652d96ac16 100644 --- a/models/migrations/v1_22/v283_test.go +++ b/models/migrations/v1_22/v283_test.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "testing" diff --git a/models/migrations/v1_22/v284.go b/models/migrations/v1_22/v284.go index 2b95078980..31b38f6aed 100644 --- a/models/migrations/v1_22/v284.go +++ b/models/migrations/v1_22/v284.go @@ -1,7 +1,8 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 + import ( "xorm.io/xorm" ) diff --git a/models/migrations/v1_22/v285.go b/models/migrations/v1_22/v285.go index a55cc17c04..fed89f670e 100644 --- a/models/migrations/v1_22/v285.go +++ b/models/migrations/v1_22/v285.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "time" diff --git a/models/migrations/v1_22/v286.go b/models/migrations/v1_22/v286.go index d0489e7aeb..05247bb436 100644 --- a/models/migrations/v1_22/v286.go +++ b/models/migrations/v1_22/v286.go @@ -1,6 +1,6 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "fmt" diff --git a/models/migrations/v1_22/v286_test.go b/models/migrations/v1_22/v286_test.go index c63deef495..5bb3334df2 100644 --- a/models/migrations/v1_22/v286_test.go +++ b/models/migrations/v1_22/v286_test.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "testing" diff --git a/models/migrations/v1_22/v287.go b/models/migrations/v1_22/v287.go index c8b1593286..5fd901f9de 100644 --- a/models/migrations/v1_22/v287.go +++ b/models/migrations/v1_22/v287.go @@ -1,7 +1,7 @@ // Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_22/v288.go b/models/migrations/v1_22/v288.go index 44e4991851..78be3b6ef2 100644 --- a/models/migrations/v1_22/v288.go +++ b/models/migrations/v1_22/v288.go @@ -1,7 +1,7 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_22/v289.go b/models/migrations/v1_22/v289.go index b9941aadd9..78689a4ffa 100644 --- a/models/migrations/v1_22/v289.go +++ b/models/migrations/v1_22/v289.go @@ -1,7 +1,7 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import "xorm.io/xorm" diff --git a/models/migrations/v1_22/v290.go b/models/migrations/v1_22/v290.go index 594e417644..ebafab6567 100644 --- a/models/migrations/v1_22/v290.go +++ b/models/migrations/v1_22/v290.go @@ -1,7 +1,7 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_22/v290_test.go b/models/migrations/v1_22/v290_test.go index 569d77bc16..a1907cf4d6 100644 --- a/models/migrations/v1_22/v290_test.go +++ b/models/migrations/v1_22/v290_test.go @@ -1,7 +1,7 @@ // Copyright 2024 The Forgejo Authors c/o Codeberg e.V.. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "strconv" diff --git a/models/migrations/v1_22/v291.go b/models/migrations/v1_22/v291.go index 74726fae96..823a644a95 100644 --- a/models/migrations/v1_22/v291.go +++ b/models/migrations/v1_22/v291.go @@ -1,7 +1,7 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import "xorm.io/xorm" diff --git a/models/migrations/v1_22/v292.go b/models/migrations/v1_22/v292.go index beca556aee..440f48ce80 100644 --- a/models/migrations/v1_22/v292.go +++ b/models/migrations/v1_22/v292.go @@ -1,7 +1,7 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 // NOTE: noop the original migration has bug which some projects will be skip, so // these projects will have no default board. diff --git a/models/migrations/v1_22/v293.go b/models/migrations/v1_22/v293.go index 9f38c3db56..e9c9746b26 100644 --- a/models/migrations/v1_22/v293.go +++ b/models/migrations/v1_22/v293.go @@ -1,7 +1,7 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "forgejo.org/modules/setting" diff --git a/models/migrations/v1_22/v293_test.go b/models/migrations/v1_22/v293_test.go index 444146737d..6b1931b761 100644 --- a/models/migrations/v1_22/v293_test.go +++ b/models/migrations/v1_22/v293_test.go @@ -1,7 +1,7 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "testing" diff --git a/models/migrations/v1_22/v294.go b/models/migrations/v1_22/v294.go index 314b4519f1..6c52372306 100644 --- a/models/migrations/v1_22/v294.go +++ b/models/migrations/v1_22/v294.go @@ -1,7 +1,7 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_22/v294_test.go b/models/migrations/v1_22/v294_test.go index ef7b67ca5b..e87a4bc85f 100644 --- a/models/migrations/v1_22/v294_test.go +++ b/models/migrations/v1_22/v294_test.go @@ -1,7 +1,7 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import ( "slices" @@ -45,7 +45,8 @@ func Test_AddUniqueIndexForProjectIssue(t *testing.T) { for _, index := range tables[0].Indexes { if index.Type == schemas.UniqueType { found = true - slices.Equal(index.Cols, []string{"project_id", "issue_id"}) + slices.Sort(index.Cols) + assert.Equal(t, []string{"issue_id", "project_id"}, index.Cols) break } } diff --git a/models/migrations/v1_22/v295.go b/models/migrations/v1_22/v295.go index 17bdadb4ad..319b1a399b 100644 --- a/models/migrations/v1_22/v295.go +++ b/models/migrations/v1_22/v295.go @@ -1,7 +1,7 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import "xorm.io/xorm" diff --git a/models/migrations/v1_22/v296.go b/models/migrations/v1_22/v296.go index 1ecacab95f..75350f9f65 100644 --- a/models/migrations/v1_22/v296.go +++ b/models/migrations/v1_22/v296.go @@ -1,7 +1,7 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import "xorm.io/xorm" diff --git a/models/migrations/v1_22/v298.go b/models/migrations/v1_22/v298.go index b9f3b95ade..7700173a00 100644 --- a/models/migrations/v1_22/v298.go +++ b/models/migrations/v1_22/v298.go @@ -1,7 +1,7 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_22 //nolint +package v1_22 import "xorm.io/xorm" diff --git a/models/migrations/v1_23/main_test.go b/models/migrations/v1_23/main_test.go index 0fd90a4a67..5fb4fec999 100644 --- a/models/migrations/v1_23/main_test.go +++ b/models/migrations/v1_23/main_test.go @@ -1,7 +1,7 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_23 //nolint +package v1_23 import ( "testing" diff --git a/models/migrations/v1_23/v299.go b/models/migrations/v1_23/v299.go index f6db960c3b..73ce19c875 100644 --- a/models/migrations/v1_23/v299.go +++ b/models/migrations/v1_23/v299.go @@ -1,7 +1,7 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_23 //nolint +package v1_23 import "xorm.io/xorm" diff --git a/models/migrations/v1_23/v300.go b/models/migrations/v1_23/v300.go index f1f1cccdbf..404d8dbea8 100644 --- a/models/migrations/v1_23/v300.go +++ b/models/migrations/v1_23/v300.go @@ -1,7 +1,7 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_23 //nolint +package v1_23 import "xorm.io/xorm" diff --git a/models/migrations/v1_23/v301.go b/models/migrations/v1_23/v301.go index b7797f6c6b..f2a4d8c559 100644 --- a/models/migrations/v1_23/v301.go +++ b/models/migrations/v1_23/v301.go @@ -1,7 +1,7 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_23 //nolint +package v1_23 import "xorm.io/xorm" diff --git a/models/migrations/v1_23/v302.go b/models/migrations/v1_23/v302.go index c8ed786d63..1b056993bd 100644 --- a/models/migrations/v1_23/v302.go +++ b/models/migrations/v1_23/v302.go @@ -1,7 +1,7 @@ // Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_23 //nolint +package v1_23 import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_23/v303.go b/models/migrations/v1_23/v303.go index fae0131bdd..03197d2857 100644 --- a/models/migrations/v1_23/v303.go +++ b/models/migrations/v1_23/v303.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. // SPDX-License-Identifier: GPL-3.0-or-later -package v1_23 //nolint +package v1_23 import ( "forgejo.org/models/migrations/base" diff --git a/models/migrations/v1_23/v303_test.go b/models/migrations/v1_23/v303_test.go index f105d11830..f2c764bae3 100644 --- a/models/migrations/v1_23/v303_test.go +++ b/models/migrations/v1_23/v303_test.go @@ -1,7 +1,7 @@ // Copyright 2025 The Forgejo Authors. // SPDX-License-Identifier: GPL-3.0-or-later -package v1_23 //nolint +package v1_23 import ( "testing" diff --git a/models/migrations/v1_6/v70.go b/models/migrations/v1_6/v70.go index ec6bd09bb5..eb669f57b6 100644 --- a/models/migrations/v1_6/v70.go +++ b/models/migrations/v1_6/v70.go @@ -1,7 +1,7 @@ // Copyright 2018 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_6 //nolint +package v1_6 import ( "fmt" diff --git a/models/migrations/v1_6/v71.go b/models/migrations/v1_6/v71.go index 3706ad4406..42fe8cd1ba 100644 --- a/models/migrations/v1_6/v71.go +++ b/models/migrations/v1_6/v71.go @@ -1,7 +1,7 @@ // Copyright 2018 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_6 //nolint +package v1_6 import ( "fmt" diff --git a/models/migrations/v1_6/v72.go b/models/migrations/v1_6/v72.go index 4df2a0f6e9..7cd2331376 100644 --- a/models/migrations/v1_6/v72.go +++ b/models/migrations/v1_6/v72.go @@ -1,7 +1,7 @@ // Copyright 2018 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_6 //nolint +package v1_6 import ( "fmt" diff --git a/models/migrations/v1_7/v73.go b/models/migrations/v1_7/v73.go index b5a748aae3..e0b7a28537 100644 --- a/models/migrations/v1_7/v73.go +++ b/models/migrations/v1_7/v73.go @@ -1,7 +1,7 @@ // Copyright 2018 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_7 //nolint +package v1_7 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_7/v74.go b/models/migrations/v1_7/v74.go index f0567e3c9b..376be37a24 100644 --- a/models/migrations/v1_7/v74.go +++ b/models/migrations/v1_7/v74.go @@ -1,7 +1,7 @@ // Copyright 2018 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_7 //nolint +package v1_7 import "xorm.io/xorm" diff --git a/models/migrations/v1_7/v75.go b/models/migrations/v1_7/v75.go index fa7430970c..ef11575466 100644 --- a/models/migrations/v1_7/v75.go +++ b/models/migrations/v1_7/v75.go @@ -1,7 +1,7 @@ // Copyright 2018 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_7 //nolint +package v1_7 import ( "xorm.io/builder" diff --git a/models/migrations/v1_8/v76.go b/models/migrations/v1_8/v76.go index 61ad006a47..8d47280b41 100644 --- a/models/migrations/v1_8/v76.go +++ b/models/migrations/v1_8/v76.go @@ -1,7 +1,7 @@ // Copyright 2018 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_8 //nolint +package v1_8 import ( "fmt" diff --git a/models/migrations/v1_8/v77.go b/models/migrations/v1_8/v77.go index 8b19993924..4fe5ebe635 100644 --- a/models/migrations/v1_8/v77.go +++ b/models/migrations/v1_8/v77.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_8 //nolint +package v1_8 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_8/v78.go b/models/migrations/v1_8/v78.go index 8102b19335..840fc20d96 100644 --- a/models/migrations/v1_8/v78.go +++ b/models/migrations/v1_8/v78.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_8 //nolint +package v1_8 import ( "forgejo.org/models/migrations/base" diff --git a/models/migrations/v1_8/v79.go b/models/migrations/v1_8/v79.go index f7d2d68f96..c8e0db531f 100644 --- a/models/migrations/v1_8/v79.go +++ b/models/migrations/v1_8/v79.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_8 //nolint +package v1_8 import ( "forgejo.org/modules/setting" diff --git a/models/migrations/v1_8/v80.go b/models/migrations/v1_8/v80.go index cebbbead28..6f9df47a93 100644 --- a/models/migrations/v1_8/v80.go +++ b/models/migrations/v1_8/v80.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_8 //nolint +package v1_8 import "xorm.io/xorm" diff --git a/models/migrations/v1_8/v81.go b/models/migrations/v1_8/v81.go index 734fc24641..8152a47ad7 100644 --- a/models/migrations/v1_8/v81.go +++ b/models/migrations/v1_8/v81.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_8 //nolint +package v1_8 import ( "fmt" diff --git a/models/migrations/v1_9/v82.go b/models/migrations/v1_9/v82.go index 78a90bdde9..235c73c504 100644 --- a/models/migrations/v1_9/v82.go +++ b/models/migrations/v1_9/v82.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_9 //nolint +package v1_9 import ( "fmt" diff --git a/models/migrations/v1_9/v83.go b/models/migrations/v1_9/v83.go index fa24a92d28..9640564a44 100644 --- a/models/migrations/v1_9/v83.go +++ b/models/migrations/v1_9/v83.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_9 //nolint +package v1_9 import ( "forgejo.org/modules/timeutil" diff --git a/models/migrations/v1_9/v84.go b/models/migrations/v1_9/v84.go index c7155fe9cf..423915ae57 100644 --- a/models/migrations/v1_9/v84.go +++ b/models/migrations/v1_9/v84.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_9 //nolint +package v1_9 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_9/v85.go b/models/migrations/v1_9/v85.go index d8e9d91840..9d5adc82dd 100644 --- a/models/migrations/v1_9/v85.go +++ b/models/migrations/v1_9/v85.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_9 //nolint +package v1_9 import ( "fmt" diff --git a/models/migrations/v1_9/v86.go b/models/migrations/v1_9/v86.go index cf2725d158..9464ff0cf6 100644 --- a/models/migrations/v1_9/v86.go +++ b/models/migrations/v1_9/v86.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_9 //nolint +package v1_9 import ( "xorm.io/xorm" diff --git a/models/migrations/v1_9/v87.go b/models/migrations/v1_9/v87.go index fa01b6e5e3..81a4ebf80d 100644 --- a/models/migrations/v1_9/v87.go +++ b/models/migrations/v1_9/v87.go @@ -1,7 +1,7 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package v1_9 //nolint +package v1_9 import ( "xorm.io/xorm" diff --git a/tests/integration/pull_commit_test.go b/tests/integration/pull_commit_test.go index f82fc08df4..8a632fa338 100644 --- a/tests/integration/pull_commit_test.go +++ b/tests/integration/pull_commit_test.go @@ -65,7 +65,7 @@ func TestPullCommitLinks(t *testing.T) { func TestPullCommitSignature(t *testing.T) { t.Cleanup(func() { // Cannot use t.Context(), it is in the done state. - require.NoError(t, git.InitFull(context.Background())) //nolint:usetesting + require.NoError(t, git.InitFull(context.Background())) }) defer test.MockVariableValue(&setting.Repository.Signing.SigningName, "UwU")() diff --git a/tests/integration/repo_test.go b/tests/integration/repo_test.go index 598a508294..3d5922c0b1 100644 --- a/tests/integration/repo_test.go +++ b/tests/integration/repo_test.go @@ -690,7 +690,7 @@ func TestViewCommit(t *testing.T) { func TestViewCommitSignature(t *testing.T) { t.Cleanup(func() { // Cannot use t.Context(), it is in the done state. - require.NoError(t, git.InitFull(context.Background())) //nolint:usetesting + require.NoError(t, git.InitFull(context.Background())) }) defer test.MockVariableValue(&setting.Repository.Signing.SigningName, "UwU")() diff --git a/tests/integration/signing_git_test.go b/tests/integration/signing_git_test.go index 8b6b30ecab..7018b10376 100644 --- a/tests/integration/signing_git_test.go +++ b/tests/integration/signing_git_test.go @@ -32,7 +32,7 @@ import ( func TestInstanceSigning(t *testing.T) { t.Cleanup(func() { // Cannot use t.Context(), it is in the done state. - require.NoError(t, git.InitFull(context.Background())) //nolint:usetesting + require.NoError(t, git.InitFull(context.Background())) }) onGiteaRun(t, func(t *testing.T, u *url.URL) { From 74981d9e97b9e8047852ac9eb9ceb7b1a454e5bb Mon Sep 17 00:00:00 2001 From: Gusted Date: Sun, 6 Jul 2025 07:16:43 +0200 Subject: [PATCH 088/495] chore: Refactor `Is{Reference,Branch}Exist` (#8425) - Instead of invoking a new git command to check if a reference exists, use the already opened git repository that uses a batch check to check if the reference exists. - Instead of invoking a new git command to check if a branch exists, use the already opened git repository that uses a batch check to check if the branch exists. - Do not depend on `IsReferenceExist` as its no longer used by any other function. - Specify `--quiet` to not waste Git's time on printing something we do not use. - Run it via `Run` so no buffers are created for stdout and stderr. - Add a test that verifies `IsBranchExist` works and does not work for other types of references. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8425 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- modules/git/repo_branch.go | 8 +------- modules/git/repo_branch_test.go | 15 +++++++++++++++ routers/api/v1/repo/branch.go | 4 ++-- routers/web/repo/pull.go | 2 +- services/automerge/automerge.go | 2 +- services/pull/commit_status.go | 3 +-- 6 files changed, 21 insertions(+), 13 deletions(-) diff --git a/modules/git/repo_branch.go b/modules/git/repo_branch.go index 3a9aa3e4e6..1e38bf2946 100644 --- a/modules/git/repo_branch.go +++ b/modules/git/repo_branch.go @@ -19,15 +19,9 @@ import ( // BranchPrefix base dir of the branch information file store on git const BranchPrefix = "refs/heads/" -// IsReferenceExist returns true if given reference exists in the repository. -func IsReferenceExist(ctx context.Context, repoPath, name string) bool { - _, _, err := NewCommand(ctx, "show-ref", "--verify").AddDashesAndList(name).RunStdString(&RunOpts{Dir: repoPath}) - return err == nil -} - // IsBranchExist returns true if given branch exists in the repository. func IsBranchExist(ctx context.Context, repoPath, name string) bool { - return IsReferenceExist(ctx, repoPath, BranchPrefix+name) + return NewCommand(ctx, "show-ref", "--verify", "--quiet").AddDashesAndList(BranchPrefix+name).Run(&RunOpts{Dir: repoPath}) == nil } // Branch represents a Git branch. diff --git a/modules/git/repo_branch_test.go b/modules/git/repo_branch_test.go index 1e0fea7cd4..e61ea6f5d7 100644 --- a/modules/git/repo_branch_test.go +++ b/modules/git/repo_branch_test.go @@ -1,4 +1,5 @@ // Copyright 2018 The Gitea Authors. All rights reserved. +// Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package git @@ -195,3 +196,17 @@ func TestRepository_IsReferenceExist(t *testing.T) { }) } } + +func TestIsBranchExist(t *testing.T) { + repo1Path := filepath.Join(testReposDir, "repo1_bare") + + assert.True(t, IsBranchExist(t.Context(), repo1Path, "branch1")) + assert.True(t, IsBranchExist(t.Context(), repo1Path, "branch2")) + assert.True(t, IsBranchExist(t.Context(), repo1Path, "master")) + + assert.False(t, IsBranchExist(t.Context(), repo1Path, "HEAD")) + assert.False(t, IsBranchExist(t.Context(), repo1Path, "153f451b9ee7fa1da317ab17a127e9fd9d384310")) + assert.False(t, IsBranchExist(t.Context(), repo1Path, "153f451b9ee7fa1da317ab17a127e9fd9d384310")) + assert.False(t, IsBranchExist(t.Context(), repo1Path, "signed-tag")) + assert.False(t, IsBranchExist(t.Context(), repo1Path, "test")) +} diff --git a/routers/api/v1/repo/branch.go b/routers/api/v1/repo/branch.go index 7c9593d625..e043448590 100644 --- a/routers/api/v1/repo/branch.go +++ b/routers/api/v1/repo/branch.go @@ -594,7 +594,7 @@ func CreateBranchProtection(ctx *context.APIContext) { isPlainRule := !git_model.IsRuleNameSpecial(ruleName) var isBranchExist bool if isPlainRule { - isBranchExist = git.IsBranchExist(ctx.Req.Context(), ctx.Repo.Repository.RepoPath(), ruleName) + isBranchExist = ctx.Repo.GitRepo.IsBranchExist(ruleName) } protectBranch, err := git_model.GetProtectedBranchRuleByName(ctx, repo.ID, ruleName) @@ -982,7 +982,7 @@ func EditBranchProtection(ctx *context.APIContext) { isPlainRule := !git_model.IsRuleNameSpecial(bpName) var isBranchExist bool if isPlainRule { - isBranchExist = git.IsBranchExist(ctx.Req.Context(), ctx.Repo.Repository.RepoPath(), bpName) + isBranchExist = ctx.Repo.GitRepo.IsBranchExist(bpName) } if isBranchExist { diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index 4e365f24ea..a9507332f8 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -638,7 +638,7 @@ func PrepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *git.C if pull.Flow == issues_model.PullRequestFlowGithub { headBranchExist = headGitRepo.IsBranchExist(pull.HeadBranch) } else { - headBranchExist = git.IsReferenceExist(ctx, baseGitRepo.Path, pull.GetGitRefName()) + headBranchExist = headGitRepo.IsReferenceExist(pull.GetGitRefName()) } if headBranchExist { diff --git a/services/automerge/automerge.go b/services/automerge/automerge.go index cbfe3bd54e..96a0e0498d 100644 --- a/services/automerge/automerge.go +++ b/services/automerge/automerge.go @@ -162,7 +162,7 @@ func handlePullRequestAutoMerge(pullID int64, sha string) { return } case issues_model.PullRequestFlowAGit: - headBranchExist := git.IsReferenceExist(ctx, baseGitRepo.Path, pr.GetGitRefName()) + headBranchExist := headGitRepo.IsReferenceExist(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 diff --git a/services/pull/commit_status.go b/services/pull/commit_status.go index 3c864c8ef2..0a95ea1152 100644 --- a/services/pull/commit_status.go +++ b/services/pull/commit_status.go @@ -12,7 +12,6 @@ import ( "forgejo.org/models/db" git_model "forgejo.org/models/git" issues_model "forgejo.org/models/issues" - "forgejo.org/modules/git" "forgejo.org/modules/gitrepo" "forgejo.org/modules/log" "forgejo.org/modules/structs" @@ -105,7 +104,7 @@ func GetPullRequestCommitStatusState(ctx context.Context, pr *issues_model.PullR if pr.Flow == issues_model.PullRequestFlowGithub && !headGitRepo.IsBranchExist(pr.HeadBranch) { return "", errors.New("head branch does not exist, can not merge") } - if pr.Flow == issues_model.PullRequestFlowAGit && !git.IsReferenceExist(ctx, headGitRepo.Path, pr.GetGitRefName()) { + if pr.Flow == issues_model.PullRequestFlowAGit && !headGitRepo.IsReferenceExist(pr.GetGitRefName()) { return "", errors.New("head branch does not exist, can not merge") } From 288c56f5d330b72defa9656994a4ba53cd2f19cb Mon Sep 17 00:00:00 2001 From: Gusted Date: Sun, 6 Jul 2025 07:19:23 +0200 Subject: [PATCH 089/495] feat: if OAuth2 is disabled return 'Not found' for openid configuration (#8426) - If a Forgejo has disabled being a OAuth2 provider via `[oauth2].ENABLED = false` then return 'Not found' when clients requests `.well-known/openid-configuration` to reflect that OAuth2 is not supported. - This allows clients to query if Forgejo has OAuth2 enabled. - Resolves forgejo/forgejo#6978 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8426 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- routers/web/auth/oauth.go | 5 +++++ tests/integration/oauth_test.go | 30 +++++++++++++++++++++--------- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/routers/web/auth/oauth.go b/routers/web/auth/oauth.go index e8e5d2c54b..f287e0e900 100644 --- a/routers/web/auth/oauth.go +++ b/routers/web/auth/oauth.go @@ -668,6 +668,11 @@ func GrantApplicationOAuth(ctx *context.Context) { // OIDCWellKnown generates JSON so OIDC clients know Gitea's capabilities func OIDCWellKnown(ctx *context.Context) { + if !setting.OAuth2.Enabled { + ctx.Status(http.StatusNotFound) + return + } + ctx.Data["SigningKey"] = oauth2.DefaultSigningKey ctx.Data["Issuer"] = strings.TrimSuffix(setting.AppURL, "/") ctx.JSONTemplate("user/auth/oidc_wellknown") diff --git a/tests/integration/oauth_test.go b/tests/integration/oauth_test.go index 2b44863ec2..188b0426da 100644 --- a/tests/integration/oauth_test.go +++ b/tests/integration/oauth_test.go @@ -632,17 +632,29 @@ func TestSignInOAuthCallbackPKCE(t *testing.T) { }) } -func TestWellKnownDocumentIssuerDoesNotEndWithASlash(t *testing.T) { +func TestWellKnownOpenIDConfiguration(t *testing.T) { defer tests.PrepareTestEnv(t)() - req := NewRequest(t, "GET", "/.well-known/openid-configuration") - resp := MakeRequest(t, req, http.StatusOK) - type response struct { - Issuer string `json:"issuer"` - } - parsed := new(response) - DecodeJSON(t, resp, parsed) - assert.Equal(t, strings.TrimSuffix(setting.AppURL, "/"), parsed.Issuer) + t.Run("Issuer does not end with a slash", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + req := NewRequest(t, "GET", "/.well-known/openid-configuration") + resp := MakeRequest(t, req, http.StatusOK) + type response struct { + Issuer string `json:"issuer"` + } + parsed := new(response) + + DecodeJSON(t, resp, parsed) + assert.Equal(t, strings.TrimSuffix(setting.AppURL, "/"), parsed.Issuer) + }) + + t.Run("Not found if OAuth2 is not enabled", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + defer test.MockVariableValue(&setting.OAuth2.Enabled, false)() + + MakeRequest(t, NewRequest(t, "GET", "/.well-known/openid-configuration"), http.StatusNotFound) + }) } func TestSignInOAuthCallbackRedirectToEscaping(t *testing.T) { From 466e7bfcb80ff997cf6d393806c426fc6f833d91 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 6 Jul 2025 07:25:09 +0200 Subject: [PATCH 090/495] Update module github.com/go-webauthn/webauthn to v0.13.1 (forgejo) (#8427) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [github.com/go-webauthn/webauthn](https://github.com/go-webauthn/webauthn) | `v0.13.0` -> `v0.13.1` | [![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fgo-webauthn%2fwebauthn/v0.13.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fgo-webauthn%2fwebauthn/v0.13.0/v0.13.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
go-webauthn/webauthn (github.com/go-webauthn/webauthn) ### [`v0.13.1`](https://github.com/go-webauthn/webauthn/releases/tag/v0.13.1) [Compare Source](https://github.com/go-webauthn/webauthn/compare/v0.13.0...v0.13.1) ##### Bug Fixes - **protocol:** conditional create uv check ([#​434](https://github.com/go-webauthn/webauthn/issues/434)) ([2e13a60](https://github.com/go-webauthn/webauthn/commit/2e13a60aecef52d91467d444a9fc66150ecee17b)), closes [#​361](https://github.com/go-webauthn/webauthn/issues/361)
--- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8427 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index de6331722b..5f62066994 100644 --- a/go.mod +++ b/go.mod @@ -49,7 +49,7 @@ require ( github.com/go-ldap/ldap/v3 v3.4.6 github.com/go-openapi/spec v0.21.0 github.com/go-sql-driver/mysql v1.9.3 - github.com/go-webauthn/webauthn v0.13.0 + github.com/go-webauthn/webauthn v0.13.1 github.com/gobwas/glob v0.2.3 github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85 @@ -170,7 +170,7 @@ require ( github.com/go-openapi/jsonpointer v0.21.1 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/swag v0.23.1 // indirect - github.com/go-webauthn/x v0.1.21 // indirect + github.com/go-webauthn/x v0.1.22 // indirect github.com/goccy/go-json v0.10.5 // indirect github.com/golang-jwt/jwt/v4 v4.5.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect diff --git a/go.sum b/go.sum index 38a9dd5708..9e72ee5c2c 100644 --- a/go.sum +++ b/go.sum @@ -250,10 +250,10 @@ github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI6 github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= -github.com/go-webauthn/webauthn v0.13.0 h1:cJIL1/1l+22UekVhipziAaSgESJxokYkowUqAIsWs0Y= -github.com/go-webauthn/webauthn v0.13.0/go.mod h1:Oy9o2o79dbLKRPZWWgRIOdtBGAhKnDIaBp2PFkICRHs= -github.com/go-webauthn/x v0.1.21 h1:nFbckQxudvHEJn2uy1VEi713MeSpApoAv9eRqsb9AdQ= -github.com/go-webauthn/x v0.1.21/go.mod h1:sEYohtg1zL4An1TXIUIQ5csdmoO+WO0R4R2pGKaHYKA= +github.com/go-webauthn/webauthn v0.13.1 h1:Q3/GLXsckVJUPE+BGR6ex26yRIiZ/X2ITaMeSkOftuc= +github.com/go-webauthn/webauthn v0.13.1/go.mod h1:HeaBromTjgMg1sHZOzyjEiqcrk4Og7mxafDTWDepaXI= +github.com/go-webauthn/x v0.1.22 h1:rHilV/rYXawarI0uA3uZ5nhLb30Ex8RgbVAsOSt/57o= +github.com/go-webauthn/x v0.1.22/go.mod h1:+iV9BF4OsvLYzETdc0lmQO2webTos10oH6QydSoWxDM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= From ff5ef8fe8bf8c20d1986499e3cbd6ff0dc21eb7d Mon Sep 17 00:00:00 2001 From: Gusted Date: Sun, 6 Jul 2025 14:23:47 +0200 Subject: [PATCH 091/495] fix: check PR reference on base repository (#8431) - Regression of forgejo/forgejo#8425 (I was fooled by the github flow being `headGitRepo`). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8431 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- routers/web/repo/pull.go | 2 +- services/automerge/automerge.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index a9507332f8..c9a2bb4e08 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -638,7 +638,7 @@ func PrepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *git.C if pull.Flow == issues_model.PullRequestFlowGithub { headBranchExist = headGitRepo.IsBranchExist(pull.HeadBranch) } else { - headBranchExist = headGitRepo.IsReferenceExist(pull.GetGitRefName()) + headBranchExist = baseGitRepo.IsReferenceExist(pull.GetGitRefName()) } if headBranchExist { diff --git a/services/automerge/automerge.go b/services/automerge/automerge.go index 96a0e0498d..0cdc113379 100644 --- a/services/automerge/automerge.go +++ b/services/automerge/automerge.go @@ -162,7 +162,7 @@ func handlePullRequestAutoMerge(pullID int64, sha string) { return } case issues_model.PullRequestFlowAGit: - headBranchExist := headGitRepo.IsReferenceExist(pr.GetGitRefName()) + headBranchExist := baseGitRepo.IsReferenceExist(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 From f5cbb9604db5d306c6a478769374b2aba6c4f0ef Mon Sep 17 00:00:00 2001 From: Antonin Delpeuch Date: Sun, 6 Jul 2025 14:26:20 +0200 Subject: [PATCH 092/495] fix(ui): visually distinguish the branch name in action description (#8418) ## Checklist ### Tests I don't think this deserves a test. ### Documentation - [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [x] I do not want this change to show in the release notes. - [ ] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/.md` to be be used for the release notes instead of the title. ### What does it fix In the dashboard, when someone deletes a branch, the message that is displayed doesn't distinguish the branch name from the rest of the message visually. Because that's user-provided content, I find it odd, as it blends in with the system-generated message. For consistency with other messages (such as the one obtained when renaming a repository), I propose to show the branch name in monospaced font via the `` markup. I didn't update the other languages by fear of interfering with Weblate but I would be happy to update the other languages accordingly if you wish so. I didn't add any tests because I don't think it's necessary for such a small change. #### Before ![image](/attachments/f158626e-fa58-4559-81b7-dd99045e1a33) #### After ![image](/attachments/f12fe539-5c9a-4d13-a912-414591b8726d) #### Renaming a repository (unchanged, just for reference) ![image](/attachments/a2366afb-6e24-4ad7-a41d-1c0ac6f04725) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8418 Reviewed-by: Earl Warren Reviewed-by: 0ko <0ko@noreply.codeberg.org> Co-authored-by: Antonin Delpeuch Co-committed-by: Antonin Delpeuch --- options/locale/locale_bg.ini | 2 +- options/locale/locale_cs-CZ.ini | 2 +- options/locale/locale_da.ini | 2 +- options/locale/locale_de-DE.ini | 2 +- options/locale/locale_el-GR.ini | 2 +- options/locale/locale_en-US.ini | 2 +- options/locale/locale_es-ES.ini | 2 +- options/locale/locale_fi-FI.ini | 2 +- options/locale/locale_fil.ini | 2 +- options/locale/locale_fr-FR.ini | 2 +- options/locale/locale_ga-IE.ini | 2 +- options/locale/locale_hu-HU.ini | 2 +- options/locale/locale_id-ID.ini | 2 +- options/locale/locale_it-IT.ini | 2 +- options/locale/locale_ja-JP.ini | 2 +- options/locale/locale_lv-LV.ini | 2 +- options/locale/locale_nds.ini | 2 +- options/locale/locale_nl-NL.ini | 2 +- options/locale/locale_pl-PL.ini | 2 +- options/locale/locale_pt-BR.ini | 2 +- options/locale/locale_pt-PT.ini | 2 +- options/locale/locale_ru-RU.ini | 2 +- options/locale/locale_si-LK.ini | 2 +- options/locale/locale_sv-SE.ini | 2 +- options/locale/locale_tr-TR.ini | 2 +- options/locale/locale_uk-UA.ini | 2 +- options/locale/locale_zh-CN.ini | 2 +- options/locale/locale_zh-TW.ini | 2 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/options/locale/locale_bg.ini b/options/locale/locale_bg.ini index 1b9767f674..943994e061 100644 --- a/options/locale/locale_bg.ini +++ b/options/locale/locale_bg.ini @@ -2035,7 +2035,7 @@ merge_pull_request = `сля заявка за сливане %[ auto_merge_pull_request = `сля автоматично заявка за сливане %[3]s#%[2]s` watched_repo = започна да наблюдава %[2]s delete_tag = изтри маркера %[2]s от %[3]s -delete_branch = изтри клона %[2]s от %[3]s +delete_branch = изтри клона %[2]s от %[3]s create_branch = създаде клон %[3]s на %[4]s publish_release = `публикува издание %[4]s на %[3]s` push_tag = изтласка маркер %[3]s към %[4]s diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index 168965a740..81430bc96c 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -3636,7 +3636,7 @@ auto_merge_pull_request=`automaticky sloučen požadavek na natažení %s push_tag=nahrál/a značku %[3]s do %[4]s delete_tag=smazal/a značku %[2]s z %[3]s -delete_branch=smazal/a větev %[2]s z %[3]s +delete_branch=smazal/a větev %[2]s z %[3]s compare_branch=Porovnat compare_commits=Porovnat %d revizí compare_commits_general=Porovnat revize diff --git a/options/locale/locale_da.ini b/options/locale/locale_da.ini index c82779ab60..df51b5f2bf 100644 --- a/options/locale/locale_da.ini +++ b/options/locale/locale_da.ini @@ -2768,7 +2768,7 @@ close_pull_request = `lukket pull request %[3]s#%[2]s` starred_repo = stjernemarkerede %[2]s close_issue = `lukket problem %[3]s#%[2]s` comment_issue = `kommenterede problem %[3]s#%[2]s` -delete_branch = slettede gren %[2]s fra %[3]s +delete_branch = slettede gren %[2]s fra %[3]s compare_commits = Sammenlign %d commits compare_commits_general = Sammenlign commits review_dismissed = `afvist anmeldelse fra %[4]s for %[3]s#%[2]s` diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index f8bfc9258a..9be888684c 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -3640,7 +3640,7 @@ auto_merge_pull_request=`führte Pull-Request %[3]s#%[2]s au transfer_repo=hat Repository %s übertragen zu %s push_tag=hat Tag %[3]s auf %[4]s gepusht delete_tag=hat Tag %[2]s in %[3]s gelöscht -delete_branch=hat Branch %[2]s in %[3]s gelöscht +delete_branch=hat Branch %[2]s in %[3]s gelöscht compare_branch=Vergleichen compare_commits=Vergleiche %d Commits compare_commits_general=Commits vergleichen diff --git a/options/locale/locale_el-GR.ini b/options/locale/locale_el-GR.ini index 398a0d9ce4..5638d35c40 100644 --- a/options/locale/locale_el-GR.ini +++ b/options/locale/locale_el-GR.ini @@ -3563,7 +3563,7 @@ auto_merge_pull_request=`αυτόματη συγχώνευση του pull reque transfer_repo=μετέφερε το repository %s σε %s push_tag=ώθησε την ετικέτα %[3]s σε %[4]s delete_tag=διέγραψε την ετικέτα %[2]s από %[3]s -delete_branch=διέγραψε το κλάδο %[2]s από %[3]s +delete_branch=διέγραψε το κλάδο %[2]s από %[3]s compare_branch=Σύγκριση compare_commits=Σύγκριση %d commit compare_commits_general=Σύγκριση commits diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 5fd2ebd163..cce62685bf 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -3564,7 +3564,7 @@ auto_merge_pull_request = `automatically merged pull request %[3 transfer_repo = transferred repository %s to %s push_tag = pushed tag %[3]s to %[4]s delete_tag = deleted tag %[2]s from %[3]s -delete_branch = deleted branch %[2]s from %[3]s +delete_branch = deleted branch %[2]s from %[3]s compare_branch = Compare compare_commits = Compare %d commits compare_commits_general = Compare commits diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini index bdafba93b4..c572cf6385 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -3586,7 +3586,7 @@ auto_merge_pull_request=`fusionado automáticamente pull request %s
a %s push_tag=hizó push la etiqueta %[3]s a %[4]s delete_tag=etiqueta eliminada %[2]s de %[3]s -delete_branch=rama %[2]s eliminada, de %[3]s +delete_branch=rama %[2]s eliminada, de %[3]s compare_branch=Comparar compare_commits=Comparar %d commits compare_commits_general=Comparar commits diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini index efd8a16526..27942ead99 100644 --- a/options/locale/locale_fi-FI.ini +++ b/options/locale/locale_fi-FI.ini @@ -3180,7 +3180,7 @@ close_issue = `sulki ongelman %[3]s#%[2]s` merge_pull_request = `yhdisti vetopyynnön %[3]s#%[2]s` comment_pull = `kommentoi vetopyyntöä %[3]s#%[2]s` auto_merge_pull_request = `automaattisesti yhdisti vetopyynnön %[3]s#%[2]s` -delete_branch = poisti haaran %[2]s tietovarastosta %[3]s +delete_branch = poisti haaran %[2]s tietovarastosta %[3]s watched_repo = aloitti tietovaraston %[2]s tarkkailun approve_pull_request = `hyväksyi %[3]s#%[2]s` starred_repo = lisäsi tähden tietovarastolle %[2]s diff --git a/options/locale/locale_fil.ini b/options/locale/locale_fil.ini index 8c9badb04b..35378c5653 100644 --- a/options/locale/locale_fil.ini +++ b/options/locale/locale_fil.ini @@ -3758,7 +3758,7 @@ close_issue = `sinara ang isyu na %[3]s#%[2]s` review_dismissed = `na-dismiss ang pagsusuri mula %[4]s para sa %[3]s#%[2]s` close_pull_request = `sinara ang hiling sa paghila na %[3]s#%[2]s` transfer_repo = nilipat ang repositoryo na %s sa %s -delete_branch = binura ang branch %[2]s mula %[3]s +delete_branch = binura ang branch %[2]s mula %[3]s mirror_sync_push = na-sync ang mga commit sa %[3]s sa %[4]s mula sa mirror mirror_sync_create = na-syng ang bagong reference %[3]s sa %[4]s mula sa mirror publish_release = `inilabas ang %[4]s sa %[3]s` diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index e522d5ab92..544e590e85 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -3636,7 +3636,7 @@ auto_merge_pull_request=`a fusionné automatiquement la demande d’ajout %s vers %s push_tag=a poussé l’étiquette %[3]s de %[4]s delete_tag=a supprimé l’étiquette %[2]s de %[3]s -delete_branch=a supprimée la branche %[2]s de %[3]s +delete_branch=a supprimée la branche %[2]s de %[3]s compare_branch=Comparer compare_commits=Comparer %d révisions compare_commits_general=Comparer les révisions diff --git a/options/locale/locale_ga-IE.ini b/options/locale/locale_ga-IE.ini index 3bb06e8c21..deadb72a8f 100644 --- a/options/locale/locale_ga-IE.ini +++ b/options/locale/locale_ga-IE.ini @@ -2678,7 +2678,7 @@ auto_merge_pull_request = `iarratas tarraingthe cumasctha go huathoibríoch %s go %s push_tag = brú %[3]s go %[4]s delete_tag = scriosta clib %[2]s ó %[3]s -delete_branch = brainse scriosta %[2]s ó %[3]s +delete_branch = brainse scriosta %[2]s ó %[3]s compare_branch = Déan comparáid compare_commits = Déan comparáid idir tiomáintí %d compare_commits_general = Déan comparáid idir tiomáintí diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini index 3e93ee8ba9..b8c69cfe4a 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -1694,7 +1694,7 @@ create_repo=létrehozott tárolót: %s rename_repo=átnevezte a(z) %[1]s tárolót %[3]s-ra/re transfer_repo=áthelyezett egy tárolót innen: %s ide: %s delete_tag=címke %[2]s törölve innen: %[3]s -delete_branch=ág %[2]s törölve innen: %[3]s +delete_branch=ág %[2]s törölve innen: %[3]s compare_branch=Összehasonlítás compare_commits=%d commit összehasonlítása compare_commits_general=Commitok összehasonlítása diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini index f1a392105e..32d28837e1 100644 --- a/options/locale/locale_id-ID.ini +++ b/options/locale/locale_id-ID.ini @@ -1368,7 +1368,7 @@ create_repo=repositori dibuat %s rename_repo=ganti nama gudang penyimpanan dari %[1]s ke %[3]s transfer_repo=ditransfer repositori %s ke %s delete_tag=tag dihapus %[2]s dari %[3]s -delete_branch=cabang dihapus %[2]s dari %[3]s +delete_branch=cabang dihapus %[2]s dari %[3]s compare_commits=Bandingkan %d melakukan [tool] diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index d46f709cde..94ee88c4b6 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -3624,7 +3624,7 @@ merge_pull_request=`ha fuso la richiesta di modifica %[3]s#%[2]s transfer_repo=repository %s trasferito in %s push_tag=ha inviato il tag %[3]s su %[4]s delete_tag=tag eliminato %[2]s da %[3]s -delete_branch=branch eliminato %[2]s da %[3]s +delete_branch=branch eliminato %[2]s da %[3]s compare_branch=Confronta compare_commits=Confronta %d commits compare_commits_general=Confronta commit diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index 555f5c6a75..6e30f76b9a 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -3536,7 +3536,7 @@ auto_merge_pull_request=`がプルリクエスト %[3]s#%[2]s%s を %s へ移転しました push_tag=がタグ %[3]s%[4]s にプッシュしました delete_tag=がタグ %[2]s を %[3]s から削除しました -delete_branch=がブランチ %[2]s を %[3]s から削除しました +delete_branch=がブランチ %[2]s%[3]s から削除しました compare_branch=比較 compare_commits=%d件のコミットを比較 compare_commits_general=コミットを比較 diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 4a98e1aa9d..e8ee85c61a 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -3635,7 +3635,7 @@ auto_merge_pull_request=`automātiski iekļāva izmaiņu pieprasījumu %s push_tag=aizgādāja birku %[3]s uz %[4]s delete_tag=izdzēsa birku %[2]s no %[3]s -delete_branch=izdzēsa zaru %[2]s no %[3]s +delete_branch=izdzēsa zaru %[2]s no %[3]s compare_branch=Salīdzināt compare_commits=Salīdzināt %d iesūtījumus compare_commits_general=Salīdzināt iesūtījumus diff --git a/options/locale/locale_nds.ini b/options/locale/locale_nds.ini index cd91f7c35a..57afa69f78 100644 --- a/options/locale/locale_nds.ini +++ b/options/locale/locale_nds.ini @@ -3304,7 +3304,7 @@ comment_issue = `hett up Gefall %[3]s #%[2]s kommenteert` comment_pull = `hett up Haalvörslag %[3]s #%[2]s kommenteert` auto_merge_pull_request = `hett Haalvörslag %[3]s #%[2]s automatisk tosamenföhrt` transfer_repo = hett Repositorium %s na %s överdragen -delete_branch = hett Twieg %[2]s vun %[3]s lösket +delete_branch = hett Twieg %[2]s vun %[3]s lösket compare_branch = Verglieken compare_commits = %d Kommitterens verglieken compare_commits_general = Kommitterens verglieken diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index 7e08c8036c..d547b5bf77 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -3625,7 +3625,7 @@ create_repo=repository aangemaakt in %s rename_repo=hernoemde repository van %[1]s naar %[3]s transfer_repo=repository verplaatst naar %s naar %s delete_tag=heeft label %[2]s van %[3]s verwijderd -delete_branch=heeft branch %[2]s in %[3]s verwijderd +delete_branch=heeft branch %[2]s in %[3]s verwijderd compare_branch=Vergelijk compare_commits=Vergelijk %d commits compare_commits_general=Vergelijk commits diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index 189e663618..f1a92a79f3 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -3552,7 +3552,7 @@ create_repo=tworzy repozytorium %s rename_repo=zmienia nazwę repozytorium %[1]s na %[3]s transfer_repo=przenosi repozytorium %s do %s delete_tag=usuwa tag %[2]s z %[3]s -delete_branch=usuwa gałąź %[2]s z %[3]s +delete_branch=usuwa gałąź %[2]s z %[3]s compare_branch=Porównaj compare_commits=Porównaj %d commitów compare_commits_general=Porównaj commity diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index cd5cc14833..242b915137 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -3636,7 +3636,7 @@ auto_merge_pull_request=`fez merge automático do pull request % transfer_repo=transferiu repositório de %s para %s push_tag=fez push da tag %[3]s to %[4]s delete_tag=excluiu tag %[2]s de %[3]s -delete_branch=excluiu branch %[2]s de %[3]s +delete_branch=excluiu branch %[2]s de %[3]s compare_branch=Comparar compare_commits=Compare %d commits compare_commits_general=Comparar commits diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index 9e1c7f7f63..6dbc92e1f5 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -3637,7 +3637,7 @@ auto_merge_pull_request=`fez automaticamente a integração constante no pedido transfer_repo=transferiu o repositório %s para %s push_tag=enviou a etiqueta %[3]s para %[4]s delete_tag=eliminou a etiqueta %[2]de %[3]s -delete_branch=eliminou o ramo %[2]s de %[3]s +delete_branch=eliminou o ramo %[2]s de %[3]s compare_branch=Comparar compare_commits=Comparar %d comentimentos compare_commits_general=Comparar comentimentos diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 2ef1b868d4..33418a0621 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -3639,7 +3639,7 @@ auto_merge_pull_request=`автоматически принят запрос н transfer_repo=репозиторий %s был передан: %s push_tag=отправлен тег %[3]s в %[4]s delete_tag=удалён тег %[2]s в %[3]s -delete_branch=удалена ветвь %[2]s в %[3]s +delete_branch=удалена ветвь %[2]s в %[3]s compare_branch=Сравнить compare_commits=Сравнить %d коммитов compare_commits_general=Сравнить коммиты diff --git a/options/locale/locale_si-LK.ini b/options/locale/locale_si-LK.ini index 54b0b246db..cd8c9bf7d4 100644 --- a/options/locale/locale_si-LK.ini +++ b/options/locale/locale_si-LK.ini @@ -2488,7 +2488,7 @@ merge_pull_request=`ඒකාබද්ධ අදින්න ඉල්ලීම transfer_repo=මාරු කරන ලද ගබඩාව %s සිට %s push_tag=තල්ලු ටැගය %[3]s ගේ %[4]s ගේ delete_tag=මකාදැමුවා ටැගය%[2]s සිට %[3]s -delete_branch=මකාදැමූ ශාඛාව %[2]s සිට %[3]s +delete_branch=මකාදැමූ ශාඛාව %[2]s සිට %[3]s compare_branch=සසඳන්න compare_commits=%d විවරයන් සසඳා බලන්න compare_commits_general=විවරයන් සසඳා බලන්න diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index 2e212c8c49..b548e0fbf3 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -2226,7 +2226,7 @@ create_repo=skapade utvecklingskatalog %s rename_repo=döpte om utvecklingskalatogen från %[1]s till %[3]s transfer_repo=överförde utvecklingskalatogen %s till %s delete_tag=tog bort taggen %[2]s från %[3]s -delete_branch=tog bort branchen %[2]s from %[3]s +delete_branch=tog bort branchen %[2]s from %[3]s compare_branch=Jämför compare_commits=Jämför %d commits compare_commits_general=Jämför commits diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini index c07cefdab9..462187e120 100644 --- a/options/locale/locale_tr-TR.ini +++ b/options/locale/locale_tr-TR.ini @@ -3417,7 +3417,7 @@ auto_merge_pull_request=`%[3]s#%[2]s değişiklik isteği ot transfer_repo=depo %s %s'a aktarıldı push_tag=%[3]s etiketini %[4]s dalına gönderdi delete_tag=%[2]s etiketi %[3]s deposundan silindi -delete_branch=%[3]s deposundan %[2]s dalı silindi +delete_branch=%[3]s deposundan %[2]s dalı silindi compare_branch=Karşılaştır compare_commits=%d işlemeyi karşılaştır compare_commits_general=İşlemeleri karşılaştır diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 331c7403eb..9b0d6159ff 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -3355,7 +3355,7 @@ merge_pull_request=`прийняв запит злиття %[3]s transfer_repo=перенесено репозиторій %s у %s push_tag=надсилає тег %[3]s в %[4]s delete_tag=видаляє тег %[2]s із %[3]s -delete_branch=видалено гілку %[2]s з %[3]s +delete_branch=видалено гілку %[2]s з %[3]s compare_branch=Порівняти compare_commits=Порівняти %d комітів compare_commits_general=Порівняти коміти diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index d87ad53676..b12bce88ec 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -3636,7 +3636,7 @@ auto_merge_pull_request=`自动合并了拉取请求 %[3]s#%[2]s transfer_repo=将仓库 %s 转移至 %s push_tag=推送了标签 %[3]s 至仓库 %[4]s delete_tag=从%[3]s 删除了标签 %[2]s -delete_branch=从 %[3]s 删除分支 %[2]s +delete_branch=从 %[3]s 删除分支 %[2]s compare_branch=比较 compare_commits=比较 %d 提交 compare_commits_general=比较提交 diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index fba51a391e..0903f27396 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -3633,7 +3633,7 @@ auto_merge_pull_request=`自動合併了合併請求 %[3]s#%[2]s transfer_repo=將儲存庫 %s 轉移至 %s push_tag=推送了標籤 %[3]s%[4]s delete_tag=刪除了 %[3]s 的標籤 %[2]s -delete_branch=刪除了 %[3]s 的 %[2]s 分支 +delete_branch=刪除了 %[3]s%[2]s 分支 compare_branch=比較 compare_commits=比較 %d 個提交 compare_commits_general=比較提交 From da1c0f7f184ccac34cacadecb48bf25f277859ef Mon Sep 17 00:00:00 2001 From: Gusted Date: Sun, 6 Jul 2025 22:00:09 +0200 Subject: [PATCH 093/495] fix: enable multi-line math equations in wiki (#8424) - When math equation support was added into Gitea it allowed for math equations to be typed over multiple lines via `\[ ... \]` and `$$ ... $$`. Specifically the former delimiters caused problems with legitimate markdown input to be seen as a math equation and therefore was disabled in e1a82a15d3837a51409b128d4cf66d86e63788e0. - Enable this multi-line parsing for wiki as it's less likely to cause issues in the context of the wiki. - It is hard to fix this issue in a proper way without investing a good amount of time in Goldmark as explained in https://codeberg.org/forgejo/forgejo/issues/6902#issuecomment-2845317 - Added unit test. - Resolves forgejo/forgejo#6902 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8424 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- modules/markup/markdown/goldmark.go | 5 +-- modules/markup/markdown/markdown.go | 10 ++---- modules/markup/markdown/markdown_test.go | 34 ++++++++++++++++++++ modules/markup/markdown/math/block_parser.go | 10 ++++++ modules/markup/markdown/util/text.go | 6 ++++ 5 files changed, 56 insertions(+), 9 deletions(-) diff --git a/modules/markup/markdown/goldmark.go b/modules/markup/markdown/goldmark.go index d229afa8e3..67d81488fd 100644 --- a/modules/markup/markdown/goldmark.go +++ b/modules/markup/markdown/goldmark.go @@ -9,6 +9,7 @@ import ( "strings" "forgejo.org/modules/markup" + markdownutil "forgejo.org/modules/markup/markdown/util" "forgejo.org/modules/setting" "github.com/yuin/goldmark/ast" @@ -35,8 +36,8 @@ func (g *ASTTransformer) applyElementDir(n ast.Node) { func (g *ASTTransformer) Transform(node *ast.Document, reader text.Reader, pc parser.Context) { firstChild := node.FirstChild() tocMode := "" - ctx := pc.Get(renderContextKey).(*markup.RenderContext) - rc := pc.Get(renderConfigKey).(*RenderConfig) + ctx := pc.Get(markdownutil.RenderContextKey).(*markup.RenderContext) + rc := pc.Get(markdownutil.RenderConfigKey).(*RenderConfig) tocList := make([]markup.Header, 0, 20) if rc.yamlNode != nil { diff --git a/modules/markup/markdown/markdown.go b/modules/markup/markdown/markdown.go index e811d29994..2b19e0f1c9 100644 --- a/modules/markup/markdown/markdown.go +++ b/modules/markup/markdown/markdown.go @@ -16,6 +16,7 @@ import ( "forgejo.org/modules/markup/common" "forgejo.org/modules/markup/markdown/callout" "forgejo.org/modules/markup/markdown/math" + markdownutil "forgejo.org/modules/markup/markdown/util" "forgejo.org/modules/setting" giteautil "forgejo.org/modules/util" @@ -34,11 +35,6 @@ var ( specMarkdownOnce sync.Once ) -var ( - renderContextKey = parser.NewContextKey() - renderConfigKey = parser.NewContextKey() -) - type limitWriter struct { w io.Writer sum int64 @@ -64,7 +60,7 @@ func (l *limitWriter) Write(data []byte) (int, error) { // newParserContext creates a parser.Context with the render context set func newParserContext(ctx *markup.RenderContext) parser.Context { pc := parser.NewContext(parser.WithIDs(newPrefixedIDs())) - pc.Set(renderContextKey, ctx) + pc.Set(markdownutil.RenderContextKey, ctx) return pc } @@ -192,7 +188,7 @@ func actualRender(ctx *markup.RenderContext, input io.Reader, output io.Writer) } rc.metaLength = metaLength - pc.Set(renderConfigKey, rc) + pc.Set(markdownutil.RenderConfigKey, rc) if err := converter.Convert(buf, lw, parser.WithContext(pc)); err != nil { log.Error("Unable to render: %v", err) diff --git a/modules/markup/markdown/markdown_test.go b/modules/markup/markdown/markdown_test.go index f7955115e0..c854861031 100644 --- a/modules/markup/markdown/markdown_test.go +++ b/modules/markup/markdown/markdown_test.go @@ -561,6 +561,14 @@ func TestMathBlock(t *testing.T) { "test $$a$$", `

test a

` + nl, }, + { + `\[ +[\triangle ABC] = \sqrt{s(s-a)(s-b)(s-c)} +\]`, + `

[
+[\triangle ABC] = \sqrt{s(s-a)(s-b)(s-c)}
+]

` + nl, + }, } for _, test := range testcases { @@ -568,6 +576,32 @@ func TestMathBlock(t *testing.T) { require.NoError(t, err, "Unexpected error in testcase: %q", test.testcase) assert.Equal(t, template.HTML(test.expected), res, "Unexpected result in testcase %q", test.testcase) } + + t.Run("Wiki context", func(t *testing.T) { + testcases := []struct { + testcase string + expected string + }{ + { + "$a$", + `

a

` + nl, + }, + { + `\[ +[\triangle ABC] = \sqrt{s(s-a)(s-b)(s-c)} +\]`, + `

+[\triangle ABC] = \sqrt{s(s-a)(s-b)(s-c)}
+
` + nl, + }, + } + + for _, test := range testcases { + res, err := markdown.RenderString(&markup.RenderContext{Ctx: git.DefaultContext, IsWiki: true}, test.testcase) + require.NoError(t, err, "Unexpected error in testcase: %q", test.testcase) + assert.Equal(t, template.HTML(test.expected), res, "Unexpected result in testcase %q", test.testcase) + } + }) } func TestFootnote(t *testing.T) { diff --git a/modules/markup/markdown/math/block_parser.go b/modules/markup/markdown/math/block_parser.go index 527df84975..b0fe1d588a 100644 --- a/modules/markup/markdown/math/block_parser.go +++ b/modules/markup/markdown/math/block_parser.go @@ -6,6 +6,9 @@ package math import ( "bytes" + "forgejo.org/modules/markup" + markdownutil "forgejo.org/modules/markup/markdown/util" + "github.com/yuin/goldmark/ast" "github.com/yuin/goldmark/parser" "github.com/yuin/goldmark/text" @@ -61,6 +64,13 @@ func (b *blockParser) Open(parent ast.Node, reader text.Reader, pc parser.Contex return node, parser.Close | parser.NoChildren } + ctx := pc.Get(markdownutil.RenderContextKey).(*markup.RenderContext) + if ctx.IsWiki { + reader.Advance(segment.Len() - 1) + segment.Start += 2 + node.Lines().Append(segment) + return node, parser.NoChildren + } return nil, parser.NoChildren } diff --git a/modules/markup/markdown/util/text.go b/modules/markup/markdown/util/text.go index 8a42e5835b..db6e432e79 100644 --- a/modules/markup/markdown/util/text.go +++ b/modules/markup/markdown/util/text.go @@ -7,6 +7,7 @@ import ( "bytes" "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/parser" ) func textOfChildren(n ast.Node, src []byte, b *bytes.Buffer) { @@ -24,3 +25,8 @@ func Text(n ast.Node, src []byte) []byte { textOfChildren(n, src, &b) return b.Bytes() } + +var ( + RenderContextKey = parser.NewContextKey() + RenderConfigKey = parser.NewContextKey() +) From 1d310e6df5569d8f99528e1e1eb3b9fe5ebf1eba Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 7 Jul 2025 06:50:50 +0200 Subject: [PATCH 094/495] Update renovate to v41.23.1 (forgejo) (#8434) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- .forgejo/workflows/renovate.yml | 2 +- Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/renovate.yml b/.forgejo/workflows/renovate.yml index 729cba3723..d3eac5357a 100644 --- a/.forgejo/workflows/renovate.yml +++ b/.forgejo/workflows/renovate.yml @@ -28,7 +28,7 @@ jobs: runs-on: docker container: - image: data.forgejo.org/renovate/renovate:41.17.2 + image: data.forgejo.org/renovate/renovate:41.23.2 steps: - name: Load renovate repo cache diff --git a/Makefile b/Makefile index 54becdc8dc..c09e0180eb 100644 --- a/Makefile +++ b/Makefile @@ -47,7 +47,7 @@ GO_LICENSES_PACKAGE ?= github.com/google/go-licenses@v1.6.0 # renovate: datasour GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1 # renovate: datasource=go DEADCODE_PACKAGE ?= golang.org/x/tools/cmd/deadcode@v0.34.0 # renovate: datasource=go GOMOCK_PACKAGE ?= go.uber.org/mock/mockgen@v0.5.2 # renovate: datasource=go -RENOVATE_NPM_PACKAGE ?= renovate@41.17.2 # renovate: datasource=docker packageName=data.forgejo.org/renovate/renovate +RENOVATE_NPM_PACKAGE ?= renovate@41.23.2 # renovate: datasource=docker packageName=data.forgejo.org/renovate/renovate # https://github.com/disposable-email-domains/disposable-email-domains/commits/main/ DISPOSABLE_EMAILS_SHA ?= 0c27e671231d27cf66370034d7f6818037416989 # renovate: ... From 63236ed693e01bcccc838b0c2c5165c46d259f45 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 7 Jul 2025 07:39:56 +0200 Subject: [PATCH 095/495] Lock file maintenance (forgejo) (#8436) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Update | Change | |---|---| | lockFileMaintenance | All locks refreshed | 🔧 This Pull Request updates lock files to use the latest dependency versions. --- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8436 Reviewed-by: Earl Warren Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 425 ++++++++++++++--------------- web_src/fomantic/package-lock.json | 18 +- 2 files changed, 221 insertions(+), 222 deletions(-) diff --git a/package-lock.json b/package-lock.json index bc5f65fea9..2d0e10c3ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -216,12 +216,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.7.tgz", - "integrity": "sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.7" + "@babel/types": "^7.28.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -240,9 +240,9 @@ } }, "node_modules/@babel/types": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.7.tgz", - "integrity": "sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.0.tgz", + "integrity": "sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -1884,9 +1884,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.9.tgz", - "integrity": "sha512-xpz6C/vXOegF9VEtlMBlkNNIjHrLhKaFBsO4lmQGr00x5BHp7p+oliR6i7LwIcM5cZU2VjLSwm2R+/zj5IjPWg==", + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -1903,9 +1903,9 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.7.tgz", - "integrity": "sha512-maArE+jvYbj06DXh2iFlXSSDjTWXODlPTQHdDRQdGoYw7KvT4SfYCnPHfCyww8Z3JqFsW0BBjPLj8A2fwAvv7Q==", + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz", + "integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==", "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -1913,15 +1913,15 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.1.tgz", - "integrity": "sha512-mBLKRHc7Ffw/hObYb9+cunuGNjshQk+vZdwZBJoqiysK/mW3Jq0UXosq8aIhMnLevANhR9yoYfdUEOHg6M9y0g==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.26", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.26.tgz", - "integrity": "sha512-Z9rjt4BUVEbLFpw0qjCklVxxf421wrmcbP4w+LmBUxYCyJTYYSclgJD0YsCgGqQCtCIPiz7kjbYYJiAKhjJ3kA==", + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -2263,9 +2263,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.1.tgz", - "integrity": "sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.2.tgz", + "integrity": "sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==", "cpu": [ "arm" ], @@ -2277,9 +2277,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.1.tgz", - "integrity": "sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.2.tgz", + "integrity": "sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA==", "cpu": [ "arm64" ], @@ -2291,9 +2291,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.1.tgz", - "integrity": "sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.2.tgz", + "integrity": "sha512-EsnFot9ZieM35YNA26nhbLTJBHD0jTwWpPwmRVDzjylQT6gkar+zenfb8mHxWpRrbn+WytRRjE0WKsfaxBkVUA==", "cpu": [ "arm64" ], @@ -2305,9 +2305,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.1.tgz", - "integrity": "sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.2.tgz", + "integrity": "sha512-dv/t1t1RkCvJdWWxQ2lWOO+b7cMsVw5YFaS04oHpZRWehI1h0fV1gF4wgGCTyQHHjJDfbNpwOi6PXEafRBBezw==", "cpu": [ "x64" ], @@ -2319,9 +2319,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.1.tgz", - "integrity": "sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.2.tgz", + "integrity": "sha512-W4tt4BLorKND4qeHElxDoim0+BsprFTwb+vriVQnFFtT/P6v/xO5I99xvYnVzKWrK6j7Hb0yp3x7V5LUbaeOMg==", "cpu": [ "arm64" ], @@ -2333,9 +2333,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.1.tgz", - "integrity": "sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.2.tgz", + "integrity": "sha512-tdT1PHopokkuBVyHjvYehnIe20fxibxFCEhQP/96MDSOcyjM/shlTkZZLOufV3qO6/FQOSiJTBebhVc12JyPTA==", "cpu": [ "x64" ], @@ -2347,9 +2347,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.1.tgz", - "integrity": "sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.2.tgz", + "integrity": "sha512-+xmiDGGaSfIIOXMzkhJ++Oa0Gwvl9oXUeIiwarsdRXSe27HUIvjbSIpPxvnNsRebsNdUo7uAiQVgBD1hVriwSQ==", "cpu": [ "arm" ], @@ -2361,9 +2361,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.1.tgz", - "integrity": "sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.2.tgz", + "integrity": "sha512-bDHvhzOfORk3wt8yxIra8N4k/N0MnKInCW5OGZaeDYa/hMrdPaJzo7CSkjKZqX4JFUWjUGm88lI6QJLCM7lDrA==", "cpu": [ "arm" ], @@ -2375,9 +2375,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.1.tgz", - "integrity": "sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.2.tgz", + "integrity": "sha512-NMsDEsDiYghTbeZWEGnNi4F0hSbGnsuOG+VnNvxkKg0IGDvFh7UVpM/14mnMwxRxUf9AdAVJgHPvKXf6FpMB7A==", "cpu": [ "arm64" ], @@ -2389,9 +2389,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.1.tgz", - "integrity": "sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.2.tgz", + "integrity": "sha512-lb5bxXnxXglVq+7imxykIp5xMq+idehfl+wOgiiix0191av84OqbjUED+PRC5OA8eFJYj5xAGcpAZ0pF2MnW+A==", "cpu": [ "arm64" ], @@ -2403,9 +2403,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.1.tgz", - "integrity": "sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.2.tgz", + "integrity": "sha512-Yl5Rdpf9pIc4GW1PmkUGHdMtbx0fBLE1//SxDmuf3X0dUC57+zMepow2LK0V21661cjXdTn8hO2tXDdAWAqE5g==", "cpu": [ "loong64" ], @@ -2417,9 +2417,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.1.tgz", - "integrity": "sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.2.tgz", + "integrity": "sha512-03vUDH+w55s680YYryyr78jsO1RWU9ocRMaeV2vMniJJW/6HhoTBwyyiiTPVHNWLnhsnwcQ0oH3S9JSBEKuyqw==", "cpu": [ "ppc64" ], @@ -2431,9 +2431,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.1.tgz", - "integrity": "sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.2.tgz", + "integrity": "sha512-iYtAqBg5eEMG4dEfVlkqo05xMOk6y/JXIToRca2bAWuqjrJYJlx/I7+Z+4hSrsWU8GdJDFPL4ktV3dy4yBSrzg==", "cpu": [ "riscv64" ], @@ -2445,9 +2445,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.1.tgz", - "integrity": "sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.2.tgz", + "integrity": "sha512-e6vEbgaaqz2yEHqtkPXa28fFuBGmUJ0N2dOJK8YUfijejInt9gfCSA7YDdJ4nYlv67JfP3+PSWFX4IVw/xRIPg==", "cpu": [ "riscv64" ], @@ -2459,9 +2459,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.1.tgz", - "integrity": "sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.2.tgz", + "integrity": "sha512-evFOtkmVdY3udE+0QKrV5wBx7bKI0iHz5yEVx5WqDJkxp9YQefy4Mpx3RajIVcM6o7jxTvVd/qpC1IXUhGc1Mw==", "cpu": [ "s390x" ], @@ -2473,9 +2473,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.1.tgz", - "integrity": "sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.2.tgz", + "integrity": "sha512-/bXb0bEsWMyEkIsUL2Yt5nFB5naLAwyOWMEviQfQY1x3l5WsLKgvZf66TM7UTfED6erckUVUJQ/jJ1FSpm3pRQ==", "cpu": [ "x64" ], @@ -2487,9 +2487,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.1.tgz", - "integrity": "sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.2.tgz", + "integrity": "sha512-3D3OB1vSSBXmkGEZR27uiMRNiwN08/RVAcBKwhUYPaiZ8bcvdeEwWPvbnXvvXHY+A/7xluzcN+kaiOFNiOZwWg==", "cpu": [ "x64" ], @@ -2501,9 +2501,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.1.tgz", - "integrity": "sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.2.tgz", + "integrity": "sha512-VfU0fsMK+rwdK8mwODqYeM2hDrF2WiHaSmCBrS7gColkQft95/8tphyzv2EupVxn3iE0FI78wzffoULH1G+dkw==", "cpu": [ "arm64" ], @@ -2515,9 +2515,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.1.tgz", - "integrity": "sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.2.tgz", + "integrity": "sha512-+qMUrkbUurpE6DVRjiJCNGZBGo9xM4Y0FXU5cjgudWqIBWbcLkjE3XprJUsOFgC6xjBClwVa9k6O3A7K3vxb5Q==", "cpu": [ "ia32" ], @@ -2529,9 +2529,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.1.tgz", - "integrity": "sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.2.tgz", + "integrity": "sha512-3+QZROYfJ25PDcxFF66UEk8jGWigHJeecZILvkPkyQN7oc5BvFo4YEXFkOs154j3FTMp9mn9Ky8RCOwastduEA==", "cpu": [ "x64" ], @@ -3494,9 +3494,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.19.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.2.tgz", - "integrity": "sha512-9pLGGwdzOUBDYi0GNjM97FIA+f92fqSke6joWeBjWXllfNxZBs7qeMF7tvtOIsbY45xkWkxrdwUfUf3MnQa9gA==", + "version": "20.19.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.4.tgz", + "integrity": "sha512-OP+We5WV8Xnbuvw0zC2m4qfB/BJvjyCwtNjhHdJxV1639SGSKrLmJkc3fMnp2Qy8nJyHp8RO6umxELN/dS1/EA==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -3810,9 +3810,9 @@ } }, "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.9.2.tgz", - "integrity": "sha512-tS+lqTU3N0kkthU+rYp0spAYq15DU8ld9kXkaKg9sbQqJNF+WPMuNHZQGCgdxrUOEO0j22RKMwRVhF1HTl+X8A==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.0.tgz", + "integrity": "sha512-LRw5BW29sYj9NsQC6QoqeLVQhEa+BwVINYyMlcve+6stwdBsSt5UB7zw4UZB4+4PNqIVilHoMaPWCb/KhABHQw==", "cpu": [ "arm" ], @@ -3824,9 +3824,9 @@ ] }, "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.9.2.tgz", - "integrity": "sha512-MffGiZULa/KmkNjHeuuflLVqfhqLv1vZLm8lWIyeADvlElJ/GLSOkoUX+5jf4/EGtfwrNFcEaB8BRas03KT0/Q==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.0.tgz", + "integrity": "sha512-zYX8D2zcWCAHqghA8tPjbp7LwjVXbIZP++mpU/Mrf5jUVlk3BWIxkeB8yYzZi5GpFSlqMcRZQxQqbMI0c2lASQ==", "cpu": [ "arm64" ], @@ -3838,9 +3838,9 @@ ] }, "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.9.2.tgz", - "integrity": "sha512-dzJYK5rohS1sYl1DHdJ3mwfwClJj5BClQnQSyAgEfggbUwA9RlROQSSbKBLqrGfsiC/VyrDPtbO8hh56fnkbsQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.0.tgz", + "integrity": "sha512-YsYOT049hevAY/lTYD77GhRs885EXPeAfExG5KenqMJ417nYLS2N/kpRpYbABhFZBVQn+2uRPasTe4ypmYoo3w==", "cpu": [ "arm64" ], @@ -3852,9 +3852,9 @@ ] }, "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.9.2.tgz", - "integrity": "sha512-gaIMWK+CWtXcg9gUyznkdV54LzQ90S3X3dn8zlh+QR5Xy7Y+Efqw4Rs4im61K1juy4YNb67vmJsCDAGOnIeffQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.0.tgz", + "integrity": "sha512-PSjvk3OZf1aZImdGY5xj9ClFG3bC4gnSSYWrt+id0UAv+GwwVldhpMFjAga8SpMo2T1GjV9UKwM+QCsQCQmtdA==", "cpu": [ "x64" ], @@ -3866,9 +3866,9 @@ ] }, "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.9.2.tgz", - "integrity": "sha512-S7QpkMbVoVJb0xwHFwujnwCAEDe/596xqY603rpi/ioTn9VDgBHnCCxh+UFrr5yxuMH+dliHfjwCZJXOPJGPnw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.0.tgz", + "integrity": "sha512-KC/iFaEN/wsTVYnHClyHh5RSYA9PpuGfqkFua45r4sweXpC0KHZ+BYY7ikfcGPt5w1lMpR1gneFzuqWLQxsRKg==", "cpu": [ "x64" ], @@ -3880,9 +3880,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.9.2.tgz", - "integrity": "sha512-+XPUMCuCCI80I46nCDFbGum0ZODP5NWGiwS3Pj8fOgsG5/ctz+/zzuBlq/WmGa+EjWZdue6CF0aWWNv84sE1uw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.0.tgz", + "integrity": "sha512-CDh/0v8uot43cB4yKtDL9CVY8pbPnMV0dHyQCE4lFz6PW/+9tS0i9eqP5a91PAqEBVMqH1ycu+k8rP6wQU846w==", "cpu": [ "arm" ], @@ -3894,9 +3894,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.9.2.tgz", - "integrity": "sha512-sqvUyAd1JUpwbz33Ce2tuTLJKM+ucSsYpPGl2vuFwZnEIg0CmdxiZ01MHQ3j6ExuRqEDUCy8yvkDKvjYFPb8Zg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.0.tgz", + "integrity": "sha512-+TE7epATDSnvwr3L/hNHX3wQ8KQYB+jSDTdywycg3qDqvavRP8/HX9qdq/rMcnaRDn4EOtallb3vL/5wCWGCkw==", "cpu": [ "arm" ], @@ -3908,9 +3908,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.9.2.tgz", - "integrity": "sha512-UYA0MA8ajkEDCFRQdng/FVx3F6szBvk3EPnkTTQuuO9lV1kPGuTB+V9TmbDxy5ikaEgyWKxa4CI3ySjklZ9lFA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.0.tgz", + "integrity": "sha512-VBAYGg3VahofpQ+L4k/ZO8TSICIbUKKTaMYOWHWfuYBFqPbSkArZZLezw3xd27fQkxX4BaLGb/RKnW0dH9Y/UA==", "cpu": [ "arm64" ], @@ -3922,9 +3922,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.9.2.tgz", - "integrity": "sha512-P/CO3ODU9YJIHFqAkHbquKtFst0COxdphc8TKGL5yCX75GOiVpGqd1d15ahpqu8xXVsqP4MGFP2C3LRZnnL5MA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.0.tgz", + "integrity": "sha512-9IgGFUUb02J1hqdRAHXpZHIeUHRrbnGo6vrRbz0fREH7g+rzQy53/IBSyadZ/LG5iqMxukriNPu4hEMUn+uWEg==", "cpu": [ "arm64" ], @@ -3936,9 +3936,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.9.2.tgz", - "integrity": "sha512-uKStFlOELBxBum2s1hODPtgJhY4NxYJE9pAeyBgNEzHgTqTiVBPjfTlPFJkfxyTjQEuxZbbJlJnMCrRgD7ubzw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.0.tgz", + "integrity": "sha512-LR4iQ/LPjMfivpL2bQ9kmm3UnTas3U+umcCnq/CV7HAkukVdHxrDD1wwx74MIWbbgzQTLPYY7Ur2MnnvkYJCBQ==", "cpu": [ "ppc64" ], @@ -3950,9 +3950,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.9.2.tgz", - "integrity": "sha512-LkbNnZlhINfY9gK30AHs26IIVEZ9PEl9qOScYdmY2o81imJYI4IMnJiW0vJVtXaDHvBvxeAgEy5CflwJFIl3tQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.0.tgz", + "integrity": "sha512-HCupFQwMrRhrOg7YHrobbB5ADg0Q8RNiuefqMHVsdhEy9lLyXm/CxsCXeLJdrg27NAPsCaMDtdlm8Z2X8x91Tg==", "cpu": [ "riscv64" ], @@ -3964,9 +3964,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.9.2.tgz", - "integrity": "sha512-vI+e6FzLyZHSLFNomPi+nT+qUWN4YSj8pFtQZSFTtmgFoxqB6NyjxSjAxEC1m93qn6hUXhIsh8WMp+fGgxCoRg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.0.tgz", + "integrity": "sha512-Ckxy76A5xgjWa4FNrzcKul5qFMWgP5JSQ5YKd0XakmWOddPLSkQT+uAvUpQNnFGNbgKzv90DyQlxPDYPQ4nd6A==", "cpu": [ "riscv64" ], @@ -3978,9 +3978,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.9.2.tgz", - "integrity": "sha512-sSO4AlAYhSM2RAzBsRpahcJB1msc6uYLAtP6pesPbZtptF8OU/CbCPhSRW6cnYOGuVmEmWVW5xVboAqCnWTeHQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.0.tgz", + "integrity": "sha512-HfO0PUCCRte2pMJmVyxPI+eqT7KuV3Fnvn2RPvMe5mOzb2BJKf4/Vth8sSt9cerQboMaTVpbxyYjjLBWIuI5BQ==", "cpu": [ "s390x" ], @@ -3992,9 +3992,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.9.2.tgz", - "integrity": "sha512-jkSkwch0uPFva20Mdu8orbQjv2A3G88NExTN2oPTI1AJ+7mZfYW3cDCTyoH6OnctBKbBVeJCEqh0U02lTkqD5w==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.0.tgz", + "integrity": "sha512-9PZdjP7tLOEjpXHS6+B/RNqtfVUyDEmaViPOuSqcbomLdkJnalt5RKQ1tr2m16+qAufV0aDkfhXtoO7DQos/jg==", "cpu": [ "x64" ], @@ -4006,9 +4006,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.9.2.tgz", - "integrity": "sha512-Uk64NoiTpQbkpl+bXsbeyOPRpUoMdcUqa+hDC1KhMW7aN1lfW8PBlBH4mJ3n3Y47dYE8qi0XTxy1mBACruYBaw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.0.tgz", + "integrity": "sha512-qkE99ieiSKMnFJY/EfyGKVtNra52/k+lVF/PbO4EL5nU6AdvG4XhtJ+WHojAJP7ID9BNIra/yd75EHndewNRfA==", "cpu": [ "x64" ], @@ -4020,9 +4020,9 @@ ] }, "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.9.2.tgz", - "integrity": "sha512-EpBGwkcjDicjR/ybC0g8wO5adPNdVuMrNalVgYcWi+gYtC1XYNuxe3rufcO7dA76OHGeVabcO6cSkPJKVcbCXQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.0.tgz", + "integrity": "sha512-MjXek8UL9tIX34gymvQLecz2hMaQzOlaqYJJBomwm1gsvK2F7hF+YqJJ2tRyBDTv9EZJGMt4KlKkSD/gZWCOiw==", "cpu": [ "wasm32" ], @@ -4037,9 +4037,9 @@ } }, "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.9.2.tgz", - "integrity": "sha512-EdFbGn7o1SxGmN6aZw9wAkehZJetFPao0VGZ9OMBwKx6TkvDuj6cNeLimF/Psi6ts9lMOe+Dt6z19fZQ9Ye2fw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.0.tgz", + "integrity": "sha512-9LT6zIGO7CHybiQSh7DnQGwFMZvVr0kUjah6qQfkH2ghucxPV6e71sUXJdSM4Ba0MaGE6DC/NwWf7mJmc3DAng==", "cpu": [ "arm64" ], @@ -4051,9 +4051,9 @@ ] }, "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.9.2.tgz", - "integrity": "sha512-JY9hi1p7AG+5c/dMU8o2kWemM8I6VZxfGwn1GCtf3c5i+IKcMo2NQ8OjZ4Z3/itvY/Si3K10jOBQn7qsD/whUA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.0.tgz", + "integrity": "sha512-HYchBYOZ7WN266VjoGm20xFv5EonG/ODURRgwl9EZT7Bq1nLEs6VKJddzfFdXEAho0wfFlt8L/xIiE29Pmy1RA==", "cpu": [ "ia32" ], @@ -4065,9 +4065,9 @@ ] }, "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.9.2.tgz", - "integrity": "sha512-ryoo+EB19lMxAd80ln9BVf8pdOAxLb97amrQ3SFN9OCRn/5M5wvwDgAe4i8ZjhpbiHoDeP8yavcTEnpKBo7lZg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.0.tgz", + "integrity": "sha512-+oLKLHw3I1UQo4MeHfoLYF+e6YBa8p5vYUw3Rgt7IDzCs+57vIZqQlIo62NDpYM0VG6BjWOwnzBczMvbtH8hag==", "cpu": [ "x64" ], @@ -5334,9 +5334,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001726", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz", - "integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==", + "version": "1.0.30001727", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", + "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==", "funding": [ { "type": "opencollective", @@ -5539,9 +5539,9 @@ } }, "node_modules/ci-info": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz", - "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", + "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", "dev": true, "funding": [ { @@ -6904,9 +6904,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.177", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.177.tgz", - "integrity": "sha512-7EH2G59nLsEMj97fpDuvVcYi6lwTcM1xuWw3PssD8xzboAW7zj7iB3COEEEATUfjLHrs5uKBLQT03V/8URx06g==", + "version": "1.5.179", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.179.tgz", + "integrity": "sha512-UWKi/EbBopgfFsc5k61wFpV7WrnnSlSzW/e2XcBmS6qKYTivZlLtoll5/rdqRTxGglGHkmkW0j0pFNJG10EUIQ==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -7913,9 +7913,9 @@ } }, "node_modules/expect-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", - "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", + "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -11340,9 +11340,9 @@ } }, "node_modules/napi-postinstall": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.2.5.tgz", - "integrity": "sha512-kmsgUvCRIJohHjbZ3V8avP0I1Pekw329MVAMDzVxsrkjgdnqiwvMX5XwR+hWV66vsAtZ+iM+fVnq8RTQawUmCQ==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.0.tgz", + "integrity": "sha512-M7NqKyhODKV1gRLdkwE7pDsZP2/SC2a2vHkOYh9MCpKMbWVfyVfUw5MaH83Fv6XMjxr5jryUp3IDDL9rlxsTeA==", "dev": true, "license": "MIT", "bin": { @@ -11939,9 +11939,9 @@ } }, "node_modules/pkg-types": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.1.1.tgz", - "integrity": "sha512-eY0QFb6eSwc9+0d/5D2lFFUq+A3n3QNGSy/X2Nvp+6MfzGw2u6EbA7S80actgjY1lkvvI0pqB+a4hioMh443Ew==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.2.0.tgz", + "integrity": "sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==", "license": "MIT", "dependencies": { "confbox": "^0.2.2", @@ -14966,38 +14966,38 @@ } }, "node_modules/unrs-resolver": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.9.2.tgz", - "integrity": "sha512-VUyWiTNQD7itdiMuJy+EuLEErLj3uwX/EpHQF8EOf33Dq3Ju6VW1GXm+swk6+1h7a49uv9fKZ+dft9jU7esdLA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.0.tgz", + "integrity": "sha512-uw3hCGO/RdAEAb4zgJ3C/v6KIAFFOtBoxR86b2Ejc5TnH7HrhTWJR2o0A9ullC3eWMegKQCw/arQ/JivywQzkg==", "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { - "napi-postinstall": "^0.2.4" + "napi-postinstall": "^0.3.0" }, "funding": { "url": "https://opencollective.com/unrs-resolver" }, "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.9.2", - "@unrs/resolver-binding-android-arm64": "1.9.2", - "@unrs/resolver-binding-darwin-arm64": "1.9.2", - "@unrs/resolver-binding-darwin-x64": "1.9.2", - "@unrs/resolver-binding-freebsd-x64": "1.9.2", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.9.2", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.9.2", - "@unrs/resolver-binding-linux-arm64-gnu": "1.9.2", - "@unrs/resolver-binding-linux-arm64-musl": "1.9.2", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.9.2", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.9.2", - "@unrs/resolver-binding-linux-riscv64-musl": "1.9.2", - "@unrs/resolver-binding-linux-s390x-gnu": "1.9.2", - "@unrs/resolver-binding-linux-x64-gnu": "1.9.2", - "@unrs/resolver-binding-linux-x64-musl": "1.9.2", - "@unrs/resolver-binding-wasm32-wasi": "1.9.2", - "@unrs/resolver-binding-win32-arm64-msvc": "1.9.2", - "@unrs/resolver-binding-win32-ia32-msvc": "1.9.2", - "@unrs/resolver-binding-win32-x64-msvc": "1.9.2" + "@unrs/resolver-binding-android-arm-eabi": "1.11.0", + "@unrs/resolver-binding-android-arm64": "1.11.0", + "@unrs/resolver-binding-darwin-arm64": "1.11.0", + "@unrs/resolver-binding-darwin-x64": "1.11.0", + "@unrs/resolver-binding-freebsd-x64": "1.11.0", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.0", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.0", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.0", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.0", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.0", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.0", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.0", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.0", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.0", + "@unrs/resolver-binding-linux-x64-musl": "1.11.0", + "@unrs/resolver-binding-wasm32-wasi": "1.11.0", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.0", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.0", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.0" } }, "node_modules/update-browserslist-db": { @@ -15104,9 +15104,9 @@ "license": "MIT" }, "node_modules/vite": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.0.tgz", - "integrity": "sha512-ixXJB1YRgDIw2OszKQS9WxGHKwLdCsbQNkpJN171udl6szi/rIySHL6/Os3s2+oE4P/FLD4dxg4mD7Wust+u5g==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.2.tgz", + "integrity": "sha512-hxdyZDY1CM6SNpKI4w4lcUc3Mtkd9ej4ECWVHSMrOdSinVc2zYOAppHeGc/hzmRo3pxM5blMzkuWHOJA/3NiFw==", "dev": true, "license": "MIT", "dependencies": { @@ -15288,9 +15288,9 @@ } }, "node_modules/vite/node_modules/rollup": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.1.tgz", - "integrity": "sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.2.tgz", + "integrity": "sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg==", "dev": true, "license": "MIT", "dependencies": { @@ -15304,26 +15304,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.44.1", - "@rollup/rollup-android-arm64": "4.44.1", - "@rollup/rollup-darwin-arm64": "4.44.1", - "@rollup/rollup-darwin-x64": "4.44.1", - "@rollup/rollup-freebsd-arm64": "4.44.1", - "@rollup/rollup-freebsd-x64": "4.44.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.44.1", - "@rollup/rollup-linux-arm-musleabihf": "4.44.1", - "@rollup/rollup-linux-arm64-gnu": "4.44.1", - "@rollup/rollup-linux-arm64-musl": "4.44.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.44.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.44.1", - "@rollup/rollup-linux-riscv64-gnu": "4.44.1", - "@rollup/rollup-linux-riscv64-musl": "4.44.1", - "@rollup/rollup-linux-s390x-gnu": "4.44.1", - "@rollup/rollup-linux-x64-gnu": "4.44.1", - "@rollup/rollup-linux-x64-musl": "4.44.1", - "@rollup/rollup-win32-arm64-msvc": "4.44.1", - "@rollup/rollup-win32-ia32-msvc": "4.44.1", - "@rollup/rollup-win32-x64-msvc": "4.44.1", + "@rollup/rollup-android-arm-eabi": "4.44.2", + "@rollup/rollup-android-arm64": "4.44.2", + "@rollup/rollup-darwin-arm64": "4.44.2", + "@rollup/rollup-darwin-x64": "4.44.2", + "@rollup/rollup-freebsd-arm64": "4.44.2", + "@rollup/rollup-freebsd-x64": "4.44.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.44.2", + "@rollup/rollup-linux-arm-musleabihf": "4.44.2", + "@rollup/rollup-linux-arm64-gnu": "4.44.2", + "@rollup/rollup-linux-arm64-musl": "4.44.2", + "@rollup/rollup-linux-loongarch64-gnu": "4.44.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.44.2", + "@rollup/rollup-linux-riscv64-gnu": "4.44.2", + "@rollup/rollup-linux-riscv64-musl": "4.44.2", + "@rollup/rollup-linux-s390x-gnu": "4.44.2", + "@rollup/rollup-linux-x64-gnu": "4.44.2", + "@rollup/rollup-linux-x64-musl": "4.44.2", + "@rollup/rollup-win32-arm64-msvc": "4.44.2", + "@rollup/rollup-win32-ia32-msvc": "4.44.2", + "@rollup/rollup-win32-x64-msvc": "4.44.2", "fsevents": "~2.3.2" } }, @@ -15511,16 +15511,16 @@ } }, "node_modules/vue-component-type-helpers": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.2.10.tgz", - "integrity": "sha512-iDUO7uQK+Sab2tYuiP9D1oLujCWlhHELHMgV/cB13cuGbG4qwkLHvtfWb6FzvxrIOPDnU0oHsz2MlQjhYDeaHA==", + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.2.12.tgz", + "integrity": "sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw==", "dev": true, "license": "MIT" }, "node_modules/vue-eslint-parser": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.1.4.tgz", - "integrity": "sha512-EIZvCukIEMHEb3mxOKemtvWR1fcUAdWWAgkfyjmRHzvyhrZvBvH9oz69+thDIWhGiIQjZnPkCn8yHqvjM+a9eg==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.2.0.tgz", + "integrity": "sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==", "dev": true, "license": "MIT", "peer": true, @@ -15530,7 +15530,6 @@ "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.6.0", - "lodash": "^4.17.21", "semver": "^7.6.3" }, "engines": { diff --git a/web_src/fomantic/package-lock.json b/web_src/fomantic/package-lock.json index d91eb98866..314afd5869 100644 --- a/web_src/fomantic/package-lock.json +++ b/web_src/fomantic/package-lock.json @@ -494,9 +494,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.0.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.7.tgz", - "integrity": "sha512-YIEUUr4yf8q8oQoXPpSlnvKNVKDQlPMWrmOcgzoduo7kvA2UF0/BwJ/eMKFTiTtkNL17I0M6Xe2tvwFU7be6iw==", + "version": "24.0.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.10.tgz", + "integrity": "sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==", "license": "MIT", "dependencies": { "undici-types": "~7.8.0" @@ -1249,9 +1249,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001726", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz", - "integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==", + "version": "1.0.30001727", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", + "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==", "funding": [ { "type": "opencollective", @@ -2005,9 +2005,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.177", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.177.tgz", - "integrity": "sha512-7EH2G59nLsEMj97fpDuvVcYi6lwTcM1xuWw3PssD8xzboAW7zj7iB3COEEEATUfjLHrs5uKBLQT03V/8URx06g==", + "version": "1.5.179", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.179.tgz", + "integrity": "sha512-UWKi/EbBopgfFsc5k61wFpV7WrnnSlSzW/e2XcBmS6qKYTivZlLtoll5/rdqRTxGglGHkmkW0j0pFNJG10EUIQ==", "license": "ISC" }, "node_modules/emoji-regex": { From c69e8cde7a5f0512d668ca73c5fc85cabf716d7e Mon Sep 17 00:00:00 2001 From: Michael Jerger Date: Mon, 7 Jul 2025 14:29:57 +0200 Subject: [PATCH 096/495] chore(ci): temporarily disable flaky ActivityPub related tests (#8395) As discussed in forgejo/forgejo#8274 A workaround till analysis of test timeouts helped us to fix the root cause. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8395 Reviewed-by: Earl Warren Co-authored-by: Michael Jerger Co-committed-by: Michael Jerger --- .../integration/api_activitypub_actor_test.go | 77 -------- .../api_activitypub_person_test.go | 114 ------------ .../api_activitypub_repository_test.go | 174 ------------------ .../api_federation_httpsig_test.go | 82 --------- tests/integration/repo_settings_test.go | 65 ------- 5 files changed, 512 deletions(-) delete mode 100644 tests/integration/api_activitypub_actor_test.go delete mode 100644 tests/integration/api_activitypub_person_test.go delete mode 100644 tests/integration/api_activitypub_repository_test.go delete mode 100644 tests/integration/api_federation_httpsig_test.go diff --git a/tests/integration/api_activitypub_actor_test.go b/tests/integration/api_activitypub_actor_test.go deleted file mode 100644 index 42232bd640..0000000000 --- a/tests/integration/api_activitypub_actor_test.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2024 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package integration - -import ( - "fmt" - "net/http" - "net/url" - "strconv" - "testing" - - "forgejo.org/modules/forgefed" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/routers" - "forgejo.org/services/contexttest" - "forgejo.org/services/federation" - "forgejo.org/tests" - - ap "github.com/go-ap/activitypub" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestActivityPubActor(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - defer tests.PrepareTestEnv(t)() - - req := NewRequest(t, "GET", "/api/v1/activitypub/actor") - resp := MakeRequest(t, req, http.StatusOK) - assert.Contains(t, resp.Body.String(), "@context") - - var actor ap.Actor - err := actor.UnmarshalJSON(resp.Body.Bytes()) - require.NoError(t, err) - - assert.Equal(t, ap.ApplicationType, actor.Type) - assert.Equal(t, "ghost", actor.PreferredUsername.String()) - keyID := actor.GetID().String() - assert.Regexp(t, "activitypub/actor$", keyID) - assert.Regexp(t, "activitypub/actor/inbox$", actor.Inbox.GetID().String()) - - pubKey := actor.PublicKey - assert.NotNil(t, pubKey) - publicKeyID := keyID + "#main-key" - assert.Equal(t, pubKey.ID.String(), publicKeyID) - - pubKeyPem := pubKey.PublicKeyPem - assert.NotNil(t, pubKeyPem) - assert.Regexp(t, "^-----BEGIN PUBLIC KEY-----", pubKeyPem) -} - -func TestActorNewFromKeyId(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - - onGiteaRun(t, func(t *testing.T, u *url.URL) { - ctx, _ := contexttest.MockAPIContext(t, "/api/v1/activitypub/actor") - sut, err := federation.NewActorIDFromKeyID(ctx.Base, fmt.Sprintf("%sapi/v1/activitypub/actor#main-key", u)) - require.NoError(t, err) - - port, err := strconv.ParseUint(u.Port(), 10, 16) - require.NoError(t, err) - - assert.Equal(t, forgefed.ActorID{ - ID: "actor", - HostSchema: "http", - Path: "api/v1/activitypub", - Host: setting.Domain, - HostPort: uint16(port), - UnvalidatedInput: fmt.Sprintf("http://%s:%d/api/v1/activitypub/actor", setting.Domain, port), - IsPortSupplemented: false, - }, sut) - }) -} diff --git a/tests/integration/api_activitypub_person_test.go b/tests/integration/api_activitypub_person_test.go deleted file mode 100644 index ca3bc844d7..0000000000 --- a/tests/integration/api_activitypub_person_test.go +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2022 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package integration - -import ( - "fmt" - "net/http" - "net/url" - "testing" - - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/activitypub" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/routers" - "forgejo.org/tests" - - ap "github.com/go-ap/activitypub" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestActivityPubPerson(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - - mock := test.NewFederationServerMock() - federatedSrv := mock.DistantServer(t) - defer federatedSrv.Close() - - onGiteaRun(t, func(t *testing.T, localUrl *url.URL) { - defer test.MockVariableValue(&setting.AppURL, localUrl.String())() - - localUserID := 2 - localUserName := "user2" - localUserURL := fmt.Sprintf("%sapi/v1/activitypub/user-id/%d", localUrl, localUserID) - - // distantURL := federatedSrv.URL - // distantUser15URL := fmt.Sprintf("%s/api/v1/activitypub/user-id/15", distantURL) - - cf, err := activitypub.GetClientFactory(db.DefaultContext) - require.NoError(t, err) - - c, err := cf.WithKeysDirect(db.DefaultContext, mock.Persons[0].PrivKey, - mock.Persons[0].KeyID(federatedSrv.URL)) - require.NoError(t, err) - - // Unsigned request - t.Run("UnsignedRequest", func(t *testing.T) { - req := NewRequest(t, "GET", localUserURL) - MakeRequest(t, req, http.StatusBadRequest) - }) - - t.Run("SignedRequestValidation", func(t *testing.T) { - // Signed request - resp, err := c.GetBody(localUserURL) - require.NoError(t, err) - - var person ap.Person - err = person.UnmarshalJSON(resp) - require.NoError(t, err) - - assert.Equal(t, ap.PersonType, person.Type) - assert.Equal(t, localUserName, person.PreferredUsername.String()) - assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%d$", localUserID), person.GetID()) - assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%d/inbox$", localUserID), person.Inbox.GetID().String()) - - assert.NotNil(t, person.PublicKey) - assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%d#main-key$", localUserID), person.PublicKey.ID) - - assert.NotNil(t, person.PublicKey.PublicKeyPem) - assert.Regexp(t, "^-----BEGIN PUBLIC KEY-----", person.PublicKey.PublicKeyPem) - }) - }) -} - -func TestActivityPubMissingPerson(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - defer tests.PrepareTestEnv(t)() - - req := NewRequest(t, "GET", "/api/v1/activitypub/user-id/999999999") - resp := MakeRequest(t, req, http.StatusNotFound) - assert.Contains(t, resp.Body.String(), "user does not exist") -} - -func TestActivityPubPersonInbox(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - - onGiteaRun(t, func(t *testing.T, u *url.URL) { - defer test.MockVariableValue(&setting.AppURL, u.String())() - user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) - - user1url := u.JoinPath("/api/v1/activitypub/user-id/1").String() + "#main-key" - cf, err := activitypub.GetClientFactory(db.DefaultContext) - require.NoError(t, err) - c, err := cf.WithKeys(db.DefaultContext, user1, user1url) - require.NoError(t, err) - user2inboxurl := u.JoinPath("/api/v1/activitypub/user-id/2/inbox").String() - - // Signed request succeeds - resp, err := c.Post([]byte{}, user2inboxurl) - require.NoError(t, err) - assert.Equal(t, http.StatusNoContent, resp.StatusCode) - - // Unsigned request fails - req := NewRequest(t, "POST", user2inboxurl) - MakeRequest(t, req, http.StatusBadRequest) - }) -} diff --git a/tests/integration/api_activitypub_repository_test.go b/tests/integration/api_activitypub_repository_test.go deleted file mode 100644 index 14ea1a4b66..0000000000 --- a/tests/integration/api_activitypub_repository_test.go +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright 2024, 2025 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package integration - -import ( - "fmt" - "net/http" - "net/url" - "testing" - "time" - - "forgejo.org/models/db" - "forgejo.org/models/forgefed" - "forgejo.org/models/unittest" - "forgejo.org/models/user" - "forgejo.org/modules/activitypub" - forgefed_modules "forgejo.org/modules/forgefed" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/routers" - "forgejo.org/tests" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestActivityPubRepository(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - - mock := test.NewFederationServerMock() - federatedSrv := mock.DistantServer(t) - defer federatedSrv.Close() - - onGiteaRun(t, func(t *testing.T, u *url.URL) { - repositoryID := 2 - - cf, err := activitypub.GetClientFactory(db.DefaultContext) - require.NoError(t, err) - - c, err := cf.WithKeysDirect(db.DefaultContext, mock.Persons[0].PrivKey, - mock.Persons[0].KeyID(federatedSrv.URL)) - require.NoError(t, err) - - resp, err := c.GetBody(fmt.Sprintf("%sapi/v1/activitypub/repository-id/%d", u, repositoryID)) - require.NoError(t, err) - assert.Contains(t, string(resp), "@context") - - var repository forgefed_modules.Repository - err = repository.UnmarshalJSON(resp) - require.NoError(t, err) - - assert.Regexp(t, fmt.Sprintf("activitypub/repository-id/%d$", repositoryID), repository.GetID().String()) - }) -} - -func TestActivityPubMissingRepository(t *testing.T) { - defer tests.PrepareTestEnv(t)() - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&setting.Federation.SignatureEnforced, false)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - - repositoryID := 9999999 - req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/activitypub/repository-id/%d", repositoryID)) - resp := MakeRequest(t, req, http.StatusNotFound) - assert.Contains(t, resp.Body.String(), "repository does not exist") -} - -func TestActivityPubRepositoryInboxValid(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - - mock := test.NewFederationServerMock() - federatedSrv := mock.DistantServer(t) - defer federatedSrv.Close() - - onGiteaRun(t, func(t *testing.T, u *url.URL) { - repositoryID := 2 - timeNow := time.Now().UTC() - - cf, err := activitypub.GetClientFactory(db.DefaultContext) - require.NoError(t, err) - - c, err := cf.WithKeysDirect(db.DefaultContext, mock.Persons[0].PrivKey, - mock.Persons[0].KeyID(federatedSrv.URL)) - require.NoError(t, err) - - repoInboxURL := u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d/inbox", repositoryID)).String() - - activity1 := []byte(fmt.Sprintf( - `{"type":"Like",`+ - `"startTime":"%s",`+ - `"actor":"%s/api/v1/activitypub/user-id/15",`+ - `"object":"%s"}`, - timeNow.Format(time.RFC3339), - federatedSrv.URL, u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d", repositoryID)).String())) - t.Logf("activity: %s", activity1) - resp, err := c.Post(activity1, repoInboxURL) - - require.NoError(t, err) - assert.Equal(t, http.StatusNoContent, resp.StatusCode) - - federationHost := unittest.AssertExistsAndLoadBean(t, &forgefed.FederationHost{HostFqdn: "127.0.0.1"}) - federatedUser := unittest.AssertExistsAndLoadBean(t, &user.FederatedUser{ExternalID: "15", FederationHostID: federationHost.ID}) - unittest.AssertExistsAndLoadBean(t, &user.User{ID: federatedUser.UserID}) - - // A like activity by a different user of the same federated host. - activity2 := []byte(fmt.Sprintf( - `{"type":"Like",`+ - `"startTime":"%s",`+ - `"actor":"%s/api/v1/activitypub/user-id/30",`+ - `"object":"%s"}`, - // Make sure this activity happens later then the one before - timeNow.Add(time.Second).Format(time.RFC3339), - federatedSrv.URL, u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d", repositoryID)).String())) - t.Logf("activity: %s", activity2) - resp, err = c.Post(activity2, repoInboxURL) - - require.NoError(t, err) - assert.Equal(t, http.StatusNoContent, resp.StatusCode) - - federatedUser = unittest.AssertExistsAndLoadBean(t, &user.FederatedUser{ExternalID: "30", FederationHostID: federationHost.ID}) - unittest.AssertExistsAndLoadBean(t, &user.User{ID: federatedUser.UserID}) - - // The same user sends another like activity - otherRepositoryID := 3 - otherRepoInboxURL := u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d/inbox", otherRepositoryID)).String() - activity3 := []byte(fmt.Sprintf( - `{"type":"Like",`+ - `"startTime":"%s",`+ - `"actor":"%s/api/v1/activitypub/user-id/30",`+ - `"object":"%s"}`, - // Make sure this activity happens later then the ones before - timeNow.Add(time.Second*2).Format(time.RFC3339), - federatedSrv.URL, u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d", otherRepositoryID)).String())) - t.Logf("activity: %s", activity3) - resp, err = c.Post(activity3, otherRepoInboxURL) - - require.NoError(t, err) - assert.Equal(t, http.StatusNoContent, resp.StatusCode) - - federatedUser = unittest.AssertExistsAndLoadBean(t, &user.FederatedUser{ExternalID: "30", FederationHostID: federationHost.ID}) - unittest.AssertExistsAndLoadBean(t, &user.User{ID: federatedUser.UserID}) - - // Replay activity2. - resp, err = c.Post(activity2, repoInboxURL) - require.NoError(t, err) - assert.Equal(t, http.StatusNotAcceptable, resp.StatusCode) - }) -} - -func TestActivityPubRepositoryInboxInvalid(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&setting.Federation.SignatureEnforced, false)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - - onGiteaRun(t, func(t *testing.T, u *url.URL) { - apServerActor := user.NewAPServerActor() - repositoryID := 2 - - cf, err := activitypub.GetClientFactory(db.DefaultContext) - require.NoError(t, err) - - c, err := cf.WithKeys(db.DefaultContext, apServerActor, apServerActor.KeyID()) - require.NoError(t, err) - - repoInboxURL := u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d/inbox", repositoryID)).String() - activity := []byte(`{"type":"Wrong"}`) - resp, err := c.Post(activity, repoInboxURL) - require.NoError(t, err) - assert.Equal(t, http.StatusNotAcceptable, resp.StatusCode) - }) -} diff --git a/tests/integration/api_federation_httpsig_test.go b/tests/integration/api_federation_httpsig_test.go deleted file mode 100644 index a8deaa315f..0000000000 --- a/tests/integration/api_federation_httpsig_test.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2025 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package integration - -import ( - "fmt" - "net/http" - "net/url" - "testing" - - "forgejo.org/models/db" - "forgejo.org/models/forgefed" - "forgejo.org/models/unittest" - "forgejo.org/models/user" - "forgejo.org/modules/activitypub" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/routers" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestFederationHttpSigValidation(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - - onGiteaRun(t, func(t *testing.T, u *url.URL) { - userID := 2 - userURL := fmt.Sprintf("%sapi/v1/activitypub/user-id/%d", u, userID) - - user1 := unittest.AssertExistsAndLoadBean(t, &user.User{ID: 1}) - - clientFactory, err := activitypub.GetClientFactory(db.DefaultContext) - require.NoError(t, err) - - apClient, err := clientFactory.WithKeys(db.DefaultContext, user1, user1.KeyID()) - require.NoError(t, err) - - // Unsigned request - t.Run("UnsignedRequest", func(t *testing.T) { - req := NewRequest(t, "GET", userURL) - MakeRequest(t, req, http.StatusBadRequest) - }) - - // Signed request - t.Run("SignedRequest", func(t *testing.T) { - resp, err := apClient.Get(userURL) - require.NoError(t, err) - assert.Equal(t, http.StatusOK, resp.StatusCode) - }) - - // HACK HACK HACK: the host part of the URL gets set to which IP forgejo is - // listening on, NOT localhost, which is the Domain given to forgejo which - // is then used for eg. the keyID all requests - applicationKeyID := fmt.Sprintf("%sapi/v1/activitypub/actor#main-key", setting.AppURL) - actorKeyID := fmt.Sprintf("%sapi/v1/activitypub/user-id/1#main-key", setting.AppURL) - - // Check for cached public keys - t.Run("ValidateCaches", func(t *testing.T) { - host, err := forgefed.FindFederationHostByKeyID(db.DefaultContext, applicationKeyID) - require.NoError(t, err) - assert.NotNil(t, host) - assert.True(t, host.PublicKey.Valid) - - _, user, err := user.FindFederatedUserByKeyID(db.DefaultContext, actorKeyID) - require.NoError(t, err) - assert.NotNil(t, user) - assert.True(t, user.PublicKey.Valid) - }) - - // Disable signature validation - defer test.MockVariableValue(&setting.Federation.SignatureEnforced, false)() - - // Unsigned request - t.Run("SignatureValidationDisabled", func(t *testing.T) { - req := NewRequest(t, "GET", userURL) - MakeRequest(t, req, http.StatusOK) - }) - }) -} diff --git a/tests/integration/repo_settings_test.go b/tests/integration/repo_settings_test.go index 63cc5332bc..6b467d78b2 100644 --- a/tests/integration/repo_settings_test.go +++ b/tests/integration/repo_settings_test.go @@ -6,21 +6,16 @@ package integration import ( "fmt" "net/http" - "strings" "testing" "forgejo.org/models/db" - "forgejo.org/models/forgefed" git_model "forgejo.org/models/git" repo_model "forgejo.org/models/repo" unit_model "forgejo.org/models/unit" "forgejo.org/models/unittest" user_model "forgejo.org/models/user" - fm "forgejo.org/modules/forgefed" "forgejo.org/modules/optional" "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/modules/validation" gitea_context "forgejo.org/services/context" repo_service "forgejo.org/services/repository" user_service "forgejo.org/services/user" @@ -311,63 +306,3 @@ func TestProtectedBranch(t *testing.T) { unittest.AssertCount(t, &git_model.ProtectedBranch{RuleName: "master", RepoID: repo.ID}, 1) }) } - -func TestRepoFollowing(t *testing.T) { - defer tests.PrepareTestEnv(t)() - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - - mock := test.NewFederationServerMock() - federatedSrv := mock.DistantServer(t) - defer federatedSrv.Close() - - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1, OwnerID: user.ID}) - session := loginUser(t, user.Name) - - t.Run("Add a following repo", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - link := fmt.Sprintf("/%s/settings", repo.FullName()) - - req := NewRequestWithValues(t, "POST", link, map[string]string{ - "_csrf": GetCSRF(t, session, link), - "action": "federation", - "following_repos": fmt.Sprintf("%s/api/v1/activitypub/repository-id/1", federatedSrv.URL), - }) - session.MakeRequest(t, req, http.StatusSeeOther) - - // Verify it was added. - federationHost := unittest.AssertExistsAndLoadBean(t, &forgefed.FederationHost{HostFqdn: "127.0.0.1"}) - unittest.AssertExistsAndLoadBean(t, &repo_model.FollowingRepo{ - ExternalID: "1", - FederationHostID: federationHost.ID, - }) - }) - - t.Run("Star a repo having a following repo", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - repoLink := fmt.Sprintf("/%s", repo.FullName()) - link := fmt.Sprintf("%s/action/star", repoLink) - req := NewRequestWithValues(t, "POST", link, map[string]string{ - "_csrf": GetCSRF(t, session, repoLink), - }) - - session.MakeRequest(t, req, http.StatusOK) - - // Verify distant server received a like activity - like := fm.ForgeLike{} - err := like.UnmarshalJSON([]byte(mock.LastPost)) - if err != nil { - t.Errorf("Error unmarshalling ForgeLike: %q", err) - } - if isValid, err := validation.IsValid(like); !isValid { - t.Errorf("ForgeLike is not valid: %q", err) - } - activityType := like.Type - object := like.Object.GetLink().String() - isLikeType := activityType == "Like" - isCorrectObject := strings.HasSuffix(object, "/api/v1/activitypub/repository-id/1") - if !isLikeType || !isCorrectObject { - t.Error("Activity is not a like for this repo") - } - }) -} From cee2aae4cacd9caab98a4cbb273aab1cf0d0137b Mon Sep 17 00:00:00 2001 From: oliverpool Date: Mon, 7 Jul 2025 18:04:00 +0200 Subject: [PATCH 097/495] fix: corrupted wiki unit default permission (#8234 follow-up) (#8258) Closes #8119, follow-up of #8234 #8234 "only" fixed the case when a new wiki setting was applied. However it lacked 2 aspects: - fixing the already corrupted unit permission in the database (required a migration) - fixing the API route Both aspects should now be covered. Additionally, I commented out the unused `UnitAccessMode` and indicated that they are only used for the wiki-unit (hopefully saving some time to future code-readers). ### Testing - go to a commit before #8234 (e.g. 285f66b782491d05e35aa81a6e1a0fede85069b4) - create 3 repositories - save the wiki settings of the second, without any change - set the wiki of the third to be globally writable - verify the `default_permissions` column in the database, of the unit `5`: 0, 2, 3 - stop Forgejo, switch to this PR and start Forgejo - verify that the logs writes `Migration[35]: Fix wiki unit default permission` - verify the `default_permissions` column in the database, of the unit `5`: 0, 0, 3 Before: ![2025-06-23-150055.png](/attachments/1eb92507-b8b4-422c-921c-4296a91172e7) After: ![2025-06-23-150853.png](/attachments/c7b53397-54fe-487d-89da-e10b26538cde) - [x] I did not document these changes and I do not expect someone else to do it. - [x] I do not want this change to show in the release notes. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8258 Reviewed-by: Earl Warren Co-authored-by: oliverpool Co-committed-by: oliverpool --- models/forgejo_migrations/migrate.go | 2 + models/forgejo_migrations/v36.go | 55 ++++++++++++++++++++++++++++ models/repo/repo_unit.go | 17 +++++---- models/repo/repo_unit_test.go | 4 +- routers/api/v1/repo/repo.go | 2 +- 5 files changed, 70 insertions(+), 10 deletions(-) create mode 100644 models/forgejo_migrations/v36.go diff --git a/models/forgejo_migrations/migrate.go b/models/forgejo_migrations/migrate.go index 50391ff650..fcea69d23f 100644 --- a/models/forgejo_migrations/migrate.go +++ b/models/forgejo_migrations/migrate.go @@ -109,6 +109,8 @@ var migrations = []*Migration{ NewMigration("Add `notify-email` column to `action_run` table", AddNotifyEmailToActionRun), // v34 -> v35 NewMigration("Noop because of https://codeberg.org/forgejo/forgejo/issues/8373", NoopAddIndexToActionRunStopped), + // v35 -> v36 + NewMigration("Fix wiki unit default permission", FixWikiUnitDefaultPermission), } // GetCurrentDBVersion returns the current Forgejo database version. diff --git a/models/forgejo_migrations/v36.go b/models/forgejo_migrations/v36.go new file mode 100644 index 0000000000..1a798147cf --- /dev/null +++ b/models/forgejo_migrations/v36.go @@ -0,0 +1,55 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package forgejo_migrations + +import ( + "xorm.io/xorm" +) + +func FixWikiUnitDefaultPermission(x *xorm.Engine) error { + // Type is Unit's Type + type Type int + + // Enumerate all the unit types + const ( + TypeInvalid Type = iota // 0 invalid + TypeCode // 1 code + TypeIssues // 2 issues + TypePullRequests // 3 PRs + TypeReleases // 4 Releases + TypeWiki // 5 Wiki + TypeExternalWiki // 6 ExternalWiki + TypeExternalTracker // 7 ExternalTracker + TypeProjects // 8 Projects + TypePackages // 9 Packages + TypeActions // 10 Actions + ) + + // RepoUnitAccessMode specifies the users access mode to a repo unit + type UnitAccessMode int + + const ( + // UnitAccessModeUnset - no unit mode set + UnitAccessModeUnset UnitAccessMode = iota // 0 + // UnitAccessModeNone no access + UnitAccessModeNone // 1 + // UnitAccessModeRead read access + UnitAccessModeRead // 2 + // UnitAccessModeWrite write access + UnitAccessModeWrite // 3 + ) + _ = UnitAccessModeNone + _ = UnitAccessModeWrite + + type RepoUnit struct { + DefaultPermissions UnitAccessMode `xorm:"NOT NULL DEFAULT 0"` + } + _, err := x.Where("type = ?", TypeWiki). + Where("default_permissions = ?", UnitAccessModeRead). + Cols("default_permissions"). + Update(RepoUnit{ + DefaultPermissions: UnitAccessModeUnset, + }) + return err +} diff --git a/models/repo/repo_unit.go b/models/repo/repo_unit.go index c11ad70627..e50f79e945 100644 --- a/models/repo/repo_unit.go +++ b/models/repo/repo_unit.go @@ -41,27 +41,30 @@ func (err ErrUnitTypeNotExist) Unwrap() error { } // RepoUnitAccessMode specifies the users access mode to a repo unit +// Only UnitAccessModeWrite is used by the wiki, to mark it as instance-writable type UnitAccessMode int const ( // UnitAccessModeUnset - no unit mode set UnitAccessModeUnset UnitAccessMode = iota // 0 + // UnitAccessModeNone no access - UnitAccessModeNone // 1 + // UnitAccessModeNone UnitAccessMode = 1 // UnitAccessModeRead read access - UnitAccessModeRead // 2 + // UnitAccessModeRead UnitAccessMode = 2 + // UnitAccessModeWrite write access - UnitAccessModeWrite // 3 + UnitAccessModeWrite UnitAccessMode = 3 ) func (mode UnitAccessMode) ToAccessMode(modeIfUnset perm.AccessMode) perm.AccessMode { switch mode { case UnitAccessModeUnset: return modeIfUnset - case UnitAccessModeNone: - return perm.AccessModeNone - case UnitAccessModeRead: - return perm.AccessModeRead + // case UnitAccessModeNone: + // return perm.AccessModeNone + // case UnitAccessModeRead: + // return perm.AccessModeRead case UnitAccessModeWrite: return perm.AccessModeWrite default: diff --git a/models/repo/repo_unit_test.go b/models/repo/repo_unit_test.go index a1964519bd..3d6d408fcb 100644 --- a/models/repo/repo_unit_test.go +++ b/models/repo/repo_unit_test.go @@ -34,8 +34,8 @@ func TestActionsConfig(t *testing.T) { } func TestRepoUnitAccessMode(t *testing.T) { - assert.Equal(t, perm.AccessModeNone, UnitAccessModeNone.ToAccessMode(perm.AccessModeAdmin)) - assert.Equal(t, perm.AccessModeRead, UnitAccessModeRead.ToAccessMode(perm.AccessModeAdmin)) + // assert.Equal(t, perm.AccessModeNone, UnitAccessModeNone.ToAccessMode(perm.AccessModeAdmin)) + // assert.Equal(t, perm.AccessModeRead, UnitAccessModeRead.ToAccessMode(perm.AccessModeAdmin)) assert.Equal(t, perm.AccessModeWrite, UnitAccessModeWrite.ToAccessMode(perm.AccessModeAdmin)) assert.Equal(t, perm.AccessModeRead, UnitAccessModeUnset.ToAccessMode(perm.AccessModeRead)) } diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index 3d6a40e9ab..42385d54a6 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -861,7 +861,7 @@ func updateRepoUnits(ctx *context.APIContext, owner string, repo *repo_model.Rep if *opts.GloballyEditableWiki { wikiPermissions = repo_model.UnitAccessModeWrite } else { - wikiPermissions = repo_model.UnitAccessModeRead + wikiPermissions = repo_model.UnitAccessModeUnset } } From 1d838c8d5ec76fcea4dbdc61ac74bfb89ffb4d11 Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Mon, 7 Jul 2025 20:23:20 +0200 Subject: [PATCH 098/495] [v12.0/forgejo] fix: corrupted wiki unit default permission (#8234 follow-up) (#8439) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8258 Closes #8119, follow-up of #8234 #8234 "only" fixed the case when a new wiki setting was applied. However it lacked 2 aspects: - fixing the already corrupted unit permission in the database (required a migration) - fixing the API route Both aspects should now be covered. Additionally, I commented out the unused `UnitAccessMode` and indicated that they are only used for the wiki-unit (hopefully saving some time to future code-readers). ### Testing - go to a commit before #8234 (e.g. 285f66b782491d05e35aa81a6e1a0fede85069b4) - create 3 repositories - save the wiki settings of the second, without any change - set the wiki of the third to be globally writable - verify the `default_permissions` column in the database, of the unit `5`: 0, 2, 3 - stop Forgejo, switch to this PR and start Forgejo - verify that the logs writes `Migration[35]: Fix wiki unit default permission` - verify the `default_permissions` column in the database, of the unit `5`: 0, 0, 3 Before: ![2025-06-23-150055.png](/attachments/1eb92507-b8b4-422c-921c-4296a91172e7) After: ![2025-06-23-150853.png](/attachments/c7b53397-54fe-487d-89da-e10b26538cde) - [x] I did not document these changes and I do not expect someone else to do it. - [x] I do not want this change to show in the release notes. Co-authored-by: oliverpool Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8439 Reviewed-by: Earl Warren Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- models/forgejo_migrations/migrate.go | 2 + models/forgejo_migrations/v36.go | 55 ++++++++++++++++++++++++++++ models/repo/repo_unit.go | 17 +++++---- models/repo/repo_unit_test.go | 4 +- routers/api/v1/repo/repo.go | 2 +- 5 files changed, 70 insertions(+), 10 deletions(-) create mode 100644 models/forgejo_migrations/v36.go diff --git a/models/forgejo_migrations/migrate.go b/models/forgejo_migrations/migrate.go index bc64f07013..94469b7371 100644 --- a/models/forgejo_migrations/migrate.go +++ b/models/forgejo_migrations/migrate.go @@ -109,6 +109,8 @@ var migrations = []*Migration{ NewMigration("Add `notify-email` column to `action_run` table", AddNotifyEmailToActionRun), // v34 -> v35 NewMigration("Noop because of https://codeberg.org/forgejo/forgejo/issues/8373", NoopAddIndexToActionRunStopped), + // v35 -> v36 + NewMigration("Fix wiki unit default permission", FixWikiUnitDefaultPermission), } // GetCurrentDBVersion returns the current Forgejo database version. diff --git a/models/forgejo_migrations/v36.go b/models/forgejo_migrations/v36.go new file mode 100644 index 0000000000..019c177a08 --- /dev/null +++ b/models/forgejo_migrations/v36.go @@ -0,0 +1,55 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package forgejo_migrations //nolint:revive + +import ( + "xorm.io/xorm" +) + +func FixWikiUnitDefaultPermission(x *xorm.Engine) error { + // Type is Unit's Type + type Type int + + // Enumerate all the unit types + const ( + TypeInvalid Type = iota // 0 invalid + TypeCode // 1 code + TypeIssues // 2 issues + TypePullRequests // 3 PRs + TypeReleases // 4 Releases + TypeWiki // 5 Wiki + TypeExternalWiki // 6 ExternalWiki + TypeExternalTracker // 7 ExternalTracker + TypeProjects // 8 Projects + TypePackages // 9 Packages + TypeActions // 10 Actions + ) + + // RepoUnitAccessMode specifies the users access mode to a repo unit + type UnitAccessMode int + + const ( + // UnitAccessModeUnset - no unit mode set + UnitAccessModeUnset UnitAccessMode = iota // 0 + // UnitAccessModeNone no access + UnitAccessModeNone // 1 + // UnitAccessModeRead read access + UnitAccessModeRead // 2 + // UnitAccessModeWrite write access + UnitAccessModeWrite // 3 + ) + _ = UnitAccessModeNone + _ = UnitAccessModeWrite + + type RepoUnit struct { + DefaultPermissions UnitAccessMode `xorm:"NOT NULL DEFAULT 0"` + } + _, err := x.Where("type = ?", TypeWiki). + Where("default_permissions = ?", UnitAccessModeRead). + Cols("default_permissions"). + Update(RepoUnit{ + DefaultPermissions: UnitAccessModeUnset, + }) + return err +} diff --git a/models/repo/repo_unit.go b/models/repo/repo_unit.go index c11ad70627..e50f79e945 100644 --- a/models/repo/repo_unit.go +++ b/models/repo/repo_unit.go @@ -41,27 +41,30 @@ func (err ErrUnitTypeNotExist) Unwrap() error { } // RepoUnitAccessMode specifies the users access mode to a repo unit +// Only UnitAccessModeWrite is used by the wiki, to mark it as instance-writable type UnitAccessMode int const ( // UnitAccessModeUnset - no unit mode set UnitAccessModeUnset UnitAccessMode = iota // 0 + // UnitAccessModeNone no access - UnitAccessModeNone // 1 + // UnitAccessModeNone UnitAccessMode = 1 // UnitAccessModeRead read access - UnitAccessModeRead // 2 + // UnitAccessModeRead UnitAccessMode = 2 + // UnitAccessModeWrite write access - UnitAccessModeWrite // 3 + UnitAccessModeWrite UnitAccessMode = 3 ) func (mode UnitAccessMode) ToAccessMode(modeIfUnset perm.AccessMode) perm.AccessMode { switch mode { case UnitAccessModeUnset: return modeIfUnset - case UnitAccessModeNone: - return perm.AccessModeNone - case UnitAccessModeRead: - return perm.AccessModeRead + // case UnitAccessModeNone: + // return perm.AccessModeNone + // case UnitAccessModeRead: + // return perm.AccessModeRead case UnitAccessModeWrite: return perm.AccessModeWrite default: diff --git a/models/repo/repo_unit_test.go b/models/repo/repo_unit_test.go index a1964519bd..3d6d408fcb 100644 --- a/models/repo/repo_unit_test.go +++ b/models/repo/repo_unit_test.go @@ -34,8 +34,8 @@ func TestActionsConfig(t *testing.T) { } func TestRepoUnitAccessMode(t *testing.T) { - assert.Equal(t, perm.AccessModeNone, UnitAccessModeNone.ToAccessMode(perm.AccessModeAdmin)) - assert.Equal(t, perm.AccessModeRead, UnitAccessModeRead.ToAccessMode(perm.AccessModeAdmin)) + // assert.Equal(t, perm.AccessModeNone, UnitAccessModeNone.ToAccessMode(perm.AccessModeAdmin)) + // assert.Equal(t, perm.AccessModeRead, UnitAccessModeRead.ToAccessMode(perm.AccessModeAdmin)) assert.Equal(t, perm.AccessModeWrite, UnitAccessModeWrite.ToAccessMode(perm.AccessModeAdmin)) assert.Equal(t, perm.AccessModeRead, UnitAccessModeUnset.ToAccessMode(perm.AccessModeRead)) } diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index 3d6a40e9ab..42385d54a6 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -861,7 +861,7 @@ func updateRepoUnits(ctx *context.APIContext, owner string, repo *repo_model.Rep if *opts.GloballyEditableWiki { wikiPermissions = repo_model.UnitAccessModeWrite } else { - wikiPermissions = repo_model.UnitAccessModeRead + wikiPermissions = repo_model.UnitAccessModeUnset } } From eb8ed7e5e9e535f84da7795e16681af8a4df6fb0 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 8 Jul 2025 07:59:34 +0200 Subject: [PATCH 099/495] Update module code.forgejo.org/forgejo/act to v1.29.0 (forgejo) (#8442) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [code.forgejo.org/forgejo/act](https://code.forgejo.org/forgejo/act) | `v1.28.0` -> `v1.29.0` | [![age](https://developer.mend.io/api/mc/badges/age/go/code.forgejo.org%2fforgejo%2fact/v1.29.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/go/code.forgejo.org%2fforgejo%2fact/v1.28.0/v1.29.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
forgejo/act (code.forgejo.org/forgejo/act) ### [`v1.29.0`](https://code.forgejo.org/forgejo/act/compare/v1.28.0...v1.29.0) [Compare Source](https://code.forgejo.org/forgejo/act/compare/v1.28.0...v1.29.0)
--- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8442 Reviewed-by: Earl Warren Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5f62066994..952082987b 100644 --- a/go.mod +++ b/go.mod @@ -244,7 +244,7 @@ require ( replace github.com/hashicorp/go-version => github.com/6543/go-version v1.3.1 -replace github.com/nektos/act => code.forgejo.org/forgejo/act v1.28.0 +replace github.com/nektos/act => code.forgejo.org/forgejo/act v1.29.0 replace github.com/mholt/archiver/v3 => code.forgejo.org/forgejo/archiver/v3 v3.5.1 diff --git a/go.sum b/go.sum index 9e72ee5c2c..cddd87d4ce 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ code.forgejo.org/f3/gof3/v3 v3.11.0 h1:f/xToKwqTgxG6PYxvewywjDQyCcyHEEJ6sZqUitFs code.forgejo.org/f3/gof3/v3 v3.11.0/go.mod h1:4FaRUNSQGBiD1M0DuB0yNv+Z2wMtlOeckgygHSSq4KQ= code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251 h1:HTZl3CBk3ABNYtFI6TPLvJgGKFIhKT5CBk0sbOtkDKU= code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251/go.mod h1:PphB88CPbx601QrWPMZATeorACeVmQlyv3u+uUMbSaM= -code.forgejo.org/forgejo/act v1.28.0 h1:96njNC7C1YNyjWq5OWvLZMF/nw0PMthzIA8Nwbnn7jo= -code.forgejo.org/forgejo/act v1.28.0/go.mod h1:dFuiwAmD5vyrzecysHB2kL/GM3wRpoVPl+WdbCTC8Bs= +code.forgejo.org/forgejo/act v1.29.0 h1:CPiI0LRPU0f6gUdQj1ZVax0ySc8CfegY4hiRsymdZU0= +code.forgejo.org/forgejo/act v1.29.0/go.mod h1:RPqtuaI2FkC1SVOaYCRODo5jIfoMTBVgEOOP3Sdiuh4= code.forgejo.org/forgejo/archiver/v3 v3.5.1 h1:UmmbA7D5550uf71SQjarmrn6yKwOGxtEjb3jaYYtmSE= code.forgejo.org/forgejo/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4= code.forgejo.org/forgejo/go-rpmutils v1.0.0 h1:RZGGeKt70p/WaIEL97pyT6uiiEIoN8/aLmS5Z6WmX0M= From f8d6a61157d69094be64a1112600122d4113dbb7 Mon Sep 17 00:00:00 2001 From: 0ko <0ko@noreply.codeberg.org> Date: Tue, 8 Jul 2025 16:58:49 +0200 Subject: [PATCH 100/495] fix(ui): make releases filtering responsive (#8399) * Improve consistency with other list pages (issues, PRs) * Improve mobile usability * Refresh the look a bit --- Bug fix: Currently on mobile filters get squashed and are not very usable: https://codeberg.org/attachments/5d6ad65e-6ae5-4819-a3dc-75fb4fe77960 This commit: https://codeberg.org/attachments/6eb0843e-49fd-4687-ab38-9ba60a6cc6c8 --- Consistency fix: Use same element order and spacing as in issue list: https://codeberg.org/attachments/9cdb042d-cdce-4243-a610-a1eabe3f4fc3 On desktop this means full width search bar: https://codeberg.org/attachments/bdd50c3d-76f3-4ad0-884e-5717f9c86154 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8399 Reviewed-by: Gusted --- templates/repo/release_tag_header.tmpl | 23 +++++++++++------------ tests/integration/release_test.go | 2 +- tests/integration/repo_tag_test.go | 4 ++-- web_src/css/repo/release-tag.css | 6 ++++++ 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/templates/repo/release_tag_header.tmpl b/templates/repo/release_tag_header.tmpl index 63d0689c50..75a115e31e 100644 --- a/templates/repo/release_tag_header.tmpl +++ b/templates/repo/release_tag_header.tmpl @@ -2,24 +2,23 @@ {{$canReadCode := $.Permission.CanRead $.UnitTypeCode}} {{if $canReadReleases}} -
-
- +
+ {{if .ShowReleaseSearch}} -
+ {{template "shared/search/combo" dict "Value" .Keyword}}
{{end}} -
+
{{if .EnableFeed}} - - {{svg "octicon-rss" 16}} {{ctx.Locale.Tr "rss_feed"}} + + {{svg "octicon-rss" 16}} + {{end}} {{if and (not .PageIsTagList) .CanCreateRelease}} diff --git a/tests/integration/release_test.go b/tests/integration/release_test.go index b5cccc65e8..f9ce3c81de 100644 --- a/tests/integration/release_test.go +++ b/tests/integration/release_test.go @@ -70,7 +70,7 @@ func checkLatestReleaseAndCount(t *testing.T, session *TestSession, repoURL, ver // Check release count in the counter on the Release/Tag switch, as well as that the tab is highlighted if count < 10 { // Only check values less than 10, should be enough attempts before this test cracks // 10 is the pagination limit, but the counter can have more than that - releaseTab := htmlDoc.doc.Find(".repository.releases .ui.compact.menu a.active.item[href$='/releases']") + releaseTab := htmlDoc.doc.Find(".repository.releases .switch a.active.item[href$='/releases']") assert.Contains(t, releaseTab.Text(), strconv.Itoa(count)+" release") // Could be "1 release" or "4 releases" } diff --git a/tests/integration/repo_tag_test.go b/tests/integration/repo_tag_test.go index 9be33ec8a8..4f72b58d12 100644 --- a/tests/integration/repo_tag_test.go +++ b/tests/integration/repo_tag_test.go @@ -41,11 +41,11 @@ func TestTagViewWithoutRelease(t *testing.T) { // Test that the tags sub-menu is active and has a counter htmlDoc := NewHTMLParser(t, resp.Body) - tagsTab := htmlDoc.Find(".small-menu-items .active.item[href$='/tags']") + tagsTab := htmlDoc.Find(".switch .active.item[href$='/tags']") assert.Contains(t, tagsTab.Text(), "4 tags") // Test that the release sub-menu isn't active - releaseLink := htmlDoc.Find(".small-menu-items .item[href$='/releases']") + releaseLink := htmlDoc.Find(".switch .item[href$='/releases']") assert.False(t, releaseLink.HasClass("active")) // Test that the title is displayed diff --git a/web_src/css/repo/release-tag.css b/web_src/css/repo/release-tag.css index 9860813e98..4a4158f4ba 100644 --- a/web_src/css/repo/release-tag.css +++ b/web_src/css/repo/release-tag.css @@ -110,6 +110,12 @@ .repository.new.release .field button { margin-bottom: 1em; } + .release-list-search { + order: 2 !important; + } + .release-list-buttons { + margin-left: auto; + } } .repository.new.release .field .attachment_edit { From 34b77270e85a527b5ed3c505abd32a7ae78ad2a4 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 9 Jul 2025 00:14:17 +0200 Subject: [PATCH 101/495] Update dependency mermaid to v11.8.1 (forgejo) (#8440) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8440 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2d0e10c3ba..b0d24f002d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "idiomorph": "0.3.0", "jquery": "3.7.1", "katex": "0.16.22", - "mermaid": "11.8.0", + "mermaid": "11.8.1", "mini-css-extract-plugin": "2.9.2", "minimatch": "10.0.3", "monaco-editor": "0.52.2", @@ -2075,9 +2075,9 @@ } }, "node_modules/@mermaid-js/parser": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.0.tgz", - "integrity": "sha512-7DNESgpyZ5WG1SIkrYafVBhWmImtmQuoxOO1lawI3gQYWxBX3v1FW3IyuuRfKJAO06XrZR71W0Kif5VEGGd4VA==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.1.tgz", + "integrity": "sha512-lCQNpV8R4lgsGcjX5667UiuDLk2micCtjtxR1YKbBXvN5w2v+FeLYoHrTSSrjwXdMcDYvE4ZBPvKT31dfeSmmA==", "license": "MIT", "dependencies": { "langium": "3.3.1" @@ -10558,14 +10558,14 @@ } }, "node_modules/mermaid": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.8.0.tgz", - "integrity": "sha512-uAZUwnBiqREZcUrFw3G5iQ5Pj3hTYUP95EZc3ec/nGBzHddJZydzYGE09tGZDBS1VoSoDn0symZ85FmypSTo5g==", + "version": "11.8.1", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.8.1.tgz", + "integrity": "sha512-VSXJLqP1Sqw5sGr273mhvpPRhXwE6NlmMSqBZQw+yZJoAJkOIPPn/uT3teeCBx60Fkt5zEI3FrH2eVT0jXRDzw==", "license": "MIT", "dependencies": { "@braintree/sanitize-url": "^7.0.4", "@iconify/utils": "^2.1.33", - "@mermaid-js/parser": "^0.6.0", + "@mermaid-js/parser": "^0.6.1", "@types/d3": "^7.4.3", "cytoscape": "^3.29.3", "cytoscape-cose-bilkent": "^4.1.0", diff --git a/package.json b/package.json index 8fceed4534..229ae56354 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "idiomorph": "0.3.0", "jquery": "3.7.1", "katex": "0.16.22", - "mermaid": "11.8.0", + "mermaid": "11.8.1", "mini-css-extract-plugin": "2.9.2", "minimatch": "10.0.3", "monaco-editor": "0.52.2", From 0636b3087fa8c1cc1c5fe9582b3ac0925f3504b1 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 9 Jul 2025 07:32:03 +0200 Subject: [PATCH 102/495] Update dependency go to v1.24.5 (forgejo) (#8449) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [go](https://go.dev/) ([source](https://github.com/golang/go)) | toolchain | patch | `1.24.4` -> `1.24.5` | --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8449 Reviewed-by: Earl Warren Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 952082987b..d09ec592aa 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module forgejo.org go 1.24 -toolchain go1.24.4 +toolchain go1.24.5 require ( code.forgejo.org/f3/gof3/v3 v3.11.0 From 11934670ec55c2b607168919db74ad6a94800317 Mon Sep 17 00:00:00 2001 From: Gusted Date: Wed, 9 Jul 2025 07:38:00 +0200 Subject: [PATCH 103/495] fix: correctly mark reviews as stale for AGit PRs (#8450) The argument order for `ValidatePullRequest` is to first give the new commitID and then the old commit ID. This results in reviews not being marked as stale when they are not stale and reviews as not stale when they are stale. The test will fail if the fix is not present. Add testing for the following three scenarios: 1. A review is made, the PR is updated and as a consequence the PR's diff is changed. The review is now marked as stale. 2. A review is made but in the meantime the PR is updated and the review is submitted on a older commit ID. If the diff changed the review is marked as stale. 3. A review that was made against a older commit ID is no longer marked as stale if the PR is force-pushed to that older commit ID. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8450 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- services/agit/agit.go | 2 +- tests/integration/pull_review_test.go | 159 ++++++++++++++++++++++++++ 2 files changed, 160 insertions(+), 1 deletion(-) diff --git a/services/agit/agit.go b/services/agit/agit.go index 20e87642c3..8ef641629a 100644 --- a/services/agit/agit.go +++ b/services/agit/agit.go @@ -221,7 +221,7 @@ func ProcReceive(ctx context.Context, repo *repo_model.Repository, gitRepo *git. } // Validate pull request. - pull_service.ValidatePullRequest(ctx, pr, oldCommitID, opts.NewCommitIDs[i], pusher) + pull_service.ValidatePullRequest(ctx, pr, opts.NewCommitIDs[i], oldCommitID, pusher) // TODO: call `InvalidateCodeComments` diff --git a/tests/integration/pull_review_test.go b/tests/integration/pull_review_test.go index 603252f45f..4af0a1100e 100644 --- a/tests/integration/pull_review_test.go +++ b/tests/integration/pull_review_test.go @@ -5,19 +5,23 @@ package integration import ( + "bytes" "fmt" "io" "net/http" "net/http/httptest" "net/url" + "os" "path" "strconv" "strings" "testing" + "time" "forgejo.org/models/db" issues_model "forgejo.org/models/issues" repo_model "forgejo.org/models/repo" + unit_model "forgejo.org/models/unit" "forgejo.org/models/unittest" user_model "forgejo.org/models/user" "forgejo.org/modules/git" @@ -761,3 +765,158 @@ func updateFileInBranch(user *user_model.User, repo *repo_model.Repository, tree _, err = files_service.ChangeRepoFiles(git.DefaultContext, repo, user, opts) return err } + +func TestPullRequestStaleReview(t *testing.T) { + onGiteaRun(t, func(t *testing.T, u *url.URL) { + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + session := loginUser(t, user2.Name) + + // Create temporary repository. + repo, _, f := tests.CreateDeclarativeRepo(t, user2, "", + []unit_model.Type{unit_model.TypePullRequests}, nil, + []*files_service.ChangeRepoFile{ + { + Operation: "create", + TreePath: "FUNFACT", + ContentReader: strings.NewReader("Smithy was the runner up to be Forgejo's name"), + }, + }, + ) + defer f() + + // Clone it. + dstPath := t.TempDir() + r := fmt.Sprintf("%suser2/%s.git", u.String(), repo.Name) + cloneURL, _ := url.Parse(r) + cloneURL.User = url.UserPassword("user2", userPassword) + require.NoError(t, git.CloneWithArgs(t.Context(), nil, cloneURL.String(), dstPath, git.CloneRepoOptions{})) + + // Create first commit. + require.NoError(t, os.WriteFile(path.Join(dstPath, "README.md"), []byte("## test content"), 0o600)) + require.NoError(t, git.AddChanges(dstPath, true)) + require.NoError(t, 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: "Add README.", + })) + stdout := &bytes.Buffer{} + require.NoError(t, git.NewCommand(t.Context(), "rev-parse", "HEAD").Run(&git.RunOpts{Dir: dstPath, Stdout: stdout})) + firstCommitID := strings.TrimSpace(stdout.String()) + + // Create agit PR. + require.NoError(t, git.NewCommand(t.Context(), "push", "origin", "HEAD:refs/for/main", "-o", "topic=agit-pr").Run(&git.RunOpts{Dir: dstPath})) + + pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{Index: 1, BaseRepoID: repo.ID}) + + req := NewRequest(t, "GET", "/"+repo.FullName()+"/pulls/1/files/reviews/new_comment") + resp := session.MakeRequest(t, req, http.StatusOK) + doc := NewHTMLParser(t, resp.Body) + + t.Run("Mark review as stale", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + // Create a approved review against against this commit. + req = NewRequestWithValues(t, "POST", "/"+repo.FullName()+"/pulls/1/files/reviews/comments", map[string]string{ + "_csrf": doc.GetCSRF(), + "origin": doc.GetInputValueByName("origin"), + "latest_commit_id": firstCommitID, + "side": "proposed", + "line": "1", + "path": "FUNFACT", + "diff_start_cid": doc.GetInputValueByName("diff_start_cid"), + "diff_end_cid": doc.GetInputValueByName("diff_end_cid"), + "diff_base_cid": doc.GetInputValueByName("diff_base_cid"), + "content": "nitpicking comment", + "pending_review": "", + }) + session.MakeRequest(t, req, http.StatusOK) + + req = NewRequestWithValues(t, "POST", "/"+repo.FullName()+"/pulls/1/files/reviews/submit", map[string]string{ + "_csrf": doc.GetCSRF(), + "commit_id": firstCommitID, + "content": "looks good", + "type": "comment", + }) + session.MakeRequest(t, req, http.StatusOK) + + // Review is not stale. + review := unittest.AssertExistsAndLoadBean(t, &issues_model.Review{IssueID: pr.IssueID}) + assert.False(t, review.Stale) + + // Create second commit + require.NoError(t, os.WriteFile(path.Join(dstPath, "README.md"), []byte("## I prefer this heading"), 0o600)) + require.NoError(t, git.AddChanges(dstPath, true)) + require.NoError(t, 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: "Add README.", + })) + + // Push to agit PR. + require.NoError(t, git.NewCommand(t.Context(), "push", "origin", "HEAD:refs/for/main", "-o", "topic=agit-pr").Run(&git.RunOpts{Dir: dstPath})) + + // Review is stale. + review = unittest.AssertExistsAndLoadBean(t, &issues_model.Review{IssueID: pr.IssueID}) + assert.True(t, review.Stale) + }) + + t.Run("Create stale review", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + // Review based on the first commit, which is a stale review because the + // PR's head is at the seconnd commit. + req := NewRequestWithValues(t, "POST", "/"+repo.FullName()+"/pulls/1/files/reviews/submit", map[string]string{ + "_csrf": doc.GetCSRF(), + "commit_id": firstCommitID, + "content": "looks good", + "type": "approve", + }) + session.MakeRequest(t, req, http.StatusOK) + + // There does not exist a review that is not stale, because all reviews + // are based on the first commit and the PR's head is at the second commit. + unittest.AssertExistsIf(t, false, &issues_model.Review{IssueID: pr.IssueID}, "stale = false") + }) + + t.Run("Mark unstale", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + // Force push the PR to the first commit. + require.NoError(t, git.NewCommand(t.Context(), "reset", "--hard", "HEAD~1").Run(&git.RunOpts{Dir: dstPath})) + require.NoError(t, git.NewCommand(t.Context(), "push", "origin", "HEAD:refs/for/main", "-o", "topic=agit-pr", "-o", "force-push").Run(&git.RunOpts{Dir: dstPath})) + + // There does not exist a review that is stale, because all reviews + // are based on the first commit and thus all reviews are no longer marked + // as stale. + unittest.AssertExistsIf(t, false, &issues_model.Review{IssueID: pr.IssueID}, "stale = true") + }) + + t.Run("Diff did not change", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + // Create a empty commit and push it to the PR. + require.NoError(t, git.NewCommand(t.Context(), "commit", "--allow-empty", "-m", "Empty commit").Run(&git.RunOpts{Dir: dstPath})) + require.NoError(t, git.NewCommand(t.Context(), "push", "origin", "HEAD:refs/for/main", "-o", "topic=agit-pr").Run(&git.RunOpts{Dir: dstPath})) + + // There does not exist a review that is stale, because the diff did not + // change. + unittest.AssertExistsIf(t, false, &issues_model.Review{IssueID: pr.IssueID}, "stale = true") + }) + }) +} From a1e3bace727653787eb05a4797bf1e1360ea9c2e Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Wed, 9 Jul 2025 08:13:05 +0200 Subject: [PATCH 104/495] [v12.0/forgejo] fix: correctly mark reviews as stale for AGit PRs (#8454) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8450 The argument order for `ValidatePullRequest` is to first give the new commitID and then the old commit ID. This results in reviews not being marked as stale when they are not stale and reviews as not stale when they are stale. The test will fail if the fix is not present. Add testing for the following three scenarios: 1. A review is made, the PR is updated and as a consequence the PR's diff is changed. The review is now marked as stale. 2. A review is made but in the meantime the PR is updated and the review is submitted on a older commit ID. If the diff changed the review is marked as stale. 3. A review that was made against a older commit ID is no longer marked as stale if the PR is force-pushed to that older commit ID. Co-authored-by: Gusted Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8454 Reviewed-by: Earl Warren Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- services/agit/agit.go | 2 +- tests/integration/pull_review_test.go | 159 ++++++++++++++++++++++++++ 2 files changed, 160 insertions(+), 1 deletion(-) diff --git a/services/agit/agit.go b/services/agit/agit.go index 20e87642c3..8ef641629a 100644 --- a/services/agit/agit.go +++ b/services/agit/agit.go @@ -221,7 +221,7 @@ func ProcReceive(ctx context.Context, repo *repo_model.Repository, gitRepo *git. } // Validate pull request. - pull_service.ValidatePullRequest(ctx, pr, oldCommitID, opts.NewCommitIDs[i], pusher) + pull_service.ValidatePullRequest(ctx, pr, opts.NewCommitIDs[i], oldCommitID, pusher) // TODO: call `InvalidateCodeComments` diff --git a/tests/integration/pull_review_test.go b/tests/integration/pull_review_test.go index 603252f45f..4af0a1100e 100644 --- a/tests/integration/pull_review_test.go +++ b/tests/integration/pull_review_test.go @@ -5,19 +5,23 @@ package integration import ( + "bytes" "fmt" "io" "net/http" "net/http/httptest" "net/url" + "os" "path" "strconv" "strings" "testing" + "time" "forgejo.org/models/db" issues_model "forgejo.org/models/issues" repo_model "forgejo.org/models/repo" + unit_model "forgejo.org/models/unit" "forgejo.org/models/unittest" user_model "forgejo.org/models/user" "forgejo.org/modules/git" @@ -761,3 +765,158 @@ func updateFileInBranch(user *user_model.User, repo *repo_model.Repository, tree _, err = files_service.ChangeRepoFiles(git.DefaultContext, repo, user, opts) return err } + +func TestPullRequestStaleReview(t *testing.T) { + onGiteaRun(t, func(t *testing.T, u *url.URL) { + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + session := loginUser(t, user2.Name) + + // Create temporary repository. + repo, _, f := tests.CreateDeclarativeRepo(t, user2, "", + []unit_model.Type{unit_model.TypePullRequests}, nil, + []*files_service.ChangeRepoFile{ + { + Operation: "create", + TreePath: "FUNFACT", + ContentReader: strings.NewReader("Smithy was the runner up to be Forgejo's name"), + }, + }, + ) + defer f() + + // Clone it. + dstPath := t.TempDir() + r := fmt.Sprintf("%suser2/%s.git", u.String(), repo.Name) + cloneURL, _ := url.Parse(r) + cloneURL.User = url.UserPassword("user2", userPassword) + require.NoError(t, git.CloneWithArgs(t.Context(), nil, cloneURL.String(), dstPath, git.CloneRepoOptions{})) + + // Create first commit. + require.NoError(t, os.WriteFile(path.Join(dstPath, "README.md"), []byte("## test content"), 0o600)) + require.NoError(t, git.AddChanges(dstPath, true)) + require.NoError(t, 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: "Add README.", + })) + stdout := &bytes.Buffer{} + require.NoError(t, git.NewCommand(t.Context(), "rev-parse", "HEAD").Run(&git.RunOpts{Dir: dstPath, Stdout: stdout})) + firstCommitID := strings.TrimSpace(stdout.String()) + + // Create agit PR. + require.NoError(t, git.NewCommand(t.Context(), "push", "origin", "HEAD:refs/for/main", "-o", "topic=agit-pr").Run(&git.RunOpts{Dir: dstPath})) + + pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{Index: 1, BaseRepoID: repo.ID}) + + req := NewRequest(t, "GET", "/"+repo.FullName()+"/pulls/1/files/reviews/new_comment") + resp := session.MakeRequest(t, req, http.StatusOK) + doc := NewHTMLParser(t, resp.Body) + + t.Run("Mark review as stale", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + // Create a approved review against against this commit. + req = NewRequestWithValues(t, "POST", "/"+repo.FullName()+"/pulls/1/files/reviews/comments", map[string]string{ + "_csrf": doc.GetCSRF(), + "origin": doc.GetInputValueByName("origin"), + "latest_commit_id": firstCommitID, + "side": "proposed", + "line": "1", + "path": "FUNFACT", + "diff_start_cid": doc.GetInputValueByName("diff_start_cid"), + "diff_end_cid": doc.GetInputValueByName("diff_end_cid"), + "diff_base_cid": doc.GetInputValueByName("diff_base_cid"), + "content": "nitpicking comment", + "pending_review": "", + }) + session.MakeRequest(t, req, http.StatusOK) + + req = NewRequestWithValues(t, "POST", "/"+repo.FullName()+"/pulls/1/files/reviews/submit", map[string]string{ + "_csrf": doc.GetCSRF(), + "commit_id": firstCommitID, + "content": "looks good", + "type": "comment", + }) + session.MakeRequest(t, req, http.StatusOK) + + // Review is not stale. + review := unittest.AssertExistsAndLoadBean(t, &issues_model.Review{IssueID: pr.IssueID}) + assert.False(t, review.Stale) + + // Create second commit + require.NoError(t, os.WriteFile(path.Join(dstPath, "README.md"), []byte("## I prefer this heading"), 0o600)) + require.NoError(t, git.AddChanges(dstPath, true)) + require.NoError(t, 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: "Add README.", + })) + + // Push to agit PR. + require.NoError(t, git.NewCommand(t.Context(), "push", "origin", "HEAD:refs/for/main", "-o", "topic=agit-pr").Run(&git.RunOpts{Dir: dstPath})) + + // Review is stale. + review = unittest.AssertExistsAndLoadBean(t, &issues_model.Review{IssueID: pr.IssueID}) + assert.True(t, review.Stale) + }) + + t.Run("Create stale review", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + // Review based on the first commit, which is a stale review because the + // PR's head is at the seconnd commit. + req := NewRequestWithValues(t, "POST", "/"+repo.FullName()+"/pulls/1/files/reviews/submit", map[string]string{ + "_csrf": doc.GetCSRF(), + "commit_id": firstCommitID, + "content": "looks good", + "type": "approve", + }) + session.MakeRequest(t, req, http.StatusOK) + + // There does not exist a review that is not stale, because all reviews + // are based on the first commit and the PR's head is at the second commit. + unittest.AssertExistsIf(t, false, &issues_model.Review{IssueID: pr.IssueID}, "stale = false") + }) + + t.Run("Mark unstale", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + // Force push the PR to the first commit. + require.NoError(t, git.NewCommand(t.Context(), "reset", "--hard", "HEAD~1").Run(&git.RunOpts{Dir: dstPath})) + require.NoError(t, git.NewCommand(t.Context(), "push", "origin", "HEAD:refs/for/main", "-o", "topic=agit-pr", "-o", "force-push").Run(&git.RunOpts{Dir: dstPath})) + + // There does not exist a review that is stale, because all reviews + // are based on the first commit and thus all reviews are no longer marked + // as stale. + unittest.AssertExistsIf(t, false, &issues_model.Review{IssueID: pr.IssueID}, "stale = true") + }) + + t.Run("Diff did not change", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + // Create a empty commit and push it to the PR. + require.NoError(t, git.NewCommand(t.Context(), "commit", "--allow-empty", "-m", "Empty commit").Run(&git.RunOpts{Dir: dstPath})) + require.NoError(t, git.NewCommand(t.Context(), "push", "origin", "HEAD:refs/for/main", "-o", "topic=agit-pr").Run(&git.RunOpts{Dir: dstPath})) + + // There does not exist a review that is stale, because the diff did not + // change. + unittest.AssertExistsIf(t, false, &issues_model.Review{IssueID: pr.IssueID}, "stale = true") + }) + }) +} From 32e8610b20e6da88b6910151c0bf9412dca3f433 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Wed, 9 Jul 2025 09:43:33 +0200 Subject: [PATCH 105/495] fix(email): actions notification template confuses branch with PR (#8448) When a mail notification is sent because of a failed pull request run, the body will show: Branch: #661 (f57df45) where #661 is the number of the pull request and not the branch. This is because run.PrettyRef() is used and has a misleading special case returning a PR number instead of a ref. Remove the textual description as it can easily be discovered from the run web page linked in the mail. ## Checklist The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org). ### Tests - I added test coverage for Go changes... - [ ] in their respective `*_test.go` for unit tests. - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server. - I added test coverage for JavaScript changes... - [ ] in `web_src/js/*.test.js` if it can be unit tested. - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)). ### Documentation - [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [ ] I did not document these changes and I do not expect someone else to do it. ### Release notes - [ ] I do not want this change to show in the release notes. - [ ] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/.md` to be be used for the release notes instead of the title. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8448 Reviewed-by: Christopher Besch Co-authored-by: Earl Warren Co-committed-by: Earl Warren --- options/locale_next/locale_en-US.json | 2 +- services/mailer/mail_actions.go | 2 -- services/mailer/mail_actions_now_done_test.go | 2 +- templates/mail/actions/now_done.tmpl | 2 +- 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/options/locale_next/locale_en-US.json b/options/locale_next/locale_en-US.json index a551db87dc..e08c8b2aee 100644 --- a/options/locale_next/locale_en-US.json +++ b/options/locale_next/locale_en-US.json @@ -92,7 +92,7 @@ "mail.actions.not_successful_run": "Workflow %[1]s failed in repository %[2]s", "mail.actions.run_info_cur_status": "This Run's Status: %[1]s (just updated from %[2]s)", "mail.actions.run_info_previous_status": "Previous Run's Status: %[1]s", - "mail.actions.run_info_ref": "Branch: %[1]s (%[2]s)", + "mail.actions.run_info_sha": "Commit: %[1]s", "mail.actions.run_info_trigger": "Triggered because: %[1]s by: %[2]s", "repo.diff.commit.next-short": "Next", "repo.diff.commit.previous-short": "Prev", diff --git a/services/mailer/mail_actions.go b/services/mailer/mail_actions.go index fa0d2635f1..a99af823b3 100644 --- a/services/mailer/mail_actions.go +++ b/services/mailer/mail_actions.go @@ -60,7 +60,6 @@ func sendMailActionRun(to *user_model.User, run *actions_model.ActionRun, priorS if len(commitSHA) > 7 { commitSHA = commitSHA[:7] } - branch := run.PrettyRef() data := map[string]any{ "locale": locale, @@ -73,7 +72,6 @@ func sendMailActionRun(to *user_model.User, run *actions_model.ActionRun, priorS "LastRun": lastRun, "PriorStatus": priorStatus, "CommitSHA": commitSHA, - "Branch": branch, "IsSuccess": run.Status.IsSuccess(), } diff --git a/services/mailer/mail_actions_now_done_test.go b/services/mailer/mail_actions_now_done_test.go index f4c597c99c..e84441f460 100644 --- a/services/mailer/mail_actions_now_done_test.go +++ b/services/mailer/mail_actions_now_done_test.go @@ -54,7 +54,7 @@ func getActionsNowDoneTestOrg(t *testing.T, name, email string, owner *user_mode } func assertTranslatedLocaleMailActionsNowDone(t *testing.T, msgBody string) { - AssertTranslatedLocale(t, msgBody, "mail.actions.successful_run_after_failure", "mail.actions.not_successful_run", "mail.actions.run_info_cur_status", "mail.actions.run_info_ref", "mail.actions.run_info_previous_status", "mail.actions.run_info_trigger", "mail.view_it_on") + AssertTranslatedLocale(t, msgBody, "mail.actions.successful_run_after_failure", "mail.actions.not_successful_run", "mail.actions.run_info_cur_status", "mail.actions.run_info_sha", "mail.actions.run_info_previous_status", "mail.actions.run_info_trigger", "mail.view_it_on") } func TestActionRunNowDoneStatusMatrix(t *testing.T) { diff --git a/templates/mail/actions/now_done.tmpl b/templates/mail/actions/now_done.tmpl index a890411055..adc990c545 100644 --- a/templates/mail/actions/now_done.tmpl +++ b/templates/mail/actions/now_done.tmpl @@ -21,7 +21,7 @@
{{.locale.Tr "mail.actions.run_info_cur_status" .Run.Status .PriorStatus}}
- {{.locale.Tr "mail.actions.run_info_ref" .Branch .CommitSHA}}
+ {{.locale.Tr "mail.actions.run_info_sha" .CommitSHA}}
{{if .LastRun}} {{.locale.Tr "mail.actions.run_info_previous_status" .LastRun.Status}}
{{end}} From eb543dcbdb7dcce4bbcedea17cd55299aa05cf71 Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Wed, 9 Jul 2025 10:20:54 +0200 Subject: [PATCH 106/495] [v12.0/forgejo] fix(email): actions notification template confuses branch with PR (#8455) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8448 When a mail notification is sent because of a failed pull request run, the body will show: Branch: #661 (f57df45) where #661 is the number of the pull request and not the branch. This is because run.PrettyRef() is used and has a misleading special case returning a PR number instead of a ref. Remove the textual description as it can easily be discovered from the run web page linked in the mail. Co-authored-by: Earl Warren Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8455 Reviewed-by: Earl Warren Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- options/locale_next/locale_en-US.json | 2 +- services/mailer/mail_actions.go | 2 -- services/mailer/mail_actions_now_done_test.go | 2 +- templates/mail/actions/now_done.tmpl | 2 +- 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/options/locale_next/locale_en-US.json b/options/locale_next/locale_en-US.json index b1c98e4551..4f1c3904e2 100644 --- a/options/locale_next/locale_en-US.json +++ b/options/locale_next/locale_en-US.json @@ -92,7 +92,7 @@ "mail.actions.not_successful_run": "Workflow %[1]s failed in repository %[2]s", "mail.actions.run_info_cur_status": "This Run's Status: %[1]s (just updated from %[2]s)", "mail.actions.run_info_previous_status": "Previous Run's Status: %[1]s", - "mail.actions.run_info_ref": "Branch: %[1]s (%[2]s)", + "mail.actions.run_info_sha": "Commit: %[1]s", "mail.actions.run_info_trigger": "Triggered because: %[1]s by: %[2]s", "repo.diff.commit.next-short": "Next", "repo.diff.commit.previous-short": "Prev", diff --git a/services/mailer/mail_actions.go b/services/mailer/mail_actions.go index fa0d2635f1..a99af823b3 100644 --- a/services/mailer/mail_actions.go +++ b/services/mailer/mail_actions.go @@ -60,7 +60,6 @@ func sendMailActionRun(to *user_model.User, run *actions_model.ActionRun, priorS if len(commitSHA) > 7 { commitSHA = commitSHA[:7] } - branch := run.PrettyRef() data := map[string]any{ "locale": locale, @@ -73,7 +72,6 @@ func sendMailActionRun(to *user_model.User, run *actions_model.ActionRun, priorS "LastRun": lastRun, "PriorStatus": priorStatus, "CommitSHA": commitSHA, - "Branch": branch, "IsSuccess": run.Status.IsSuccess(), } diff --git a/services/mailer/mail_actions_now_done_test.go b/services/mailer/mail_actions_now_done_test.go index f4c597c99c..e84441f460 100644 --- a/services/mailer/mail_actions_now_done_test.go +++ b/services/mailer/mail_actions_now_done_test.go @@ -54,7 +54,7 @@ func getActionsNowDoneTestOrg(t *testing.T, name, email string, owner *user_mode } func assertTranslatedLocaleMailActionsNowDone(t *testing.T, msgBody string) { - AssertTranslatedLocale(t, msgBody, "mail.actions.successful_run_after_failure", "mail.actions.not_successful_run", "mail.actions.run_info_cur_status", "mail.actions.run_info_ref", "mail.actions.run_info_previous_status", "mail.actions.run_info_trigger", "mail.view_it_on") + AssertTranslatedLocale(t, msgBody, "mail.actions.successful_run_after_failure", "mail.actions.not_successful_run", "mail.actions.run_info_cur_status", "mail.actions.run_info_sha", "mail.actions.run_info_previous_status", "mail.actions.run_info_trigger", "mail.view_it_on") } func TestActionRunNowDoneStatusMatrix(t *testing.T) { diff --git a/templates/mail/actions/now_done.tmpl b/templates/mail/actions/now_done.tmpl index a890411055..adc990c545 100644 --- a/templates/mail/actions/now_done.tmpl +++ b/templates/mail/actions/now_done.tmpl @@ -21,7 +21,7 @@
{{.locale.Tr "mail.actions.run_info_cur_status" .Run.Status .PriorStatus}}
- {{.locale.Tr "mail.actions.run_info_ref" .Branch .CommitSHA}}
+ {{.locale.Tr "mail.actions.run_info_sha" .CommitSHA}}
{{if .LastRun}} {{.locale.Tr "mail.actions.run_info_previous_status" .LastRun.Status}}
{{end}} From 48035bbd4ea0c034062537f4922cd2a3ae3c3a52 Mon Sep 17 00:00:00 2001 From: joneshf Date: Wed, 9 Jul 2025 20:55:10 +0200 Subject: [PATCH 107/495] chore: add tests for `admin auth` subcommands (#8433) This PR is adds almost all tests in `cmd/admin_auth_oauth_test.go` with a bit of refactoring beforehand to make the tests easier to write. These should be legitimate refactors where the implementation changes but the public API/behavior does not change. All of the changes in this PR are done to align with how tests are written in `cmd/admin_auth_ldap_test.go`. Since `cmd/admin_auth_ldap.go` is a sibling file to `cmd/admin_auth_oauth.go`, it seems like their test files should also be aligned. There are some tests added that show the current behavior as not ideal. E.g. not being able to update certain fields, or being able to set fields that are ultimately ignored. These are added so that the behavior is at least shown a bit more visibly. There should likely be a follow-up to fix some of these issues. But that will almost certainly be a breaking change that I'd rather avoid in this PR. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8433 Reviewed-by: Earl Warren Co-authored-by: joneshf Co-committed-by: joneshf --- cmd/admin_auth.go | 19 + cmd/admin_auth_ldap.go | 19 - cmd/admin_auth_oauth.go | 18 +- cmd/admin_auth_oauth_test.go | 704 +++++++++++++++++++++++++++++++++++ 4 files changed, 732 insertions(+), 28 deletions(-) create mode 100644 cmd/admin_auth_oauth_test.go diff --git a/cmd/admin_auth.go b/cmd/admin_auth.go index cb95b3b3c8..91b344b1e9 100644 --- a/cmd/admin_auth.go +++ b/cmd/admin_auth.go @@ -17,6 +17,15 @@ import ( "github.com/urfave/cli/v3" ) +type ( + authService struct { + initDB func(ctx context.Context) error + createAuthSource func(context.Context, *auth_model.Source) error + updateAuthSource func(context.Context, *auth_model.Source) error + getAuthSourceByID func(ctx context.Context, id int64) (*auth_model.Source, error) + } +) + func microcmdAuthDelete() *cli.Command { return &cli.Command{ Name: "delete", @@ -60,6 +69,16 @@ func microcmdAuthList() *cli.Command { } } +// newAuthService creates a service with default functions. +func newAuthService() *authService { + return &authService{ + initDB: initDB, + createAuthSource: auth_model.CreateSource, + updateAuthSource: auth_model.UpdateSource, + getAuthSourceByID: auth_model.GetSourceByID, + } +} + func runListAuth(ctx context.Context, c *cli.Command) error { ctx, cancel := installSignals(ctx) defer cancel() diff --git a/cmd/admin_auth_ldap.go b/cmd/admin_auth_ldap.go index 997d6b3a16..9af6c331d3 100644 --- a/cmd/admin_auth_ldap.go +++ b/cmd/admin_auth_ldap.go @@ -14,15 +14,6 @@ import ( "github.com/urfave/cli/v3" ) -type ( - authService struct { - initDB func(ctx context.Context) error - createAuthSource func(context.Context, *auth.Source) error - updateAuthSource func(context.Context, *auth.Source) error - getAuthSourceByID func(ctx context.Context, id int64) (*auth.Source, error) - } -) - func commonLdapCLIFlags() []cli.Flag { return []cli.Flag{ &cli.StringFlag{ @@ -184,16 +175,6 @@ func microcmdAuthUpdateLdapSimpleAuth() *cli.Command { } } -// newAuthService creates a service with default functions. -func newAuthService() *authService { - return &authService{ - initDB: initDB, - createAuthSource: auth.CreateSource, - updateAuthSource: auth.UpdateSource, - getAuthSourceByID: auth.GetSourceByID, - } -} - // parseAuthSource assigns values on authSource according to command line flags. func parseAuthSource(c *cli.Command, authSource *auth.Source) { if c.IsSet("name") { diff --git a/cmd/admin_auth_oauth.go b/cmd/admin_auth_oauth.go index a638bf0210..8a756480cd 100644 --- a/cmd/admin_auth_oauth.go +++ b/cmd/admin_auth_oauth.go @@ -132,7 +132,7 @@ func microcmdAuthAddOauth() *cli.Command { return &cli.Command{ Name: "add-oauth", Usage: "Add new Oauth authentication source", - Action: runAddOauth, + Action: newAuthService().addOauth, Flags: oauthCLIFlags(), } } @@ -141,7 +141,7 @@ func microcmdAuthUpdateOauth() *cli.Command { return &cli.Command{ Name: "update-oauth", Usage: "Update existing Oauth authentication source", - Action: runUpdateOauth, + Action: newAuthService().updateOauth, Flags: append(oauthCLIFlags()[:1], append([]cli.Flag{idFlag()}, oauthCLIFlags()[1:]...)...), } } @@ -179,11 +179,11 @@ func parseOAuth2Config(_ context.Context, c *cli.Command) *oauth2.Source { } } -func runAddOauth(ctx context.Context, c *cli.Command) error { +func (a *authService) addOauth(ctx context.Context, c *cli.Command) error { ctx, cancel := installSignals(ctx) defer cancel() - if err := initDB(ctx); err != nil { + if err := a.initDB(ctx); err != nil { return err } @@ -195,7 +195,7 @@ func runAddOauth(ctx context.Context, c *cli.Command) error { } } - return auth_model.CreateSource(ctx, &auth_model.Source{ + return a.createAuthSource(ctx, &auth_model.Source{ Type: auth_model.OAuth2, Name: c.String("name"), IsActive: true, @@ -203,7 +203,7 @@ func runAddOauth(ctx context.Context, c *cli.Command) error { }) } -func runUpdateOauth(ctx context.Context, c *cli.Command) error { +func (a *authService) updateOauth(ctx context.Context, c *cli.Command) error { if !c.IsSet("id") { return errors.New("--id flag is missing") } @@ -211,11 +211,11 @@ func runUpdateOauth(ctx context.Context, c *cli.Command) error { ctx, cancel := installSignals(ctx) defer cancel() - if err := initDB(ctx); err != nil { + if err := a.initDB(ctx); err != nil { return err } - source, err := auth_model.GetSourceByID(ctx, c.Int64("id")) + source, err := a.getAuthSourceByID(ctx, c.Int64("id")) if err != nil { return err } @@ -310,5 +310,5 @@ func runUpdateOauth(ctx context.Context, c *cli.Command) error { oAuth2Config.CustomURLMapping = customURLMapping source.Cfg = oAuth2Config - return auth_model.UpdateSource(ctx, source) + return a.updateAuthSource(ctx, source) } diff --git a/cmd/admin_auth_oauth_test.go b/cmd/admin_auth_oauth_test.go new file mode 100644 index 0000000000..ea5442e62d --- /dev/null +++ b/cmd/admin_auth_oauth_test.go @@ -0,0 +1,704 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package cmd + +import ( + "context" + "testing" + + "forgejo.org/models/auth" + "forgejo.org/modules/test" + "forgejo.org/services/auth/source/oauth2" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/urfave/cli/v3" +) + +func TestAddOauth(t *testing.T) { + // Mock cli functions to do not exit on error + defer test.MockVariableValue(&cli.OsExiter, func(code int) {})() + + // Test cases + cases := []struct { + args []string + source *auth.Source + errMsg string + }{ + // case 0 + { + args: []string{ + "oauth-test", + "--name", "oauth2 (via openidConnect) source full", + "--provider", "openidConnect", + "--key", "client id", + "--secret", "client secret", + "--auto-discover-url", "https://example.com/.well-known/openid-configuration", + "--use-custom-urls", "", + "--custom-tenant-id", "tenant id", + "--custom-auth-url", "https://example.com/auth", + "--custom-token-url", "https://example.com/token", + "--custom-profile-url", "https://example.com/profile", + "--custom-email-url", "https://example.com/email", + "--icon-url", "https://example.com/icon.svg", + "--skip-local-2fa", + "--scopes", "address", + "--scopes", "email", + "--scopes", "phone", + "--scopes", "profile", + "--attribute-ssh-public-key", "ssh_public_key", + "--required-claim-name", "can_access", + "--required-claim-value", "yes", + "--group-claim-name", "groups", + "--admin-group", "admin", + "--restricted-group", "restricted", + "--group-team-map", `{"org_a_team_1": {"organization-a": ["Team 1"]}, "org_a_all_teams": {"organization-a": ["Team 1", "Team 2", "Team 3"]}}`, + "--group-team-map-removal", + }, + source: &auth.Source{ + Type: auth.OAuth2, + Name: "oauth2 (via openidConnect) source full", + IsActive: true, + Cfg: &oauth2.Source{ + Provider: "openidConnect", + ClientID: "client id", + ClientSecret: "client secret", + OpenIDConnectAutoDiscoveryURL: "https://example.com/.well-known/openid-configuration", + CustomURLMapping: &oauth2.CustomURLMapping{ + AuthURL: "https://example.com/auth", + TokenURL: "https://example.com/token", + ProfileURL: "https://example.com/profile", + EmailURL: "https://example.com/email", + Tenant: "tenant id", + }, + IconURL: "https://example.com/icon.svg", + Scopes: []string{"address", "email", "phone", "profile"}, + AttributeSSHPublicKey: "ssh_public_key", + RequiredClaimName: "can_access", + RequiredClaimValue: "yes", + GroupClaimName: "groups", + AdminGroup: "admin", + GroupTeamMap: `{"org_a_team_1": {"organization-a": ["Team 1"]}, "org_a_all_teams": {"organization-a": ["Team 1", "Team 2", "Team 3"]}}`, + GroupTeamMapRemoval: true, + RestrictedGroup: "restricted", + SkipLocalTwoFA: true, + }, + }, + }, + // case 1 + { + args: []string{ + "oauth-test", + "--name", "oauth2 (via openidConnect) source min", + "--provider", "openidConnect", + "--auto-discover-url", "https://example.com/.well-known/openid-configuration", + }, + source: &auth.Source{ + Type: auth.OAuth2, + Name: "oauth2 (via openidConnect) source min", + IsActive: true, + Cfg: &oauth2.Source{ + Provider: "openidConnect", + OpenIDConnectAutoDiscoveryURL: "https://example.com/.well-known/openid-configuration", + Scopes: []string{}, + }, + }, + }, + // case 2 + { + args: []string{ + "oauth-test", + "--name", "oauth2 (via openidConnect) source `--use-custom-urls` required for `--custom-*` flags", + "--custom-tenant-id", "tenant id", + "--custom-auth-url", "https://example.com/auth", + "--custom-token-url", "https://example.com/token", + "--custom-profile-url", "https://example.com/profile", + "--custom-email-url", "https://example.com/email", + }, + source: &auth.Source{ + Type: auth.OAuth2, + Name: "oauth2 (via openidConnect) source `--use-custom-urls` required for `--custom-*` flags", + IsActive: true, + Cfg: &oauth2.Source{ + Scopes: []string{}, + }, + }, + }, + // case 3 + { + args: []string{ + "oauth-test", + "--name", "oauth2 (via openidConnect) source `--scopes` aggregates multiple uses", + "--provider", "openidConnect", + "--auto-discover-url", "https://example.com/.well-known/openid-configuration", + "--scopes", "address", + "--scopes", "email", + "--scopes", "phone", + "--scopes", "profile", + }, + source: &auth.Source{ + Type: auth.OAuth2, + Name: "oauth2 (via openidConnect) source `--scopes` aggregates multiple uses", + IsActive: true, + Cfg: &oauth2.Source{ + Provider: "openidConnect", + OpenIDConnectAutoDiscoveryURL: "https://example.com/.well-known/openid-configuration", + Scopes: []string{"address", "email", "phone", "profile"}, + }, + }, + }, + // case 4 + { + args: []string{ + "oauth-test", + "--name", "oauth2 (via openidConnect) source `--scopes` supports commas as separators", + "--provider", "openidConnect", + "--auto-discover-url", "https://example.com/.well-known/openid-configuration", + "--scopes", "address,email,phone,profile", + }, + source: &auth.Source{ + Type: auth.OAuth2, + Name: "oauth2 (via openidConnect) source `--scopes` supports commas as separators", + IsActive: true, + Cfg: &oauth2.Source{ + Provider: "openidConnect", + OpenIDConnectAutoDiscoveryURL: "https://example.com/.well-known/openid-configuration", + Scopes: []string{"address", "email", "phone", "profile"}, + }, + }, + }, + // case 5 + { + args: []string{ + "oauth-test", + "--name", "oauth2 (via openidConnect) source", + "--provider", "openidConnect", + }, + errMsg: "invalid Auto Discovery URL: (this must be a valid URL starting with http:// or https://)", + }, + // case 6 + { + args: []string{ + "oauth-test", + "--name", "oauth2 (via openidConnect) source", + "--provider", "openidConnect", + "--auto-discover-url", "example.com", + }, + errMsg: "invalid Auto Discovery URL: example.com (this must be a valid URL starting with http:// or https://)", + }, + } + + for n, c := range cases { + // Mock functions. + var createdAuthSource *auth.Source + service := &authService{ + initDB: func(context.Context) error { + return nil + }, + createAuthSource: func(ctx context.Context, authSource *auth.Source) error { + createdAuthSource = authSource + return nil + }, + updateAuthSource: func(ctx context.Context, authSource *auth.Source) error { + assert.FailNow(t, "should not call updateAuthSource", "case: %d", n) + return nil + }, + getAuthSourceByID: func(ctx context.Context, id int64) (*auth.Source, error) { + assert.FailNow(t, "should not call getAuthSourceByID", "case: %d", n) + return nil, nil + }, + } + + // Create a copy of command to test + app := cli.Command{} + app.Flags = microcmdAuthAddOauth().Flags + app.Action = service.addOauth + + // Run it + err := app.Run(t.Context(), c.args) + if c.errMsg != "" { + assert.EqualError(t, err, c.errMsg, "case %d: error should match", n) + } else { + require.NoError(t, err, "case %d: should have no errors", n) + assert.Equal(t, c.source, createdAuthSource, "case %d: wrong authSource", n) + } + } +} + +func TestUpdateOauth(t *testing.T) { + // Mock cli functions to do not exit on error + defer test.MockVariableValue(&cli.OsExiter, func(code int) {})() + + // Test cases + cases := []struct { + args []string + id int64 + existingAuthSource *auth.Source + authSource *auth.Source + errMsg string + }{ + // case 0 + { + args: []string{ + "oauth-test", + "--id", "23", + "--name", "oauth2 (via openidConnect) source full", + "--provider", "openidConnect", + "--key", "client id", + "--secret", "client secret", + "--auto-discover-url", "https://example.com/.well-known/openid-configuration", + "--use-custom-urls", "", + "--custom-tenant-id", "tenant id", + "--custom-auth-url", "https://example.com/auth", + "--custom-token-url", "https://example.com/token", + "--custom-profile-url", "https://example.com/profile", + "--custom-email-url", "https://example.com/email", + "--icon-url", "https://example.com/icon.svg", + "--skip-local-2fa", + "--scopes", "address", + "--scopes", "email", + "--scopes", "phone", + "--scopes", "profile", + "--attribute-ssh-public-key", "ssh_public_key", + "--required-claim-name", "can_access", + "--required-claim-value", "yes", + "--group-claim-name", "groups", + "--admin-group", "admin", + "--restricted-group", "restricted", + "--group-team-map", `{"org_a_team_1": {"organization-a": ["Team 1"]}, "org_a_all_teams": {"organization-a": ["Team 1", "Team 2", "Team 3"]}}`, + "--group-team-map-removal", + }, + id: 23, + existingAuthSource: &auth.Source{ + Type: auth.OAuth2, + Cfg: &oauth2.Source{}, + }, + authSource: &auth.Source{ + Type: auth.OAuth2, + Name: "oauth2 (via openidConnect) source full", + Cfg: &oauth2.Source{ + Provider: "openidConnect", + ClientID: "client id", + ClientSecret: "client secret", + OpenIDConnectAutoDiscoveryURL: "https://example.com/.well-known/openid-configuration", + CustomURLMapping: &oauth2.CustomURLMapping{ + AuthURL: "https://example.com/auth", + TokenURL: "https://example.com/token", + ProfileURL: "https://example.com/profile", + EmailURL: "https://example.com/email", + Tenant: "tenant id", + }, + IconURL: "https://example.com/icon.svg", + Scopes: []string{"address", "email", "phone", "profile"}, + AttributeSSHPublicKey: "ssh_public_key", + RequiredClaimName: "can_access", + RequiredClaimValue: "yes", + GroupClaimName: "groups", + AdminGroup: "admin", + GroupTeamMap: `{"org_a_team_1": {"organization-a": ["Team 1"]}, "org_a_all_teams": {"organization-a": ["Team 1", "Team 2", "Team 3"]}}`, + GroupTeamMapRemoval: true, + RestrictedGroup: "restricted", + // `--skip-local-2fa` is currently ignored. + // SkipLocalTwoFA: true, + }, + }, + }, + // case 1 + { + args: []string{ + "oauth-test", + "--id", "1", + }, + authSource: &auth.Source{ + Type: auth.OAuth2, + Cfg: &oauth2.Source{ + CustomURLMapping: &oauth2.CustomURLMapping{}, + }, + }, + }, + // case 2 + { + args: []string{ + "oauth-test", + "--id", "1", + "--name", "oauth2 (via openidConnect) source full", + }, + authSource: &auth.Source{ + Type: auth.OAuth2, + Name: "oauth2 (via openidConnect) source full", + Cfg: &oauth2.Source{ + CustomURLMapping: &oauth2.CustomURLMapping{}, + }, + }, + }, + // case 3 + { + args: []string{ + "oauth-test", + "--id", "1", + "--provider", "openidConnect", + }, + authSource: &auth.Source{ + Type: auth.OAuth2, + Cfg: &oauth2.Source{ + Provider: "openidConnect", + CustomURLMapping: &oauth2.CustomURLMapping{}, + }, + }, + }, + // case 4 + { + args: []string{ + "oauth-test", + "--id", "1", + "--key", "client id", + }, + authSource: &auth.Source{ + Type: auth.OAuth2, + Cfg: &oauth2.Source{ + ClientID: "client id", + CustomURLMapping: &oauth2.CustomURLMapping{}, + }, + }, + }, + // case 5 + { + args: []string{ + "oauth-test", + "--id", "1", + "--secret", "client secret", + }, + authSource: &auth.Source{ + Type: auth.OAuth2, + Cfg: &oauth2.Source{ + ClientSecret: "client secret", + CustomURLMapping: &oauth2.CustomURLMapping{}, + }, + }, + }, + // case 6 + { + args: []string{ + "oauth-test", + "--id", "1", + "--auto-discover-url", "https://example.com/.well-known/openid-configuration", + }, + authSource: &auth.Source{ + Type: auth.OAuth2, + Cfg: &oauth2.Source{ + OpenIDConnectAutoDiscoveryURL: "https://example.com/.well-known/openid-configuration", + CustomURLMapping: &oauth2.CustomURLMapping{}, + }, + }, + }, + // case 7 + { + args: []string{ + "oauth-test", + "--id", "1", + "--use-custom-urls", "", + "--custom-tenant-id", "tenant id", + "--custom-auth-url", "https://example.com/auth", + "--custom-token-url", "https://example.com/token", + "--custom-profile-url", "https://example.com/profile", + "--custom-email-url", "https://example.com/email", + }, + authSource: &auth.Source{ + Type: auth.OAuth2, + Cfg: &oauth2.Source{ + CustomURLMapping: &oauth2.CustomURLMapping{ + AuthURL: "https://example.com/auth", + TokenURL: "https://example.com/token", + ProfileURL: "https://example.com/profile", + EmailURL: "https://example.com/email", + Tenant: "tenant id", + }, + }, + }, + }, + // case 8 + { + args: []string{ + "oauth-test", + "--id", "1", + "--name", "oauth2 (via openidConnect) source `--use-custom-urls` required for `--custom-*` flags", + "--custom-tenant-id", "tenant id", + "--custom-auth-url", "https://example.com/auth", + "--custom-token-url", "https://example.com/token", + "--custom-profile-url", "https://example.com/profile", + "--custom-email-url", "https://example.com/email", + }, + authSource: &auth.Source{ + Type: auth.OAuth2, + Name: "oauth2 (via openidConnect) source `--use-custom-urls` required for `--custom-*` flags", + Cfg: &oauth2.Source{ + CustomURLMapping: &oauth2.CustomURLMapping{}, + }, + }, + }, + // case 9 + { + args: []string{ + "oauth-test", + "--id", "1", + "--icon-url", "https://example.com/icon.svg", + }, + authSource: &auth.Source{ + Type: auth.OAuth2, + Cfg: &oauth2.Source{ + CustomURLMapping: &oauth2.CustomURLMapping{}, + IconURL: "https://example.com/icon.svg", + }, + }, + }, + // case 10 + { + args: []string{ + "oauth-test", + "--id", "1", + "--name", "oauth2 (via openidConnect) source `--skip-local-2fa` is currently ignored", + "--skip-local-2fa", + }, + authSource: &auth.Source{ + Type: auth.OAuth2, + Name: "oauth2 (via openidConnect) source `--skip-local-2fa` is currently ignored", + Cfg: &oauth2.Source{ + CustomURLMapping: &oauth2.CustomURLMapping{}, + // `--skip-local-2fa` is currently ignored. + // SkipLocalTwoFA: true, + }, + }, + }, + // case 11 + { + args: []string{ + "oauth-test", + "--id", "1", + "--name", "oauth2 (via openidConnect) source `--scopes` aggregates multiple uses", + "--scopes", "address", + "--scopes", "email", + "--scopes", "phone", + "--scopes", "profile", + }, + authSource: &auth.Source{ + Type: auth.OAuth2, + Name: "oauth2 (via openidConnect) source `--scopes` aggregates multiple uses", + Cfg: &oauth2.Source{ + CustomURLMapping: &oauth2.CustomURLMapping{}, + Scopes: []string{"address", "email", "phone", "profile"}, + }, + }, + }, + // case 12 + { + args: []string{ + "oauth-test", + "--id", "1", + "--name", "oauth2 (via openidConnect) source `--scopes` supports commas as separators", + "--scopes", "address,email,phone,profile", + }, + authSource: &auth.Source{ + Type: auth.OAuth2, + Name: "oauth2 (via openidConnect) source `--scopes` supports commas as separators", + Cfg: &oauth2.Source{ + CustomURLMapping: &oauth2.CustomURLMapping{}, + Scopes: []string{"address", "email", "phone", "profile"}, + }, + }, + }, + // case 13 + { + args: []string{ + "oauth-test", + "--id", "1", + "--attribute-ssh-public-key", "ssh_public_key", + }, + authSource: &auth.Source{ + Type: auth.OAuth2, + Cfg: &oauth2.Source{ + CustomURLMapping: &oauth2.CustomURLMapping{}, + AttributeSSHPublicKey: "ssh_public_key", + }, + }, + }, + // case 14 + { + args: []string{ + "oauth-test", + "--id", "1", + "--required-claim-name", "can_access", + }, + authSource: &auth.Source{ + Type: auth.OAuth2, + Cfg: &oauth2.Source{ + CustomURLMapping: &oauth2.CustomURLMapping{}, + RequiredClaimName: "can_access", + }, + }, + }, + // case 15 + { + args: []string{ + "oauth-test", + "--id", "1", + "--required-claim-value", "yes", + }, + authSource: &auth.Source{ + Type: auth.OAuth2, + Cfg: &oauth2.Source{ + CustomURLMapping: &oauth2.CustomURLMapping{}, + RequiredClaimValue: "yes", + }, + }, + }, + // case 16 + { + args: []string{ + "oauth-test", + "--id", "1", + "--group-claim-name", "groups", + }, + authSource: &auth.Source{ + Type: auth.OAuth2, + Cfg: &oauth2.Source{ + CustomURLMapping: &oauth2.CustomURLMapping{}, + GroupClaimName: "groups", + }, + }, + }, + // case 17 + { + args: []string{ + "oauth-test", + "--id", "1", + "--admin-group", "admin", + }, + authSource: &auth.Source{ + Type: auth.OAuth2, + Cfg: &oauth2.Source{ + CustomURLMapping: &oauth2.CustomURLMapping{}, + AdminGroup: "admin", + }, + }, + }, + // case 18 + { + args: []string{ + "oauth-test", + "--id", "1", + "--restricted-group", "restricted", + }, + authSource: &auth.Source{ + Type: auth.OAuth2, + Cfg: &oauth2.Source{ + CustomURLMapping: &oauth2.CustomURLMapping{}, + RestrictedGroup: "restricted", + }, + }, + }, + // case 19 + { + args: []string{ + "oauth-test", + "--id", "1", + "--group-team-map", `{"org_a_team_1": {"organization-a": ["Team 1"]}, "org_a_all_teams": {"organization-a": ["Team 1", "Team 2", "Team 3"]}}`, + }, + authSource: &auth.Source{ + Type: auth.OAuth2, + Cfg: &oauth2.Source{ + CustomURLMapping: &oauth2.CustomURLMapping{}, + GroupTeamMap: `{"org_a_team_1": {"organization-a": ["Team 1"]}, "org_a_all_teams": {"organization-a": ["Team 1", "Team 2", "Team 3"]}}`, + }, + }, + }, + // case 20 + { + args: []string{ + "oauth-test", + "--id", "1", + "--group-team-map-removal", + }, + authSource: &auth.Source{ + Type: auth.OAuth2, + Cfg: &oauth2.Source{ + CustomURLMapping: &oauth2.CustomURLMapping{}, + GroupTeamMapRemoval: true, + }, + }, + }, + // case 21 + { + args: []string{ + "oauth-test", + "--id", "23", + "--group-team-map-removal=false", + }, + id: 23, + existingAuthSource: &auth.Source{ + Type: auth.OAuth2, + Cfg: &oauth2.Source{ + GroupTeamMapRemoval: true, + }, + }, + authSource: &auth.Source{ + Type: auth.OAuth2, + Cfg: &oauth2.Source{ + CustomURLMapping: &oauth2.CustomURLMapping{}, + GroupTeamMapRemoval: false, + }, + }, + }, + // case 22 + { + args: []string{ + "oauth-test", + }, + errMsg: "--id flag is missing", + }, + } + + for n, c := range cases { + // Mock functions. + var updatedAuthSource *auth.Source + service := &authService{ + initDB: func(context.Context) error { + return nil + }, + createAuthSource: func(ctx context.Context, authSource *auth.Source) error { + assert.FailNow(t, "should not call createAuthSource", "case: %d", n) + return nil + }, + updateAuthSource: func(ctx context.Context, authSource *auth.Source) error { + updatedAuthSource = authSource + return nil + }, + getAuthSourceByID: func(ctx context.Context, id int64) (*auth.Source, error) { + if c.id != 0 { + assert.Equal(t, c.id, id, "case %d: wrong id", n) + } + if c.existingAuthSource != nil { + return c.existingAuthSource, nil + } + return &auth.Source{ + Type: auth.OAuth2, + Cfg: &oauth2.Source{}, + }, nil + }, + } + + // Create a copy of command to test + app := cli.Command{} + app.Flags = microcmdAuthUpdateOauth().Flags + app.Action = service.updateOauth + + // Run it + err := app.Run(t.Context(), c.args) + if c.errMsg != "" { + assert.EqualError(t, err, c.errMsg, "case %d: error should match", n) + } else { + require.NoError(t, err, "case %d: should have no errors", n) + assert.Equal(t, c.authSource, updatedAuthSource, "case %d: wrong authSource", n) + } + } +} From f324ee73c56da387a11b0b59ff455c321fefa3d4 Mon Sep 17 00:00:00 2001 From: Gnarwhal Date: Wed, 9 Jul 2025 22:58:49 +0200 Subject: [PATCH 108/495] fix: file action button spacing when wrapped (#8415) The download, edit, and trash icon buttons had an extraneous `` that was inconsistent with the copy and RSS button which caused spacing issues when wrapping. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8415 Reviewed-by: 0ko <0ko@noreply.codeberg.org> Co-authored-by: Gnarwhal Co-committed-by: Gnarwhal --- templates/repo/view_file.tmpl | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/templates/repo/view_file.tmpl b/templates/repo/view_file.tmpl index 2a9d7d02ba..36809b769e 100644 --- a/templates/repo/view_file.tmpl +++ b/templates/repo/view_file.tmpl @@ -59,8 +59,12 @@ {{end}}
- {{svg "octicon-download"}} - {{svg "octicon-copy" 14}} + + {{svg "octicon-download"}} + + + {{svg "octicon-copy" 14}} + {{if .EnableFeed}} {{if .IsViewBranch}} @@ -74,14 +78,22 @@ {{end}} {{if .Repository.CanEnableEditor}} {{if .CanEditFile}} - {{svg "octicon-pencil"}} + + {{svg "octicon-pencil"}} + {{else}} - {{svg "octicon-pencil"}} + + {{svg "octicon-pencil"}} + {{end}} {{if .CanDeleteFile}} - {{svg "octicon-trash"}} + + {{svg "octicon-trash"}} + {{else}} - {{svg "octicon-trash"}} + + {{svg "octicon-trash"}} + {{end}} {{end}} {{else if .EscapeStatus.Escaped}} From 24d6972f6b31521f96a626dd31746506d3145fa2 Mon Sep 17 00:00:00 2001 From: Nis Wechselberg Date: Wed, 9 Jul 2025 23:01:03 +0200 Subject: [PATCH 109/495] fix: ASCII equal fold for authorization header (#8391) For the "Authorization:" header only lowercase "token" was accepted. This change allows uppercase "Token" as well. Signed-off-by: Nis Wechselberg Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8391 Reviewed-by: Gusted Reviewed-by: Michael Kriese Co-authored-by: Nis Wechselberg Co-committed-by: Nis Wechselberg --- modules/util/string.go | 22 ++++++++++++++++++++++ modules/util/string_test.go | 26 ++++++++++++++++++++++++++ services/auth/oauth2.go | 3 ++- services/auth/oauth2_test.go | 28 ++++++++++++++++++++++++++++ 4 files changed, 78 insertions(+), 1 deletion(-) diff --git a/modules/util/string.go b/modules/util/string.go index cf50f591c6..ca3d43ec6e 100644 --- a/modules/util/string.go +++ b/modules/util/string.go @@ -95,3 +95,25 @@ func UnsafeBytesToString(b []byte) string { func UnsafeStringToBytes(s string) []byte { return unsafe.Slice(unsafe.StringData(s), len(s)) } + +// AsciiEqualFold is taken from Golang, but reimplemented here, since the original is not exposed to public +// Taken from: https://cs.opensource.google/go/go/+/refs/tags/go1.24.4:src/net/http/internal/ascii/print.go +func ASCIIEqualFold(s, t string) bool { + if len(s) != len(t) { + return false + } + for i := 0; i < len(s); i++ { + if ASCIILower(s[i]) != ASCIILower(t[i]) { + return false + } + } + return true +} + +// AsciiLower returns the ASCII lowercase version of b. +func ASCIILower(b byte) byte { + if 'A' <= b && b <= 'Z' { + return b + ('a' - 'A') + } + return b +} diff --git a/modules/util/string_test.go b/modules/util/string_test.go index 0a4a8bbcfb..1012ab32a4 100644 --- a/modules/util/string_test.go +++ b/modules/util/string_test.go @@ -45,3 +45,29 @@ func TestToSnakeCase(t *testing.T) { assert.Equal(t, expected, ToSnakeCase(input)) } } + +func TestASCIIEqualFold(t *testing.T) { + cases := map[string]struct { + First string + Second string + Expected bool + }{ + "Empty String": {First: "", Second: "", Expected: true}, + "Single Letter Ident": {First: "h", Second: "h", Expected: true}, + "Single Letter Equal": {First: "h", Second: "H", Expected: true}, + "Single Letter Unequal": {First: "h", Second: "g", Expected: false}, + "Simple Match Ident": {First: "someString", Second: "someString", Expected: true}, + "Simple Match Equal": {First: "someString", Second: "someSTRIng", Expected: true}, + "Simple Match Unequal": {First: "someString", Second: "sameString", Expected: false}, + "Different Length": {First: "abcdef", Second: "abcdefg", Expected: false}, + "Unicode Kelvin": {First: "ghijklm", Second: "GHIJ\u212ALM", Expected: false}, + } + + for name := range cases { + c := cases[name] + t.Run(name, func(t *testing.T) { + Actual := ASCIIEqualFold(c.First, c.Second) + assert.Equal(t, c.Expected, Actual) + }) + } +} diff --git a/services/auth/oauth2.go b/services/auth/oauth2.go index 093940aa18..4fdd15d7ec 100644 --- a/services/auth/oauth2.go +++ b/services/auth/oauth2.go @@ -17,6 +17,7 @@ import ( "forgejo.org/modules/log" "forgejo.org/modules/setting" "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "forgejo.org/modules/web/middleware" "forgejo.org/services/actions" "forgejo.org/services/auth/source/oauth2" @@ -125,7 +126,7 @@ func parseToken(req *http.Request) (string, bool) { // check header token if auHead := req.Header.Get("Authorization"); auHead != "" { auths := strings.Fields(auHead) - if len(auths) == 2 && (auths[0] == "token" || strings.ToLower(auths[0]) == "bearer") { + if len(auths) == 2 && (util.ASCIIEqualFold(auths[0], "token") || util.ASCIIEqualFold(auths[0], "bearer")) { return auths[1], true } } diff --git a/services/auth/oauth2_test.go b/services/auth/oauth2_test.go index d6455b33ad..3fce7df50b 100644 --- a/services/auth/oauth2_test.go +++ b/services/auth/oauth2_test.go @@ -4,6 +4,7 @@ package auth import ( + "net/http" "testing" "forgejo.org/models/unittest" @@ -52,3 +53,30 @@ func TestCheckTaskIsRunning(t *testing.T) { }) } } + +func TestParseToken(t *testing.T) { + cases := map[string]struct { + Header string + ExpectedToken string + Expected bool + }{ + "Token Uppercase": {Header: "Token 1234567890123456789012345687901325467890", ExpectedToken: "1234567890123456789012345687901325467890", Expected: true}, + "Token Lowercase": {Header: "token 1234567890123456789012345687901325467890", ExpectedToken: "1234567890123456789012345687901325467890", Expected: true}, + "Token Unicode": {Header: "to\u212Aen 1234567890123456789012345687901325467890", ExpectedToken: "", Expected: false}, + "Bearer Uppercase": {Header: "Bearer 1234567890123456789012345687901325467890", ExpectedToken: "1234567890123456789012345687901325467890", Expected: true}, + "Bearer Lowercase": {Header: "bearer 1234567890123456789012345687901325467890", ExpectedToken: "1234567890123456789012345687901325467890", Expected: true}, + "Missing type": {Header: "1234567890123456789012345687901325467890", ExpectedToken: "", Expected: false}, + "Three Parts": {Header: "abc 1234567890 test", ExpectedToken: "", Expected: false}, + } + + for name := range cases { + c := cases[name] + t.Run(name, func(t *testing.T) { + req, _ := http.NewRequest("GET", "/", nil) + req.Header.Add("Authorization", c.Header) + ActualToken, ActualSuccess := parseToken(req) + assert.Equal(t, c.ExpectedToken, ActualToken) + assert.Equal(t, c.Expected, ActualSuccess) + }) + } +} From 13b560c191ae885900d9f8213b4ae97418734bc8 Mon Sep 17 00:00:00 2001 From: fruzitent Date: Wed, 9 Jul 2025 23:15:26 +0200 Subject: [PATCH 110/495] feat: add _URI entries for mail config (#8116) For the mailer and incoming_mailer config, allow passwords to be read from a file. Add `_URI` config values and use the existing `loadSecret` function to do this. Resolves https://codeberg.org/forgejo/forgejo/issues/8113 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8116 Reviewed-by: Gusted Reviewed-by: oliverpool Co-authored-by: fruzitent Co-committed-by: fruzitent --- custom/conf/app.example.ini | 6 ++++++ modules/setting/incoming_email.go | 7 ++++++- modules/setting/incoming_email_test.go | 18 ++++++++++++++++++ modules/setting/mailer.go | 4 ++++ modules/setting/mailer_test.go | 20 ++++++++++++++++++++ 5 files changed, 54 insertions(+), 1 deletion(-) diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index 37d67df5f0..71598663b2 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -1768,6 +1768,9 @@ LEVEL = Info ;; Use PASSWD = `your password` for quoting if you use special characters in the password. ;PASSWD = ;; +;; Alternative location to specify mailer password. You cannot specify both this and PASSWD, and must pick one +;PASSWD_URI = file:/etc/forgejo/mailer_passwd +;; ;; Send mails only in plain text, without HTML alternative ;SEND_AS_PLAIN_TEXT = false ;; @@ -1820,6 +1823,9 @@ LEVEL = Info ;; Password of the receiving account ;PASSWORD = ;; +;; Alternative location to specify password of the receiving account. You cannot specify both this and PASSWORD, and must pick one +;PASSWORD_URI = file:/etc/forgejo/email_incoming_password +;; ;; Whether the IMAP server uses TLS. ;USE_TLS = false ;; diff --git a/modules/setting/incoming_email.go b/modules/setting/incoming_email.go index e592220de6..a890a4a328 100644 --- a/modules/setting/incoming_email.go +++ b/modules/setting/incoming_email.go @@ -44,9 +44,14 @@ func loadIncomingEmailFrom(rootCfg ConfigProvider) { if sec.HasKey("USER") && !sec.HasKey("USERNAME") { IncomingEmail.Username = sec.Key("USER").String() } + if sec.HasKey("PASSWD") && !sec.HasKey("PASSWORD") { - IncomingEmail.Password = sec.Key("PASSWD").String() + sec.Key("PASSWORD").SetValue(sec.Key("PASSWD").String()) } + if sec.HasKey("PASSWD_URI") && !sec.HasKey("PASSWORD_URI") { + sec.Key("PASSWORD_URI").SetValue(sec.Key("PASSWD_URI").String()) + } + IncomingEmail.Password = loadSecret(sec, "PASSWORD_URI", "PASSWORD") // Infer Port if not set if IncomingEmail.Port == 0 { diff --git a/modules/setting/incoming_email_test.go b/modules/setting/incoming_email_test.go index 6d181cae3c..4ea740bafd 100644 --- a/modules/setting/incoming_email_test.go +++ b/modules/setting/incoming_email_test.go @@ -4,6 +4,8 @@ package setting import ( + "os" + "path/filepath" "testing" "github.com/stretchr/testify/assert" @@ -35,6 +37,22 @@ func Test_loadIncomingEmailFrom(t *testing.T) { assert.Equal(t, "y0u'll n3v3r gUess th1S!!1", IncomingEmail.Password) }) + t.Run("Secrets", func(t *testing.T) { + uri := filepath.Join(t.TempDir(), "email_incoming_password") + + if err := os.WriteFile(uri, []byte("th1S gUess n3v3r y0u'll!!1"), 0o644); err != nil { + t.Fatal(err) + } + + cfg, sec := makeBaseConfig() + sec.NewKey("PASSWORD_URI", "file:"+uri) + + IncomingEmail.Password = "" + loadIncomingEmailFrom(cfg) + + assert.Equal(t, "th1S gUess n3v3r y0u'll!!1", IncomingEmail.Password) + }) + t.Run("Port settings", func(t *testing.T) { t.Run("no port, no tls", func(t *testing.T) { defer resetIncomingEmailPort()() diff --git a/modules/setting/mailer.go b/modules/setting/mailer.go index 9c004c6ce0..b43484a90f 100644 --- a/modules/setting/mailer.go +++ b/modules/setting/mailer.go @@ -147,6 +147,10 @@ func loadMailerFrom(rootCfg ConfigProvider) { if sec.HasKey("PASSWORD") && !sec.HasKey("PASSWD") { sec.Key("PASSWD").SetValue(sec.Key("PASSWORD").String()) } + if sec.HasKey("PASSWORD_URI") && !sec.HasKey("PASSWD_URI") { + sec.Key("PASSWD_URI").SetValue(sec.Key("PASSWORD_URI").String()) + } + sec.Key("PASSWD").SetValue(loadSecret(sec, "PASSWD_URI", "PASSWD")) // Set default values & validate sec.Key("NAME").MustString(AppName) diff --git a/modules/setting/mailer_test.go b/modules/setting/mailer_test.go index 4523cc91dd..47eaf3ffbb 100644 --- a/modules/setting/mailer_test.go +++ b/modules/setting/mailer_test.go @@ -4,6 +4,8 @@ package setting import ( + "os" + "path/filepath" "testing" "github.com/stretchr/testify/assert" @@ -52,6 +54,24 @@ func Test_loadMailerFrom(t *testing.T) { assert.Equal(t, "y0u'll n3v3r gUess th1S!!1", MailService.Passwd) }) + t.Run("Secrets", func(t *testing.T) { + uri := filepath.Join(t.TempDir(), "mailer_passwd") + + if err := os.WriteFile(uri, []byte("th1S gUess n3v3r y0u'll!!1"), 0o644); err != nil { + t.Fatal(err) + } + + cfg, _ := NewConfigProviderFromData("") + sec := cfg.Section("mailer") + sec.NewKey("ENABLED", "true") + sec.NewKey("PASSWD_URI", "file:"+uri) + + MailService.Passwd = "" + loadMailerFrom(cfg) + + assert.Equal(t, "th1S gUess n3v3r y0u'll!!1", MailService.Passwd) + }) + t.Run("sendmail argument sanitization", func(t *testing.T) { cfg, _ := NewConfigProviderFromData("") sec := cfg.Section("mailer") From ba42ebf1ae95b0dae23a870f82635e281a9027e9 Mon Sep 17 00:00:00 2001 From: Gusted Date: Thu, 10 Jul 2025 00:47:39 +0200 Subject: [PATCH 111/495] chore: do not navigate to same URL in E2E test (#8461) - In `test.beforeEach` the browser is navigated to `/user2/repo1/pulls/5` and the test environment is prepared by making sure the pull request is not WIP. At the start of `simple toggle` the browser is navigated to the same URL (and the browser is already on this URL) which the Mobile Chrome browser does not handle gracefully and reliably errors with `net::ERR_ABORTED`. - Because we are already at that URL, do not try to navigate to it again. - I cannot offer a rationale why the Mobile Chrome browser does give a error when this happens in subsequent tests of 'Pull: Toggle WIP'. - Ref forgejo/forgejo#8359 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8461 Reviewed-by: Otto Co-authored-by: Gusted Co-committed-by: Gusted --- tests/e2e/issue-sidebar.test.e2e.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/e2e/issue-sidebar.test.e2e.ts b/tests/e2e/issue-sidebar.test.e2e.ts index 34885d0d5d..9d2975b612 100644 --- a/tests/e2e/issue-sidebar.test.e2e.ts +++ b/tests/e2e/issue-sidebar.test.e2e.ts @@ -50,7 +50,6 @@ test.describe('Pull: Toggle WIP', () => { test('simple toggle', async ({page}, 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'); - await page.goto('/user2/repo1/pulls/5'); // toggle to WIP await toggle_wip_to({page}, true); await check_wip({page}, true); From 501836df77d99b54babc642c63f52c8dc6e8ce52 Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Thu, 10 Jul 2025 01:30:07 +0200 Subject: [PATCH 112/495] [v12.0/forgejo] fix: ASCII equal fold for authorization header (#8459) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8391 For the "Authorization:" header only lowercase "token" was accepted. This change allows uppercase "Token" as well. Signed-off-by: Nis Wechselberg Co-authored-by: Nis Wechselberg Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8459 Reviewed-by: Gusted Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- modules/util/string.go | 22 ++++++++++++++++++++++ modules/util/string_test.go | 26 ++++++++++++++++++++++++++ services/auth/oauth2.go | 3 ++- services/auth/oauth2_test.go | 28 ++++++++++++++++++++++++++++ 4 files changed, 78 insertions(+), 1 deletion(-) diff --git a/modules/util/string.go b/modules/util/string.go index cf50f591c6..ca3d43ec6e 100644 --- a/modules/util/string.go +++ b/modules/util/string.go @@ -95,3 +95,25 @@ func UnsafeBytesToString(b []byte) string { func UnsafeStringToBytes(s string) []byte { return unsafe.Slice(unsafe.StringData(s), len(s)) } + +// AsciiEqualFold is taken from Golang, but reimplemented here, since the original is not exposed to public +// Taken from: https://cs.opensource.google/go/go/+/refs/tags/go1.24.4:src/net/http/internal/ascii/print.go +func ASCIIEqualFold(s, t string) bool { + if len(s) != len(t) { + return false + } + for i := 0; i < len(s); i++ { + if ASCIILower(s[i]) != ASCIILower(t[i]) { + return false + } + } + return true +} + +// AsciiLower returns the ASCII lowercase version of b. +func ASCIILower(b byte) byte { + if 'A' <= b && b <= 'Z' { + return b + ('a' - 'A') + } + return b +} diff --git a/modules/util/string_test.go b/modules/util/string_test.go index 0a4a8bbcfb..1012ab32a4 100644 --- a/modules/util/string_test.go +++ b/modules/util/string_test.go @@ -45,3 +45,29 @@ func TestToSnakeCase(t *testing.T) { assert.Equal(t, expected, ToSnakeCase(input)) } } + +func TestASCIIEqualFold(t *testing.T) { + cases := map[string]struct { + First string + Second string + Expected bool + }{ + "Empty String": {First: "", Second: "", Expected: true}, + "Single Letter Ident": {First: "h", Second: "h", Expected: true}, + "Single Letter Equal": {First: "h", Second: "H", Expected: true}, + "Single Letter Unequal": {First: "h", Second: "g", Expected: false}, + "Simple Match Ident": {First: "someString", Second: "someString", Expected: true}, + "Simple Match Equal": {First: "someString", Second: "someSTRIng", Expected: true}, + "Simple Match Unequal": {First: "someString", Second: "sameString", Expected: false}, + "Different Length": {First: "abcdef", Second: "abcdefg", Expected: false}, + "Unicode Kelvin": {First: "ghijklm", Second: "GHIJ\u212ALM", Expected: false}, + } + + for name := range cases { + c := cases[name] + t.Run(name, func(t *testing.T) { + Actual := ASCIIEqualFold(c.First, c.Second) + assert.Equal(t, c.Expected, Actual) + }) + } +} diff --git a/services/auth/oauth2.go b/services/auth/oauth2.go index 093940aa18..4fdd15d7ec 100644 --- a/services/auth/oauth2.go +++ b/services/auth/oauth2.go @@ -17,6 +17,7 @@ import ( "forgejo.org/modules/log" "forgejo.org/modules/setting" "forgejo.org/modules/timeutil" + "forgejo.org/modules/util" "forgejo.org/modules/web/middleware" "forgejo.org/services/actions" "forgejo.org/services/auth/source/oauth2" @@ -125,7 +126,7 @@ func parseToken(req *http.Request) (string, bool) { // check header token if auHead := req.Header.Get("Authorization"); auHead != "" { auths := strings.Fields(auHead) - if len(auths) == 2 && (auths[0] == "token" || strings.ToLower(auths[0]) == "bearer") { + if len(auths) == 2 && (util.ASCIIEqualFold(auths[0], "token") || util.ASCIIEqualFold(auths[0], "bearer")) { return auths[1], true } } diff --git a/services/auth/oauth2_test.go b/services/auth/oauth2_test.go index d6455b33ad..3fce7df50b 100644 --- a/services/auth/oauth2_test.go +++ b/services/auth/oauth2_test.go @@ -4,6 +4,7 @@ package auth import ( + "net/http" "testing" "forgejo.org/models/unittest" @@ -52,3 +53,30 @@ func TestCheckTaskIsRunning(t *testing.T) { }) } } + +func TestParseToken(t *testing.T) { + cases := map[string]struct { + Header string + ExpectedToken string + Expected bool + }{ + "Token Uppercase": {Header: "Token 1234567890123456789012345687901325467890", ExpectedToken: "1234567890123456789012345687901325467890", Expected: true}, + "Token Lowercase": {Header: "token 1234567890123456789012345687901325467890", ExpectedToken: "1234567890123456789012345687901325467890", Expected: true}, + "Token Unicode": {Header: "to\u212Aen 1234567890123456789012345687901325467890", ExpectedToken: "", Expected: false}, + "Bearer Uppercase": {Header: "Bearer 1234567890123456789012345687901325467890", ExpectedToken: "1234567890123456789012345687901325467890", Expected: true}, + "Bearer Lowercase": {Header: "bearer 1234567890123456789012345687901325467890", ExpectedToken: "1234567890123456789012345687901325467890", Expected: true}, + "Missing type": {Header: "1234567890123456789012345687901325467890", ExpectedToken: "", Expected: false}, + "Three Parts": {Header: "abc 1234567890 test", ExpectedToken: "", Expected: false}, + } + + for name := range cases { + c := cases[name] + t.Run(name, func(t *testing.T) { + req, _ := http.NewRequest("GET", "/", nil) + req.Header.Add("Authorization", c.Header) + ActualToken, ActualSuccess := parseToken(req) + assert.Equal(t, c.ExpectedToken, ActualToken) + assert.Equal(t, c.Expected, ActualSuccess) + }) + } +} From 3c7e3ec9e2dd2486fc855893bf15b8d80219645b Mon Sep 17 00:00:00 2001 From: Gusted Date: Thu, 10 Jul 2025 01:56:29 +0200 Subject: [PATCH 113/495] chore: disable mismatched root URL e2e test for safari (#8460) - I cannot give a good rationale why Mobile Safari and webkit is failing this test quite consistently and also succeed quite often. We add a script to ensure that we get a mismatched URL - but these two browsers either ignore this script sometime or delays the execution until after the root URL check is done. - Because it is very hard to run webkit and mobile safari without running a heavily containerized environment (without a graphical interface) it is near impossible to debug this issue properly; save ourselves a headache and disable it instead. I find it more likely to be a problem with my playwright test than it to be a problem with the mismatched root URL code. - Ref forgejo/forgejo#8359 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8460 Reviewed-by: Otto Reviewed-by: Beowulf Co-authored-by: Gusted Co-committed-by: Gusted --- tests/e2e/login.test.e2e.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/e2e/login.test.e2e.ts b/tests/e2e/login.test.e2e.ts index 1ffa0b2e5d..01cf4d7b8d 100644 --- a/tests/e2e/login.test.e2e.ts +++ b/tests/e2e/login.test.e2e.ts @@ -10,7 +10,8 @@ import {expect} from '@playwright/test'; import {test, save_visual, test_context} from './utils_e2e.ts'; -test('Mismatched ROOT_URL', async ({browser}) => { +test('Mismatched ROOT_URL', async ({browser}, workerInfo) => { + test.skip(['Mobile Safari', 'webkit'].includes(workerInfo.project.name), 'init script gets randomly ignored'); const context = await test_context(browser); const page = await context.newPage(); From 3db33792499fdef6ef48e9484bc60b2d12192f0c Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Thu, 10 Jul 2025 03:08:54 +0200 Subject: [PATCH 114/495] [v12.0/forgejo] chore: do not navigate to same URL in E2E test (#8463) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8461 - In `test.beforeEach` the browser is navigated to `/user2/repo1/pulls/5` and the test environment is prepared by making sure the pull request is not WIP. At the start of `simple toggle` the browser is navigated to the same URL (and the browser is already on this URL) which the Mobile Chrome browser does not handle gracefully and reliably errors with `net::ERR_ABORTED`. - Because we are already at that URL, do not try to navigate to it again. - I cannot offer a rationale why the Mobile Chrome browser does give a error when this happens in subsequent tests of 'Pull: Toggle WIP'. - Ref forgejo/forgejo#8359 Co-authored-by: Gusted Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8463 Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- tests/e2e/issue-sidebar.test.e2e.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/e2e/issue-sidebar.test.e2e.ts b/tests/e2e/issue-sidebar.test.e2e.ts index bc65b0842c..ca0ee5e278 100644 --- a/tests/e2e/issue-sidebar.test.e2e.ts +++ b/tests/e2e/issue-sidebar.test.e2e.ts @@ -50,7 +50,6 @@ test.describe('Pull: Toggle WIP', () => { test('simple toggle', async ({page}, 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'); - await page.goto('/user2/repo1/pulls/5'); // toggle to WIP await toggle_wip_to({page}, true); await check_wip({page}, true); From e7301994997a5de499eb5d2738c2f64d49085f47 Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Thu, 10 Jul 2025 03:30:37 +0200 Subject: [PATCH 115/495] [v12.0/forgejo] chore: disable mismatched root URL e2e test for safari (#8466) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8460 - I cannot give a good rationale why Mobile Safari and webkit is failing this test quite consistently and also succeed quite often. We add a script to ensure that we get a mismatched URL - but these two browsers either ignore this script sometime or delays the execution until after the root URL check is done. - Because it is very hard to run webkit and mobile safari without running a heavily containerized environment (without a graphical interface) it is near impossible to debug this issue properly; save ourselves a headache and disable it instead. I find it more likely to be a problem with my playwright test than it to be a problem with the mismatched root URL code. - Ref forgejo/forgejo#8359 Co-authored-by: Gusted Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8466 Reviewed-by: Otto Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- tests/e2e/login.test.e2e.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/e2e/login.test.e2e.ts b/tests/e2e/login.test.e2e.ts index 1ffa0b2e5d..01cf4d7b8d 100644 --- a/tests/e2e/login.test.e2e.ts +++ b/tests/e2e/login.test.e2e.ts @@ -10,7 +10,8 @@ import {expect} from '@playwright/test'; import {test, save_visual, test_context} from './utils_e2e.ts'; -test('Mismatched ROOT_URL', async ({browser}) => { +test('Mismatched ROOT_URL', async ({browser}, workerInfo) => { + test.skip(['Mobile Safari', 'webkit'].includes(workerInfo.project.name), 'init script gets randomly ignored'); const context = await test_context(browser); const page = await context.newPage(); From ddc9240a1481e3e6565ebb8e73911aac4ac60ce1 Mon Sep 17 00:00:00 2001 From: forgejo-release-manager Date: Thu, 10 Jul 2025 10:50:11 +0200 Subject: [PATCH 116/495] chore(release-notes): Forgejo v7.0.16 (#8473) https://codeberg.org/forgejo/forgejo/milestone/17405 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8473 Reviewed-by: Earl Warren Co-authored-by: forgejo-release-manager Co-committed-by: forgejo-release-manager --- release-notes-published/7.0.16.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 release-notes-published/7.0.16.md diff --git a/release-notes-published/7.0.16.md b/release-notes-published/7.0.16.md new file mode 100644 index 0000000000..5d09ddc245 --- /dev/null +++ b/release-notes-published/7.0.16.md @@ -0,0 +1,11 @@ +## Git update fixing CVE-2025-48385 + +Git vulnerabilities were [disclosed 8 July 2025](https://groups.google.com/g/git-packagers/c/cYJ6peBtyxk/m/xVukiATcBQAJ) and require an update of the Git version used by Forgejo to Git [v2.43.7, v2.44.4, v2.45.4, v2.46.4, v2.47.3, v2.48.2, v2.49.1, or v2.50.1](https://nvd.nist.gov/vuln/detail/CVE-2025-48385). The [containers of this release](https://codeberg.org/forgejo/-/packages/container/forgejo/7.0.16) include a Git binary that is not vulnerable. If Forgejo was installed using a container, it is enough to upgrade the container to get the latest Git binary. + +Security bug fixes are only for Git, there are no security fixes for Forgejo itself in this release. + + + +## Release notes + + From 86a13589fa5218b676c3e5c3ec159d4c84266c9b Mon Sep 17 00:00:00 2001 From: forgejo-release-manager Date: Thu, 10 Jul 2025 10:50:24 +0200 Subject: [PATCH 117/495] chore(release-notes): Forgejo v11.0.3 (#8472) https://codeberg.org/forgejo/forgejo/milestone/20958 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8472 Reviewed-by: Earl Warren Co-authored-by: forgejo-release-manager Co-committed-by: forgejo-release-manager --- release-notes-published/11.0.3.md | 34 +++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 release-notes-published/11.0.3.md diff --git a/release-notes-published/11.0.3.md b/release-notes-published/11.0.3.md new file mode 100644 index 0000000000..ed6f150af9 --- /dev/null +++ b/release-notes-published/11.0.3.md @@ -0,0 +1,34 @@ +## Git update fixing CVE-2025-48385 + +Git vulnerabilities were [disclosed 8 July 2025](https://groups.google.com/g/git-packagers/c/cYJ6peBtyxk/m/xVukiATcBQAJ) and require an update of the Git version used by Forgejo to Git [v2.43.7, v2.44.4, v2.45.4, v2.46.4, v2.47.3, v2.48.2, v2.49.1, or v2.50.1](https://nvd.nist.gov/vuln/detail/CVE-2025-48385). The [containers of this release](https://codeberg.org/forgejo/-/packages/container/forgejo/11.0.3) include a Git binary that is not vulnerable. If Forgejo was installed using a container, it is enough to upgrade the container to get the latest Git binary. + +Security bug fixes are only for Git, there are no security fixes for Forgejo itself in this release. + +## Wiki permissions manual steps + +If collaborators with write access can't edit the wiki, an administrator can now go to the Units settings (`//settings/units#wiki`) and Save the wiki settings (no change is needed) to fix the problem. This is a manual step that will trigger a database update that is currently not possible to automate for Forgejo stable releases. + + + +## Release notes + +- User Interface bug fixes + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8246) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8283)): fix(ui): add missing lazy load attribute to images (#8246) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8170) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8262)): fix(ui): erroneous list continuation on Cmd+Enter on macOS +- Localization + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8300): i18n: backport of translation updates +- Bug fixes + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8189) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8456)): fix: do not ignore automerge while a PR is checking for conflicts + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8367) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8385)): fix: user activation with uppercase email address + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8234) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8237)): fix: collaborator can edit wiki with write access +- Included for completeness but not worth a release note + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8460) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8465)): chore: disable mismatched root URL e2e test for safari + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8461) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8462)): chore: do not navigate to same URL in E2E test + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8258) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8445)): fix: corrupted wiki unit default permission (#8234 follow-up) (#8258) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8261) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8412)): fix: skip empty tokens in SearchOptions.Tokens() + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8400) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8401)): chore: improve reliability of webauthn e2e test + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8326) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8333)): fix: make API /repos/{owner}/{repo}/compare/{basehead} work with forks + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8226) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8292)): chore: sort mailer messages in test assertion + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8002) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8289)): fix(ui): release: name is overridden with tag name on edit + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8286) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8287)): Revert "fix(api): document `is_system_webhook` field (#7784)" + From 3f1ed6dde4584f046046600dec635493247b109b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 10 Jul 2025 10:58:57 +0200 Subject: [PATCH 118/495] Update dependency webpack to v5.100.0 (forgejo) (#8467) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [webpack](https://github.com/webpack/webpack) | [`5.99.9` -> `5.100.0`](https://renovatebot.com/diffs/npm/webpack/5.99.9/5.100.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/webpack/5.100.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/webpack/5.99.9/5.100.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
webpack/webpack (webpack) ### [`v5.100.0`](https://github.com/webpack/webpack/releases/tag/v5.100.0) [Compare Source](https://github.com/webpack/webpack/compare/v5.99.9...v5.100.0) ##### Fixes - Fixed the case where an ES modules entry chunk depends on the runtime chunk hash - Handle function exports in webpack module wrapper - Ensure dependent chunks are imported before startup & fix duplicate export of 'default' - Generate lose closing brace when exports are unprovided - CleanPlugin doesn't unlink same file twice - Fixed unexpected error codes from fs.unlink on Windows - Typescript types ##### Features - HMR support for ES modules output - ES module output mode now fully supports `splitChunks` when external variables and runtimeChunk are not set. - Added support `using` keyword - Implemented tc39 [Defer Module Evaluation](https://github.com/tc39/proposal-defer-import-eval) (experiment) - Support dynamic template literals expressions for `new URL(...)` - Enable ES modules worker chunk loading for Node.js targets - Improved support for destructing in DefinePlugin - Added [VirtualUrlPlugin](https://github.com/webpack/webpack/tree/main/examples/virtual-modules) to support `virtual:` scheme ##### Performance Improvements - Remove useless startup entrypoint runtime for ES modules output - Cache `new URL(...)` evaluate expression
--- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8467 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 29 +++++++++++++++++++++-------- package.json | 2 +- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index b0d24f002d..5ac6838b58 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,7 +56,7 @@ "vue-chartjs": "5.3.1", "vue-loader": "17.4.2", "vue3-calendar-heatmap": "2.0.5", - "webpack": "5.99.9", + "webpack": "5.100.0", "webpack-cli": "6.0.1", "wrap-ansi": "9.0.0" }, @@ -4671,6 +4671,18 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-phases": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.3.tgz", + "integrity": "sha512-jtKLnfoOzm28PazuQ4dVBcE9Jeo6ha1GAJvq3N0LlNOszmTfx+wSycBehn+FN0RnyeR77IBxN/qVYMw0Rlj0Xw==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -15597,21 +15609,22 @@ "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.99.9", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz", - "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==", + "version": "5.100.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.100.0.tgz", + "integrity": "sha512-H8yBSBTk+BqxrINJnnRzaxU94SVP2bjd7WmA+PfCphoIdDpeQMJ77pq9/4I7xjLq38cB1bNKfzYPZu8pB3zKtg==", "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", + "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", + "enhanced-resolve": "^5.17.2", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -15625,7 +15638,7 @@ "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" diff --git a/package.json b/package.json index 229ae56354..27576923bf 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "vue-chartjs": "5.3.1", "vue-loader": "17.4.2", "vue3-calendar-heatmap": "2.0.5", - "webpack": "5.99.9", + "webpack": "5.100.0", "webpack-cli": "6.0.1", "wrap-ansi": "9.0.0" }, From 7cd313951aa4f12d652305be708ed6a4a8d98d24 Mon Sep 17 00:00:00 2001 From: Gusted Date: Thu, 10 Jul 2025 14:07:18 +0200 Subject: [PATCH 119/495] fix: use parent context for new transactions (#8464) - Older code (154 places to be exact) that want to do transactions uses `TxContext`. If the context is not already in a transaction then it uses `DefaultContext` for the new transaction. - Not reusing the context it was given leads to two problems: for tracing (forgejo/forgejo#6470) any SQL code that is executed inside this transaction is not shown in the trace. If the context is cancelled then the transaction is not cancelled and will always complete (given there's no SQL error). - When this function was introduced it didn't take a parent context, hence the usage of `DefaultContext`. When `parentCtx` was introduced it was only used to avoid nested transactions and use the parent's transaction. I do not see any reasons why the parent context cannot be reused, it is reused in the newer transaction function `WithTx` without any known problems. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8464 Reviewed-by: Otto Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- models/db/context.go | 2 +- models/db/context_test.go | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/models/db/context.go b/models/db/context.go index 35526936af..3e035cd733 100644 --- a/models/db/context.go +++ b/models/db/context.go @@ -141,7 +141,7 @@ func TxContext(parentCtx context.Context) (*Context, Committer, error) { return nil, nil, err } - return newContext(DefaultContext, sess, true), sess, nil + return newContext(parentCtx, sess, true), sess, nil } // WithTx represents executing database operations on a transaction, if the transaction exist, diff --git a/models/db/context_test.go b/models/db/context_test.go index 7ab327b7e9..d12d79ebe1 100644 --- a/models/db/context_test.go +++ b/models/db/context_test.go @@ -84,4 +84,16 @@ func TestTxContext(t *testing.T) { return nil })) } + + t.Run("Reuses parent context", func(t *testing.T) { + type unique struct{} + + ctx := context.WithValue(db.DefaultContext, unique{}, "yes!") + assert.False(t, db.InTransaction(ctx)) + + require.NoError(t, db.WithTx(ctx, func(ctx context.Context) error { + assert.Equal(t, "yes!", ctx.Value(unique{})) + return nil + })) + }) } From 7c06db89e30ada623e51b32ecd4d914657ce0847 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 10 Jul 2025 14:14:30 +0200 Subject: [PATCH 120/495] Update module golang.org/x/sync to v0.16.0 (forgejo) (#8469) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8469 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d09ec592aa..f762211788 100644 --- a/go.mod +++ b/go.mod @@ -103,7 +103,7 @@ require ( golang.org/x/image v0.27.0 golang.org/x/net v0.41.0 golang.org/x/oauth2 v0.30.0 - golang.org/x/sync v0.15.0 + golang.org/x/sync v0.16.0 golang.org/x/sys v0.33.0 golang.org/x/text v0.26.0 google.golang.org/protobuf v1.36.4 diff --git a/go.sum b/go.sum index cddd87d4ce..c261c5f1c4 100644 --- a/go.sum +++ b/go.sum @@ -627,8 +627,8 @@ golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= From 18b542f8b1f183f97b0d0e2c5cd178fdecabd613 Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Thu, 10 Jul 2025 14:44:56 +0200 Subject: [PATCH 121/495] [v12.0/forgejo] fix: use parent context for new transactions (#8474) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8464 - Older code (154 places to be exact) that want to do transactions uses `TxContext`. If the context is not already in a transaction then it uses `DefaultContext` for the new transaction. - Not reusing the context it was given leads to two problems: for tracing (forgejo/forgejo#6470) any SQL code that is executed inside this transaction is not shown in the trace. If the context is cancelled then the transaction is not cancelled and will always complete (given there's no SQL error). - When this function was introduced it didn't take a parent context, hence the usage of `DefaultContext`. When `parentCtx` was introduced it was only used to avoid nested transactions and use the parent's transaction. I do not see any reasons why the parent context cannot be reused, it is reused in the newer transaction function `WithTx` without any known problems. Co-authored-by: Gusted Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8474 Reviewed-by: Gusted Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- models/db/context.go | 2 +- models/db/context_test.go | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/models/db/context.go b/models/db/context.go index 35526936af..3e035cd733 100644 --- a/models/db/context.go +++ b/models/db/context.go @@ -141,7 +141,7 @@ func TxContext(parentCtx context.Context) (*Context, Committer, error) { return nil, nil, err } - return newContext(DefaultContext, sess, true), sess, nil + return newContext(parentCtx, sess, true), sess, nil } // WithTx represents executing database operations on a transaction, if the transaction exist, diff --git a/models/db/context_test.go b/models/db/context_test.go index 7ab327b7e9..d12d79ebe1 100644 --- a/models/db/context_test.go +++ b/models/db/context_test.go @@ -84,4 +84,16 @@ func TestTxContext(t *testing.T) { return nil })) } + + t.Run("Reuses parent context", func(t *testing.T) { + type unique struct{} + + ctx := context.WithValue(db.DefaultContext, unique{}, "yes!") + assert.False(t, db.InTransaction(ctx)) + + require.NoError(t, db.WithTx(ctx, func(ctx context.Context) error { + assert.Equal(t, "yes!", ctx.Value(unique{})) + return nil + })) + }) } From b332d1c2e4c4bff89f70986e4d11854cc44a0500 Mon Sep 17 00:00:00 2001 From: Maxim Slipenko Date: Thu, 10 Jul 2025 17:12:07 +0200 Subject: [PATCH 122/495] several fixes of ALT Package registry (#8475) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes #7946 - The `rpmsRepoPattern` regex has been fixed to handle releases with dots correctly. For example, the version `0.9.0-alt1.git.17.g2ba905d` is valid, just like `0.1.0-1.n1` mentioned in the issue (https://codeberg.org/forgejo/forgejo/issues/7946#issue-1628991) - getEntries now returns entry names. In the integration tests, there were lines like: ```go assert.Equal(t, []string{"", ""}, result.ProvideNames) ``` and it’s unclear how such test logic could have ever worked correctly (fixes problems with deps https://codeberg.org/forgejo/forgejo/issues/7946#issuecomment-5109795) - ALT is an acronym for ALT Linux Team, so `Alt` was replaced with `ALT`. Strictly speaking, it should probably be `ALT Linux`, but since we use `Arch` instead of `Arch Linux`, this seems fine. Also, Distrowatch shows `Arch`/`ALT` in its dropdown, so it’s consistent. - The strings `"Alt Linux Team"` and `"Sisyphus"` in the `Origin` and `Suite` fields have been replaced with `setting.AppName` and `"Unknown"`. `Unknown` is a valid value and is set by default, so this won’t cause any issues. - The documentation link has been fixed: (404 docs.gitea.com/usage/packages/alt/ -> 200 forgejo.org/docs/latest/user/packages/alt/) --- ## Checklist The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org). ### Tests - I added test coverage for Go changes... - [ ] in their respective `*_test.go` for unit tests. - [x] in the `tests/integration` directory if it involves interactions with a live Forgejo server. - I added test coverage for JavaScript changes... - [ ] in `web_src/js/*.test.js` if it can be unit tested. - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)). ### Documentation - [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [ ] I do not want this change to show in the release notes. - [x] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/.md` to be be used for the release notes instead of the title. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8475 Reviewed-by: Gusted Co-authored-by: Maxim Slipenko Co-committed-by: Maxim Slipenko --- models/packages/package.go | 2 +- modules/packages/rpm/metadata.go | 3 ++- routers/api/packages/api.go | 2 +- services/packages/alt/repository.go | 12 +++++++----- templates/package/content/alt.tmpl | 2 +- tests/integration/api_packages_alt_test.go | 16 ++++++++-------- 6 files changed, 20 insertions(+), 17 deletions(-) diff --git a/models/packages/package.go b/models/packages/package.go index bdd1c74cad..c06dcf5eb3 100644 --- a/models/packages/package.go +++ b/models/packages/package.go @@ -125,7 +125,7 @@ func (pt Type) Name() string { case TypeRpm: return "RPM" case TypeAlt: - return "Alt" + return "ALT" case TypeRubyGems: return "RubyGems" case TypeSwift: diff --git a/modules/packages/rpm/metadata.go b/modules/packages/rpm/metadata.go index 4af9af620f..503b7b1a24 100644 --- a/modules/packages/rpm/metadata.go +++ b/modules/packages/rpm/metadata.go @@ -232,9 +232,10 @@ func getEntries(h *rpmutils.RpmHeader, namesTag, versionsTag, flagsTag int, repo case "alt": for i := range names { e := &Entry{ + Name: names[i], AltFlags: uint32(flags[i]), + Version: versions[i], } - e.Version = versions[i] entries = append(entries, e) } } diff --git a/routers/api/packages/api.go b/routers/api/packages/api.go index 79e61cf352..c53edfbf96 100644 --- a/routers/api/packages/api.go +++ b/routers/api/packages/api.go @@ -631,7 +631,7 @@ func CommonRoutes() *web.Route { baseURLPattern = regexp.MustCompile(`\A(.*?)\.repo\z`) uploadPattern = regexp.MustCompile(`\A(.*?)/upload\z`) baseRepoPattern = regexp.MustCompile(`(\S+)\.repo/(\S+)\/base/(\S+)`) - rpmsRepoPattern = regexp.MustCompile(`(\S+)\.repo/(\S+)\.(\S+)\/([a-zA-Z0-9_-]+)-([\d.]+-[a-zA-Z0-9_-]+)\.(\S+)\.rpm`) + rpmsRepoPattern = regexp.MustCompile(`(\S+)\.repo/(\S+)\.(\S+)\/([a-zA-Z0-9_-]+)-([\d.]+-[a-zA-Z0-9_.-]+)\.(\S+)\.rpm`) ) r.Methods("HEAD,GET,PUT,DELETE", "*", func(ctx *context.Context) { diff --git a/services/packages/alt/repository.go b/services/packages/alt/repository.go index 317862da9d..9693f4322e 100644 --- a/services/packages/alt/repository.go +++ b/services/packages/alt/repository.go @@ -714,21 +714,23 @@ func buildRelease(ctx context.Context, pv *packages_model.PackageVersion, pfs [] for architecture := range architectures.Seq() { version := time.Now().Unix() label := setting.AppName - data := fmt.Sprintf(`Archive: Alt Linux Team + origin := setting.AppName + archive := setting.AppName + + data := fmt.Sprintf(`Archive: %s Component: classic Version: %d -Origin: Alt Linux Team +Origin: %s Label: %s Architecture: %s NotAutomatic: false `, - version, label, architecture) + archive, version, origin, label, architecture) fileInfo, err := addReleaseAsFileToRepo(ctx, pv, "release.classic", data, group, architecture) if err != nil { return err } - origin := setting.AppName codename := time.Now().Unix() date := time.Now().UTC().Format(time.RFC1123) @@ -744,7 +746,7 @@ NotAutomatic: false data = fmt.Sprintf(`Origin: %s Label: %s -Suite: Sisyphus +Suite: Unknown Codename: %d Date: %s Architectures: %s diff --git a/templates/package/content/alt.tmpl b/templates/package/content/alt.tmpl index 9a5e9c7656..0a5c328e6d 100644 --- a/templates/package/content/alt.tmpl +++ b/templates/package/content/alt.tmpl @@ -24,7 +24,7 @@ apt-get install {{$.PackageDescriptor.Package.Name}}
- +
diff --git a/tests/integration/api_packages_alt_test.go b/tests/integration/api_packages_alt_test.go index c7ee2c49a5..f43759364e 100644 --- a/tests/integration/api_packages_alt_test.go +++ b/tests/integration/api_packages_alt_test.go @@ -214,7 +214,7 @@ enabled=1`, } assert.Equal(t, "classic", result.Component) - assert.Equal(t, "Alt Linux Team", result.Origin) + assert.Equal(t, "Forgejo", result.Origin) assert.Equal(t, "Forgejo", result.Label) assert.Equal(t, "x86_64", result.Architecture) assert.False(t, result.NotAutomatic) @@ -299,17 +299,17 @@ enabled=1`, assert.Equal(t, "Forgejo", result.Origin) assert.Equal(t, "Forgejo", result.Label) - assert.Equal(t, "Sisyphus", result.Suite) + assert.Equal(t, "Unknown", result.Suite) assert.Equal(t, "x86_64", result.Architectures) assert.Len(t, result.MD5Sum, 3) - assert.Equal(t, "bbf7ae6b2f540673ed1cfc0266b5f319", result.MD5Sum[0].Hash) - assert.Equal(t, 1003, result.MD5Sum[0].Size) + assert.Equal(t, "3f25f44163e8e512efb248d3b96949c3", result.MD5Sum[0].Hash) + assert.Equal(t, 1147, result.MD5Sum[0].Size) assert.Equal(t, "base/pkglist.classic", result.MD5Sum[0].File) assert.Len(t, result.BLAKE2B, 3) - assert.Equal(t, "b527bf038895ce29107ec3a6d2eebd7c365e8ce5ab767276eeddd7c549a159025225cb0ecfdbf7b71da13db7e865e77bcb0e2dae4d21335df01a4a17e0056a70", result.BLAKE2B[0].Hash) - assert.Equal(t, 1003, result.BLAKE2B[0].Size) + assert.Equal(t, "21a63e12a41f70e0697d354ae31e22ad6f024ec5ead2ea498b9a1b7db0f98a4e441f46c96d6912fba19148ff013457561fbb9bf3fca2a21d04cf15a325be7de9", result.BLAKE2B[0].Hash) + assert.Equal(t, 1147, result.BLAKE2B[0].Size) assert.Equal(t, "base/pkglist.classic", result.BLAKE2B[0].File) }) @@ -567,9 +567,9 @@ enabled=1`, assert.Equal(t, "https://gitea.io", result.URL) assert.Equal(t, "x86_64", result.Arch) assert.Equal(t, "gitea-test-1.0.2-1.src.rpm", result.SourceRpm) - assert.Equal(t, []string{"", ""}, result.ProvideNames) + assert.Equal(t, []string{"gitea-test(x86-64)", "gitea-test(x86-64)"}, result.ProvideNames) assert.Equal(t, []int{16777226, 16777226, 16777226, 16777226, 16777226, 16777226, 16777226}, result.RequireFlags) - assert.Equal(t, []string{"", "", "", "", "", "", ""}, result.RequireNames) + assert.Equal(t, []string{"rpmlib(PayloadIsXz)", "rpmlib(PayloadIsXz)", "rpmlib(PayloadIsXz)", "rpmlib(PayloadIsXz)", "rpmlib(PayloadIsXz)", "rpmlib(PayloadIsXz)", "rpmlib(PayloadIsXz)"}, result.RequireNames) assert.Equal(t, []string{"5.2-1", "5.2-1", "5.2-1", "5.2-1", "5.2-1", "5.2-1", "5.2-1"}, result.RequireVersions) assert.Equal(t, []int{1678276800}, result.ChangeLogTimes) assert.Equal(t, []string{"KN4CK3R "}, result.ChangeLogNames) From 2c01097315e7a6125e56f5085b63a0861a64fb8d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 10 Jul 2025 17:12:27 +0200 Subject: [PATCH 123/495] Update module golang.org/x/sys to v0.34.0 (forgejo) (#8470) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8470 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f762211788..ea05356154 100644 --- a/go.mod +++ b/go.mod @@ -104,7 +104,7 @@ require ( golang.org/x/net v0.41.0 golang.org/x/oauth2 v0.30.0 golang.org/x/sync v0.16.0 - golang.org/x/sys v0.33.0 + golang.org/x/sys v0.34.0 golang.org/x/text v0.26.0 google.golang.org/protobuf v1.36.4 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df diff --git a/go.sum b/go.sum index c261c5f1c4..52cdff2454 100644 --- a/go.sum +++ b/go.sum @@ -654,8 +654,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= From 049899b56b02339ab43062d75a0803a3dfdb40f8 Mon Sep 17 00:00:00 2001 From: Gusted Date: Thu, 10 Jul 2025 17:51:19 +0200 Subject: [PATCH 124/495] feat: AGit push options starting with `{base64}` are decoded (#8479) - When specifying push options, tooling like [git-repo-go](https://github.com/alibaba/git-repo-go) encodes pushoption values if they contain newlines or non-ASCII characters as they cannot be easily specified via the CLI otherwise. - Recognize such base64 encoded values in the pushoptions (those that have the `{base64}` prefix), if the base64 decoding fails we return the original value. - Resolves forgejo/forgejo#8161 ## Release notes - Features - [PR](https://codeberg.org/forgejo/forgejo/pulls/8479): AGit push options starting with `{base64}` are decoded Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8479 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- modules/git/pushoptions/pushoptions.go | 20 +++++++++++++++++++- modules/git/pushoptions/pushoptions_test.go | 18 ++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/modules/git/pushoptions/pushoptions.go b/modules/git/pushoptions/pushoptions.go index 9709a8be79..e96ba0a339 100644 --- a/modules/git/pushoptions/pushoptions.go +++ b/modules/git/pushoptions/pushoptions.go @@ -4,6 +4,7 @@ package pushoptions import ( + "encoding/base64" "fmt" "os" "strconv" @@ -109,5 +110,22 @@ func (o gitPushOptions) GetBool(key Key, def bool) bool { func (o gitPushOptions) GetString(key Key) (string, bool) { val, ok := o[string(key)] - return val, ok + if !ok { + return "", false + } + + // If the value is prefixed with `{base64}` then everything after that is very + // likely to be encoded via base64. + base64Value, found := strings.CutPrefix(val, "{base64}") + if !found { + return val, true + } + + value, err := base64.StdEncoding.DecodeString(base64Value) + if err != nil { + // Not valid base64? Return the original value. + return val, true + } + + return string(value), true } diff --git a/modules/git/pushoptions/pushoptions_test.go b/modules/git/pushoptions/pushoptions_test.go index 1cb36d9d1e..d7c50649d0 100644 --- a/modules/git/pushoptions/pushoptions_test.go +++ b/modules/git/pushoptions/pushoptions_test.go @@ -4,6 +4,7 @@ package pushoptions import ( + "encoding/base64" "fmt" "testing" @@ -92,6 +93,23 @@ func TestParse(t *testing.T) { assert.False(t, options.Parse("unknown=value")) assert.True(t, options.Empty()) }) + + t.Run("Base64 values", func(t *testing.T) { + options := New() + + description := `I contain +a +line` + assert.True(t, options.Parse(fmt.Sprintf("%s={base64}%s", AgitDescription, base64.StdEncoding.EncodeToString([]byte(description))))) + val, ok := options.GetString(AgitDescription) + assert.True(t, ok) + assert.Equal(t, description, val) + + assert.True(t, options.Parse(fmt.Sprintf("%s={base64}fooled you", AgitTitle))) + val, ok = options.GetString(AgitTitle) + assert.True(t, ok) + assert.Equal(t, "{base64}fooled you", val) + }) } func TestReadEnv(t *testing.T) { From 6e9a2e89e83ca30d7870ebce66bd4d5ab50bd877 Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Thu, 10 Jul 2025 21:57:46 +0200 Subject: [PATCH 125/495] [v12.0/forgejo] several fixes of ALT Package registry (#8480) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8475 closes #7946 - The `rpmsRepoPattern` regex has been fixed to handle releases with dots correctly. For example, the version `0.9.0-alt1.git.17.g2ba905d` is valid, just like `0.1.0-1.n1` mentioned in the issue (https://codeberg.org/forgejo/forgejo/issues/7946#issue-1628991) - getEntries now returns entry names. In the integration tests, there were lines like: ```go assert.Equal(t, []string{"", ""}, result.ProvideNames) ``` and it’s unclear how such test logic could have ever worked correctly (fixes problems with deps https://codeberg.org/forgejo/forgejo/issues/7946#issuecomment-5109795) - ALT is an acronym for ALT Linux Team, so `Alt` was replaced with `ALT`. Strictly speaking, it should probably be `ALT Linux`, but since we use `Arch` instead of `Arch Linux`, this seems fine. Also, Distrowatch shows `Arch`/`ALT` in its dropdown, so it’s consistent. - The strings `"Alt Linux Team"` and `"Sisyphus"` in the `Origin` and `Suite` fields have been replaced with `setting.AppName` and `"Unknown"`. `Unknown` is a valid value and is set by default, so this won’t cause any issues. - The documentation link has been fixed: (404 docs.gitea.com/usage/packages/alt/ -> 200 forgejo.org/docs/latest/user/packages/alt/) Co-authored-by: Maxim Slipenko Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8480 Reviewed-by: Earl Warren Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- models/packages/package.go | 2 +- modules/packages/rpm/metadata.go | 3 ++- routers/api/packages/api.go | 2 +- services/packages/alt/repository.go | 12 +++++++----- templates/package/content/alt.tmpl | 2 +- tests/integration/api_packages_alt_test.go | 16 ++++++++-------- 6 files changed, 20 insertions(+), 17 deletions(-) diff --git a/models/packages/package.go b/models/packages/package.go index bdd1c74cad..c06dcf5eb3 100644 --- a/models/packages/package.go +++ b/models/packages/package.go @@ -125,7 +125,7 @@ func (pt Type) Name() string { case TypeRpm: return "RPM" case TypeAlt: - return "Alt" + return "ALT" case TypeRubyGems: return "RubyGems" case TypeSwift: diff --git a/modules/packages/rpm/metadata.go b/modules/packages/rpm/metadata.go index 4af9af620f..503b7b1a24 100644 --- a/modules/packages/rpm/metadata.go +++ b/modules/packages/rpm/metadata.go @@ -232,9 +232,10 @@ func getEntries(h *rpmutils.RpmHeader, namesTag, versionsTag, flagsTag int, repo case "alt": for i := range names { e := &Entry{ + Name: names[i], AltFlags: uint32(flags[i]), + Version: versions[i], } - e.Version = versions[i] entries = append(entries, e) } } diff --git a/routers/api/packages/api.go b/routers/api/packages/api.go index 79e61cf352..c53edfbf96 100644 --- a/routers/api/packages/api.go +++ b/routers/api/packages/api.go @@ -631,7 +631,7 @@ func CommonRoutes() *web.Route { baseURLPattern = regexp.MustCompile(`\A(.*?)\.repo\z`) uploadPattern = regexp.MustCompile(`\A(.*?)/upload\z`) baseRepoPattern = regexp.MustCompile(`(\S+)\.repo/(\S+)\/base/(\S+)`) - rpmsRepoPattern = regexp.MustCompile(`(\S+)\.repo/(\S+)\.(\S+)\/([a-zA-Z0-9_-]+)-([\d.]+-[a-zA-Z0-9_-]+)\.(\S+)\.rpm`) + rpmsRepoPattern = regexp.MustCompile(`(\S+)\.repo/(\S+)\.(\S+)\/([a-zA-Z0-9_-]+)-([\d.]+-[a-zA-Z0-9_.-]+)\.(\S+)\.rpm`) ) r.Methods("HEAD,GET,PUT,DELETE", "*", func(ctx *context.Context) { diff --git a/services/packages/alt/repository.go b/services/packages/alt/repository.go index 317862da9d..9693f4322e 100644 --- a/services/packages/alt/repository.go +++ b/services/packages/alt/repository.go @@ -714,21 +714,23 @@ func buildRelease(ctx context.Context, pv *packages_model.PackageVersion, pfs [] for architecture := range architectures.Seq() { version := time.Now().Unix() label := setting.AppName - data := fmt.Sprintf(`Archive: Alt Linux Team + origin := setting.AppName + archive := setting.AppName + + data := fmt.Sprintf(`Archive: %s Component: classic Version: %d -Origin: Alt Linux Team +Origin: %s Label: %s Architecture: %s NotAutomatic: false `, - version, label, architecture) + archive, version, origin, label, architecture) fileInfo, err := addReleaseAsFileToRepo(ctx, pv, "release.classic", data, group, architecture) if err != nil { return err } - origin := setting.AppName codename := time.Now().Unix() date := time.Now().UTC().Format(time.RFC1123) @@ -744,7 +746,7 @@ NotAutomatic: false data = fmt.Sprintf(`Origin: %s Label: %s -Suite: Sisyphus +Suite: Unknown Codename: %d Date: %s Architectures: %s diff --git a/templates/package/content/alt.tmpl b/templates/package/content/alt.tmpl index 9a5e9c7656..0a5c328e6d 100644 --- a/templates/package/content/alt.tmpl +++ b/templates/package/content/alt.tmpl @@ -24,7 +24,7 @@ apt-get install {{$.PackageDescriptor.Package.Name}}

- +
diff --git a/tests/integration/api_packages_alt_test.go b/tests/integration/api_packages_alt_test.go index c7ee2c49a5..f43759364e 100644 --- a/tests/integration/api_packages_alt_test.go +++ b/tests/integration/api_packages_alt_test.go @@ -214,7 +214,7 @@ enabled=1`, } assert.Equal(t, "classic", result.Component) - assert.Equal(t, "Alt Linux Team", result.Origin) + assert.Equal(t, "Forgejo", result.Origin) assert.Equal(t, "Forgejo", result.Label) assert.Equal(t, "x86_64", result.Architecture) assert.False(t, result.NotAutomatic) @@ -299,17 +299,17 @@ enabled=1`, assert.Equal(t, "Forgejo", result.Origin) assert.Equal(t, "Forgejo", result.Label) - assert.Equal(t, "Sisyphus", result.Suite) + assert.Equal(t, "Unknown", result.Suite) assert.Equal(t, "x86_64", result.Architectures) assert.Len(t, result.MD5Sum, 3) - assert.Equal(t, "bbf7ae6b2f540673ed1cfc0266b5f319", result.MD5Sum[0].Hash) - assert.Equal(t, 1003, result.MD5Sum[0].Size) + assert.Equal(t, "3f25f44163e8e512efb248d3b96949c3", result.MD5Sum[0].Hash) + assert.Equal(t, 1147, result.MD5Sum[0].Size) assert.Equal(t, "base/pkglist.classic", result.MD5Sum[0].File) assert.Len(t, result.BLAKE2B, 3) - assert.Equal(t, "b527bf038895ce29107ec3a6d2eebd7c365e8ce5ab767276eeddd7c549a159025225cb0ecfdbf7b71da13db7e865e77bcb0e2dae4d21335df01a4a17e0056a70", result.BLAKE2B[0].Hash) - assert.Equal(t, 1003, result.BLAKE2B[0].Size) + assert.Equal(t, "21a63e12a41f70e0697d354ae31e22ad6f024ec5ead2ea498b9a1b7db0f98a4e441f46c96d6912fba19148ff013457561fbb9bf3fca2a21d04cf15a325be7de9", result.BLAKE2B[0].Hash) + assert.Equal(t, 1147, result.BLAKE2B[0].Size) assert.Equal(t, "base/pkglist.classic", result.BLAKE2B[0].File) }) @@ -567,9 +567,9 @@ enabled=1`, assert.Equal(t, "https://gitea.io", result.URL) assert.Equal(t, "x86_64", result.Arch) assert.Equal(t, "gitea-test-1.0.2-1.src.rpm", result.SourceRpm) - assert.Equal(t, []string{"", ""}, result.ProvideNames) + assert.Equal(t, []string{"gitea-test(x86-64)", "gitea-test(x86-64)"}, result.ProvideNames) assert.Equal(t, []int{16777226, 16777226, 16777226, 16777226, 16777226, 16777226, 16777226}, result.RequireFlags) - assert.Equal(t, []string{"", "", "", "", "", "", ""}, result.RequireNames) + assert.Equal(t, []string{"rpmlib(PayloadIsXz)", "rpmlib(PayloadIsXz)", "rpmlib(PayloadIsXz)", "rpmlib(PayloadIsXz)", "rpmlib(PayloadIsXz)", "rpmlib(PayloadIsXz)", "rpmlib(PayloadIsXz)"}, result.RequireNames) assert.Equal(t, []string{"5.2-1", "5.2-1", "5.2-1", "5.2-1", "5.2-1", "5.2-1", "5.2-1"}, result.RequireVersions) assert.Equal(t, []int{1678276800}, result.ChangeLogTimes) assert.Equal(t, []string{"KN4CK3R "}, result.ChangeLogNames) From 51b42e3a84f167debf61f41ca2004f25cef49ef5 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 11 Jul 2025 02:49:55 +0200 Subject: [PATCH 126/495] Update dependency sharp to v0.34.3 (forgejo) (#8482) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8482 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 224 +++++++++++++++++++++++++--------------------- package.json | 2 +- 2 files changed, 125 insertions(+), 101 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5ac6838b58..edb57b618a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -91,7 +91,7 @@ "license-checker-rseidelsohn": "4.4.2", "markdownlint-cli": "0.45.0", "postcss-html": "1.8.0", - "sharp": "0.34.2", + "sharp": "0.34.3", "stylelint": "16.21.1", "stylelint-declaration-block-no-ignored-properties": "2.8.0", "stylelint-declaration-strict-value": "1.10.11", @@ -537,9 +537,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", - "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.4.tgz", + "integrity": "sha512-hHyapA4A3gPaDCNfiqyZUStTMqIkKRshqPIuDOXv1hcBnD4U3l8cP0T1HMCfGRxQ6V64TGCcoswChANyOAwbQg==", "dev": true, "license": "MIT", "optional": true, @@ -1340,9 +1340,9 @@ } }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.2.tgz", - "integrity": "sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz", + "integrity": "sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==", "cpu": [ "arm64" ], @@ -1359,13 +1359,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.1.0" + "@img/sharp-libvips-darwin-arm64": "1.2.0" } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.2.tgz", - "integrity": "sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.3.tgz", + "integrity": "sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==", "cpu": [ "x64" ], @@ -1382,13 +1382,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.1.0" + "@img/sharp-libvips-darwin-x64": "1.2.0" } }, "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz", - "integrity": "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.0.tgz", + "integrity": "sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==", "cpu": [ "arm64" ], @@ -1403,9 +1403,9 @@ } }, "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz", - "integrity": "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz", + "integrity": "sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==", "cpu": [ "x64" ], @@ -1420,9 +1420,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz", - "integrity": "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz", + "integrity": "sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==", "cpu": [ "arm" ], @@ -1437,9 +1437,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz", - "integrity": "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz", + "integrity": "sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==", "cpu": [ "arm64" ], @@ -1454,9 +1454,9 @@ } }, "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz", - "integrity": "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz", + "integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==", "cpu": [ "ppc64" ], @@ -1471,9 +1471,9 @@ } }, "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz", - "integrity": "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz", + "integrity": "sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==", "cpu": [ "s390x" ], @@ -1488,9 +1488,9 @@ } }, "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz", - "integrity": "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz", + "integrity": "sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==", "cpu": [ "x64" ], @@ -1505,9 +1505,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz", - "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz", + "integrity": "sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==", "cpu": [ "arm64" ], @@ -1522,9 +1522,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz", - "integrity": "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz", + "integrity": "sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==", "cpu": [ "x64" ], @@ -1539,9 +1539,9 @@ } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.2.tgz", - "integrity": "sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.3.tgz", + "integrity": "sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==", "cpu": [ "arm" ], @@ -1558,13 +1558,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.1.0" + "@img/sharp-libvips-linux-arm": "1.2.0" } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.2.tgz", - "integrity": "sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.3.tgz", + "integrity": "sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==", "cpu": [ "arm64" ], @@ -1581,13 +1581,36 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.1.0" + "@img/sharp-libvips-linux-arm64": "1.2.0" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.3.tgz", + "integrity": "sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.0" } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.2.tgz", - "integrity": "sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.3.tgz", + "integrity": "sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==", "cpu": [ "s390x" ], @@ -1604,13 +1627,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.1.0" + "@img/sharp-libvips-linux-s390x": "1.2.0" } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.2.tgz", - "integrity": "sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.3.tgz", + "integrity": "sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==", "cpu": [ "x64" ], @@ -1627,13 +1650,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.1.0" + "@img/sharp-libvips-linux-x64": "1.2.0" } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.2.tgz", - "integrity": "sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.3.tgz", + "integrity": "sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==", "cpu": [ "arm64" ], @@ -1650,13 +1673,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.1.0" + "@img/sharp-libvips-linuxmusl-arm64": "1.2.0" } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.2.tgz", - "integrity": "sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.3.tgz", + "integrity": "sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==", "cpu": [ "x64" ], @@ -1673,13 +1696,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.1.0" + "@img/sharp-libvips-linuxmusl-x64": "1.2.0" } }, "node_modules/@img/sharp-wasm32": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.2.tgz", - "integrity": "sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.3.tgz", + "integrity": "sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==", "cpu": [ "wasm32" ], @@ -1687,7 +1710,7 @@ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { - "@emnapi/runtime": "^1.4.3" + "@emnapi/runtime": "^1.4.4" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -1697,9 +1720,9 @@ } }, "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.2.tgz", - "integrity": "sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz", + "integrity": "sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==", "cpu": [ "arm64" ], @@ -1717,9 +1740,9 @@ } }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.2.tgz", - "integrity": "sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz", + "integrity": "sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==", "cpu": [ "ia32" ], @@ -1737,9 +1760,9 @@ } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.2.tgz", - "integrity": "sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz", + "integrity": "sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==", "cpu": [ "x64" ], @@ -13221,9 +13244,9 @@ } }, "node_modules/sharp": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.2.tgz", - "integrity": "sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==", + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.3.tgz", + "integrity": "sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -13239,27 +13262,28 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.2", - "@img/sharp-darwin-x64": "0.34.2", - "@img/sharp-libvips-darwin-arm64": "1.1.0", - "@img/sharp-libvips-darwin-x64": "1.1.0", - "@img/sharp-libvips-linux-arm": "1.1.0", - "@img/sharp-libvips-linux-arm64": "1.1.0", - "@img/sharp-libvips-linux-ppc64": "1.1.0", - "@img/sharp-libvips-linux-s390x": "1.1.0", - "@img/sharp-libvips-linux-x64": "1.1.0", - "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", - "@img/sharp-libvips-linuxmusl-x64": "1.1.0", - "@img/sharp-linux-arm": "0.34.2", - "@img/sharp-linux-arm64": "0.34.2", - "@img/sharp-linux-s390x": "0.34.2", - "@img/sharp-linux-x64": "0.34.2", - "@img/sharp-linuxmusl-arm64": "0.34.2", - "@img/sharp-linuxmusl-x64": "0.34.2", - "@img/sharp-wasm32": "0.34.2", - "@img/sharp-win32-arm64": "0.34.2", - "@img/sharp-win32-ia32": "0.34.2", - "@img/sharp-win32-x64": "0.34.2" + "@img/sharp-darwin-arm64": "0.34.3", + "@img/sharp-darwin-x64": "0.34.3", + "@img/sharp-libvips-darwin-arm64": "1.2.0", + "@img/sharp-libvips-darwin-x64": "1.2.0", + "@img/sharp-libvips-linux-arm": "1.2.0", + "@img/sharp-libvips-linux-arm64": "1.2.0", + "@img/sharp-libvips-linux-ppc64": "1.2.0", + "@img/sharp-libvips-linux-s390x": "1.2.0", + "@img/sharp-libvips-linux-x64": "1.2.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.0", + "@img/sharp-libvips-linuxmusl-x64": "1.2.0", + "@img/sharp-linux-arm": "0.34.3", + "@img/sharp-linux-arm64": "0.34.3", + "@img/sharp-linux-ppc64": "0.34.3", + "@img/sharp-linux-s390x": "0.34.3", + "@img/sharp-linux-x64": "0.34.3", + "@img/sharp-linuxmusl-arm64": "0.34.3", + "@img/sharp-linuxmusl-x64": "0.34.3", + "@img/sharp-wasm32": "0.34.3", + "@img/sharp-win32-arm64": "0.34.3", + "@img/sharp-win32-ia32": "0.34.3", + "@img/sharp-win32-x64": "0.34.3" } }, "node_modules/shebang-command": { diff --git a/package.json b/package.json index 27576923bf..c154270c6c 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "license-checker-rseidelsohn": "4.4.2", "markdownlint-cli": "0.45.0", "postcss-html": "1.8.0", - "sharp": "0.34.2", + "sharp": "0.34.3", "stylelint": "16.21.1", "stylelint-declaration-block-no-ignored-properties": "2.8.0", "stylelint-declaration-strict-value": "1.10.11", From a8d8a4c106ff68dbaa902d24909a8a9d8b8ed6e7 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 11 Jul 2025 02:51:56 +0200 Subject: [PATCH 127/495] Update module golang.org/x/crypto to v0.40.0 (forgejo) (#8483) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8483 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- go.mod | 4 ++-- go.sum | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index ea05356154..221b4453de 100644 --- a/go.mod +++ b/go.mod @@ -99,13 +99,13 @@ require ( github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc gitlab.com/gitlab-org/api/client-go v0.130.1 go.uber.org/mock v0.5.2 - golang.org/x/crypto v0.39.0 + golang.org/x/crypto v0.40.0 golang.org/x/image v0.27.0 golang.org/x/net v0.41.0 golang.org/x/oauth2 v0.30.0 golang.org/x/sync v0.16.0 golang.org/x/sys v0.34.0 - golang.org/x/text v0.26.0 + golang.org/x/text v0.27.0 google.golang.org/protobuf v1.36.4 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df gopkg.in/ini.v1 v1.67.0 diff --git a/go.sum b/go.sum index 52cdff2454..84c6564f95 100644 --- a/go.sum +++ b/go.sum @@ -585,8 +585,8 @@ golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliY golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= -golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= +golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= +golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/image v0.27.0 h1:C8gA4oWU/tKkdCfYT6T2u4faJu3MeNS5O8UPWlPF61w= @@ -665,8 +665,8 @@ golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= -golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= -golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= +golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg= +golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -677,8 +677,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= +golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From 316073a92530b659a16548590de7c80950449d58 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Fri, 11 Jul 2025 05:07:33 +0200 Subject: [PATCH 128/495] fix: replace {workflowname} with {workflowfilename} in dispatch API (#8481) The current {workflowname} in the API endpoint /repos/{owner}/{repo}/actions/workflows/{workflowname}/dispatches is misleading because it does not refer to the name of the workflow but to the filename in which the workflow is defined. Change to /repos/{owner}/{repo}/actions/workflows/{workflowfilename}/dispatches --- There is no need for testing because it is a documentation change. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8481 Reviewed-by: Gusted Reviewed-by: Beowulf Co-authored-by: Earl Warren Co-committed-by: Earl Warren --- routers/api/v1/api.go | 2 +- routers/api/v1/repo/action.go | 8 ++++---- templates/swagger/v1_json.tmpl | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index fe13f85df4..3b66d02fba 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -1177,7 +1177,7 @@ func Routes() *web.Route { }) m.Group("/workflows", func() { - m.Group("/{workflowname}", func() { + m.Group("/{workflowfilename}", func() { m.Post("/dispatches", reqToken(), reqRepoWriter(unit.TypeActions), mustNotBeArchived, bind(api.DispatchWorkflowOption{}), repo.DispatchWorkflow) }) }) diff --git a/routers/api/v1/repo/action.go b/routers/api/v1/repo/action.go index dbc4933de6..fe29d534ff 100644 --- a/routers/api/v1/repo/action.go +++ b/routers/api/v1/repo/action.go @@ -615,7 +615,7 @@ func ListActionTasks(ctx *context.APIContext) { // DispatchWorkflow dispatches a workflow func DispatchWorkflow(ctx *context.APIContext) { - // swagger:operation POST /repos/{owner}/{repo}/actions/workflows/{workflowname}/dispatches repository DispatchWorkflow + // swagger:operation POST /repos/{owner}/{repo}/actions/workflows/{workflowfilename}/dispatches repository DispatchWorkflow // --- // summary: Dispatches a workflow // consumes: @@ -631,7 +631,7 @@ func DispatchWorkflow(ctx *context.APIContext) { // description: name of the repo // type: string // required: true - // - name: workflowname + // - name: workflowfilename // in: path // description: name of the workflow // type: string @@ -649,13 +649,13 @@ func DispatchWorkflow(ctx *context.APIContext) { // "$ref": "#/responses/notFound" opt := web.GetForm(ctx).(*api.DispatchWorkflowOption) - name := ctx.Params("workflowname") + name := ctx.Params("workflowfilename") if len(opt.Ref) == 0 { ctx.Error(http.StatusBadRequest, "ref", "ref is empty") return } else if len(name) == 0 { - ctx.Error(http.StatusBadRequest, "workflowname", "workflow name is empty") + ctx.Error(http.StatusBadRequest, "workflowfilename", "workflow file name is empty") return } diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 0e8382b8ab..ee5e919757 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -5533,7 +5533,7 @@ } } }, - "/repos/{owner}/{repo}/actions/workflows/{workflowname}/dispatches": { + "/repos/{owner}/{repo}/actions/workflows/{workflowfilename}/dispatches": { "post": { "consumes": [ "application/json" @@ -5561,7 +5561,7 @@ { "type": "string", "description": "name of the workflow", - "name": "workflowname", + "name": "workflowfilename", "in": "path", "required": true }, From 74f7250259b1723eab63e88d7160b863b37f51c7 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 11 Jul 2025 07:53:56 +0200 Subject: [PATCH 129/495] Update module golang.org/x/net to v0.42.0 (forgejo) (#8484) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [golang.org/x/net](https://pkg.go.dev/golang.org/x/net) | [`v0.41.0` -> `v0.42.0`](https://cs.opensource.google/go/x/net/+/refs/tags/v0.41.0...refs/tags/v0.42.0) | [![age](https://developer.mend.io/api/mc/badges/age/go/golang.org%2fx%2fnet/v0.42.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/go/golang.org%2fx%2fnet/v0.41.0/v0.42.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8484 Reviewed-by: Earl Warren Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 221b4453de..139095099b 100644 --- a/go.mod +++ b/go.mod @@ -101,7 +101,7 @@ require ( go.uber.org/mock v0.5.2 golang.org/x/crypto v0.40.0 golang.org/x/image v0.27.0 - golang.org/x/net v0.41.0 + golang.org/x/net v0.42.0 golang.org/x/oauth2 v0.30.0 golang.org/x/sync v0.16.0 golang.org/x/sys v0.34.0 diff --git a/go.sum b/go.sum index 84c6564f95..3c906b45c6 100644 --- a/go.sum +++ b/go.sum @@ -614,8 +614,8 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= -golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= -golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= +golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= +golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= From dc6626453a1645bc48affd4583b439aae8b4bffd Mon Sep 17 00:00:00 2001 From: Codeberg Translate Date: Fri, 11 Jul 2025 05:58:02 +0000 Subject: [PATCH 130/495] i18n: update of translations from Codeberg Translate Co-authored-by: 0ko <0ko@noreply.codeberg.org> Co-authored-by: Atul_Eterno Co-authored-by: Benedikt Straub Co-authored-by: Codeberg Translate Co-authored-by: Dirk Co-authored-by: Edgarsons Co-authored-by: Fjuro Co-authored-by: Gusted Co-authored-by: Juno Takano Co-authored-by: Laxystem Co-authored-by: Miguel P.L Co-authored-by: Salif Mehmed Co-authored-by: SomeTr Co-authored-by: aivot-on Co-authored-by: earl-warren Co-authored-by: kne Co-authored-by: oster5 Co-authored-by: readevalprintloop Co-authored-by: tacaly Co-authored-by: volkan Co-authored-by: xtex Co-authored-by: yurtpage Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/ar/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/be/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/bn/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/ca/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/cs/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/da/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/de/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/es/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/fi/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/hu/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/id/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/ja/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/ko/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/lv/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/nds/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/nl/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/pt_BR/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/ru/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/sr_SP/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/tr/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/uk/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/vi/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/zh_Hans/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/zh_Hant_HK/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/ar/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/bg/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/ca/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/cs/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/da/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/de/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/el/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/eo/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/es/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/et/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/fa/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/fi/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/fil/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/fr/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/ga/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/gl/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/he/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/hu/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/id/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/is/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/it/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/ja/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/ko/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/lt/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/ml/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/nds/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/pl/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/ro/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/ru/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/si/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/sk/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/sl/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/sv/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/tr/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/uk/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/zh_Hans/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/zh_Hant/ Translation: Forgejo/forgejo Translation: Forgejo/forgejo-next --- options/locale/locale_ar.ini | 25 +- options/locale/locale_bg.ini | 400 +++++++++++++++++++++++++- options/locale/locale_ca.ini | 24 +- options/locale/locale_cs-CZ.ini | 6 +- options/locale/locale_da.ini | 14 +- options/locale/locale_de-DE.ini | 2 +- options/locale/locale_el-GR.ini | 10 +- options/locale/locale_eo.ini | 12 +- options/locale/locale_es-ES.ini | 10 +- options/locale/locale_et.ini | 24 +- options/locale/locale_fa-IR.ini | 30 +- options/locale/locale_fi-FI.ini | 8 + options/locale/locale_fil.ini | 4 +- options/locale/locale_fr-FR.ini | 2 +- options/locale/locale_ga-IE.ini | 28 +- options/locale/locale_gl.ini | 24 +- options/locale/locale_he.ini | 29 +- options/locale/locale_hu-HU.ini | 24 +- options/locale/locale_id-ID.ini | 38 +-- options/locale/locale_is-IS.ini | 22 +- options/locale/locale_it-IT.ini | 32 +-- options/locale/locale_ja-JP.ini | 27 +- options/locale/locale_ko-KR.ini | 16 +- options/locale/locale_lt.ini | 24 +- options/locale/locale_ml-IN.ini | 6 +- options/locale/locale_nds.ini | 2 +- options/locale/locale_pl-PL.ini | 28 +- options/locale/locale_ro.ini | 12 +- options/locale/locale_ru-RU.ini | 8 +- options/locale/locale_si-LK.ini | 6 +- options/locale/locale_sk-SK.ini | 6 +- options/locale/locale_sl.ini | 8 +- options/locale/locale_sv-SE.ini | 6 +- options/locale/locale_tr-TR.ini | 128 ++++++--- options/locale/locale_uk-UA.ini | 168 ++++++++--- options/locale/locale_zh-CN.ini | 6 +- options/locale/locale_zh-TW.ini | 2 +- options/locale_next/locale_ar.json | 4 +- options/locale_next/locale_be.json | 4 +- options/locale_next/locale_bg.json | 1 - options/locale_next/locale_bn.json | 4 +- options/locale_next/locale_ca.json | 3 +- options/locale_next/locale_cs-CZ.json | 4 +- options/locale_next/locale_da.json | 8 +- options/locale_next/locale_de-DE.json | 4 +- options/locale_next/locale_el-GR.json | 1 - options/locale_next/locale_es-ES.json | 3 +- options/locale_next/locale_fi-FI.json | 4 +- options/locale_next/locale_fil.json | 1 - options/locale_next/locale_fr-FR.json | 1 - options/locale_next/locale_hu-HU.json | 3 +- options/locale_next/locale_id-ID.json | 9 +- options/locale_next/locale_it-IT.json | 1 - options/locale_next/locale_ja-JP.json | 3 +- options/locale_next/locale_ko-KR.json | 3 +- options/locale_next/locale_lv-LV.json | 4 +- options/locale_next/locale_nb_NO.json | 1 - options/locale_next/locale_nds.json | 4 +- options/locale_next/locale_nl-NL.json | 4 +- options/locale_next/locale_pt-BR.json | 6 +- options/locale_next/locale_pt-PT.json | 1 - options/locale_next/locale_ru-RU.json | 5 +- options/locale_next/locale_sr-SP.json | 4 +- options/locale_next/locale_sv-SE.json | 1 - options/locale_next/locale_tr-TR.json | 3 +- options/locale_next/locale_uk-UA.json | 4 +- options/locale_next/locale_vi.json | 4 +- options/locale_next/locale_zh-CN.json | 7 +- options/locale_next/locale_zh-HK.json | 5 +- options/locale_next/locale_zh-TW.json | 1 - 70 files changed, 935 insertions(+), 401 deletions(-) diff --git a/options/locale/locale_ar.ini b/options/locale/locale_ar.ini index 15d614e8bc..ba11586b44 100644 --- a/options/locale/locale_ar.ini +++ b/options/locale/locale_ar.ini @@ -297,7 +297,7 @@ twofa_disabled = عُطِّل الاستيثاق الثنائي. theme_desc = ستكون هذه السمة المبدئية لك عبر الموقع. new_password = كلمة المرور الجديدة twofa_disable_desc = تعطيل الاستيثاق الثنائي سيجعل حسابك أقل أمانًا. أتريد الاستمرار؟ -manage_themes = اختر السمة المبدئية +manage_themes = الموضوع الافتراضي delete_prompt = هذه العملية ستحذف حسابك إلى الأبد. لا يمكن التراجع عنها بعد ذلك. cancel = ألغ repos_none = ليس لديك أي مستودع. @@ -390,7 +390,7 @@ account = الحساب uploaded_avatar_is_too_big = حجم الملف المرفوع (%d كي‌ب) يتخطى الحجم الأقصى (%d كي‌ب). biography_placeholder = أخبرنا شيئا عن نفسك! (يمكنك استخدام ماركداون) comment_type_group_reference = الإشارات -orgs = إدارة المنظمات +orgs = المنظمات update_profile = حدِّث الملف الشخصي profile = الملف الشخصي comment_type_group_dependency = الاعتماديات @@ -421,7 +421,7 @@ keep_email_private_popup = سيؤدي هذا إلى إخفاء عنوان بري ssh_key_name_used = هناك مفتاح SSH بنفس الاسم موجود بالفعل على حسابك. authorized_oauth2_applications = تطبيقات OAuth2 المأذونة uid = المعرّف الرمزي -manage_openid = إدارة عناوين OpenID +manage_openid = عناوين OpenID webauthn = استيثاق ثنائي (مفاتيح الأمان) comment_type_group_deadline = الموعد النهائي add_key = أضف مفتاح @@ -502,6 +502,7 @@ update_oauth2_application_success = لقد حدّثت بنجاح تطبيق OAut oauth2_redirect_uris = روابط إعادة التوجيه. نرجو وضع كل رابط في سطر وحده. remove_account_link = أزل الحساب المربوط remove_account_link_success = أُزيل الحساب المربوط. +quota = كوتا [org] follow_blocked_user = لا يمكنك إتباع هذه المنظمة لأن هذه المنظمة حظرتك. @@ -1973,7 +1974,7 @@ component_failed_to_load = حدث خطأ غير متوقع. [search] -org_kind = بحث في المنظمات... +org_kind = بحث في المنظمات… code_search_unavailable = البحث في الكود غير متوفر حاليًا. يرجى الاتصال بمدير الموقع. search = ابحث... type_tooltip = نوع البحث @@ -1981,13 +1982,13 @@ fuzzy = أجعد fuzzy_tooltip = قم بتضمين النتائج التي تتطابق أيضًا مع مصطلح البحث بشكل وثيق match = تتناسب match_tooltip = قم بتضمين النتائج التي تطابق مصطلح البحث المحدد فقط -repo_kind = بحث في المستودعات... -user_kind = بحث عن المستخدمين... -team_kind = بحث عن الفرق ... -code_kind = بحث في الكود... -project_kind = البحث ضمن المشاريع... -branch_kind = البحث ضمن الفروع... +repo_kind = بحث في المستودعات… +user_kind = بحث عن المستخدمين… +team_kind = بحث عن الفرق… +code_kind = بحث في الكود… +project_kind = البحث ضمن المشاريع… +branch_kind = البحث ضمن الفروع… no_results = لا توجد نتائج مطابقة. -issue_kind = البحث ضمن الأعطال... -pull_kind = البحث ضمن طلبات السحب... +issue_kind = البحث ضمن الأعطال… +pull_kind = البحث ضمن طلبات السحب… keyword_search_unavailable = البحث من خلال الكلمات المفتاحية ليس متوفر حالياً. رجاءاً تواصل مع مشرف الموقع. diff --git a/options/locale/locale_bg.ini b/options/locale/locale_bg.ini index 943994e061..8c69a36d52 100644 --- a/options/locale/locale_bg.ini +++ b/options/locale/locale_bg.ini @@ -141,6 +141,7 @@ webauthn_sign_in = Натиснете бутона на вашия ключ за webauthn_error = Неуспешно прочитане на вашия ключ за сигурност. webauthn_unsupported_browser = Вашият браузър в момента не поддържа WebAuthn. webauthn_error_duplicated = Ключът за сигурност не е разрешен за тази заявка. Моля, уверете се, че ключът не е вече регистриран. +tracked_time_summary = Обобщение на проследеното време въз основа на филтрите в списъка със задачи [settings] ui = Тема @@ -324,7 +325,7 @@ permissions_list = Разрешения: edit_oauth2_application = Редактиране на OAuth2 приложение remove_oauth2_application = Премахване на OAuth2 приложение twofa_recovery_tip = Ако загубите устройството си, ще можете да използвате ключ за еднократно възстановяване, за да си върнете достъпа до акаунта. -visibility.private_tooltip = Видим само за членове на организации, в които участвате +visibility.private_tooltip = Видим само за участници в организации, в които участвате quota.applies_to_user = Следните правила за квота се прилагат за вашия акаунт quota.rule.no_limit = Неограничена hints = Подсказки @@ -380,6 +381,19 @@ hidden_comment_types = Скрити типове коментари comment_type_group_lock = Състояние на заключване can_not_add_email_activations_pending = Има чакаща активация, опитайте отново след няколко минути, ако искате да добавите нова ел. поща. storage_overview = Преглед на съхранението +webauthn = Двуфакторно удостоверяване (Ключове за сигурност) +quota.sizes.repos.public = Публични хранилища +quota.sizes.repos.private = Частни хранилища +quota.sizes.git.all = Git съдържание +quota.sizes.git.lfs = Git LFS +quota.sizes.assets.attachments.all = Прикачени файлове +quota.sizes.assets.attachments.releases = Прикачени файлове към издания +quota.sizes.assets.artifacts = Артефакти +quota.sizes.assets.packages.all = Пакети +quota.sizes.wiki = Уики +quota.sizes.all = Всички +quota.sizes.repos.all = Хранилища +quota.sizes.assets.attachments.issues = Прикачени файлове към задачи [packages] container.labels.value = Стойност @@ -438,6 +452,112 @@ details.documentation_site = Уебсайт на документацията arch.version.conflicts = В конфликт alpine.repository.branches = Клонове arch.pacman.repo.multi.item = Конфигурация за %s +container.multi_arch = ОС / Архитектура +rpm.repository = Информация за хранилището +container.pull = Издърпайте образа от командния ред: +helm.registry = Настройте този регистър от командния ред: +debian.repository.distributions = Дистрибуции +npm.dependencies.optional = Опционални зависимости +owner.settings.cargo.title = Индекс на регистъра на Cargo +owner.settings.cleanuprules.keep.pattern.container = Версията latest винаги се запазва за Container пакети. +owner.settings.cleanuprules.remove.pattern = Премахване на версии, съответстващи на +rpm.distros.suse = на дистрибуции, базирани на SUSE +owner.settings.cleanuprules.preview.overview = %d пакета са насрочени за премахване. +owner.settings.cleanuprules.preview = Преглед на правило за почистване +arch.version.properties = Свойства на версията +conan.registry = Настройте този регистър от командния ред: +conan.details.repository = Хранилище +composer.install = За да инсталирате пакета с Composer, изпълнете следната команда: +chef.install = За да инсталирате пакета, изпълнете следната команда: +chef.registry = Настройте този регистър във вашия файл ~/.chef/config.rb: +pub.install = За да инсталирате пакета с Dart, изпълнете следната команда: +npm.details.tag = Маркер +npm.install = За да инсталирате пакета с npm, изпълнете следната команда: +maven.registry = Настройте този регистър във файла на вашия проект pom.xml: +debian.repository.components = Компоненти +debian.install = За да инсталирате пакета, изпълнете следната команда: +cran.install = За да инсталирате пакета, изпълнете следната команда: +cran.registry = Настройте този регистър във вашия файл Rprofile.site: +rpm.distros.redhat = на дистрибуции, базирани на RedHat +alt.registry = Настройте този регистър от командния ред: +rpm.repository.architectures = Архитектури +alt.registry.install = За да инсталирате пакета, изпълнете следната команда: +alt.setup = Добавете хранилище към списъка със свързани хранилища (изберете необходимата архитектура вместо „_arch_“): +alt.repository = Информация за хранилището +owner.settings.cargo.initialize.error = Неуспешно инициализиране на индекса на Cargo: %v +owner.settings.cargo.initialize = Инициализиране на индекс +settings.delete.description = Изтриването на пакет е трайно и не може да бъде отменено. +alt.repository.multiple_groups = Този пакет е наличен в няколко групи. +alt.repository.architectures = Архитектури +owner.settings.chef.title = Регистър на Chef +owner.settings.cleanuprules.remove.days = Премахване на версии, по-стари от +owner.settings.cleanuprules.keep.pattern = Запазване на версии, съответстващи на +owner.settings.cleanuprules.keep.count.n = %d версии на пакет +owner.settings.cleanuprules.keep.count.1 = 1 версия на пакет +owner.settings.cleanuprules.keep.count = Запазване на най-новите +owner.settings.cleanuprules.enabled = Включено +owner.settings.cleanuprules.preview.none = Правилото за почистване не съвпада с нито един пакет. +owner.settings.cleanuprules.none = Все още няма правила за почистване. +owner.settings.cleanuprules.add = Добавяне на правило за почистване +owner.settings.cleanuprules.title = Правила за почистване +owner.settings.cargo.rebuild.success = Индексът на Cargo беше успешно преизграден. +alpine.registry.key = Изтеглете публичния RSA ключ на регистъра в папката /etc/apk/keys/, за да проверите подписа на индекса: +alpine.registry.info = Изберете $branch и $repository от списъка по-долу. +arch.version.checkdepends = Зависимости за проверката +composer.dependencies = Зависимости +swift.install = Добавете пакета във вашия файл Package.swift: +settings.link.error = Неуспешно обновяване на връзката на хранилището. +swift.install2 = и изпълнете следната команда: +rpm.repository.multiple_groups = Този пакет е наличен в няколко групи. +conda.registry = Настройте този регистър като Conda хранилище във вашия файл .condarc: +conda.install = За да инсталирате пакета с Conda, изпълнете следната команда: +owner.settings.cargo.rebuild.error = Неуспешно преизграждане на индекса на Cargo: %v +owner.settings.cargo.rebuild = Преизграждане на индекс +settings.link.button = Обновяване на връзката на хранилището +settings.link.select = Изберете хранилище +debian.repository.architectures = Архитектури +rpm.registry = Настройте този регистър от командния ред: +debian.registry = Настройте този регистър от командния ред: +helm.install = За да инсталирате пакета, изпълнете следната команда: +swift.registry = Настройте този регистър от командния ред: +settings.link = Свързване на този пакет с хранилище +settings.link.description = Ако свържете пакет с хранилище, пакетът се изброява в списъка с пакети на хранилището. +settings.link.success = Връзката на хранилището беше успешно обновена. +owner.settings.cleanuprules.pattern_full_match = Прилагане на шаблона към пълното име на пакета +owner.settings.cleanuprules.keep.title = Версиите, които съответстват на тези правила, се запазват, дори ако съответстват на правило за премахване по-долу. +debian.repository = Информация за хранилището +maven.install = За да използвате пакета, включете следното в блока dependencies във файла pom.xml: +nuget.install = За да инсталирате пакета с NuGet, изпълнете следната команда: +alt.install = Инсталиране на пакет +owner.settings.cleanuprules.edit = Редактиране на правилото за почистване +rpm.install = За да инсталирате пакета, изпълнете следната команда: +pypi.install = За да инсталирате пакета с pip, изпълнете следната команда: +arch.version.makedepends = Зависимости за изграждането +alpine.install = За да инсталирате пакета, изпълнете следната команда: +desc = Управление на пакетите на хранилището. +owner.settings.cargo.rebuild.no_index = Не може да се преизгради, няма инициализиран индекс. +owner.settings.cargo.rebuild.description = Преизграждането може да бъде полезно, ако индексът не е синхронизиран със съхранените Cargo пакети. +owner.settings.cargo.initialize.description = Необходимо е специално Git хранилище за индекс, за да се използва регистърът на Cargo. Използването на тази опция ще (пре)създаде хранилището и ще го конфигурира автоматично. +pypi.requires = Изисква Python +debian.registry.info = Изберете $distribution и $component от списъка по-долу. +alpine.registry = Настройте този регистър, като добавите URL адреса във вашия файл /etc/apk/repositories: +owner.settings.cargo.initialize.success = Индексът на Cargo беше успешно създаден. +npm.registry = Настройте този регистър във файла на вашия проект .npmrc: +owner.settings.chef.keypair = Генериране на двойка ключове +owner.settings.chef.keypair.description = Заявките, изпратени до регистъра на Chef, трябва да бъдат криптографски подписани като средство за удостоверяване. При генериране на двойка ключове, само публичният ключ се съхранява във Forgejo. Частният ключ ви се предоставя, за да се използва с knife. Генерирането на нова двойка ключове ще презапише предишната. +owner.settings.cleanuprules.remove.title = Версиите, които съответстват на тези правила, се премахват, освен ако правило по-горе не казва да се запазят. +nuget.registry = Настройте този регистър от командния ред: +owner.settings.cleanuprules.success.update = Правилото за почистване е обновено. +settings.delete.notice = На път сте да изтриете %s (%s). Тази операция е необратима, сигурни ли сте? +npm.install2 = или го добавете във файла package.json: +owner.settings.cleanuprules.success.delete = Правилото за почистване е изтрито. +vagrant.install = За да добавите Vagrant box, изпълнете следната команда: +nuget.dependency.framework = Целева платформа +maven.install2 = Изпълнете през командния ред: +maven.download = За да изтеглите зависимостта, изпълнете през командния ред: +container.layers = Слоеве на образа +conan.install = За да инсталирате пакета с Conan, изпълнете следната команда: +composer.registry = Настройте този регистър във вашия файл ~/.composer/config.json: [tool] hours = %d часа @@ -940,9 +1060,9 @@ editor.no_changes_to_show = Няма промени за показване. issues.choose.get_started = Първи стъпки issues.change_milestone_at = `промени етапа от %s на %s %s` issues.change_project_at = `промени проекта от %s на %s %s` -issues.self_assign_at = `си само-възложи това %s` +issues.self_assign_at = `си самовъзложи това %s` issues.remove_assignee_at = `е премахнат като изпълнител от %s %s` -issues.remove_self_assignment = `се само-премахна като изпълнител %s` +issues.remove_self_assignment = `се самопремахна като изпълнител %s` issues.add_assignee_at = `му бе възложено това от %s %s` pulls.merged_by = от %[3]s бе слята %[1]s pulls.merged_by_fake = от %[2]s бе слята %[1]s @@ -1272,7 +1392,7 @@ issues.review.show_resolved = Показване на решено issues.review.hide_resolved = Скриване на решено issues.review.resolve_conversation = Решаване на обсъждането diff.comment.markdown_info = Поддържа се стилизиране с Маркдаун. -diff.file_suppressed = Разликите не са показани, защото са твърде много +diff.file_suppressed = Разликите във файла са потиснати, защото са твърде много pulls.reject_count_n = %d поискани промени settings.pulls.default_allow_edits_from_maintainers = Позволяване на редакции от поддържащите по подразбиране fork_branch = Клон за клониране в разклонението @@ -1347,7 +1467,7 @@ settings.default_branch_desc = Изберете стандартен клон з settings.transfer.button = Прехвърляне на притежанието settings.transfer.modal.title = Прехвърляне на притежанието ambiguous_runes_line = `Този ред съдържа двусмислени Уникод знаци` -ambiguous_character = `%[1]c [U+%04[1]X] може да бъде объркан с %[2]c [U+%04[2]X]` +ambiguous_character = `%[1]c [U+%04[1]X] може да бъде объркан със %[2]c [U+%04[2]X]` invisible_runes_header = `Този файл съдържа невидими Уникод знаци` issues.all_title = Общо issues.new.assign_to_me = Възлагане на мен @@ -1446,7 +1566,7 @@ generated_from = генерирано от clear_ref = `Изчистване на текущата препратка` file_follow = Последване на символната връзка commitstatus.failure = Неуспех -issues.filter_label_exclude = `Използвайте alt + click/enter, за да изключите етикети` +issues.filter_label_exclude = Използвайте Alt + Click, за да изключите етикети migrate.migrating_failed = Мигрирането от %s е неуспешно. migrate.migrating_issues = Мигриране на задачи mirror_from = огледално на @@ -1575,6 +1695,177 @@ migrate.migrating_failed_no_addr = Мигрирането е неуспешно. issues.force_push_compare = Сравняване pulls.status_checking = Някои проверки са в очакване pulls.nothing_to_compare = Тези клонове са равни. Не е нужно да създавате заявка за сливане. +admin.flags_replaced = Флаговете на хранилището са заменени +editor.cannot_edit_lfs_files = LFS файлове не могат да се редактират в уеб интерфейса. +commits.ssh_key_fingerprint = Отпечатък на SSH ключ +issues.comment_on_locked = Не можете да коментирате заключена задача. +commit.revert = Връщане +migrate.cancel_migrating_title = Отказ от миграцията +migrate.cancel_migrating_confirm = Искате ли да откажете тази миграция? +issues.choose.invalid_config = Конфигурацията на задачите съдържа грешки: +unit_disabled = Администраторът на сайта е изключил тази секция на хранилището. +issues.blocked_by_user = Не можете да създавате задачи в това хранилище, защото сте блокирани от притежателя на хранилището. +commits.signed_by = Подписано от +commits.signed_by_untrusted_user = Подписано от недоверен потребител +commits.signed_by_untrusted_user_unmatched = Подписано от недоверен потребител, който не съвпада с подаващия +issues.lock.notice_1 = - Други потребители не могат да добавят нови коментари към тази задача. +issues.unlock.notice_2 = - Винаги можете да заключите тази задача отново в бъдеще. +issues.unlock.title = Отключване на обсъждането по тази задача. +issues.dependency.no_permission_1 = Нямате разрешение да прочетете %d зависимост +issues.reopen.blocked_by_user = Не можете да отворите наново тази задача, защото сте блокирани от притежателя на хранилището или от автора на тази задача. +compare.compare_base = основа +compare.compare_head = сравняване +template.one_item = Трябва да изберете поне един елемент от шаблона +admin.failed_to_replace_flags = Неуспешна замяна на флаговете на хранилището +mirror_interval_invalid = Интервалът на огледалото не е валиден. +mirror_use_ssh.not_available = SSH удостоверяването не е налично. +mirror_address_desc = Поставете всички необходими данни за удостоверяване в секцията „Упълномощаване“. +template.git_hooks = Git куки +template.invalid = Трябва да изберете шаблонно хранилище +issues.review.outdated = Остарял +issues.dependency.add_error_dep_issue_not_exist = Зависимата задача не съществува. +template.items = Елементи на шаблона +issues.review.dismissed = отхвърли рецензията на %s %s +audio_not_supported_in_browser = Вашият браузър не поддържа HTML5 тага „audio“. +stored_lfs = Съхранено с Git LFS +commit_graph.select = Изберете клонове +issues.content_history.options = Опции +editor.commit_email = Ел. поща на подаването +commit.revert-header = Връщане: %s +commits.desc = Разглеждане на историята на промените в програмния код. +commits.search.tooltip = Можете да добавите префикс към ключовите думи с „author:“, „committer:“, „after:“ или „before:“, напр. „revert author:Alice before:2019-01-13“. +issues.unlock_error = Не може да се отключи задача, която не е заключена. +issues.lock.unknown_reason = Не може да се заключи задача с неизвестна причина. +issues.cancel_tracking_history = `отмени проследяването на времето %s` +issues.dependency.add_error_dep_not_same_repo = И двете задачи трябва да са в едно и също хранилище. +issues.review.remove_review_requests = премахна заявките за рецензия за %[1]s %[2]s +issues.review.content.empty = Трябва да оставите коментар, посочващ исканите промени. +issues.review.hide_outdated = Скриване на остарели +pulls.desc = Включване на заявки за сливане и рецензии на код. +issues.review.show_outdated = Показване на остарели +ambiguous_runes_header = `Този файл съдържа двусмислени Уникод знаци` +admin.update_flags = Обновяване на флаговете +issues.dependency.blocked_by_short = Зависи от +mirror_lfs = Съхранение на големи файлове (LFS) +mirror_use_ssh.text = Използване на SSH удостоверяване +mirror_denied_combination = Не може да се използва удостоверяване с публичен ключ и парола едновременно. +rss.must_be_on_branch = Трябва да сте на клон, за да имате RSS емисия. +admin.manage_flags = Управление на флаговете +admin.enabled_flags = Флагове, включени за хранилището: +mirror_password_help = Променете потребителското име, за да изтриете запазена парола. +issues.review.remove_review_request = премахна заявката за рецензия за %[1]s %[2]s +issues.review.outdated_description = Съдържанието е променено, след като е направен този коментар +issues.dependency.setting = Включване на зависимости за задачи и заявки за сливане +issues.dependency.add_error_same_issue = Не можете да направите задача зависима от самата нея. +issues.review.self.rejection = Не можете да поискате промени в собствената си заявка за сливане. +issues.filter_type.all_pull_requests = Всички заявки за сливане +fork_to_different_account = Разклоняване в друг акаунт +mirror_sync_on_commit = Синхронизиране при изтласкване на подавания +mirror_address_protocol_invalid = Предоставеният URL е невалиден. Само http(s):// или git:// адреси могат да се използват за огледални хранилища. +template.git_hooks_tooltip = В момента не можете да променяте или премахвате Git куки, след като са добавени. Изберете това само ако се доверявате на шаблонното хранилище. +editor.commit_signed_changes = Подаване на подписани промени +editor.require_signed_commit = Клонът изисква подписано подаване +issues.desc = Организирайте доклади за грешки, задачи и етапи. +issues.lock_duplicate = Задача не може да бъде заключена два пъти. +issues.lock.notice_2 = - Вие и други сътрудници с достъп до това хранилище все още можете да оставяте коментари, които другите да виждат. +issues.due_date_invalid = Крайният срок е невалиден или извън обхвата. Моля, използвайте формата „гггг-мм-дд“. +mirror_interval = Интервал на огледалото (валидни единици за време са „h“, „m“, „s“). 0 за изключване на периодичната синхронизация. (Минимален интервал: %s) +summary_card_alt = Карта с обобщение на хранилище %s +file_copy_permalink = Копиране на постоянна връзка +view_git_blame = Преглед на git blame +commit.revert-content = Изберете клон, върху който да се върне: +issues.unlock.notice_1 = - Всеки ще може отново да коментира тази задача. +issues.delete.text = Наистина ли искате да изтриете тази задача? (Това ще премахне трайно цялото съдържание. Помислете дали вместо това да не я затворите, ако възнамерявате да я запазите архивирана) +issues.add_time_sum_to_small = Не е въведено време. +issues.dependency.no_permission_n = Нямате разрешение да прочетете %d зависимости +issues.review.pending.tooltip = Този коментар в момента не е видим за други потребители. За да изпратите изчакващите си коментари, изберете „%s“ -> „%s/%s/%s“ в горната част на страницата. +invisible_runes_description = `Този файл съдържа невидими Уникод знаци, които са неразличими за хората, но могат да бъдат обработени по различен начин от компютър. Ако смятате, че това е умишлено, можете спокойно да пренебрегнете това предупреждение. Използвайте бутона „Екраниране“, за да ги разкриете.` +video_not_supported_in_browser = Вашият браузър не поддържа HTML5 тага „video“. +editor.filename_help = Добавете директория, като въведете името ѝ, последвано от наклонена черта („/“). Премахнете директория, като натиснете backspace в началото на полето за въвеждане. +commits.view_single_diff = Преглед на промените в този файл, въведени в това подаване +issues.choose.ignore_invalid_templates = Невалидните шаблони са игнорирани +issues.due_date_form = гггг-мм-дд +issues.dependency.no_permission.can_remove = Нямате разрешение да прочетете тази зависимост, но можете да я премахнете +issues.review.remove_review_request_self = отказа да рецензира %s +mirror_use_ssh.helper = Forgejo ще създаде огледало на хранилището чрез Git през SSH и ще генерира двойка ключове за вас, когато изберете тази опция. Трябва да се уверите, че генерираният публичен ключ е упълномощен да изтласква към целевото хранилище. Не можете да използвате удостоверяване, базирано на парола, когато избирате това. +mirror_address_url_invalid = Предоставеният URL е невалиден. Трябва да екранирате правилно всички компоненти на URL адреса. +template.git_content = Git съдържание (стандартен клон) +ambiguous_runes_description = `Този файл съдържа Уникод знаци, които могат да бъдат объркани с други знаци. Ако смятате, че това е умишлено, можете спокойно да пренебрегнете това предупреждение. Използвайте бутона „Екраниране“, за да ги разкриете.` +issues.lock.notice_3 = - Винаги можете да отключите тази задача отново в бъдеще. +issues.lock.title = Заключване на обсъждането по тази задача. +issues.dependency.issue_batch_close_blocked = Не могат да бъдат затворени групово избраните задачи, защото задача #%d все още има отворени зависимости +issues.dependency.add_error_cannot_create_circular = Не можете да създадете зависимост с две задачи, които се блокират взаимно. +issues.review.add_review_requests = поиска рецензии от %[1]s %[2]s +comment.blocked_by_user = Коментирането не е възможно, защото сте блокирани от притежателя на хранилището или от автора. +pulls.view = Преглед на заявката за сливане +pulls.no_merge_desc = Тази заявка за сливане не може да бъде слята, защото всички опции за сливане в хранилището са изключени. +pulls.no_merge_wip = Тази заявка за сливане не може да бъде слята, защото е отбелязана като в процес на работа. +pulls.switch_comparison_type = Превключване на типа сравнение +pulls.has_changed_since_last_review = Променено след последната ви рецензия +pulls.filter_branch = Филтриране на клон +pulls.squash_merge_pull_request = Създаване на сплескано подаване +pulls.rebase_conflict_summary = Съобщение за грешка +pulls.auto_merge_button_when_succeed = (Когато проверките са успешни) +pulls.auto_merge_newly_scheduled_comment = `насрочи тази заявка за сливане за автоматично сливане, когато всички проверки са успешни %[1]s` +pulls.auto_merge_canceled_schedule_comment = `отмени автоматичното сливане на тази заявка за сливане, когато всички проверки са успешни %[1]s` +pulls.merge_manually = Ръчно слята +pulls.merge_commit_id = ID на подаването със сливане +pulls.require_signed_wont_sign = Клонът изисква подписани подавания, но това сливане няма да бъде подписано +pulls.no_merge_helper = Включете опциите за сливане в настройките на хранилището или слейте заявката за сливане ръчно. +pulls.review_only_possible_for_full_diff = Рецензирането е възможно само при преглед на пълните разлики +pulls.push_rejected = Изтласкването е неуспешно: Изтласкването е отхвърлено. Прегледайте Git куките за това хранилище. +pulls.auto_merge_canceled_schedule = Автоматичното сливане е отменено за тази заявка за сливане. +pulls.allow_edits_from_maintainers_err = Обновяването е неуспешно +pulls.auto_merge_cancel_schedule = Отмяна на автоматичното сливане +pulls.auto_merge_not_scheduled = Тази заявка за сливане не е насрочена за автоматично сливане. +pulls.outdated_with_base_branch = Този клон е остарял спрямо основния клон +pulls.update_not_allowed = Нямате разрешение да обновявате клона +pulls.wrong_commit_id = ID на подаването трябва да бъде ID на подаване в целевия клон +pulls.blocked_by_user = Не можете да създадете заявка за сливане в това хранилище, защото сте блокирани от притежателя на хранилището. +pulls.merge_conflict_summary = Съобщение за грешка +pulls.editable_explanation = Тази заявка за сливане позволява редакции от поддържащите. Можете да допринесете директно към нея. +pulls.allow_edits_from_maintainers_desc = Потребители с право на запис в основния клон могат също да изтласкват към този клон +pulls.merge_conflict = Сливането е неуспешно: Възникна конфликт по време на сливането. Подсказка: Опитайте различна стратегия +pulls.has_merged = Неуспешно: Заявката за сливане е слята, не можете да слеете отново или да промените целевия клон. +pulls.cmd_instruction_merge_warning = Предупреждение: Настройката „Автоматично откриване на ръчно сливане“ не е включена за това хранилище, ще трябва да отбележите тази заявка за сливане като ръчно слята след това. +pulls.delete.title = Да се изтрие ли тази заявка за сливане? +pulls.push_rejected_no_message = Изтласкването е неуспешно: Изтласкването е отхвърлено, но няма отдалечено съобщение. Прегледайте Git куките за това хранилище +pulls.auto_merge_newly_scheduled = Заявката за сливане е насрочена за сливане, когато всички проверки са успешни. +pulls.delete.text = Наистина ли искате да изтриете тази заявка за сливане? (Това ще премахне трайно цялото съдържание. Помислете дали вместо това да не я затворите, ако възнамерявате да я запазите архивирана) +pulls.auto_merge_has_pending_schedule = %[1]s насрочи тази заявка за сливане за автоматично сливане, когато всички проверки са успешни %[2]s. +pulls.auto_merge_when_succeed = Автоматично сливане, когато всички проверки са успешни +error.csv.invalid_field_count = Не може да се визуализира този файл, защото има грешен брой полета на ред %d. +diff.bin = ДВОИЧЕН +release.add_tag_msg = Използване на заглавието и съдържанието на изданието като съобщение на маркера. +release.hide_archive_links_helper = Скрийте автоматично генерираните архиви с програмен код за това издание. Например, ако качвате свои собствени. +diff.data_not_available = Съдържанието на разликите не е налично +diff.has_escaped = Този ред има скрити Уникод знаци +branch.protected_deletion_failed = Клонът „%s“ е защитен. Не може да бъде изтрит. +branch.default_deletion_failed = Клонът „%s“ е стандартният клон. Не може да бъде изтрит. +diff.generated = генериран +diff.comment.add_line_comment = Добавяне на коментар към ред +diff.comment.add_review_comment = Добавяне на коментар +diff.review.self_approve = Авторите на заявки за сливане не могат да одобряват собствените си заявки +release.tag_name_protected = Името на маркера е защитено. +branch.warning_rename_default_branch = Преименувате стандартния клон. +find_file.no_matching = Не е намерен съвпадащ файл +issues.role.member_helper = Този потребител е участник в организацията, притежаваща това хранилище. +diff.image.overlay = Наслагване +diff.image.swipe = Плъзгане +branch.included = Включен +diff.file_suppressed_line_too_long = Разликите във файла са потиснати, защото един или повече редове са твърде дълги +error.broken_git_hook = Git куките на това хранилище изглеждат повредени. Моля, последвайте документацията, за да ги поправите, след което изтласкайте подавания, за да обновите статуса. +error.csv.unexpected = Не може да се визуализира този файл, защото съдържа неочакван знак на ред %d и колона %d. +topic.count_prompt = Не можете да изберете повече от 25 теми +release.hide_archive_links = Скриване на автоматично генерираните архиви +diff.show_more = Показване на още +diff.too_many_files = Някои файлове не бяха показани, защото твърде много файлове имат промени в тези разлики +diff.review.self_reject = Авторите на заявки за сливане не могат да поискват промени в собствените си заявки +branch.included_desc = Този клон е част от стандартния клон +diff.image.side_by_side = Едно до друго +release.summary_card_alt = Карта с обобщение на издание със заглавие „%s“ в хранилище %s +release.asset_external_url = Външен URL адрес +error.csv.too_large = Не може да се визуализира този файл, защото е твърде голям. [modal] confirm = Потвърждаване @@ -1663,18 +1954,18 @@ follow_blocked_user = Не можете да следвате тази орга settings.delete_prompt = Организацията ще бъде премахната завинаги. Това НЕ МОЖЕ да бъде отменено! settings.labels_desc = Добавете етикети, които могат да се използват за задачи за всички хранилища в тази организация. teams.none_access = Без достъп -teams.members.none = Няма членове в този екип. +teams.members.none = Няма участници в този екип. repo_updated = Обновено %s teams.delete_team_success = Екипът е изтрит. teams.search_repo_placeholder = Потърсете хранилище… teams.delete_team_title = Изтриване на екипа -teams.add_team_member = Добавяне на член на екипа +teams.add_team_member = Добавяне на участник в екипа teams.read_access_helper = Членовете могат да преглеждат и клонират хранилищата на екипа. teams.invite.description = Моля, щракнете върху бутона по-долу, за да се присъедините към екипа. teams.invite.title = Поканени сте да се присъедините към екип %s в организация %s. team_permission_desc = Разрешение members.public_helper = Да е скрит -teams.members = Членове на екипа +teams.members = Участници в екипа teams.delete_team = Изтриване на екипа members.owner = Притежател members.member_role = Роля на участника: @@ -1684,6 +1975,37 @@ teams.no_desc = Този екип няма описание settings.delete_org_desc = Тази организация ще бъде изтрита перманентно. Продължаване? open_dashboard = Отваряне на таблото settings.change_orgname_prompt = Бележка: Промяната на името на организацията ще промени и URL адреса на вашата организация и ще освободи старото име. +teams.add_duplicate_users = Потребителят вече е участник в екипа. +team_unit_disabled = (Изключено) +form.name_reserved = Името на организацията „%s“ е резервирано. +settings.update_avatar_success = Профилната снимка на организацията е обновена. +teams.invite_team_member.list = Чакащи покани +teams.remove_all_repos_desc = Това ще премахне всички хранилища от екипа. +form.create_org_not_allowed = Нямате разрешение да създавате организация. +form.name_pattern_not_allowed = Шаблонът „%s“ не е разрешен в име на организация. +members.invite_now = Поканване сега +teams.specific_repositories = Конкретни хранилища +teams.repos.none = Няма хранилища, до които този екип да има достъп. +teams.add_all_repos_title = Добавяне на всички хранилища +settings.hooks_desc = Добавете уеб-куки, които ще се задействат за всички хранилища в тази организация. +teams.add_all_repos_desc = Това ще добави всички хранилища на организацията към екипа. +members.invite_desc = Добавяне на нов участник към %s: +members.private = Скрит +settings.change_orgname_redirect_prompt.with_cooldown.few = Старото име на организацията ще бъде достъпно за всички след период на изчакване от %[1]d дни. Все още можете да си върнете старото име по време на периода на изчакване. +team_access_desc = Достъп до хранилище +teams.specific_repositories_helper = Участниците ще имат достъп само до хранилища, изрично добавени към екипа. Избирането на това няма автоматично да премахне хранилища, вече добавени с Всички хранилища. +teams.delete_team_desc = Изтриването на екип отнема достъпа до хранилището от неговите участници. Продължаване? +members.membership_visibility = Видимост на участничеството: +members.public = Видим +teams.all_repositories_helper = Екипът има достъп до всички хранилища. Избирането на това ще добави всички съществуващи хранилища към екипа. +team_unit_desc = Разрешаване на достъп до секции на хранилището +settings.update_setting_success = Настройките на организацията са обновени. +settings.change_orgname_redirect_prompt = Старото име ще се пренасочва, докато не бъде взето. +teams.invite_team_member = Поканване в %s +teams.admin_access = Администраторски достъп +settings.change_orgname_redirect_prompt.with_cooldown.one = Старото име на организацията ще бъде достъпно за всички след период на изчакване от %[1]d ден. Все още можете да си върнете старото име по време на периода на изчакване. +teams.add_nonexistent_repo = Хранилището, което се опитвате да добавите, не съществува, моля, първо го създайте. +teams.invite.by = Поканен от %s [install] admin_password = Парола @@ -1978,14 +2300,14 @@ Pronouns = Местоимения Biography = Биография Website = Уебсайт Location = Местоположение -cannot_add_org_to_team = Организация не може да бъде добавена като член на екип. +cannot_add_org_to_team = Организация не може да бъде добавена като участник в екип. auth_failed = Неуспешно удостоверяване: %v team_no_units_error = Разрешете достъп до поне една секция на хранилището. password_uppercase_one = Поне един голям знак CommitSummary = Обобщение на подаването username_error = ` може да съдържа само буквено-цифрови знаци („0-9“, „a-z“, „A-Z“), тире („-“), долна черта („_“) и точка („.“). Не може да започва или завършва с не-буквено-цифрови знаци, като също така са забранени и последователни не-буквено-цифрови знаци.` username_error_no_dots = ` може да съдържа само буквено-цифрови знаци („0-9“, „a-z“, „A-Z“), тире („-“) и долна черта („_“). Не може да започва или завършва с не-буквено-цифрови знаци, като също така са забранени и последователни не-буквено-цифрови знаци.` -duplicate_invite_to_team = Потребителят вече е поканен като член на екипа. +duplicate_invite_to_team = Потребителят вече е поканен като участник в екипа. must_use_public_key = Ключът, който предоставихте, е частен ключ. Моля, не качвайте частния си ключ никъде. Вместо това използвайте публичния си ключ. org_still_own_packages = Тази организация все още притежава един или повече пакети, първо ги изтрийте. admin_cannot_delete_self = Не можете да изтриете себе си, когато сте администратор. Моля, първо премахнете администраторските си привилегии. @@ -2006,7 +2328,7 @@ enterred_invalid_repo_name = Името на хранилището, което enterred_invalid_org_name = Името на организацията, което въведохте, е неправилно. enterred_invalid_password = Паролата, която въведохте, е неправилна. organization_leave_success = Успешно напуснахте организацията %s. -still_has_org = Вашият акаунт е член на една или повече организации, първо ги напуснете. +still_has_org = Вашият акаунт е участник в една или повече организации, първо ги напуснете. org_still_own_repo = Тази организация все още притежава едно или повече хранилища, първо ги изтрийте или прехвърлете. target_branch_not_exist = Целевият клон не съществува. glob_pattern_error = ` glob шаблонът е невалиден: %s.` @@ -2016,6 +2338,17 @@ TreeName = Път до файла AdminEmail = Администраторски адрес за ел. поща email_domain_is_not_allowed = Домейнът на адреса за ел. поща на потребителя %s е в конфликт с EMAIL_DOMAIN_ALLOWLIST или EMAIL_DOMAIN_BLOCKLIST. Уверете се, че сте въвели правилно адреса за ел. поща. email_been_used = Адресът за ел. поща вече се използва. +unable_verify_ssh_key = Не може да се потвърди SSH ключът, проверете го отново за грешки. +enterred_invalid_owner_name = Името на новия притежател не е валидно. +NewBranchName = Име на новия клон +invalid_ssh_key = Не може да се потвърди вашият SSH ключ: %s +required_prefix = Въведеният текст трябва да започва с „%s“ +regex_pattern_error = ` шаблонът на регулярния израз е невалиден: %s.` +repository_files_already_exist = Вече съществуват файлове за това хранилище. Свържете се със системния администратор. +repository_files_already_exist.delete = Вече съществуват файлове за това хранилище. Трябва да ги изтриете. +invalid_gpg_key = Не може да се потвърди вашият GPG ключ: %s +git_ref_name_error = ` трябва да е правилно форматирано име на Git препратка.` +last_org_owner = Не можете да премахнете последния потребител от екипа на „притежателите“. Трябва да има поне един притежател за организация. [action] close_issue = `затвори задача %[3]s#%[2]s` @@ -2044,6 +2377,11 @@ reject_pull_request = `предложи промени за %[3] compare_branch = Сравняване compare_commits_general = Сравняване на подавания compare_commits = Сравнете %d подавания +transfer_repo = прехвърли хранилище %s към %s +mirror_sync_push = синхронизира подавания към %[3]s на %[4]s от огледало +mirror_sync_create = синхронизира нова препратка %[3]s към %[4]s от огледало +review_dismissed = `отхвърли рецензия от %[4]s за %[3]s#%[2]s` +mirror_sync_delete = синхронизира и изтри препратка %[2]s на %[3]s от огледало [auth] tab_openid = OpenID @@ -2177,6 +2515,14 @@ variables.management = Управление на променливи variables.not_found = Променливата не е открита. variables.id_not_exist = Променлива с идентификатор %d не съществува. runners.owner_type = Тип +status.cancelled = Отменено +status.running = Изпълнява се +status.success = Успешно +status.waiting = Изчаква се +status.unknown = Неизвестно +status.failure = Неуспешно +status.skipped = Пропуснато +unit.desc = Управление на интегрирани CI/CD pipelines с Forgejo Actions. [heatmap] less = По-малко @@ -2258,3 +2604,33 @@ eib = ЕиБ [translation_meta] test = окей + + +[gpg] +default_key = Подписано с ключ по подразбиране +error.no_gpg_keys_found = Не е намерен известен ключ за този подпис в базата данни +error.not_signed_commit = Не е подписано подаване +error.generate_hash = Неуспешно генериране на хеш на подаването +error.extract_sign = Неуспешно извличане на подпис +error.probable_bad_signature = ВНИМАНИЕ! Въпреки че има ключ с това ID в базата данни, той не потвърждава това подаване! Това подаване е ПОДОЗРИТЕЛНО. +error.failed_retrieval_gpg_keys = Неуспешно извличане на ключ, свързан с акаунта на подаващия +error.probable_bad_default_signature = ВНИМАНИЕ! Въпреки че ключът по подразбиране има това ID, той не потвърждава това подаване! Това подаване е ПОДОЗРИТЕЛНО. +error.no_committer_account = Няма акаунт, свързан с адреса за ел. поща на подаващия + +[repo.permissions] +projects.read = Четене: Достъп до проектните табла на хранилището. +wiki.write = Писане: Създаване, обновяване и изтриване на страници в интегрираното уики. +issues.read = Четене: Четене и създаване на задачи и коментари. +pulls.read = Четене: Четене и създаване на заявки за сливане. +pulls.write = Писане: Затваряне на заявки за сливане и управление на метаданни като етикети, етапи, изпълнители, крайни срокове и зависимости. +projects.write = Писане: Създаване и редактиране на проекти и колони. +releases.read = Четене: Преглед и изтегляне на издания. +wiki.read = Четене: Четене на интегрираното уики и неговата история. +code.read = Четене: Достъп и клониране на кода на хранилището. +code.write = Писане: Изтласкване към хранилището, създаване на клонове и маркери. +issues.write = Писане: Затваряне на задачи и управление на метаданни като етикети, етапи, изпълнители, крайни срокове и зависимости. + +[units] +error.no_unit_allowed_repo = Нямате разрешение за достъп до никоя секция на това хранилище. +unit = Елемент +error.unit_not_allowed = Нямате разрешение за достъп до тази секция на хранилището. \ No newline at end of file diff --git a/options/locale/locale_ca.ini b/options/locale/locale_ca.ini index 9cb7d5e50c..ea2af3b645 100644 --- a/options/locale/locale_ca.ini +++ b/options/locale/locale_ca.ini @@ -153,26 +153,26 @@ fuzzy = Difusa search = Cerca... type_tooltip = Tipus de cerca fuzzy_tooltip = Inclou resultats que s'assemblen al terme de la cerca -repo_kind = Cerca repos... -user_kind = Cerca usuaris... +repo_kind = Cerca repos… +user_kind = Cerca usuaris… code_search_unavailable = La cerca de codi no està disponible actualment. Si us plau concteu amb l'administrador del lloc. code_search_by_git_grep = Els resultats actuals de la cerca de codi són proporcionats per "git grep". Podríen haver-hi millors resultats si l'administrador del lloc habilita l'indexador de codi. -package_kind = Cerca paquets... -project_kind = Cerca projectes... -branch_kind = Cerca branques... -commit_kind = Cerca commits... -runner_kind = Cerca executors... +package_kind = Cerca paquets… +project_kind = Cerca projectes… +branch_kind = Cerca branques… +commit_kind = Cerca commits… +runner_kind = Cerca executors… no_results = Cap resultat coincident trobat. keyword_search_unavailable = La cerca per paraula clau no està disponible ara mateix. Si us plau contacteu amb l'administrador del lloc. union = Paraules clau union_tooltip = Inclou resultats que encaixen amb qualsevol paraula clau separada per espais -org_kind = Cerca organitzacions... -team_kind = Cerca teams... -code_kind = Cerca codi... -pull_kind = Cerca "pulls"... +org_kind = Cerca organitzacions… +team_kind = Cerca teams… +code_kind = Cerca codi… +pull_kind = Cerca "pulls"… exact = Exacte exact_tooltip = Inclou només resultats que són exactament el terme de cerca -issue_kind = Cerca problemes... +issue_kind = Cerca problemes… regexp = RegExp regexp_tooltip = Interpreta el terme de cerca com una expressió regular diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index 81430bc96c..c7770c5ea1 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -1556,7 +1556,7 @@ issues.label_templates.info=Zatím nebyly vytvořeny žádné štítky. Vytvořt issues.label_templates.helper=Vyberte přednastavené značky issues.label_templates.use=Použít přednastavené štítky issues.label_templates.fail_to_load_file=Nepodařilo se načíst soubor šablony popisku „%s“: %v -issues.add_label=přidal/a %s štítek %s +issues.add_label=přidal/a štítek %s %s issues.add_labels=přidal/a %s štítky %s issues.remove_label=odstranil/a %s štítek %s issues.remove_labels=odstranil/a %s štítky %s @@ -1763,7 +1763,7 @@ issues.error_modifying_due_date=Změna termínu dokončení selhala. issues.error_removing_due_date=Odstranění termínu dokončení selhalo. issues.push_commit_1=přidal/a %d revizi %s issues.push_commits_n=přidal/a %d revize %s -issues.force_push_codes=`vynucené nahrání %[1]s od %[2]s do %[4]s %[6]s` +issues.force_push_codes=`vynutil/a nahrání %[1]s od %[2]s do %[4]s %[6]s` issues.force_push_compare=Porovnat issues.due_date_form=rrrr-mm-dd issues.due_date_form_add=Přidat termín dokončení @@ -1813,7 +1813,7 @@ issues.review.approve=schválil/a tyto změny %s issues.review.comment=posoudil/a %s issues.review.dismissed=zamítl/a posouzení uživatele %s %s issues.review.dismissed_label=Zamítnuto -issues.review.left_comment=zanechal komentář +issues.review.left_comment=zanechal/a komentář issues.review.content.empty=Je potřeba zanechat poznámku s uvedením požadované změny (požadovaných změn). issues.review.reject=požádal/a o změny %s issues.review.wait=byl/a požádán/a o posouzení %s diff --git a/options/locale/locale_da.ini b/options/locale/locale_da.ini index df51b5f2bf..1a92305515 100644 --- a/options/locale/locale_da.ini +++ b/options/locale/locale_da.ini @@ -978,8 +978,8 @@ delete_with_all_comments = Din konto er yngre end %s. For at undgå spøgelsesko delete_account_title = Slet brugerkonto user_block_yourself = Du kan ikke blokere dig selv. pronouns_custom_label = Brugerdefinerede stedord -change_username_redirect_prompt.with_cooldown.one = Det gamle brugernavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dag, du kan stadig kræve det gamle brugernavn tilbage i nedkølingsperioden. -change_username_redirect_prompt.with_cooldown.few = Det gamle brugernavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dage, du kan stadig kræve det gamle brugernavn tilbage i nedkølingsperioden. +change_username_redirect_prompt.with_cooldown.one = Det gamle brugernavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dag, år. Du kan stadig kræve det gamle brugernavn tilbage i nedkølingsperioden. +change_username_redirect_prompt.with_cooldown.few = Det gamle brugernavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dage, år. Du kan stadig kræve det gamle brugernavn tilbage i nedkølingsperioden. keep_pronouns_private = Vis kun stedord til godkendte brugere keep_pronouns_private.description = Dette vil skjule dine stedord for besøgende, der ikke er logget ind. quota.applies_to_user = Følgende kvoteregler gælder for din konto @@ -1520,13 +1520,13 @@ issues.add_labels = tilføjede %s etiketterne %s issues.add_remove_labels = tilføjede %s og fjernede %s etiketter %s issues.add_milestone_at = `føjede dette til %s milepælen %s` issues.add_project_at = `føjede dette til %s- projektet %s` -issues.ref_reopening_from = `henviste til dette problem fra en pull-anmodning %[3]s, der vil genåbne den, %[1]s` +issues.ref_reopening_from = `henviste til dette problem fra en pull-anmodning %[3]s, der vil genåbne det, %[1]s` issues.ref_closed_from = `lukkede dette problem %[4]s %[2 ]s` issues.ref_reopened_from = `genåbnede dette problem %[4]s %[2 ]s` issues.ref_from = `fra %[1]s` issues.author = Forfatter issues.commit_ref_at = `henviste til dette problem fra en commit %s` -issues.ref_issue_from = `henviste til dette problem %[3]s %[2 ]s` +issues.ref_issue_from = `henviste til dette problem %[3]s %[1]s` issues.ref_pull_from = `henviste til denne pull-anmodning %[3]s %[1]s` issues.ref_closing_from = `henviste til dette problem fra en pull-anmodning %[3]s, der vil lukke det, %[1]s` issues.author.tooltip.issue = Denne bruger er forfatteren til dette problem. @@ -1582,7 +1582,7 @@ issues.change_ref_at = `ændret reference fra %s til issues.remove_ref_at = `fjernet reference %s %s` issues.add_ref_at = `tilføjet reference %s %s` issues.delete_branch_at = `slettet gren %s %s` -issues.filter_label_exclude = `Brug alt + klik/enter for at ekskludere etiketter` +issues.filter_label_exclude = Brug Alt + klik for at ekskludere etiketter issues.filter_milestone = Milepæl issues.filter_milestone_all = Alle milepæle issues.filter_milestone_none = Ingen milepæle @@ -2833,8 +2833,8 @@ team_permission_desc = Tilladelse members.member = Medlem settings.change_orgname_prompt = Bemærk: Ændring af organisationens navn vil også ændre din organisations URL og frigøre det gamle navn. settings.change_orgname_redirect_prompt = Det gamle navn vil omdirigere, indtil det gøres krav på. -settings.change_orgname_redirect_prompt.with_cooldown.one = Det gamle organisationsnavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dag, du kan stadig kræve det gamle navn tilbage i nedkølingsperioden. -settings.change_orgname_redirect_prompt.with_cooldown.few = Det gamle organisationsnavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dage, du kan stadig kræve det gamle navn tilbage i . +settings.change_orgname_redirect_prompt.with_cooldown.one = Det gamle organisationsnavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dag, år. Du kan stadig kræve det gamle navn tilbage i nedkølingsperioden. +settings.change_orgname_redirect_prompt.with_cooldown.few = Det gamle organisationsnavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dage, år. Du kan stadig kræve det gamle navn tilbage i. settings.update_avatar_success = Organisationens avatar er blevet opdateret. members.public_helper = Gør skjult members.private = Skjult diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 9be888684c..8f4dfda0d1 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -752,7 +752,7 @@ organization=Organisationen uid=UID webauthn=Hardware-Sicherheitsschlüssel -public_profile=Öffentliches Profil +public_profile=Öffentliches profil biography_placeholder=Erzähle anderen ein wenig über dich selbst! (Markdown wird unterstützt) location_placeholder=Teile deinen ungefähren Standort mit anderen profile_desc=Über dich diff --git a/options/locale/locale_el-GR.ini b/options/locale/locale_el-GR.ini index 5638d35c40..116d5ba5a8 100644 --- a/options/locale/locale_el-GR.ini +++ b/options/locale/locale_el-GR.ini @@ -3939,12 +3939,12 @@ submodule=Υπομονάδα [search] code_search_unavailable = Η αναζήτηση κώδικα δεν είναι επί του παρόντος διαθέσιμη. Παρακαλώ επικοινωνήστε με τον διαχειριστή σας. keyword_search_unavailable = Η αναζήτηση με την χρήση λέξεων-κλειδιών δεν είναι επί του παρόντος διαθέσιμη. Παρακαλώ επικοινωνήστε με τον διαχειριστή σας. -runner_kind = Αναζήτηση runner... +runner_kind = Αναζήτηση runner… code_search_by_git_grep = Για την αναζήτηση κώδικα, χρησιμοποιείται η εντολή «git grep». Ίσως να παρουσιαστούν καλύτερα αποτελέσματα, αν ο διαχειριστής σας ενεργοποιήσει ένα ευρετήριο για αποθετήρια («Repository Indexer»). package_kind = Αναζήτηση πακέτων… -project_kind = Αναζήτηση έργων... +project_kind = Αναζήτηση έργων… branch_kind = Αναζήτηση κλάδων… -commit_kind = Αναζήτηση commit... +commit_kind = Αναζήτηση commit… no_results = Δεν βρέθηκαν κατάλληλα αποτελέσματα. search = Αναζήτηση… type_tooltip = Είδος αναζήτησης @@ -3958,8 +3958,8 @@ org_kind = Αναζήτηση οργανισμών… team_kind = Αναζήτηση ομαδών… code_kind = Αναζήτηση κώδικα… exact_tooltip = Να συμπεριληφθούν μόνο αποτελέσματα που ταιριάζουν με τον όρο αναζήτησης -issue_kind = Αναζήτηση ζητημάτων... -pull_kind = Αναζήτηση pull... +issue_kind = Αναζήτηση ζητημάτων… +pull_kind = Αναζήτηση pull… exact = Ακριβής milestone_kind = Αναζήτηση ορόσημων... union = Ένωση diff --git a/options/locale/locale_eo.ini b/options/locale/locale_eo.ini index 6393765d63..5a06120e9e 100644 --- a/options/locale/locale_eo.ini +++ b/options/locale/locale_eo.ini @@ -630,7 +630,7 @@ account = Konto ssh_gpg_keys = SSH / GPG-ŝlosiloj twofa_disable = Malaktivigi duoblan aŭtentikigon twofa_enroll = Ŝalti duoblan aŭtentikigon -orgs = Mastrumi organizaĵojn +orgs = Organizaĵoj blocked_users = Blokitaj uzantoj profile = Profilo ui = Haŭto @@ -686,7 +686,7 @@ verify_ssh_key_success = SSH-ŝlosilo «%s» jam konfirmiĝis. edit_oauth2_application = Redakti OAuth2-programon gpg_key_deletion = Forigi GPG-ŝlosilon gpg_key_matched_identities = Akordaj identecoj: -manage_themes = Elekti implicitan haŭton +manage_themes = Defaŭlta temo ssh_key_deletion = Forigi SSH-ŝlosilon key_state_desc = Ĉi tiu ŝlosilo uziĝis dum la pasintaj 7 tagoj valid_forever = Validos dumĉiame @@ -700,7 +700,7 @@ primary = Ĉefa ssh_disabled = SSH malaktivigita update_avatar_success = Via profilbildo konserviĝis. keep_email_private = Kaŝi retpoŝtadreson -manage_openid = Mastrumi OpenID-adresojn +manage_openid = OpenID-adresoj delete_current_avatar = Forigi nunan profilbildon email_preference_set_success = Retpoŝta prefero konserviĝis sukcese. permissions_access_all = Ĉiu (publika, privata, kaj limigita) @@ -884,9 +884,9 @@ commit_kind = Serĉi enmetojn… no_results = Ne trovis kongruantajn rezultojn. exact = Ĝusta exact_tooltip = Inkluzivas nur rezultojn kongruantajn kun la ĝustaj serĉoterminoj -issue_kind = Serĉi erarojn... +issue_kind = Serĉi erarojn… regexp_tooltip = Interpretas la serĉoterminoj kiel regulesprimo fuzzy = Svaga branch_kind = Serĉi disbranĉigojn… -runner_kind = Serĉi rulantojn... -pull_kind = Serĉi tirpetojn... \ No newline at end of file +runner_kind = Serĉi rulantojn… +pull_kind = Serĉi tirpetojn… \ No newline at end of file diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini index c572cf6385..582baeebdd 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -740,7 +740,7 @@ avatar=Avatar ssh_gpg_keys=Claves SSH / GPG social=Redes sociales applications=Aplicaciones -orgs=Administrar organizaciones +orgs=Organizaciones repos=Repositorios delete=Eliminar cuenta twofa=Autenticación de dos factores (TOTP) @@ -1075,8 +1075,8 @@ keep_pronouns_private = Mostrar pronombres solo a personas autenticadas storage_overview = Resumen del almacenamiento quota.sizes.assets.artifacts = Artefactos quota.sizes.assets.attachments.releases = Archivos adjuntos del lanzamiento -change_username_redirect_prompt.with_cooldown.few = El antiguo nombre de usuario estará disponible para todos después un periodo de tiempo de espera de %[1]d días, aún puedes reclamar el antiguo nombre de usuario durante el periodo de tiempo de espera. -change_username_redirect_prompt.with_cooldown.one = El antiguo nombre de usuario estará disponible para todos después un periodo de tiempo de espera de %[1]d día, aún puedes reclamar el antiguo nombre de usuario durante el periodo de tiempo de espera. +change_username_redirect_prompt.with_cooldown.few = El antiguo nombre de usuario estará disponible para todos después un periodo de tiempo de espera de %[1]d días. Aún puedes reclamar el antiguo nombre de usuario durante el periodo de tiempo de espera. +change_username_redirect_prompt.with_cooldown.one = El antiguo nombre de usuario estará disponible para todos después un periodo de tiempo de espera de %[1]d día. Aún puedes reclamar el antiguo nombre de usuario durante el periodo de tiempo de espera. quota.rule.exceeded = Excedido quota.rule.no_limit = Ilimitado quota.sizes.assets.all = Activos @@ -1574,7 +1574,7 @@ issues.remove_ref_at=`eliminó la referencia %s %s` issues.add_ref_at=`añadió la referencia %s %s` issues.delete_branch_at=`eliminó la rama %s %s` issues.filter_label=Etiqueta -issues.filter_label_exclude=`Usa alt + clic/enter para excluir etiquetas` +issues.filter_label_exclude=Usa Alt + Click para excluir etiquetas issues.filter_label_no_select=Todas las etiquetas issues.filter_label_select_no_label=Sin etiqueta issues.filter_milestone=Hito @@ -2887,6 +2887,8 @@ pulls.delete_after_merge.head_branch.is_default = La rama actual que desea elimi summary_card_alt = Tarjeta de resumen del repositorio %s settings.pull_mirror_sync_quota_exceeded = Cuota excedida, no se empujan los cambios. archive.nocomment = No es posible hacer comentarios porque el repositorio está archivado. +sync_fork.branch_behind_one = Esta rama esta %[1]d cambios detrás de %[2]s +sync_fork.branch_behind_few = Esta rama está %[1]d confirmaciones detrás de %[2]s [graphs] component_loading = Cargando %s… diff --git a/options/locale/locale_et.ini b/options/locale/locale_et.ini index e54ceadbb5..58e5776d33 100644 --- a/options/locale/locale_et.ini +++ b/options/locale/locale_et.ini @@ -145,25 +145,25 @@ fuzzy_tooltip = Lisage tulemused mis vastavad ka otsingu terminile union = Märksõnad exact = Täpne exact_tooltip = Sisaldab ainult tulemusi mis vastavad täpsele otsingusõnale -repo_kind = Otsi hoidlad... -user_kind = Otsi kasutajaid... -org_kind = Otsi organisatsioone... -team_kind = Otsi meeskonnad... -code_kind = Otsi koodi... +repo_kind = Otsi hoidlad… +user_kind = Otsi kasutajaid… +org_kind = Otsi organisatsioone… +team_kind = Otsi meeskonnad… +code_kind = Otsi koodi… code_search_by_git_grep = Praeguse koodi otsingu tulemused annab "git grep". Paremaid tulemusi võib saada, kui saidi administraator lubab koodi indekseerija. -package_kind = Otsi pakette... -project_kind = Otsi projekte... -branch_kind = Otsi harusid... -commit_kind = Otsi kommiteid... -runner_kind = Otsi jooksjaid... +package_kind = Otsi pakette… +project_kind = Otsi projekte… +branch_kind = Otsi harusid… +commit_kind = Otsi kommiteid… +runner_kind = Otsi jooksjaid… no_results = Sobivaid tulemusi ei leitud. -issue_kind = Otsi probleeme... +issue_kind = Otsi probleeme… milestone_kind = Otsi verstapostid... type_tooltip = Otsingu tüüp code_search_unavailable = Koodide otsing ei ole praegu saadaval. Palun võtke ühendust saidi administraatoriga. union_tooltip = Sisaldab tulemused mis vastavad mis tahes tühikutega eraldatud võtmesõnadele keyword_search_unavailable = Otsing märksõna järgi ei ole praegu saadaval. Palun võtke ühendust saidi administraatoriga. -pull_kind = Otsi tõmbepäringuid... +pull_kind = Otsi tõmbepäringuid… [aria] navbar = Navigatsiooniriba diff --git a/options/locale/locale_fa-IR.ini b/options/locale/locale_fa-IR.ini index dae0695495..23cb74f814 100644 --- a/options/locale/locale_fa-IR.ini +++ b/options/locale/locale_fa-IR.ini @@ -608,7 +608,7 @@ avatar=آواتار ssh_gpg_keys=کلید‌های SSH / GPG social=حساب های اجتماعی applications=برنامه‌ها -orgs=مدیریت سازمان‌ها +orgs=سازمان‌ها repos=مخازن delete=حذف حساب کاربری twofa=احراز هویت دوگانه @@ -653,8 +653,8 @@ password_change_disabled=کاربران غیر محلی نمیتوانند گذ emails=نشانی‌های ایمیل manage_emails=مدیریت نشانی‌های ایمیل -manage_themes=تم پیش فرض را انتخاب کنید -manage_openid=مدیریت نشانی‌های OpenID +manage_themes=تم پیش فرض +manage_openid=آدرس‌های OpenID theme_desc=این پوشته پیش فرض شما در سراسر سایت می باشد. primary=اصلی activated=فعال شده @@ -2766,23 +2766,23 @@ search = جستجو... fuzzy = درهم fuzzy_tooltip = پیامدهایی را درج کنید که دقیقا با عبارت جستجو همخوانی داشته باشند regexp = عبارات باقاعده -pull_kind = جستجو واکشی‌ها... +pull_kind = جستجو واکشی‌ها… no_results = نتیجه درخوری یافت نشد. -runner_kind = جستجو دونده‌ها... +runner_kind = جستجو دونده‌ها… keyword_search_unavailable = جستجو کلیدواژه اکنون در درسترس نیست. لطفا با مدیر سایت در میان بگذارید. -repo_kind = جستجو مخازن... +repo_kind = جستجو مخازن… regexp_tooltip = اصطلاح جستجو شده را با عبارات باقاعده تفسیر کن -user_kind = جستجو کاربران... -org_kind = جستجو سازمان‌ها... -team_kind = جستجو گروه‌ها... -package_kind = جستجو بسته‌ها... -project_kind = جستجو پروژه‌ها... +user_kind = جستجو کاربران… +org_kind = جستجو سازمان‌ها… +team_kind = جستجو گروه‌ها… +package_kind = جستجو بسته‌ها… +project_kind = جستجو پروژه‌ها… code_search_unavailable = جستجوی کد اکنون در دسترس نیست. لطفا با مدیر سایت درمیان بگذارید. -code_kind = جستجو کدها... +code_kind = جستجو کدها… union = بهم پیوستگی union_tooltip = نتایجی را در بر بگیر که با هر یک از کلیدواژه‌های جدا شده از فضای‌خالی مطابقت دارد -branch_kind = جستجو شاخه‌ها... -commit_kind = جستجو سپرده‌ها... -issue_kind = جستجو مشکلات... +branch_kind = جستجو شاخه‌ها… +commit_kind = جستجو سپرده‌ها… +issue_kind = جستجو مشکلات… exact = مو به مو exact_tooltip = نتایجی را در بر بگیر که مو به مو با اصطلاح جستجو شده یکی باشد diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini index 27942ead99..263fab8774 100644 --- a/options/locale/locale_fi-FI.ini +++ b/options/locale/locale_fi-FI.ini @@ -667,6 +667,12 @@ username_change_not_local_user = Ei-paikallisten käyttäjien ei sallita vaihtaa admin_cannot_delete_self = Et voi poistaa itseäsi, kun olet ylläpitäjä. Poista ensin ylläpito-oikeudet itseltäsi. username_claiming_cooldown = Käyttäjänimeä ei voi ottaa käyttöön, koska siihen kohdistuva suojaamisjakso ei ole vielä päättynyt. Käyttäjänimen voi ottaa käyttöön %[1]s. email_domain_is_not_allowed = Käyttäjän sähköpostiosoitteen %s verkkotunnus on ristiriidassa EMAIL_DOMAIN_ALLOWLIST:in tai EMAIL_DOMAIN_BLOCKLIST:in kanssa. Varmista, että olen asettanut sähköpostiosoitteen oikein. +unsupported_login_type = Tällä kirjautumistavalla ei voi poistaa tunnusta. +invalid_ssh_principal = Väärä toimija: %s +unset_password = Kirjautuneen käyttäjän salasanaa ei ole asetettu. +invalid_group_team_map_error = ` kuvaus ei ole kelvollinen: %s` +2fa_auth_required = Etävierailu vaati kaksivaiheisen todennuksen. +visit_rate_limit = Etävierailujen pyyntörajoitukset. [user] @@ -1037,6 +1043,8 @@ passcode_invalid = Virheellinen pääsykoodi. Yritä uudelleen. then_enter_passcode = Kirjoita sovelluksessa näkyvä pääsykoodi: gpg_key_matched_identities_long = Tähän avaimeen upotetut identiteetit vastaavat tämän käyttäjän seuraavia aktivoituja sähköpostiosoitteita. Kommitit, jotka vastaavat näitä sähköpostiosoitteita, voidaan vahvistaa tällä avaimella. twofa_failed_get_secret = Salaisuuden saaminen epäonnistui. +uid = UID +hidden_comment_types.ref_tooltip = Kommentit missä tähän ongelmaan viitattiin toisesta ongelmasta/kommitista/… [repo] owner=Omistaja diff --git a/options/locale/locale_fil.ini b/options/locale/locale_fil.ini index 35378c5653..032b8b0435 100644 --- a/options/locale/locale_fil.ini +++ b/options/locale/locale_fil.ini @@ -699,7 +699,7 @@ security = Seguridad avatar = Avatar ssh_gpg_keys = Mga SSH / GPG key applications = Mga Aplikasyon -orgs = Ipamahala ang mga organisasyon +orgs = Mga organisasyon repos = Mga Repositoryo delete = Burahin ang account twofa = Authentikasyong two-factor (TOTP) @@ -707,7 +707,7 @@ account_link = Mga naka-link na account uid = UID webauthn = Authentikasyong two-factor (Mga security key) blocked_users = Mga hinarang na user -public_profile = Pampublikong Profile +public_profile = Pampublikong profile location_placeholder = Ibahagi ang iyong tinatayang lokasyon sa iba password_username_disabled = Ang mga di-lokal na gumagamit ay hindi pinapayagan na baguhin ang kanilang username. Mangyaring makipag-ugnayan sa iyong tagapangasiwa ng site para sa higit pang mga detalye. full_name = Buong pangalan diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 544e590e85..0c9df0afa0 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -4091,4 +4091,4 @@ issues.write = Écrire : Fermer des tickets et gérer les métadonnées t pulls.read = Lire : Lire et créer des demandes de tirage. [translation_meta] -test = Ceci est une chaîne de test. Elle n'est pas affichée dans Forgejo mais est utilisée à des fins de test. N'hésitez pas à entrer 'ok' pour gagner du temps (ou un fait amusant de votre choix) pour atteindre ce difficile 100 % de complétion. :-) +test = Ceci est une chaîne de test. Elle n'est pas affichée dans Forgejo même mais est utilisée à des fins de test. N'hésitez pas à entrer 'ok' pour gagner du temps (ou un fait amusant de votre choix) pour atteindre ce difficile 100 % de complétion. :-) diff --git a/options/locale/locale_ga-IE.ini b/options/locale/locale_ga-IE.ini index deadb72a8f..1d7414a0d8 100644 --- a/options/locale/locale_ga-IE.ini +++ b/options/locale/locale_ga-IE.ini @@ -132,20 +132,20 @@ fuzzy = Doiléir fuzzy_tooltip = Cuir san áireamh torthaí a mheaitseálann an téarma cuardaigh go dlúth freisin exact = Beacht exact_tooltip = Ní chuir san áireamh ach torthaí a mheaitseálann leis an téarma -repo_kind = Cuardaigh stórtha... -user_kind = Cuardaigh úsáideoirí... -org_kind = Cuardaigh eagraíochtaí... -team_kind = Cuardaigh foirne... -code_kind = Cód cuardaigh... +repo_kind = Cuardaigh stórtha… +user_kind = Cuardaigh úsáideoirí… +org_kind = Cuardaigh eagraíochtaí… +team_kind = Cuardaigh foirne… +code_kind = Cód cuardaigh… code_search_unavailable = Níl cuardach cód ar fáil faoi láthair. Déan teagmháil le riarthóir an láithreáin. -package_kind = Cuardaigh pacáistí... -project_kind = Cuardaigh tionscadail... -branch_kind = Cuardaigh brainsí... -commit_kind = Cuardaigh tiomáintí... -runner_kind = Cuardaigh reathaithe... +package_kind = Cuardaigh pacáistí… +project_kind = Cuardaigh tionscadail… +branch_kind = Cuardaigh brainsí… +commit_kind = Cuardaigh tiomáintí… +runner_kind = Cuardaigh reathaithe… no_results = Níl aon torthaí meaitseála le fáil. -issue_kind = Saincheisteanna cuardaigh... -pull_kind = Cuardaigh iarratais tarraingthe... +issue_kind = Saincheisteanna cuardaigh… +pull_kind = Cuardaigh iarratais tarraingthe… keyword_search_unavailable = Níl cuardach de réir eochairfhocal ar fáil faoi láthair. Déan teagmháil le riarthóir an láithreáin. [aria] @@ -507,12 +507,12 @@ avatar = Abhatár ssh_gpg_keys = Eochracha SSH/GPG applications = Iarratais repos = Stórais -delete = Scrios Cuntas +delete = Scrios cuntas twofa = Fíordheimhniú Dhá Fachtóir (TOTP) organization = Eagraíochtaí uid = UID webauthn = Fíordheimhniú Dhá-Fachtóir (Eochracha Slándála) -public_profile = Próifíl Phoiblí +public_profile = Próifíl phoiblí location_placeholder = Comhroinn do shuíomh thart le daoine eile full_name = Ainm Iomlán website = Láithreán Gréasáin diff --git a/options/locale/locale_gl.ini b/options/locale/locale_gl.ini index 3854b375af..c380e9b2ff 100644 --- a/options/locale/locale_gl.ini +++ b/options/locale/locale_gl.ini @@ -196,29 +196,29 @@ link_modal.paste_reminder = Consello: Coa URL no portapapeis, podes pegala direc [search] search = Buscar... type_tooltip = Tipo de procura -repo_kind = Buscar repositorios... -user_kind = Buscar usuarios... +repo_kind = Buscar repositorios… +user_kind = Buscar usuarios… regexp = RegExp regexp_tooltip = Interpretar o termo da procura como expresión regular -org_kind = Procurar organizacións... -team_kind = Procurar equipos... -code_kind = Procurar código... +org_kind = Procurar organizacións… +team_kind = Procurar equipos… +code_kind = Procurar código… code_search_unavailable = A procura de código non está dispoñible neste momento. Por favor contacte coa persoa responsable da administración da páxina. -package_kind = Buscar paquetes... +package_kind = Buscar paquetes… fuzzy = Difusa fuzzy_tooltip = Incluír resultados que tamén coincidan estreitamente co termo da procura union = Palabras clave union_tooltip = Incluír resultados correspondentes a calquera dal palabras clave separadas por espazos en branco exact = Exacta exact_tooltip = Incluír só resultados correspondentes ao termo exacto da procura -issue_kind = Procurar incidencias... -project_kind = Buscar proxectos... -branch_kind = Buscar ramas... +issue_kind = Procurar incidencias… +project_kind = Buscar proxectos… +branch_kind = Buscar ramas… no_results = Non se atoparon resultados coincidentes. keyword_search_unavailable = A busca por palabra clave non está dispoñible actualmente. Póñase en contacto co administrador do sitio. -commit_kind = Buscar achegas... -runner_kind = Buscar executores... -pull_kind = Buscar pulls... +commit_kind = Buscar achegas… +runner_kind = Buscar executores… +pull_kind = Buscar pulls… [startpage] platform = Multiplataforma diff --git a/options/locale/locale_he.ini b/options/locale/locale_he.ini index 19c4815277..8a5bc86163 100644 --- a/options/locale/locale_he.ini +++ b/options/locale/locale_he.ini @@ -150,24 +150,24 @@ union = מילות מפתח exact = מדויק exact_tooltip = תוצאות יתאימו במדויק לתוכן תיבת החיפוש regexp = רג'קס -user_kind = חיפוש אנשים... -code_kind = חיפוש קוד... -team_kind = חיפוש צוותים... +user_kind = חיפוש אנשים… +code_kind = חיפוש קוד… +team_kind = חיפוש צוותים… no_results = לא נמצאו תוצאות. union_tooltip = תוצאות יכללו לפחות מילת מפתח אחת; אפשר להפריד מילות מפתח עם רווחים -org_kind = חיפוש ארגונים... -package_kind = חיפוש חבילות... -project_kind = חיפוש פרוייקטים... -branch_kind = חיפוש ענפים... -commit_kind = חיפוש קומיטים... -issue_kind = חיפוש סוגיות... +org_kind = חיפוש ארגונים… +package_kind = חיפוש חבילות… +project_kind = חיפוש פרוייקטים… +branch_kind = חיפוש ענפים… +commit_kind = חיפוש קומיטים… +issue_kind = חיפוש סוגיות… fuzzy_tooltip = תוצאות יתאימו לתוכן תיבת החיפוש בקירוב; מומלץ כנגד שגיאות כתיב -repo_kind = חיפוש קרפיפים... +repo_kind = חיפוש קרפיפים… code_search_by_git_grep = תוצאות החיפוש יוצרו על ידי "git grep"; יכול להיות שיתקבלו תוצאות טובות יותר אם מנהלי המערכת יפעילו את המפתחן. -runner_kind = חיפוש מריצים... +runner_kind = חיפוש מריצים… keyword_search_unavailable = חיפוש מילות מפתח לא זמין. נא לדווח למנהלי המערכת. code_search_unavailable = חיפוש קוד לא זמין. נא לדווח למנהלי המערכת. -pull_kind = חיפוש בקשות מיזוג... +pull_kind = חיפוש בקשות מיזוג… [heatmap] number_of_contributions_in_the_last_12_months = % תרומות ב־12 החודשים האחרונים @@ -384,6 +384,8 @@ allow_password_change = הכרחת המשתמש לעדכן את סיסמת חש account_activated = חשבונך הופעל resent_limit_prompt = כבר ביקשת מייל אימות בשלושת הדקות האחרונות. נא לחכות ולנסות שוב. has_unconfirmed_mail = שלום %s, חשבונך משויך לכתובת אימייל לא מאומתת (%s). אם לא קיבלת הודעת אימות באימייל, או שאתה צריך חדשה, נא ללחוץ על הכפתור למטה. +confirmation_mail_sent_prompt = אימייל אימות חדש נשלח ל־%s. יש לבדוק את תיבת הדואר וללחוץ על הלינק תוך %s על מנת להשלים את רישום החשבון. אם כתובת המייל שגוייה, אפשר להיכנס לחשבון ולבקש דוא"ל אימות לכתובת אחרת. +reset_password_mail_sent_prompt = אימייל אימות חדש נשלח ל־%s. יש לבדוק את תיבת הדואר וללחוץ על הלינק תוך %s על מנת להשלים את רישום החשבון. [settings] key_content = תוכן @@ -661,6 +663,9 @@ issues.label_exclusive = בחירה בודדת issues.label_archive = לארכיון issues.label_archived_filter = הצגת תוויות מהארכיון issues.label_archive_tooltip = תוויות בארכיון לא מוצעות בחיפוש על־בסיס תווית כברירת מחדל. +issues.deleted_milestone = נמחק +issues.self_assign_at = `שייךה עצמית %s` +issues.deleted_project = נמחק [translation_meta] test = ואהבת לרעך כמוך diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini index b8c69cfe4a..841fb76bbe 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -330,7 +330,7 @@ code_no_results=Nincs találat a keresési kifejezésedre. code_last_indexed_at=Utoljára indexelve: %s [auth] -create_new_account=Regisztráció +create_new_account=Fiók regisztrálása register_helper_msg=Van már felhasználói fiókja? Jelentkezzen be! social_register_helper_msg=Van már felhasználói fiókja? Csatlakoztassa most! disable_register_prompt=Regisztráció le van tiltva. Kérjük, lépjen kapcsolatba az oldal adminisztrátorával. @@ -532,8 +532,8 @@ password_change_disabled=A nem helyi felhasználók nem frissíthetik jelszavuka emails=E-mail címek manage_emails=E-mail címek kezelése -manage_themes=Válassza ki az alapértelmezett témát -manage_openid=OpenID címek kezelése +manage_themes=Alapértelmezett téma +manage_openid=OpenID címek theme_desc=Ez lesz az alapértelmezett téma az oldalon. primary=Elsődleges activated=Aktivált @@ -1779,14 +1779,14 @@ directory = Könyvtár [search] search = Keresés... type_tooltip = Keresés típusa -code_kind = Kód keresése... +code_kind = Kód keresése… code_search_unavailable = A kódban való keresés jelenleg nem elérhető. Kérem vegye fel a kapcsolatot az oldal adminisztrátorával. -package_kind = Csomagok keresése... -project_kind = Projektek keresése... -user_kind = Felhasználók keresése... -repo_kind = Tárak keresése... -org_kind = Szervezetek keresése... -team_kind = Csapatok keresése... +package_kind = Csomagok keresése… +project_kind = Projektek keresése… +user_kind = Felhasználók keresése… +repo_kind = Tárak keresése… +org_kind = Szervezetek keresése… +team_kind = Csapatok keresése… exact = Pontos code_search_by_git_grep = A kódkeresés jelenleg a "git grep" parancsot használja. Lehet, hogy jobb találatok is lennének, ha a webhely adminisztrátora bekapcsolja a forráskód indexelését. milestone_kind = Mérföldkövek keresése... @@ -1794,8 +1794,8 @@ fuzzy_tooltip = A keresési kifejezéshez hasonló találatok mutatása fuzzy = Hasonlók union = Kulcsszavakra union_tooltip = A szóközzel elválasztott kulcsszavak bármelyikét tartalmazó találatok mutatása -branch_kind = Ágak keresése... +branch_kind = Ágak keresése… no_results = Nincsenek megfelelő találatok. -issue_kind = Hibajegyek keresése... +issue_kind = Hibajegyek keresése… exact_tooltip = Csak a keresési kifejezést pontosan tartalmazó találatok mutatása keyword_search_unavailable = A kulcsszó alapú keresés jelenleg nem elérhető. Kérlek értesítsd az oldal rendszergazdáját. diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini index 32d28837e1..c935bd9540 100644 --- a/options/locale/locale_id-ID.ini +++ b/options/locale/locale_id-ID.ini @@ -206,9 +206,9 @@ email_title = Pengaturan email smtp_from = Kirim Email Sebagai [home] -uname_holder=Nama Pengguna atau Alamat Surel +uname_holder=Nama pengguna atau alamat surel password_holder=Kata Sandi -switch_dashboard_context=Alihkan Dasbor Konteks +switch_dashboard_context=Alihkan dasbor konteks my_repos=Repositori show_more_repos=Tampilkan repositori lainnya… collaborative_repos=Repositori Kolaboratif @@ -236,7 +236,7 @@ org_no_results=Tidak ada organisasi yang cocok ditemukan. code_no_results=Tidak ada kode sumber yang cocok dengan istilah yang anda cari. [auth] -create_new_account=Daftar Akun +create_new_account=Daftar akun register_helper_msg=Sudah memiliki akun? Masuk sekarang! social_register_helper_msg=Sudah memiliki akun? Hubungkan sekarang! disable_register_prompt=Maaf, pendaftaran telah dinonaktifkan. Silakan hubungi administrator situs. @@ -269,11 +269,11 @@ twofa_passcode_incorrect=Kata sandi Anda salah. Jika Anda salah tempatkan perang twofa_scratch_token_incorrect=Kode coretan anda tidak tepat. login_userpass=Masuk tab_openid=OpenID -oauth_signup_tab=Daftar Akun Baru -oauth_signup_submit=Akun Lengkap -oauth_signin_tab=Tautkan ke Akun yang Tersedia -oauth_signin_title=Masuk untuk Izinkan Akun Tertaut -oauth_signin_submit=Taut Akun +oauth_signup_tab=Daftar akun baru +oauth_signup_submit=Akun lengkap +oauth_signin_tab=Tautkan ke akun yang tersedia +oauth_signin_title=Masuk untuk izinkan akun tertaut +oauth_signin_submit=Taut akun openid_connect_submit=Sambungkan openid_connect_title=Sambungkan ke akun yang sudah ada openid_connect_desc=OpenID URI yang dipilih tak dikenal. Asosiasikan dengan akun baru disini. @@ -398,14 +398,14 @@ avatar=Avatar ssh_gpg_keys=Kunci SSH / GPG social=Akun Sosial applications=Aplikasi -orgs=Kelola organisasi +orgs=Organisasi repos=Repositori -delete=Hapus Akun +delete=Hapus akun twofa=Otentikasi Dua-Faktor account_link=Akun Tertaut organization=Organisasi -public_profile=Profil Publik +public_profile=Profil publik password_username_disabled=Pengguna non-lokal tidak diizinkan untuk mengubah nama pengguna mereka. Silakan hubungi administrator sistem anda untuk lebih lanjut. full_name=Nama Lengkap website=Situs Web @@ -438,8 +438,8 @@ password_change_disabled=Pengguna non-lokal tidak dapat mengganti kata sandi mer emails=Alamat Surel manage_emails=Kelola Alamat Surel -manage_themes=Pilih tema default -manage_openid=Kelola alamat OpenID +manage_themes=Tema default +manage_openid=Alamat OpenID theme_desc=Ini akan menjadi tema asal Anda pada keseluruhan situs. primary=Utama activated=Diaktifkan @@ -1484,10 +1484,10 @@ search = Cari... type_tooltip = Tipe pencarian fuzzy_tooltip = Termasuk juga hasil yang mendekati kata pencarian exact_tooltip = Hanya menampilkan hasil yang cocok dengan istilah pencarian -repo_kind = Cari repo... -user_kind = Telusuri pengguna... -org_kind = Cari organisasi... -team_kind = Cari tim... -code_kind = Cari kode... +repo_kind = Cari repo… +user_kind = Telusuri pengguna… +org_kind = Cari organisasi… +team_kind = Cari tim… +code_kind = Cari kode… code_search_unavailable = Pencarian kode saat ini tidak tersedia. Silahkan hubungi administrator. -branch_kind = Cari cabang... +branch_kind = Cari cabang… diff --git a/options/locale/locale_is-IS.ini b/options/locale/locale_is-IS.ini index baf8286923..f3333dbea2 100644 --- a/options/locale/locale_is-IS.ini +++ b/options/locale/locale_is-IS.ini @@ -223,7 +223,7 @@ default_keep_email_private.description=Fela sjálfgefið netföng nýrra notenda no_reply_address_helper=Lén fyrir notendur með falið netfang. Til dæmis notandanafnið „joe“ verður skráð í Git sem „joe@noreply.example.org“ ef falið tölvupóstlén er stillt á „noreply.example.org“. [home] -uname_holder=Notandanafn eða Netfang +uname_holder=Notandanafn eða netfang password_holder=Lykilorð my_repos=Hugbúnaðarsöfn show_more_repos=Sýna fleiri hugbúnaðarsöfn… @@ -255,7 +255,7 @@ org_no_results=Engar samsvarandi stofnanir fundust. code_no_results=Enginn samsvarandi frumkóði fannst eftur þínum leitarorðum. [auth] -create_new_account=Skrá Notanda +create_new_account=Skrá notanda register_helper_msg=Ertu nú þegar með notanda? Skráðu þig inn núna! social_register_helper_msg=Ertu nú þegar með reikning? Tengdu hann núna! manual_activation_only=Hafðu samband við stjórnanda vefsvæðisins til að ljúka virkjun. @@ -276,13 +276,13 @@ verify=Staðfesta scratch_code=Skrapkóði use_scratch_code=Nota skrapkóða twofa_scratch_token_incorrect=Skrapkóði þinn er rangur. -login_userpass=Skrá Inn +login_userpass=Skrá inn tab_openid=OpenID -oauth_signup_tab=Skrá Nýjan Notanda -oauth_signup_title=Klára Nýjum Notanda -oauth_signup_submit=Klára Notanda -oauth_signin_tab=Tengja Núverandi Reikning -oauth_signin_submit=Tengja Notanda +oauth_signup_tab=Skrá nýjan notanda +oauth_signup_title=Klára nýjum notanda +oauth_signup_submit=Klára notanda +oauth_signin_tab=Tengja núverandi reikning +oauth_signin_submit=Tengja notanda openid_connect_submit=Tengjast openid_register_title=Skrá nýjan notanda disable_forgot_password_mail=Endurheimting reiknings er óvirk vegna þess að enginn tölvupóstur er uppsettur. Vinsamlegast hafðu samband við síðustjórann þinn. @@ -434,15 +434,15 @@ avatar=Notandamynd ssh_gpg_keys=SSH og GPG Lyklar social=Félagsreikningar applications=Forrit -orgs=Stjórna Stofnunum +orgs=Stofnanir repos=Hugbúnaðarsöfn -delete=Eyða Reikningi +delete=Eyða reikningi twofa=Tvíþætt Auðkenning account_link=Tengdir Reikningar organization=Stofnanir webauthn=Öryggislyklar -public_profile=Opinber Notandasíða +public_profile=Opinber notandasíða password_username_disabled=Notendum utan staðarins er ekki heimilt að breyta notendanafni sínu. Vinsamlegast hafðu samband við síðustjórann þinn til að fá frekari upplýsingar. full_name=Fullt Nafn website=Vefsíða diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index 94ee88c4b6..d9acc4c430 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -423,7 +423,7 @@ allow_password_change=Richiede all'utente di cambiare la password (scelta consig reset_password_mail_sent_prompt=Un'e-mail di conferma è stata inviata a %s. Per completare il processo di recupero dell'account, controlla la tua posta in arrivo e clicca sul link entro i prossimi %s secondi. active_your_account=Attiva il tuo account account_activated=L'account è stato attivato -prohibit_login=L'accesso è proibito +prohibit_login=L'account è sospeso 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 @@ -742,7 +742,7 @@ avatar=Avatar ssh_gpg_keys=Chiavi SSH / GPG social=Account Sociali applications=Applicazioni -orgs=Gestisci le organizzazioni +orgs=Organizzazioni repos=Repositori delete=Elimina account twofa=Verifica in due passaggi @@ -803,8 +803,8 @@ password_change_disabled=Gli utenti non locali non possono cambiare la loro pass emails=Indirizzi email manage_emails=Gestisci indirizzi email -manage_themes=Seleziona il tema predefinito -manage_openid=Gestisci gli indirizzi OpenID +manage_themes=Tema predefinito +manage_openid=Indirizzi OpenID theme_desc=Questo sarà il tuo tema di predefinito in tutto il sito. primary=Primario activated=Attivato @@ -4014,25 +4014,25 @@ type_tooltip = Tipo ricerca search = Cerca… fuzzy = Approssimativa match = Precisa -org_kind = Cerca organizzazioni... -package_kind = Ricerca pacchetti... +org_kind = Cerca organizzazioni… +package_kind = Ricerca pacchetti… code_search_unavailable = La ricerca del codice non è attualmente disponibile. Contatta l'amministratorə del sito. -code_kind = Cerca nel codice... -team_kind = Cerca team... +code_kind = Cerca nel codice… +team_kind = Cerca team… code_search_by_git_grep = I risultati della ricerca del codice sono forniti da "git grep". Potrebbero esserci risultati migliori se l'amministratore del sito avesse abilitato l'indicizzatore del codice. -project_kind = Ricerca progetti... -commit_kind = Ricerca commit... -branch_kind = Ricerca rami... +project_kind = Ricerca progetti… +commit_kind = Ricerca commit… +branch_kind = Ricerca rami… no_results = Non è stato trovato alcun risultato. keyword_search_unavailable = La ricerca per parole chiave non è attualmente disponibile. Contatta l'amministratore del sito. -runner_kind = Ricerca esecutori... +runner_kind = Ricerca esecutori… match_tooltip = Includi solo risultati che corrispondono precisamente al termine di ricerca fuzzy_tooltip = Includi anche risultati che corrispondono approssimativamente al termine di ricerca -user_kind = Cerca utenti... -repo_kind = Cerca repo... +user_kind = Cerca utenti… +repo_kind = Cerca repo… exact_tooltip = Includi solo i risultati che corrispondono esattamente al termine di ricerca -issue_kind = Cerca segnalazioni... -pull_kind = Cerca richieste... +issue_kind = Cerca segnalazioni… +pull_kind = Cerca richieste… exact = Esatto milestone_kind = Ricerca tappe... regexp_tooltip = Interpreta i termini di ricerca come un'espressione regolare diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index 6e30f76b9a..d7c657b149 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -250,7 +250,7 @@ err_empty_db_path=SQLite3のデータベースパスを空にすることはで no_admin_and_disable_registration=管理者アカウントを作成せずに、セルフ登録を無効にすることはできません。 err_empty_admin_password=管理者パスワードは空にできません。 err_empty_admin_email=管理者のメールアドレスは空にできません。 -err_admin_name_is_reserved=管理者のユーザー名が不正です。予約済みのユーザー名です。 +err_admin_name_is_reserved=管理者のユーザー名が不正です。予約済みのユーザー名です err_admin_name_pattern_not_allowed=管理者のユーザー名が不正です。 予約済みのパターンにマッチしています err_admin_name_is_invalid=管理者のユーザー名が不正です @@ -1047,6 +1047,7 @@ language.title = 既定の言語 keep_activity_private.description = 公開アクティビティは、あなたとインスタンス管理者にのみ表示されます。 language.description = この言語はアカウントに保存され、ログイン後にデフォルトとして使用されます。 language.localization_project = Forgejo をあなたの言語に翻訳するのを手伝ってください。詳細はこちら。 +quota = クオータ [repo] new_repo_helper=リポジトリには、プロジェクトのすべてのファイルとリビジョン履歴が入ります。 すでにほかの場所でホストしていますか? リポジトリを移行 もどうぞ。 @@ -3903,20 +3904,20 @@ submodule=サブモジュール [search] search = 検索... type_tooltip = 検索タイプ -org_kind = 組織の検索... -code_kind = コードの検索... +org_kind = 組織を検索… +code_kind = コードを検索… fuzzy = あいまい -repo_kind = リポジトリの検索... +repo_kind = リポジトリを検索… code_search_unavailable = コード検索は現在利用できません。サイト管理者にお問い合わせください。 -branch_kind = ブランチの検索... -commit_kind = コミットの検索... -user_kind = ユーザーの検索... -team_kind = チームの検索... +branch_kind = ブランチを検索… +commit_kind = コミットを検索… +user_kind = ユーザーを検索… +team_kind = チームを検索… code_search_by_git_grep = 現在のコード検索結果は「git grep」によって提供されます。サイト管理者がコード インデクサーを有効にすると、より良い結果が得られる可能性があります。 -package_kind = パッケージの検索... -project_kind = プロジェクトの検索... +package_kind = パッケージを検索… +project_kind = プロジェクトを検索… keyword_search_unavailable = キーワードによる検索は現在ご利用いただけません。サイト管理者にお問い合わせください。 -runner_kind = ランナーの検索... +runner_kind = ランナーを検索… no_results = 一致する結果が見つかりませんでした。 fuzzy_tooltip = 入力された語句に近いものも結果に含める match = 一致 @@ -3924,8 +3925,8 @@ match_tooltip = 検索語句に厳密に一致するもののみ結果に含め milestone_kind = マイルストーンを検索... union_tooltip = 空白で区切られたキーワードのいずれかに一致する結果を含める exact_tooltip = 検索語句と完全に一致する結果のみを含める -issue_kind = イシューを検索... -pull_kind = プルを検索... +issue_kind = イシューを検索… +pull_kind = プルを検索… exact = 完全一致 regexp_tooltip = 検索語句を正規表現として解釈する regexp = 正規表現 diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini index be0400bea4..8e8d9b1d6b 100644 --- a/options/locale/locale_ko-KR.ini +++ b/options/locale/locale_ko-KR.ini @@ -588,8 +588,8 @@ password_change_disabled=로컬 유저가 아닌 경우 Forgejo 웹 인터페이 emails=이메일 주소 manage_emails=이메일 주소 관리 -manage_themes=기본 테마 선택 -manage_openid=OpenID 주소 관리 +manage_themes=기본 테마 +manage_openid=OpenID 주소 theme_desc=이 테마가 사이트 전체 기본 테마가 됩니다. primary=대표 activated=활성화됨 @@ -1900,9 +1900,9 @@ runs.commit=커밋 [search] code_search_by_git_grep = 현재 코드 검색 결과는 "git grep"에 의해 제공됩니다.관리자가 코드 인덱서를 활성화하면 더 나은 결과가 제공될 수 있습니다. -branch_kind = 브랜치 검색... +branch_kind = 브랜치 검색… keyword_search_unavailable = 지금은 키워드로 검색이 지원되지 않습니다. 사이트 관리자에게 문의하십시오. -commit_kind = 커밋 검색... +commit_kind = 커밋 검색… no_results = 일치하는 결과를 찾을 수 없습니다. search = 검색… type_tooltip = 검색 타입 @@ -1910,11 +1910,11 @@ fuzzy_tooltip = 검색어와 밀접하게 일치하는 결과도 포함 repo_kind = 저장소 검색… user_kind = 사용자 검색… org_kind = 조직 검색… -team_kind = 팀 검색... -code_kind = 코드 검색... +team_kind = 팀 검색… +code_kind = 코드 검색… code_search_unavailable = 코드 검색은 현재 허용되지 않았습니다. 사이트 관리자와 연락하세요. -package_kind = 패키지 검색... -project_kind = 프로젝트 검색... +package_kind = 패키지 검색… +project_kind = 프로젝트 검색… exact_tooltip = 검색어와 정확하게 일치하는 결과만 포함 issue_kind = 이슈 검색… pull_kind = 풀 검색… diff --git a/options/locale/locale_lt.ini b/options/locale/locale_lt.ini index 868e5bff6e..9d1c938379 100644 --- a/options/locale/locale_lt.ini +++ b/options/locale/locale_lt.ini @@ -149,24 +149,24 @@ fuzzy = Tikslintinas union_tooltip = Įtraukti rezultatus, atitinkančius bet kurį iš matomą tarpą atskirtų raktažodžių exact = Tiksliai exact_tooltip = Įtraukti tik tuos rezultatus, kurie atitinka tikslią paieškos frazę -user_kind = Ieškoti naudotojų... -team_kind = Ieškoti komandų... -code_kind = Ieškoti kodo... +user_kind = Ieškoti naudotojų… +team_kind = Ieškoti komandų… +code_kind = Ieškoti kodo… fuzzy_tooltip = Įtraukti rezultatus, kurie taip pat labai atitinka paieškos terminą -repo_kind = Ieškoti saugyklų... +repo_kind = Ieškoti saugyklų… code_search_unavailable = Kodų paieška šiuo metu nepasiekiama. Kreipkis į svetainės administratorių. -org_kind = Ieškoti organizacijų... +org_kind = Ieškoti organizacijų… union = Bendrinis code_search_by_git_grep = Dabartiniai kodo paieškos rezultatai pateikiami atliekant „git grep“. Rezultatai gali būti geresni, jei svetainės administratorius įjungs kodo indeksuotoją. -package_kind = Ieškoti paketų... -project_kind = Ieškoti projektų... -commit_kind = Ieškoti įsipareigojimų... -runner_kind = Ieškoti vykdyklių... +package_kind = Ieškoti paketų… +project_kind = Ieškoti projektų… +commit_kind = Ieškoti įsipareigojimų… +runner_kind = Ieškoti vykdyklių… no_results = Nerasta atitinkamų rezultatų. -issue_kind = Ieškoti problemų... -branch_kind = Ieškoti šakų... +issue_kind = Ieškoti problemų… +branch_kind = Ieškoti šakų… milestone_kind = Ieškoti gairių... -pull_kind = Ieškoti sujungimų... +pull_kind = Ieškoti sujungimų… keyword_search_unavailable = Ieškoti pagal raktažodį šiuo metu nepasiekiamas. Susisiekite su svetainės administratoriumi. regexp = Reguliarusis reiškinys regexp_tooltip = Interpretuoti paieškos terminą kaip reguliariąją reiškinį diff --git a/options/locale/locale_ml-IN.ini b/options/locale/locale_ml-IN.ini index fcc9888d8e..c4c266ad86 100644 --- a/options/locale/locale_ml-IN.ini +++ b/options/locale/locale_ml-IN.ini @@ -356,7 +356,7 @@ avatar=അവതാര്‍ ssh_gpg_keys=SSH / GPG കീകള്‍ social=സോഷ്യൽ അക്കൗണ്ടുകൾ applications=അപ്ലിക്കേഷനുകൾ -orgs=സംഘടനകളെ നിയന്ത്രിക്കുക +orgs=സംഘടനകൾ repos=കലവറകള്‍ delete=അക്കൗണ്ട് ഇല്ലാതാക്കുക twofa=ഇരട്ട ഘടക പ്രാമാണീകരണം @@ -400,8 +400,8 @@ password_change_disabled=പ്രാദേശിക ഇതര ഉപയോക emails=ഇ-മെയില്‍ വിലാസങ്ങള്‍ manage_emails=ഇമെയിൽ വിലാസങ്ങൾ നിയന്ത്രിക്കുക -manage_themes=സ്ഥിരസ്ഥിതി പ്രമേയം തിരഞ്ഞെടുക്കുക -manage_openid=ഓപ്പൺഐഡി വിലാസങ്ങൾ നിയന്ത്രിക്കുക +manage_themes=ഡിഫോൾട്ട് തീം +manage_openid=OpenID വിലാസങ്ങൾ email_desc=അറിയിപ്പുകൾക്കും മറ്റ് പ്രവർത്തനങ്ങൾക്കുമായി നിങ്ങളുടെ പ്രാഥമിക ഇമെയിൽ വിലാസം ഉപയോഗിക്കും. theme_desc=സൈറ്റിലുടനീളം ഇത് നിങ്ങളുടെ സ്ഥിരസ്ഥിതി പ്രമേയം ആയിരിക്കും. primary=പ്രാഥമികം diff --git a/options/locale/locale_nds.ini b/options/locale/locale_nds.ini index 57afa69f78..791f1b84d3 100644 --- a/options/locale/locale_nds.ini +++ b/options/locale/locale_nds.ini @@ -568,7 +568,7 @@ organization = Vereenigungen uid = UID webauthn = Twee-Faktooren-Anmellen (Sekerheids-Slötels) blocked_users = Blockeert Brukers -public_profile = Publikes Profil +public_profile = Publikes profil location_placeholder = Deel waar du umslags büst mit Annerns pronouns = Pronomens pronouns_custom = Eegene diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index f1a92a79f3..cf491d2f43 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -1043,8 +1043,8 @@ language.title = Domyślny język language.localization_project = Pomóż nam przetłumaczyć Forgejo na twój język! Dowiedz się więcej. update_hints = Zaktualizuj wskazówki update_hints_success = Wskazówki zostały zaktualizowane. -change_username_redirect_prompt.with_cooldown.one = Stara nazwa użytkownika będzie dostępna dla każdego po okresie ochronnym wynoszącym %[1]d dzień, nadal możesz uzyskać z powrotem starą nazwę użytkownika podczas okresu ochronnego. -change_username_redirect_prompt.with_cooldown.few = Stara nazwa użytkownika będzie dostępna dla każdego po okresie ochronnym wynoszącym %[1]d dni, nadal możesz uzyskać z powrotem starą nazwę użytkownika podczas okresu ochronnego. +change_username_redirect_prompt.with_cooldown.one = Stara nazwa użytkownika będzie dostępna dla każdego po okresie ochronnym wynoszącym %[1]d dzień. Nadal możesz uzyskać z powrotem starą nazwę użytkownika podczas okresu ochronnego. +change_username_redirect_prompt.with_cooldown.few = Stara nazwa użytkownika będzie dostępna dla każdego po okresie ochronnym wynoszącym %[1]d dni. Nadal możesz uzyskać z powrotem starą nazwę użytkownika podczas okresu ochronnego. language.description = Ten język zostanie zapisany na twoim koncie i będzie używany jako domyślny po zalogowaniu. hidden_comment_types_description = Rodzaje komentarzy zaznaczone tutaj nie będą wyświetlały się na stronach zgłoszeń. Zaznaczenie "Etykieta" na przykład usunie wszystkie komentarze " dodał/usunął ". principal_desc = Te podmioty certyfikatu SSH będą powiązane z twoim kontem i pozwolą na pełen dostęp do twoich repozytoriów. @@ -3951,29 +3951,29 @@ normal_file = Zwykły plik search = Wyszukaj... type_tooltip = Typ wyszukiwania fuzzy = Przybliżone -package_kind = Wyszukaj pakiety... +package_kind = Wyszukaj pakiety… fuzzy_tooltip = Uwzględnij wyniki, które są bliskie wyszukiwanemu hasłu match = Dopasuj match_tooltip = Uwzględniaj tylko wyniki pasujące do wyszukiwanego hasła -repo_kind = Wyszukaj repozytoria... -user_kind = Wyszukaj użytkownilków... +repo_kind = Wyszukaj repozytoria… +user_kind = Wyszukaj użytkownilków… code_search_unavailable = Wyszukiwanie kodu jest obecnie niedostępne. Skontakuj sie z administratorem strony. no_results = Nie znaleziono pasujących wyników. -org_kind = Wyszukaj organizacje... -team_kind = Wyszukaj zespoły... -code_kind = Wyszukaj kod... +org_kind = Wyszukaj organizacje… +team_kind = Wyszukaj zespoły… +code_kind = Wyszukaj kod… code_search_by_git_grep = Obecne wyniki wyszukiwania kodu są dostarczane przez "git grep". Wyniki mogą być lepsze, jeśli administrator witryny włączy indeksator kodu. -project_kind = Wyszukaj projekty... -branch_kind = Wyszukaj gałęzie... -commit_kind = Wyszukaj commity... -runner_kind = Wyszukaj runnery... +project_kind = Wyszukaj projekty… +branch_kind = Wyszukaj gałęzie… +commit_kind = Wyszukaj commity… +runner_kind = Wyszukaj runnery… keyword_search_unavailable = Wyszukiwanie według słów kluczowych jest obecnie niedostępne. Skontaktuj się z administratorem strony. milestone_kind = Wyszukaj kamienie milowe... union_tooltip = Uwzględnia wyniki pasujące do dowolnego słowa kluczowego rozdzielonego białymi znakami exact = Dokładne exact_tooltip = Uwzględniaj tylko wyniki pasujące do wyszukiwanego hasła -issue_kind = Wyszukaj zgłoszenia... -pull_kind = Wyszukaj pull requesty... +issue_kind = Wyszukaj zgłoszenia… +pull_kind = Wyszukaj pull requesty… union = Unia regexp = RegExp regexp_tooltip = Interpretuj wyszukiwane hasło jako wyrażenie regularne diff --git a/options/locale/locale_ro.ini b/options/locale/locale_ro.ini index 305c34d013..06fdb45785 100644 --- a/options/locale/locale_ro.ini +++ b/options/locale/locale_ro.ini @@ -223,12 +223,12 @@ invalid_db_setting = Setările pentru bază de date sunt invalide: %v no_reply_address = Domeniu pentru adrese de email ascunse [search] -user_kind = Caută utilizatori... -team_kind = Caută echipe... -code_kind = Caută cod... -project_kind = Caută proiecte... -package_kind = Caută pachete... -org_kind = Caută organizații... +user_kind = Caută utilizatori… +team_kind = Caută echipe… +code_kind = Caută cod… +project_kind = Caută proiecte… +package_kind = Caută pachete… +org_kind = Caută organizații… code_search_unavailable = Căutarea de cod nu este disponibilă momentan. Te rog contactează administratorul site-ului. keyword_search_unavailable = Căutarea după cuvânt cheie nu este disponibilă momentan. Te rog contactează administratorul site-ului. no_results = Nu a fost găsit niciun rezultat corespunzător. diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 33418a0621..c7cccc012c 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -1063,7 +1063,7 @@ language.description = Выбранный язык будет сохранён language.localization_project = Помогите с переводом Forgejo на свой язык! Подробнее. user_block_yourself = Нельзя заблокировать себя. pronouns_custom_label = Другие местоимения -change_username_redirect_prompt.with_cooldown.one = Прежнее имя будет доступно для использования другим пользователям после истечения защиты в %[1]d день. Вы сможете вернуть его себе во время срока защиты. +change_username_redirect_prompt.with_cooldown.one = Прежнее имя будет доступно для использования другим пользователям после истечения простоя в %[1]d день. Вы сможете вернуть его себе во время срока простоя. change_username_redirect_prompt.with_cooldown.few = Прежнее имя будет доступно для использования другим пользователям после истечения защиты в %[1]d дней. Вы сможете вернуть его себе во время срока защиты. keep_pronouns_private = Показывать местоимения только зарегистрированным пользователям keep_pronouns_private.description = Местоимения будут скрыты от пользователей, не имеющих учётных записей на сервере. @@ -1641,9 +1641,9 @@ issues.closed_at=`задача была закрыта %s` issues.reopened_at=`задача была открыта снова %s` issues.commit_ref_at=`упоминание этой задачи в коммите %s` issues.ref_issue_from=`упоминание этой задачи %[3]s %[1]s` -issues.ref_pull_from=`упоминание этого запроса слияния %[3]s %[1]s` -issues.ref_closing_from=`упоминание из запроса на слияние %[3]s, который закроет эту задачу %[1]s` -issues.ref_reopening_from=`упоминание из запроса на слияние %[3]s, который повторно откроет эту задачу %[1]s` +issues.ref_pull_from=`упомянул этот запрос на слияние %[3]s %[1]s` +issues.ref_closing_from=`упомянул эту задачу в запросе на слияние %[3]s, который закроет её %[1]s` +issues.ref_reopening_from=`упомянул эту задачу в запросе на слияние %[3]s, который переоткроет эту задачу %[1]s` issues.ref_closed_from=`закрыл этот запрос %[4]s %[2]s` issues.ref_reopened_from=`задача была открыта снова %[4]s %[2]s` issues.ref_from=`из %[1]s` diff --git a/options/locale/locale_si-LK.ini b/options/locale/locale_si-LK.ini index cd8c9bf7d4..d6f4525c4d 100644 --- a/options/locale/locale_si-LK.ini +++ b/options/locale/locale_si-LK.ini @@ -482,7 +482,7 @@ avatar=අවතාර් ssh_gpg_keys=SSH/ජීපීජී යතුරු social=සමාජ ගිණුම් applications=යෙදුම් -orgs=සංවිධාන කළමනාකරණය +orgs=සංවිධාන repos=කෝෂ්ඨ delete=ගිණුම මකන්න twofa=ද්වි-සාධක සත්යාපනය @@ -527,8 +527,8 @@ password_change_disabled=දේශීය නොවන පරිශීලකය emails=වි-තැපැල් ලිපින manage_emails=වි-තැපැල් ලිපින කළමනාකරණය -manage_themes=පෙරනිමි තේමාව තෝරන්න -manage_openid=OpenID ලිපිනයන් කළමනාකරණය කරන්න +manage_themes=පෙරනිමි තේමාව +manage_openid=OpenID ලිපින theme_desc=මෙම වෙබ් අඩවිය හරහා ඔබගේ පෙරනිමි තේමාව වනු ඇත. primary=ප්රාථමික activated=සක්රිය diff --git a/options/locale/locale_sk-SK.ini b/options/locale/locale_sk-SK.ini index 0c44df326a..aa2f863b14 100644 --- a/options/locale/locale_sk-SK.ini +++ b/options/locale/locale_sk-SK.ini @@ -597,7 +597,7 @@ avatar=Avatar ssh_gpg_keys=SSH / GPG kľúče social=Sociálne účty applications=Aplikácie -orgs=Spravovať organizácie +orgs=Organizácie repos=Repozitáre delete=Zmazať účet twofa=Dvojfaktorové overenie @@ -656,8 +656,8 @@ password_change_disabled=Externe overovaní používatelia nemôžu aktualizova emails=E-mailové adresy manage_emails=Správa e-mailových adries -manage_themes=Nastavenie predvolenej témy -manage_openid=Správa OpenID adries +manage_themes=Predvolená téma +manage_openid=Adresy OpenID theme_desc=Toto bude vaša predvolená téma vzhľadu naprieč stránkou. primary=Primárny activated=Aktivovaný diff --git a/options/locale/locale_sl.ini b/options/locale/locale_sl.ini index 608e05afa4..07ccaed259 100644 --- a/options/locale/locale_sl.ini +++ b/options/locale/locale_sl.ini @@ -133,7 +133,7 @@ reinstall_confirm_check_3 = Potrjujete, da ste popolnoma prepričani, da se ta p require_db_desc = Forgejo zahteva MySQL, PostgreSQL, SQLite3 ali TiDB (protokol MySQL). password_algorithm_helper = Nastavite algoritem za stiskanje gesla. Algoritmi imajo različne zahteve in moč. Algoritem argon2 je precej varen, vendar porabi veliko pomnilnika in je lahko neprimeren za majhne sisteme. reinstall_confirm_message = Ponovna namestitev z obstoječo zbirko podatkov Forgejo lahko povzroči več težav. V večini primerov morate za zagon programa Forgejo uporabiti obstoječi "app.ini". Če veste, kaj počnete, potrdite naslednje: -err_admin_name_is_reserved = Administrator Uporabniško ime je neveljavno, uporabniško ime je rezervirano +err_admin_name_is_reserved = Administrator uporabniško ime je neveljavno, uporabniško ime je rezervirano disable_gravatar.description = Onemogočite vire avatarjev Gravatar in avatarje tretjih oseb. Uporabi se privzeti avatar, razen če uporabnik lokalno naloži avatar. install = Namestitev title = Začetna nastavitev @@ -367,7 +367,7 @@ delete = Brisanje računa uploaded_avatar_is_too_big = Velikost naložene datoteke (%d KiB) presega največjo velikost (%d KiB). webauthn = Dvofaktorsko preverjanje pristnosti (varnostni ključi) change_username_redirect_prompt = Staro uporabniško ime bo preusmerjeno, dokler ga nekdo ne prevzame. -orgs = Upravljanje organizacij +orgs = Organizacije public_profile = Javni profil gpg_key_verified_long = Ključ je bil preverjen z žetonom in ga je mogoče uporabiti za preverjanje zavez, ki ustrezajo vsem aktiviranim e-poštnim naslovom tega uporabnika, poleg vseh ujemajočih se identitet za ta ključ. @@ -495,14 +495,14 @@ tab_openid = Odprta identiteta [home] show_both_archived_unarchived = Prikazovanje arhiviranih in nearhiviranih -switch_dashboard_context = Kontekst stikala Nadzorna plošča +switch_dashboard_context = Kontekst stikala nadzorna plošča search_repos = Poiščite skladišče… filter_by_team_repositories = Filtriranje po skupinskih skladiščih show_archived = Arhivirano collaborative_repos = Sodelovalni repozitoriji my_mirrors = Moja ogledala show_only_public = Prikazovanje samo javnih -uname_holder = Uporabniško ime ali E-poštovni naslov +uname_holder = Uporabniško ime ali e-poštni naslov password_holder = Geslo my_repos = Repozitoriji show_more_repos = Prikaži več skladišč… diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index b548e0fbf3..5b06c5e3b5 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -2326,15 +2326,15 @@ repo_kind = Sök repon… user_kind = Sök användare… code_kind = Sök kod… package_kind = Sök paket… -runner_kind = Sök exekutorer... +runner_kind = Sök exekutorer… branch_kind = Sök grenar… -commit_kind = Sök commiter... +commit_kind = Sök commiter… project_kind = Sök projekt… search = Sök… type_tooltip = Söktyp team_kind = Sök team… org_kind = Sök organisationer… -issue_kind = Sök ärenden... +issue_kind = Sök ärenden… regexp_tooltip = Tolka söktermen som ett reguljärt uttryck code_search_unavailable = Kodsökning är för närvarande inte tillgänglig. Vänligen kontakta webbplatsadministratören. fuzzy_tooltip = Inkludera resultat som är närliggande till söktermen diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini index 462187e120..aa41d7dc63 100644 --- a/options/locale/locale_tr-TR.ini +++ b/options/locale/locale_tr-TR.ini @@ -163,8 +163,8 @@ new_repo.link = Yeni depo new_org.link = Yeni organizasyon error413 = Kotanızı doldurdunuz. toggle_menu = Menüyü aç-kapa -new_migrate.title = Yeni geçiş -new_migrate.link = Yeni geçiş +new_migrate.title = Yeni göç +new_migrate.link = Yeni göç copy_path = Dizini kopyala confirm_delete_artifact = "%s" adlı öğeyi silmek istediğinizden emin misiniz? @@ -179,8 +179,9 @@ number_of_contributions_in_the_last_12_months=son 12 ayda %s katkı contributions_zero=Katkı yapılmamış less=Daha az more=Daha Fazla -contributions_one = katılım -contributions_few = katılımlar +contributions_one = katkı +contributions_few = katkı +contributions_format = {day} {month} {year} tarihinde {contributions} katkı [editor] buttons.heading.tooltip=Başlık ekle @@ -203,6 +204,12 @@ table_modal.placeholder.header = Başlık table_modal.placeholder.content = İçerik table_modal.label.rows = Satırlar table_modal.label.columns = Sütunlar +link_modal.header = Bağlantı ekle +link_modal.url = Url +link_modal.description = Açıklama +link_modal.paste_reminder = İpucu: Panonuzdaki bir URL'yi doğrudan düzenleyiciye yapıştırarak bir bağlantı oluşturabilirsiniz. +buttons.unindent.tooltip = Bir seviye girinti azalt +buttons.indent.tooltip = Bir seviye girinti artır [filter] string.asc=A - Z @@ -226,6 +233,7 @@ lightweight=Hafif lightweight_desc=Forgejo'nın minimal gereksinimleri çok düşüktür ve ucuz bir Raspberry Pi üzerinde çalışabilmektedir. Makine enerjinizden tasarruf edin! license=Açık Kaynak license_desc=Gidin ve Forgejo'yı edinin! Bu projeyi daha da iyi yapmak için katkıda bulunarak bize katılın. Katkıda bulunmaktan çekinmeyin! +platform_desc = Forgejo'nun Linux ve FreeBSD gibi özgür işletim sistemlerinde ve farklı CPU mimarilerinde çalıştığı doğrulandı. Sevdiğinizi seçin! [install] install=Kurulum @@ -252,9 +260,9 @@ err_empty_db_path=SQLite3 veritabanı dosya yolu boş olamaz. no_admin_and_disable_registration=Bir yönetici hesabı oluşturmadan kullanıcı kaydını kapatamazsınız. err_empty_admin_password=Yönetici parolası boş olamaz. err_empty_admin_email=Yönetici e-postası boş olamaz. -err_admin_name_is_reserved=Yönetici Kullanıcı Adı geçersiz, bu kullanıcı adı rezerv edilen bir kelimedir +err_admin_name_is_reserved=Yönetici kullanıcı adı geçersiz, bu kullanıcı adı rezerv edilen bir kelimedir err_admin_name_pattern_not_allowed=Yönetici kullanıcı adı geçersiz, kullanıcı adı ayrılmış bir desenle eşleşiyor -err_admin_name_is_invalid=Yönetici Kullanıcı Adı geçersiz +err_admin_name_is_invalid=Yönetici kullanıcı adı geçersiz general_title=Genel ayarlar app_name=Site Başlığı @@ -344,6 +352,7 @@ enable_update_checker_helper_forgejo = release.forgejo.org adresindeki TXT DNS k allow_dots_in_usernames = Kullanıcı isimlerinde noktaya izin ver. Var olan kullanıcıları etkilemez. smtp_from_invalid = `"E-posta Olarak Gönder" adresi geçersiz` +config_location_hint = Bu yapılandırma seçenekleri şuraya kaydedilecek: [home] uname_holder=Kullanıcı adı veya e-posta adresi @@ -477,6 +486,7 @@ hint_register = Hesaba ihtiyacın var mı? Hemen kaydol. sign_in_openid = OpenID ile giriş yap hint_login = Mevcut hesabın var mı? Hemen giriş yap! use_onetime_code = Tek kullanımlık kod kullan +change_unconfirmed_email = Kayıt sırasında yanlış e-posta adresi verdiyseniz, aşağıdan değiştirebilirsiniz; yeni adresinize bir onay mesajı gönderilecektir. [mail] view_it_on=%s üzerinde görüntüle @@ -722,16 +732,16 @@ avatar=Avatar ssh_gpg_keys=SSH / GPG Anahtarları social=Sosyal Medya Hesapları applications=Uygulamalar -orgs=Organizasyonları Yönet +orgs=Kuruluşlar repos=Depolar -delete=Hesabı Sil -twofa=İki Aşamalı Doğrulama +delete=Hesabı sil +twofa=İki aşamalı doğrulama account_link=Bağlı Hesaplar organization=Organizasyonlar uid=UID webauthn=Güvenlik Anahtarları -public_profile=Herkese Açık Profil +public_profile=Herkese açık profil biography_placeholder=Bize kendiniz hakkında birşeyler söyleyin! (Markdown kullanabilirsiniz) location_placeholder=Yaklaşık konumunuzu başkalarıyla paylaşın profile_desc=Profilinizin başkalarına nasıl gösterildiğini yönetin. Ana e-posta adresiniz bildirimler, parola kurtarma ve web tabanlı Git işlemleri için kullanılacaktır. @@ -796,8 +806,8 @@ password_change_disabled=Yerel olmayan kullanıcılar parolalarını Forgejo web emails=E-Posta Adresleri manage_emails=E-posta Adreslerini Yönet -manage_themes=Varsayılan temayı seç -manage_openid=OpenID Adreslerini Yönet +manage_themes=Varsayılan tema +manage_openid=OpenID adresleri email_desc=Ana e-posta adresiniz bildirimler, parola kurtarma ve gizlenmemişse eğer web tabanlı Git işlemleri için kullanılacaktır. theme_desc=Bu, sitedeki varsayılan temanız olacak. primary=Birincil @@ -1166,7 +1176,7 @@ form.name_reserved=Depo adı "%s" rezerve edilmiş. form.name_pattern_not_allowed=Depo adında "%s" deseni kullanılamaz. need_auth=Yetkilendirme -migrate_options=Göç Seçenekleri +migrate_options=Göç seçenekleri migrate_service=Göç Hizmeti migrate_options_mirror_helper=Bu depo bir yansı olacaktır migrate_options_lfs=LFS dosyalarını taşı @@ -1174,7 +1184,7 @@ migrate_options_lfs_endpoint.label=LFS Uç Noktası migrate_options_lfs_endpoint.description=Taşıma, LFS sunucusunu belirlemek için Git uzak sunucusunu kullanmaya çalışacak. Eğer LFS veri deposu başka yerdeyse özel bir uç nokta da belirtebilirsiniz. migrate_options_lfs_endpoint.description.local=Yerel bir sunucu yolu da destekleniyor. migrate_options_lfs_endpoint.placeholder=Boş bırakılırsa, uç nokta klon URL'sinden türetilecektir -migrate_items=Göç Öğeleri +migrate_items=Göç öğeleri migrate_items_wiki=Wiki migrate_items_milestones=Kilometre Taşları migrate_items_labels=Etiketler @@ -1215,7 +1225,7 @@ migrate.migrating_labels=Etiketleri Taşıma migrate.migrating_releases=Sürümleri Taşıma migrate.migrating_issues=Konuları Taşıma migrate.migrating_pulls=Değişiklik İsteklerini Taşıma -migrate.cancel_migrating_title=Göçü İptal Et +migrate.cancel_migrating_title=Göçü iptal et migrate.cancel_migrating_confirm=Bu göçü iptal etmek istiyor musunuz? mirror_from=şunun yansıması @@ -1252,7 +1262,7 @@ find_tag=Etiketi bul branches=Dal tags=Etiket issues=Konular -pulls=Değişiklik İstekleri +pulls=Değişiklik istekleri project_board=Projeler packages=Paketler actions=İşlemler @@ -1443,7 +1453,7 @@ projects.column.set_default=Varsayılanı Ayarla projects.column.set_default_desc=Bu sütunu kategorize edilmemiş konular ve değişiklik istekleri için varsayılan olarak ayarlayın projects.column.unset_default=Varsayılanları Geri Al projects.column.unset_default_desc=Bu sütunu varsayılan olarak geri al -projects.column.delete=Sutün Sil +projects.column.delete=Sütunu sil projects.column.deletion_desc=Bir proje sütununun silinmesi, ilgili tüm konuları 'Kategorize edilmemiş'e taşır. Devam edilsin mi? projects.column.color=Renk projects.open=Aç @@ -1595,7 +1605,7 @@ issues.reopen_issue=Yeniden aç issues.reopen_comment_issue=Yorum Yap ve Yeniden Aç issues.create_comment=Yorum yap issues.closed_at=`%s konusunu kapattı` -issues.reopened_at=`%s konusunu yeniden açtı` +issues.reopened_at=%s sorununu yeniden açtı issues.commit_ref_at=`%s işlemesinde bu konuyu işaret etti` issues.ref_issue_from=`bu konuya referansta bulundu %[3]s %[1]s` issues.ref_pull_from=`bu değişiklik isteğine referansta bulundu %[3]s %[1]s` @@ -1647,7 +1657,7 @@ issues.label.filter_sort.alphabetically=Alfabetik issues.label.filter_sort.reverse_alphabetically=Ters alfabetik issues.label.filter_sort.by_size=En küçük boyut issues.label.filter_sort.reverse_by_size=En büyük boyut -issues.num_participants_few=%d Katılımcı +issues.num_participants_few=%d katılımcı issues.attachment.open_tab=`Yeni bir sekmede "%s" görmek için tıkla` issues.attachment.download=`"%s" indirmek için tıkla` issues.subscribe=Abone Ol @@ -1984,7 +1994,7 @@ ext_wiki=Harici Vikiye Erişim ext_wiki.desc=Harici bir wiki'ye bağlantı. wiki=Wiki -wiki.welcome=Wiki'ye Hoşgeldiniz. +wiki.welcome=Viki'ye Hoş geldiniz. wiki.welcome_desc=Wiki, katkıcılarla belge yazmanıza ve paylaşmanıza olanak tanır. wiki.desc=Katkıcılarla belgeler yazın ve paylaşın. wiki.create_first_page=İlk sayfayı oluştur @@ -2140,15 +2150,15 @@ settings.use_external_wiki=Harici Wiki Kullan settings.external_wiki_url=Harici Wiki bağlantısı settings.external_wiki_url_error=Harici wiki URL'si geçerli bir URL değil. settings.external_wiki_url_desc=Ziyaretçiler, wiki sekmesine tıklandığında harici wiki URL'sine yönlendirilir. -settings.issues_desc=Depo Konu İzleyicisini Etkinleştir -settings.use_internal_issue_tracker=Yerleşik Konu İzleyici Kullan -settings.use_external_issue_tracker=Harici Konu İzleyici Kullan -settings.external_tracker_url=Harici Konu İzleyici URLsi +settings.issues_desc=Depo sorun izleyicisini etkinleştir +settings.use_internal_issue_tracker=Yerleşik sorun izleyici kullan +settings.use_external_issue_tracker=Harici sorun izleyici kullan +settings.external_tracker_url=Harici sorun izleyici URL'si settings.external_tracker_url_error=Harici konu izleyici URL'si geçerli bir URL değil. settings.external_tracker_url_desc=Ziyaretçiler, konular sekmesine tıkladığında harici konu izleyici URL'sine yönlendirilir. -settings.tracker_url_format=Harici Konu İzleyici URL Biçimi +settings.tracker_url_format=Harici sorun izleyici URL Biçimi settings.tracker_url_format_error=Harici konu izleyici URL biçimi geçerli bir URL değil. -settings.tracker_issue_style=Harici Konu İzleyici Numara Biçimi +settings.tracker_issue_style=Harici sorun izleyici Numara Biçimi settings.tracker_issue_style.numeric=Sayısal settings.tracker_issue_style.alphanumeric=Alfanumerik settings.tracker_issue_style.regexp=Düzenli ifade @@ -2158,13 +2168,13 @@ settings.tracker_url_format_desc=Kullanıcı adı, depo adı ve yayın dizini i settings.enable_timetracker=Zaman Takibini Etkinleştir settings.allow_only_contributors_to_track_time=Sadece Katkıcılar İçin Zaman Takibine İzin Ver settings.pulls_desc=Değişiklik İsteklerini Etkinleştir -settings.pulls.ignore_whitespace=Çakışmalar için Boşlukları Gözardı Et +settings.pulls.ignore_whitespace=Çakışmalar için boşlukları gözardı et settings.pulls.enable_autodetect_manual_merge=Kendiliğinden algılamalı elle birleştirmeyi etkinleştir (Not: Bazı özel durumlarda yanlış kararlar olabilir) settings.pulls.allow_rebase_update=Değişiklik isteği dalının yeniden yapılandırmayla güncellenmesine izin ver settings.pulls.default_delete_branch_after_merge=Varsayılan olarak birleştirmeden sonra değişiklik isteği dalını sil settings.pulls.default_allow_edits_from_maintainers=Bakımcıların düzenlemelerine izin ver settings.releases_desc=Depo Sürümlerini Etkinleştir -settings.packages_desc=Depo paket kütüğünü etkinleştir +settings.packages_desc=Depo paket kayıt defterini etkinleştir settings.projects_desc=Depo Projelerini Etkinleştir settings.actions_desc=Depo İşlemlerini Etkinleştir settings.admin_settings=Yönetici Ayarları @@ -2188,7 +2198,7 @@ settings.convert_fork_desc=Bu çatalı normal bir depoya dönüştürebilirsiniz settings.convert_fork_notices_1=Bu işlem çatalı normal bir depoya dönüştürür ve geri alınamaz. settings.convert_fork_confirm=Depoyu Dönüştür settings.convert_fork_succeed=Çatal normal bir depoya dönüştürüldü. -settings.transfer.title=Sahipliği Aktar +settings.transfer.title=Sahipliği aktar settings.transfer.rejected=Depo aktarımı reddedildi. settings.transfer.success=Depo aktarımı başarıyla tamamlandı. settings.transfer_abort=Aktarımı iptal et @@ -2448,7 +2458,7 @@ settings.block_on_official_review_requests_desc=Yeterli onay olsa bile, resmi in settings.block_outdated_branch=Değişiklik isteği güncel değilse birleştirmeyi engelle settings.block_outdated_branch_desc=Baş dal taban dalın arkasındayken birleştirme mümkün olmayacaktır. settings.default_branch_desc=Değişiklik istekleri ve kod işlemeleri için varsayılan bir depo dalı seçin: -settings.merge_style_desc=Biçimleri Birleştir +settings.merge_style_desc=Birleştirme biçemleri settings.default_merge_style_desc=Değişiklik istekleri için varsayılan birleştirme tarzı: settings.choose_branch=Bir dal seç… settings.no_protected_branch=Korumalı dal yok. @@ -2701,7 +2711,7 @@ settings.new_owner_blocked_doer = Yeni sahip sizi engelledi. open_with_editor = %s ile aç object_format = Nesne Biçimi -mirror_sync = eşitlendi +mirror_sync = eşitlenme: stars = Yıldızlar desc.sha256 = SHA256 vendored = Sağlanmış @@ -2721,6 +2731,25 @@ settings.mirror_settings.pushed_repository = İtilmiş depo settings.ignore_stale_approvals = Eskimiş onayları yoksay settings.ignore_stale_approvals_desc = Daha eski işlemelere (eski incelemelere) yapılmış olan onayları, Dİ'nin kaç onayı olduğunu belirlerken sayma. Eskimiş incelemeler atıldıysa bu ilgisizdir. error.broken_git_hook = Bu deponun Git İstemcileri bozuk gibi gözüküyor. Onarmak için lütfen belgelere bakın, daha sonra durumu yenilemek için bazı işlemeler itin. +commits.browse_further = Daha fazlasına göz at +settings.units.units = Birimler +commits.renamed_from = %s adından yeniden adlandırıldı +mirror_use_ssh.text = SSH yetkilendirme kullan +settings.default_update_style_desc = Temel dalın ardındaki çekme isteklerini güncellemek için kullanılan varsayılan güncelleme stili. +mirror_denied_combination = Ortak anahtar ve parola tabanlı kimlik doğrulama birlikte kullanılamaz. +mirror_public_key = Ortak SSH anahtarı +n_branch_few = %s dal +n_commit_few = %s gönderi +n_tag_few = %s etiket +settings.wiki_rename_branch_main = Viki dal adını normalleştir +mirror_use_ssh.not_available = SSH yetkilendirme kullanılamıyor. +mirror_use_ssh.helper = Forgejo, bu seçeneği seçtiğinizde deponuzu SSH üzerinden Git üzerinden yansıtacak ve sizin için bir anahtar çifti oluşturacaktır. Oluşturulan ortak anahtarın hedef depoya gönderilmek üzere yetkilendirildiğinden emin olmalısınız. Bunu seçerken parola tabanlı yetkilendirme kullanamazsınız. +n_branch_one = %s dal +settings.units.add_more = Daha fazlasını etkinleştir +settings.wiki_globally_editable = Vikiyi herkesin düzenlemesine izin ver +issues.filter_no_results_placeholder = Arama filtrelerini değiştirmeyi deneyin. +issues.filter_no_results = Sonuç yok +issues.num_participants_one = %d katılımcı [graphs] component_loading = %s yükleniyor... @@ -2736,7 +2765,7 @@ org_name_holder=Organizasyon Adı org_full_name_holder=Organizasyon Tam Adı org_name_helper=Organizasyon adları kısa ve hatırlanabilir olmalıdır. create_org=Organizasyon Oluştur -repo_updated=Güncellendi %s +repo_updated=%s güncellendi members=Üyeler teams=Takımlar code=Kod @@ -2792,7 +2821,7 @@ members.membership_visibility=Üyelik Görünürlüğü: members.public=Görünür members.public_helper=gizle members.private=Gizlenmiş -members.private_helper=görünür yap +members.private_helper=Görünür yap members.member_role=Üye Rolü: members.owner=Sahibi members.member=Üye @@ -3311,7 +3340,7 @@ config.git_max_diff_lines=Maksimum Değişiklik Satırı (tek bir dosya için) config.git_max_diff_line_characters=Maksimum Değişiklik Karakteri (tek bir satır için) config.git_max_diff_files=Maksimum Değişiklik Dosyaları (gösterilecek) config.git_gc_args=GC Argümanları -config.git_migrate_timeout=Göç İşlemi Zaman Aşımı +config.git_migrate_timeout=Göç işlemi zaman aşımı config.git_mirror_timeout=Yansı Güncelleme Zaman Aşımı config.git_clone_timeout=Klonlama İşlemi Zaman Aşımı config.git_pull_timeout=Çekme İşlemi Zaman Aşımı @@ -3363,7 +3392,7 @@ monitor.queue.settings.maxnumberworkers=En fazla çalışan Sayısı monitor.queue.settings.maxnumberworkers.placeholder=Şu anda %[1]d monitor.queue.settings.maxnumberworkers.error=En fazla çalışan sayısı bir sayı olmalıdır monitor.queue.settings.submit=Ayarları Güncelle -monitor.queue.settings.changed=Ayarlar Güncellendi +monitor.queue.settings.changed=Ayarlar güncellendi monitor.queue.settings.remove_all_items=Tümünü kaldır monitor.queue.settings.remove_all_items_done=Kuyruktaki tüm öğeler kaldırıldı. @@ -3771,23 +3800,23 @@ submodule=Alt modül [search] -project_kind = Projeleri ara... +project_kind = Projeleri ara… org_kind = Organizasyonları ara… team_kind = Takımları ara… search = Ara… code_kind = Kod ara… type_tooltip = Arama türü -repo_kind = Depoları ara... +repo_kind = Depoları ara… user_kind = Kullanıcıları ara… milestone_kind = Kilometre taşlarını ara... -branch_kind = Dalları ara... -package_kind = Paketleri ara... -commit_kind = Katkıları ara... -runner_kind = Çalıştırıcıları ara... +branch_kind = Dalları ara… +package_kind = Paketleri ara… +commit_kind = Katkıları ara… +runner_kind = Çalıştırıcıları ara… no_results = Eşleşen sonuç bulunamadı. code_search_unavailable = Kod araması şu anda kullanıma açık değildir. Lütfen site yöneticisi ile iletişime geçin. -issue_kind = Sorunları ara... -pull_kind = Birleştirme isteklerini ara... +issue_kind = Sorunları ara… +pull_kind = Birleştirme isteklerini ara… code_search_by_git_grep = Anlık kod araması sonuçları "git grep" komutu tarafından sağlanmaktadır. Site yöneticisinin kod endekslemesini açması durumunda daha iyi sonuçlar verilmesi mümkün olabilir. keyword_search_unavailable = Anahtar kelime ile arama şu anda kullanıma açık değildir. Lütfen site yöneticisi ile iletişime geçin. fuzzy_tooltip = Arama terimine yakın olan eşleşmeleri dahil et @@ -3795,3 +3824,16 @@ union_tooltip = Boşlukla ayrılmış anahtar kelime eşleşmelerini dahil et exact_tooltip = Sadece arama terimiyle tam uyuşan sonuçları dahit et. fuzzy = Bulanık exact = Tam +regexp = Düzenliİfade +regexp_tooltip = Arama terimini düzenli ifade olarak yorumla +union = Anahtar sözcük + + +[munits.data] +tib = TiB +kib = KiB +pib = PiB +mib = MiB +b = B +gib = GiB +eib = EiB \ No newline at end of file diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 9b0d6159ff..b94cb64af1 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -149,7 +149,7 @@ filter.not_archived = Не архівовано filter.public = Загальнодоступні filter.private = Приватні more_items = Більше пунктів -remove_label_str = Видалити об'єкт «%s» +remove_label_str = Видалити елемент «%s» new_repo.title = Новий репозиторій new_migrate.title = Нова міграція new_org.title = Нова організація @@ -195,8 +195,8 @@ buttons.list.task.tooltip = Додати список завдань buttons.heading.tooltip = Додати заголовок buttons.switch_to_legacy.tooltip = Використовувати застарілий редактор замість поточного buttons.disable_monospace_font = Вимкнути моноширинний шрифт -buttons.indent.tooltip = Вкласти предмет на один рівень -buttons.unindent.tooltip = Викласти об'єкт на один рівень +buttons.indent.tooltip = Вкласти елемент на один рівень +buttons.unindent.tooltip = Викласти елемент на один рівень buttons.mention.tooltip = Згадати користувача чи команду buttons.ref.tooltip = Послатися на задачу чи на запит на злиття buttons.enable_monospace_font = Увімкнути моноширинний шрифт @@ -348,7 +348,7 @@ app_slogan = Гасло екземпляра app_slogan_helper = Уведіть гасло вашого екземпляра тут. Залиште порожнім, аби вимкнути. run_user_helper = Імʼя користувача операційної системи, від якого запущено Forgejo. Зауважте, що цей користувач повинен мати доступ до кореневої теки репозиторію. smtp_from_invalid = Адреса з «Відправляти email від імені» недійсна -allow_dots_in_usernames = Дозволити користувачам використовувати крапки у своїх іменах. Не впливає на облікові записи, що вже існують. +allow_dots_in_usernames = Дозволити використання крапки в іменах користувачів. Не впливає на облікові записи, що вже існують. invalid_password_algorithm = Недійсний варіант алгоритму хешування паролів enable_update_checker_helper_forgejo = Наявність нових версій Forgejo періодично перевірятиметься через перевірку запису TXT DNS на release.forgejo.org. @@ -392,7 +392,7 @@ user_no_results=Відповідних користувачів не знайд org_no_results=Відповідних організацій не знайдено. code_no_results=Відповідний пошуковому запитанню код не знайдено. code_last_indexed_at=Останні індексовані %s -relevant_repositories = Відображаються лише релевантні репозиторії, переглянути результати без фільтру. +relevant_repositories = Показано лише релевантні репозиторії, переглянути результати без фільтру. relevant_repositories_tooltip = Приховано форки, а також репозиторії без теми, значка й опису. go_to = Перейти до stars_one = %d зірка @@ -469,7 +469,7 @@ invalid_code_forgot_password = Ваш код підтвердження неді reset_password_wrong_user = Ви ввійшли як %s, але посилання на відновлення було передбачене для %s back_to_sign_in = Назад до входу sign_in_openid = Продовжити з OpenID -openid_signin_desc = Введіть ваше посилання OpenID. Наприклад: alice.openid.example.org чи https://openid.example.org/alice. +openid_signin_desc = Уведіть свій OpenID URI. Наприклад: alice.openid.example.org чи https://openid.example.org/alice. invalid_password = Ваш пароль не відповідає тому, що був заданий при створенні облікового запису. hint_login = Вже маєте обліковий запис? Увійдіть зараз! hint_register = Потрібен обліковий запис? Зареєструйтеся зараз. @@ -813,9 +813,9 @@ manage_ssh_keys=Керування ключами SSH manage_ssh_principals=Управління SSH сертифікатами користувачів manage_gpg_keys=Керування ключами GPG add_key=Додати ключ -ssh_desc=Ці відкриті ключі SSH повʼязані з вашим обліковим записом. Відповідні приватні ключі дозволяють отримати повний доступ до ваших репозиторіїв. Підтверджені ключі можна використати для підтвердження комітів Git, підписані з SSH. +ssh_desc=Ці відкриті ключі SSH повʼязані з вашим обліковим записом. Відповідні приватні ключі дозволяють отримати повний доступ до ваших репозиторіїв. Підтверджені ключі можна використати для підтвердження комітів Git, підписаних із SSH. principal_desc=Ці настройки SSH сертифікатів вказані у вашому обліковому записі та надають повний доступ до ваших репозиторіїв. -gpg_desc=Ці публічні ключі GPG пов'язані з вашим обліковим записом. Тримайте свої приватні ключі в безпеці, оскільки вони дозволяють здійснювати перевірку комітів. +gpg_desc=Ці публічні ключі GPG пов'язані з вашим обліковим записом і використовуються для підтвердження комітів. Тримайте свої приватні ключі в безпеці, оскільки вони дозволяють підписувати коміти вашим особистим підписом. ssh_helper=Потрібна допомога? Дивіться гід на GitHub з генерації ключів SSH або виправлення типових неполадок SSH. gpg_helper= Потрібна допомога? Перегляньте посібник GitHub про GPG . add_new_key=Додати SSH ключ @@ -893,7 +893,7 @@ manage_oauth2_applications=Керування програмами OAuth2 edit_oauth2_application=Редагувати програму OAuth2 oauth2_applications_desc=Програми OAuth2 дають можливість вашим стороннім програмам надійно аутентифікувати користувачів у цьому екземплярі Forgejo. remove_oauth2_application=Видалити програму OAuth2 -remove_oauth2_application_desc=Видалення програми OAuth2 скасовує доступ до всіх підписаних маркерів доступу. Продовжити? +remove_oauth2_application_desc=Видалення програми OAuth2 скасує доступ до всіх підписаних токенів доступу. Продовжити? remove_oauth2_application_success=Програму видалено. create_oauth2_application=Створити новий додаток OAuth2 create_oauth2_application_button=Створити програму @@ -1076,6 +1076,8 @@ quota.rule.exceeded = Перевищено regenerate_token = Згенерувати знову access_token_regeneration = Згенерувати новий токен доступу quota.sizes.assets.all = Ресурси +access_token_regeneration_desc = Регенерація токена скасує доступ програм, які використовують цей токен, до вашого облікового запису. Це незворотна дія. Продовжити? +regenerate_token_success = Токен згенеровано наново. Програми, які його використовують, більше не мають доступу до вашого облікового запису; ви повинні відновити доступ за допомогою нового токена. [repo] owner=Власник @@ -1143,7 +1145,7 @@ forks=Форки reactions_more=додати %d більше unit_disabled=Адміністратор сайту вимкнув цей розділ репозиторію. language_other=Інші -adopt_search=Введіть ім'я користувач_ки для пошуку неприйнятих репозиторіїв… (залиште порожнім, щоб знайти всі) +adopt_search=Уведіть ім'я користувач_ки для пошуку неприйнятих репозиторіїв… (залиште порожнім, щоб знайти всі) adopt_preexisting_label=Прийняті файли adopt_preexisting=Прийняти вже існуючі файли adopt_preexisting_content=Створити репозиторій з %s @@ -1168,7 +1170,7 @@ desc.archived=Архівний template.items=Елементи шаблону template.git_content=Вміст Git (типова гілка) -template.git_hooks=Перехоплювачі Git +template.git_hooks=Git-хуки template.webhooks=Webhook'и template.topics=Теми template.avatar=Аватар @@ -1285,7 +1287,7 @@ video_not_supported_in_browser=Ваш браузер не підтримує т audio_not_supported_in_browser=Ваш браузер не підтримує тег HTML5 «audio». stored_lfs=Збережено з Git LFS symbolic_link=Символічне посилання -commit_graph=Графік комітів +commit_graph=Граф комітів commit_graph.select=Виберіть гілки commit_graph.hide_pr_refs=Приховати запити на злиття commit_graph.monochrome=Монохром @@ -1402,9 +1404,9 @@ issues.new.open_projects=Відкриті проєкти issues.new.closed_projects=Закриті проєкти issues.new.no_items=Немає елементів issues.new.milestone=Етап -issues.new.no_milestone=Етап відсутній +issues.new.no_milestone=Немає етапу issues.new.clear_milestone=Очистити етап -issues.new.open_milestone=Активні етапи +issues.new.open_milestone=Відкриті етапи issues.new.closed_milestone=Закриті етапи issues.new.assignees=Виконавці issues.new.clear_assignees=Прибрати виконавців @@ -1504,7 +1506,7 @@ issues.closed_at=`закриває цю задачу %s` issues.reopened_at=`повторно відкриває цю задачу %s` issues.commit_ref_at=`посилається на цю задачу в коміті %s` issues.ref_issue_from=`посилається на цю задачу %[3]s %[1]s` -issues.ref_pull_from=`посилається на цей запит злиття %[3]s %[1]s` +issues.ref_pull_from=`посилається на цей запит на злиття %[3]s %[1]s` issues.ref_closing_from=`посилається в запиті на злиття %[3]s, який закриє цю задачу, %[1]s` issues.ref_reopening_from=`посилається в запиті на злиття %[3]s, який повторно відкриє цю задачу, %[1]s` issues.ref_closed_from=`закрив цю задачу %[4]s %[2]s` @@ -1799,7 +1801,7 @@ wiki.delete_page_button=Видалити сторінку wiki.page_already_exists=Вікі-сторінка з таким самим ім'ям вже існує. wiki.pages=Сторінки wiki.last_updated=Останні оновлення %s -wiki.page_name_desc=Введіть назву вікі-сторінки. Деякі зі спеціальних імен: «Home», «_Sidebar» та «_Footer». +wiki.page_name_desc=Уведіть назву вікі-сторінки. Деякі зі спеціальних імен: «Home», «_Sidebar» та «_Footer». activity=Активність activity.period.filter_label=Період: @@ -1844,7 +1846,7 @@ activity.unresolved_conv_label=Відкрити activity.title.releases_1=%d випуск activity.title.releases_n=%d випусків activity.title.releases_published_by=%s опубліковано %s -activity.published_release_label=Опубліковано +activity.published_release_label=Випуск activity.no_git_activity=У цей період не було здійснено жодних дій. activity.git_stats_exclude_merges=Не враховуючи злиття, activity.git_stats_author_1=%d автор @@ -1886,7 +1888,7 @@ settings.collaboration.read=Читати settings.collaboration.owner=Власник settings.collaboration.undefined=Не визначено settings.hooks=Веб-хуки -settings.githooks=Git хуки +settings.githooks=Git-хуки settings.basic_settings=Основні налаштування settings.mirror_settings=Налаштування дзеркала settings.mirror_settings.mirrored_repository=Віддзеркалений репозиторій @@ -1896,7 +1898,7 @@ settings.mirror_settings.direction.push=Push settings.mirror_settings.last_update=Останнє оновлення settings.mirror_settings.push_mirror.none=Не налаштовано дзеркало push settings.mirror_settings.push_mirror.remote_url=URL віддаленого репозиторію Git -settings.mirror_settings.push_mirror.add=Додати Push дзеркало +settings.mirror_settings.push_mirror.add=Додати push-дзеркало settings.sync_mirror=Синхронізувати зараз settings.site=Веб-сайт @@ -1927,9 +1929,9 @@ settings.pulls_desc=Увімкнути запити на злиття в реп settings.pulls.ignore_whitespace=Ігнорувати пробіл у конфліктах settings.pulls.enable_autodetect_manual_merge=Увімкнути автовизначення ручного злиття (Примітка: у деяких особливий випадках можуть виникнуть помилки) settings.pulls.default_delete_branch_after_merge=Видаляти гілку запиту злиття, коли його прийнято -settings.projects_desc=Увімкнути проєкти у репозиторії +settings.projects_desc=Увімкнути проєкти в репозиторії settings.admin_settings=Налаштування адміністратора -settings.admin_enable_health_check=Включити перевірки працездатності репозиторію (git fsck) +settings.admin_enable_health_check=Увімкнути перевірки стану репозиторію (git fsck) settings.admin_enable_close_issues_via_commit_in_any_branch=Закрити задачу за допомогою коміта, зробленого не в головній гілці settings.danger_zone=Небезпечна зона settings.new_owner_has_same_repo=Новий власник вже має репозиторій з такою назвою. Будь ласка, виберіть інше ім'я. @@ -2075,7 +2077,7 @@ settings.event_pull_request_review_desc=Запит на злиття схвал settings.event_pull_request_sync=Синхронізовано settings.event_pull_request_sync_desc=Гілку автоматично оновлено цільовою гілкою. settings.branch_filter=Фільтр гілок -settings.branch_filter_desc=Білий список гілок для push, створення гілок та видалення гілок, визначається як шаблон glob. Якщо він порожній або містить *, то реєструються події для всіх гілок. Дивіться синтаксис у документації на %[2]s. Наприклад: master, {master,release*}. +settings.branch_filter_desc=Білий список гілок для push, створення гілок та видалення гілок, визначається як шаблон glob. Якщо він порожній або містить *, то реєструються події для всіх гілок. Дивіться синтаксис у документації %[2]s. Приклади: master, {master,release*}. settings.active=Активний settings.active_helper=Інформацію про викликані події буде надіслано за цією веб-хук URL-адресою. settings.add_hook_success=Веб-хук було додано. @@ -2154,7 +2156,7 @@ settings.edit_protected_branch=Редагувати settings.protected_branch_required_approvals_min=Число необхідних схвалень не може бути від'ємним. settings.tags=Теги settings.tags.protection=Захист тегу -settings.tags.protection.pattern=Шаблон тега +settings.tags.protection.pattern=Шаблон тегів settings.tags.protection.allowed=Дозволено settings.tags.protection.allowed.users=Дозволені користувачі settings.tags.protection.allowed.teams=Дозволені команди @@ -2263,7 +2265,7 @@ release.detail=Деталі релізу release.tags=Теги release.new_release=Новий випуск release.draft=Чернетка -release.prerelease=Пре-реліз +release.prerelease=Попередній випуск release.stable=Стабільний release.compare=Порівняти release.edit=Редагувати @@ -2275,15 +2277,15 @@ release.edit_subheader=Публікація релізів допоможе ва release.tag_name=Назва тегу release.target=Ціль release.tag_helper=Виберіть існуючий тег або створіть новий. -release.prerelease_desc=Позначити як пре-реліз +release.prerelease_desc=Позначити як попередній випуск release.prerelease_helper=Позначте цей випуск непридатним для ПРОД використання. release.cancel=Відмінити -release.publish=Опублікувати реліз +release.publish=Опублікувати випуск release.save_draft=Зберегти чернетку -release.edit_release=Оновити реліз -release.delete_release=Видалити реліз +release.edit_release=Оновити випуск +release.delete_release=Видалити випуск release.delete_tag=Видалити тег -release.deletion=Видалити реліз +release.deletion=Видалити випуск release.deletion_success=Реліз, було видалено. release.deletion_tag_desc=Буде видалено цей тег із репозиторію. Вміст репозиторія та історія залишаться незмінними. Продовжити? release.deletion_tag_success=Тег видалено. @@ -2446,7 +2448,7 @@ settings.event_package = Пакунок settings.event_package_desc = Пакунок у репозиторії створено або видалено. settings.new_owner_blocked_doer = Новий власник заблокував вас. settings.transfer_quota_exceeded = Новий власник (%s) перевищив квоту. Репозиторій не передано. -release.title_empty = Заголовок не може бути порожнім. +release.title_empty = Назва не може бути порожньою. issues.role.member_helper = Цей користувач є членом організації, що володіє цим репозиторієм. wiki.page_content = Вміст сторінки wiki.page_title = Заголовок сторінки @@ -2530,7 +2532,7 @@ settings.add_web_hook_desc = Інтегрувати Увійдіть, щоб створити новий запит на злиття. @@ -2541,8 +2543,8 @@ auto_init_description = Почніть історію Git з README і за ба new_from_template_description = Можете вибрати наявний шаблон репозиторію на цьому екземплярі і застосувати його налаштування. form.string_too_long = Довжина введеного рядка більша за %d символів. form.name_reserved = Назву репозиторію «%s» зарезервовано. -form.name_pattern_not_allowed = Шаблон «%s» не допускається у назві репозиторію. -settings.wiki_rename_branch_main_desc = Перейменувати внутрішню гілку, яка використовується у вікі, на «%s». Ця зміна є остаточною і її неможливо скасувати. +form.name_pattern_not_allowed = Вираз «%s» не може бути частиною назви репозиторію. +settings.wiki_rename_branch_main_desc = Перейменувати внутрішню гілку, яка використовується для вікі, на «%s». Ця зміна є остаточною і її неможливо скасувати. wiki.reserved_page = Назву вікі-сторінки «%s» зарезервовано. stars = Зірки mirror_public_key = Відкритий SSH-ключ @@ -2694,6 +2696,83 @@ settings.remove_protected_branch_failed = Не вдалося видалити summary_card_alt = Підсумкова картка репозиторію %s issues.summary_card_alt = Підсумкова картка задачі «%s» в репозиторії %s release.summary_card_alt = Підсумкова картка випуску «%s» в репозиторії %s +release.hide_archive_links_helper = Приховати для цього випуску архіви вихідного коду, що генеруються автоматично. Наприклад, якщо ви завантажуєте свої архіви. +activity.published_prerelease_label = Пре-реліз +release.title = Назва випуску +release.system_generated = Це вкладення згенеровано автоматично. +release.hide_archive_links = Приховати автоматично генеровані архіви +branch.delete_desc = Видалення гілки є остаточним. Хоча видалена гілка може існувати ще деякий час до того, як її буде видалено, цю дію НЕМОЖЛИВО скасувати в більшості випадків. Продовжити? +release.deletion_desc = Видалення випуску видаляє його лише з Forgejo. При цьому тег Git, вміст репозиторію чи його історію не буде змінено. Продовжити? +settings.sourcehut_builds.manifest_path = Шлях до маніфесту збірки +settings.wiki_branch_rename_failure = Не вдалося нормалізувати назву вікі-гілки репозиторію. +settings.sourcehut_builds.visibility = Видимість завдань +settings.unarchive.header = Розархівувати цей репозиторій +settings.unarchive.success = Репозиторій успішно розархівовано. +diff.git-notes.remove-body = Цю примітку буде видалено. +tag.ahead.target = до %s після цього тегу +branch.tag_collision = Неможливо створити гілку «%s», оскільки у репозиторії вже є тег із такою назвою. +branch.branch_name_conflict = Назва гілки «%s» конфліктує з наявною гілкою «%s». +settings.wiki_branch_rename_success = Назву вікі-гілки репозиторію успішно нормалізовано. +diff.has_escaped = У цьому рядку є приховані символи Юнікоду +settings.unarchive.text = Розархівування репозиторію відновить можливість надсилати до нього коміти і виконувати push, а також створювати задачі і запити на злиття. +settings.wiki_rename_branch_main_notices_1 = Цю операцію НЕМОЖЛИВО скасувати. +settings.unarchive.error = Сталася помилка при спробі розархівувати репозиторій. Докладнішу інформацію див. у журналі. +settings.wiki_rename_branch_main = Нормалізувати назву вікі-гілки +settings.wiki_rename_branch_main_notices_2 = Внутрішню вікі-гілку репозиторію %s буде назавжди перейменовано. Існуючі перевірки потрібно буде оновити. +settings.pull_mirror_sync_in_progress = Триває отримання змін з віддаленого репозиторію %s. +settings.enter_repo_name = Уведіть ім'я власника і назву репозиторію, як показано: +settings.pulls.allow_rebase_update = Увімкнути оновлення гілки запиту на злиття за допомогою перебазування +settings.mirror_settings.docs.pulling_remote_title = Отримання з віддаленого репозиторію +settings.mirror_settings.docs.doc_link_pull_section = розділ документації «Отримання з віддаленого репозиторію». +settings.pull_mirror_sync_quota_exceeded = Перевищено квоту, отримання змін неможливе. +settings.mirror_settings.push_mirror.none_ssh = Немає +settings.admin_stats_indexer = Індексатор статистики коду +settings.admin_indexer_commit_sha = Останній індексований коміт +settings.discord_icon_url.exceeds_max_length = URL-адреса значка не може бути довшою, ніж 2048 символи +settings.protect_invalid_status_check_pattern = Недійсний шаблон перевірки стану: «%s». +settings.protect_no_valid_status_check_patterns = Немає дійсних шаблонів перевірки стану. +settings.admin_indexer_unindexed = Не індексовано +settings.push_mirror_sync_in_progress = Триває надсилання змін до віддаленого репозиторію %s. +settings.releases_desc = Увімкнути випуски в репозиторії +settings.admin_code_indexer = Індексатор коду +settings.protect_status_check_patterns_desc = Уведіть шаблони, щоб вказати, які перевірки стану повинні пройти гілки, перш ніж їх буде об'єднано у гілку, що відповідає цьому правилу. Кожен рядок визначає шаблон. Шаблони не можуть бути порожніми. +settings.add_webhook.invalid_path = Шлях не повинен містити частини «.» або «..» і не повинен бути порожнім. Він не може починатися або закінчуватися косою рискою. +settings.matrix.access_token_helper = Рекомендується створити окремий обліковий запис Matrix. Токен доступу можна отримати у вебклієнті Element (у приватній/інкогніто вкладці): User menu (вгорі ліворуч) > All settings > Help & About > Advanced > Access Token (під URL-адресою Homeserver). Закрийте приватну вкладку (вихід із системи зробить токен недійсним). +settings.protect_patterns = Шаблони +settings.sourcehut_builds.access_token_helper = Токен доступу, який має дозвіл JOBS:RW. Згенеруйте токен builds.sr.ht або токен builds.sr.ht з доступом до секретів на meta.sr.ht. +editor.unable_to_upload_files = Не вдалося завантажити файли в «%s» через помилку: %v +view_git_blame = Переглянути git blame +commits.ssh_key_fingerprint = Відбиток ключа SSH +settings.web_hook_name_telegram = Telegram +pulls.status_checks_hide_all = Приховати всі перевірки +settings.thread_id = Thread ID +settings.matrix.room_id_helper = ID кімнати можна отримати у вебклієнті Element: Room Settings > Advanced > Internal room ID. Приклад: %s. +editor.push_rejected_no_message = Зміну відхилено сервером без повідомлення. Будь ласка, перевірте Git-хуки. +editor.upload_files_to_dir = Завантажити файли в «%s» +issues.filter_sort.relevance = За відповідністю +editor.cannot_commit_to_protected_branch = Неможливо здійснити коміт до захищеної гілки «%s». +editor.file_deleting_no_longer_exists = Файл «%s», який ви видаляєте, більше не існує у цьому репозиторії. +editor.file_editing_no_longer_exists = Файл «%s», який ви редагуєте, більше не існує у цьому репозиторії. +diff.show_file_tree = Показати дерево файлів +milestones.filter_sort.name = За назвою +pulls.allow_edits_from_maintainers_err = Не вдалося оновити +pulls.has_viewed_file = Переглянуто +editor.file_already_exists = Файл із назвою «%s» вже є у цьому репозиторії. +commits.view_path = Переглянути на цьому етапі історії +editor.push_rejected = Зміну відхилено сервером. Будь ласка, перевірте Git-хуки. +commits.renamed_from = Перейменовано з %s +diff.hide_file_tree = Приховати дерево файлів +pulls.viewed_files_label = %[1]d з %[2]d файлів переглянуто +settings.protected_branch_duplicate_rule_name = Для цього набору гілок уже є правило +settings.mirror_settings.push_mirror.edit_sync_time = Змінити інтервал синхронізації дзеркала +wiki.delete_page_notice_1 = Видалення вікі-сторінки «%s» неможливо скасувати. Продовжити? +issues.label_archived_filter = Показати архівовані мітки +milestones.new_subheader = Етапи допомагають організувати задачі та відстежувати прогрес їх виконання. +issues.closed_by_fake = від %[2]s закрито %[1]s +issues.closed_by = від %[3]s закрито %[1]s +issues.action_check = Поставити/зняти позначку +issues.action_check_all = Поставити/зняти позначку з усіх елементів +vendored = Сторонній [graphs] contributors.what = внески @@ -2823,6 +2902,8 @@ teams.invite_team_member = Запросити до %s teams.write_access = Запис teams.invite.by = Вас запрошує %s teams.invite_team_member.list = Запрошення в очікуванні +form.name_pattern_not_allowed = Вираз «%s» не може бути частиною назви організації. +teams.add_nonexistent_repo = Репозиторій, який ви намагаєтеся додати, не існує. Спочатку створіть його. [admin] dashboard=Панель управління @@ -2934,7 +3015,7 @@ users.is_activated=Обліковий запис користувача увім users.prohibit_login=Заблокований обліковий запис users.is_admin=Обліковий запис адміністратора users.is_restricted=Обмежений -users.allow_git_hook=Може створювати Git хуки +users.allow_git_hook=Може створювати Git-хуки users.allow_git_hook_tooltip=Git хуки виконуються від імені користувача OS сервісу Forgejo і мають однаковий рівень доступу до хоста. Як результат, користувачі з доступом до Git-хуків можуть отримати доступ і змінювати всі репозиторії Forgejo, а також базу даних, що використовуються в Forgejo. Отже, вони також здатні отримати права адміністратора Forgejo. users.allow_import_local=Може імпортувати локальні репозиторії users.allow_create_organization=Може створювати організації @@ -3076,7 +3157,7 @@ auths.sspi_default_language_helper=Типова мова для користув auths.tips=Поради auths.tips.oauth2.general=Автентифікація OAuth2 auths.tip.oauth2_provider=Постачальник OAuth2 -auths.tip.bitbucket=Створіть OAuth URI на сторінці %s +auths.tip.bitbucket=Зареєструйте нового споживача OAuth на %s і додайте дозвіл «Обліковий запис» — «Читання» auths.tip.nextcloud=`Зареєструйте нового споживача OAuth у вашому екземплярі за допомогою наступного меню "Налаштування -> Безпека -> клієнт OAuth 2.0"` auths.tip.dropbox=Створіть новий додаток на %s auths.tip.facebook=Зареєструйте новий додаток на %s і додайте модуль «Facebook Login» @@ -3084,7 +3165,7 @@ auths.tip.github=Зареєструйте новий додаток OAuth на % auths.tip.gitlab=Додайте новий додаток на https://gitlab.com/profile/applications auths.tip.google_plus=Отримайте облікові дані клієнта OAuth2 в консолі Google API на сторінці %s auths.tip.openid_connect=Використовуйте OpenID Connect Discovery URL (/.well-known/openid-configuration) для автоматичної настройки входу OAuth -auths.tip.twitter=Перейдіть на %s, створіть програму і переконайтеся, що включена опція «Дозволити цю програму для входу в систему за допомогою Twitter» +auths.tip.twitter=Перейдіть на %s, створіть програму і переконайтеся, що ввімкнено опцію «Дозволити використання цієї програми для входу через Twitter» auths.tip.discord=Зареєструйте новий додаток на %s auths.tip.yandex=Створіть новий додаток на %s. У розділі «Yandex.Passport API» виберіть такі дозволи: «Доступ до адреси електронної пошти», «Доступ до аватара» і «Доступ до імені користувача, імені та прізвища, статі» auths.tip.mastodon=Введіть URL спеціального екземпляра для екземпляра mastodon, який ви хочете автентифікувати за допомогою (або використовувати за замовчуванням) @@ -3281,7 +3362,7 @@ users.purge_help = Примусово видалити користувача і dashboard.cleanup_packages = Очистити непридатні пакунки monitor.last_execution_result = Результат repos.lfs_size = Розмір LFS -config.allow_dots_in_usernames = Дозволити використання крапки в іменах користувачів. Не впливає на існуючі облікові записи. +config.allow_dots_in_usernames = Дозволити використання крапки в іменах користувачів. Не впливає на облікові записи, що вже існують. config.mailer_enable_helo = Увімкнути HELO users.organization_creation.description = Дозволити створення нових організацій. users.cannot_delete_self = Ви не можете видалити себе @@ -3337,6 +3418,11 @@ config.set_setting_failed = Не вдалося встановити парам config.access_log_template = Шаблон журналу доступу dashboard.cancel_abandoned_jobs = Скасувати покинуті завдання дій monitor.download_diagnosis_report = Завантажити діагностичний звіт +auths.oauth2_map_group_to_team_removal = Видаляти користувачів із синхронізованих команд, якщо користувачі не належать до відповідної групи. +config.mailer_smtp_addr = Адреса SMTP +dashboard.update_checker = Перевірка оновлень +auths.map_group_to_team_removal = Видаляти користувачів із синхронізованих команд, якщо користувачі не належать до відповідної групи LDAP +auths.enable_ldap_groups = Увімкнути групи LDAP [action] @@ -3441,7 +3527,7 @@ settings.delete.notice = Ви збираєтеся видалити %s (%s). Ц details.author = Автор title = Пакунки arch.version.backup = Резервне копіювання -arch.version.conflicts = Суперечки +arch.version.conflicts = Конфлікти arch.version.replaces = Заміни arch.version.provides = Надає arch.version.groups = Група @@ -3559,6 +3645,12 @@ chef.registry = Налаштуйте цей реєстр у файлі ~/. owner.settings.chef.keypair.description = Запити до реєстру Chef повинні бути криптографічно підписані як засіб автентифікації. При генерації пари ключів на Forgejo зберігається тільки публічний ключ. Приватний ключ надається вам для використання команд knife. Генерація нової пари ключів замінить попередню. nuget.dependency.framework = Цільовий фреймворк owner.settings.cleanuprules.preview.overview = Заплановано видалити %d пакунків. +owner.settings.cleanuprules.pattern_full_match = Застосувати шаблон до повної назви пакунка +maven.download = Щоб завантажити залежність, запустіть із командного рядка: +maven.install2 = Запустити з командного рядка: +npm.dependencies.bundle = Пакетні залежності +npm.dependencies.peer = Однорангові залежності +arch.pacman.repo.multi = %s має одну й ту саму версію в різних дистрибутивах. [secrets] deletion = Видалити секрет diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index b12bce88ec..59901392c2 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -70,7 +70,7 @@ your_starred=点赞 your_settings=设置 all=所有 -sources=来源 +sources=原创 mirrors=镜像 collaborative=协作 forks=派生 @@ -1062,7 +1062,7 @@ language.description = 此语言将保存到您的账号中,并在您登录后 language.localization_project = 帮助我们将 Forgejo 翻译成您的语言!了解更多。 user_block_yourself = 您不能屏蔽自己。 pronouns_custom_label = 自定义代词 -change_username_redirect_prompt.with_cooldown.one = 旧用户名将在 %[1]d 天的保护期后对所有人可用,您仍可以在此期间重新认领旧用户名。 +change_username_redirect_prompt.with_cooldown.one = 旧用户名将在 %[1]d 天的保护期后对所有人可用。您仍可以在此期间重新认领旧用户名。 change_username_redirect_prompt.with_cooldown.few = 旧用户名将在 %[1]d 天的保护期后对所有人可用,您仍可以在此期间重新认领旧用户名。 keep_pronouns_private = 仅向已认证用户显示代词 keep_pronouns_private.description = 这将对未登录的访问者隐藏您的代词。 @@ -3636,7 +3636,7 @@ auto_merge_pull_request=`自动合并了拉取请求 %[3]s#%[2]s transfer_repo=将仓库 %s 转移至 %s push_tag=推送了标签 %[3]s 至仓库 %[4]s delete_tag=从%[3]s 删除了标签 %[2]s -delete_branch=从 %[3]s 删除分支 %[2]s +delete_branch=删除了 %[3]s%[2]s 分支 compare_branch=比较 compare_commits=比较 %d 提交 compare_commits_general=比较提交 diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index 0903f27396..5f52a02018 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -1062,7 +1062,7 @@ language.localization_project = 幫助我們翻譯 Forgejo 至您的語言!公開活動只有你和站點管理員可見。 quota.rule.exceeded = 已超出 diff --git a/options/locale_next/locale_ar.json b/options/locale_next/locale_ar.json index 3d87c7ee95..cef0f06e23 100644 --- a/options/locale_next/locale_ar.json +++ b/options/locale_next/locale_ar.json @@ -3,5 +3,7 @@ "home.welcome.no_activity": "لا يوجد نشاط", "home.explore_repos": "اكتشف المستودعات", "home.explore_users": "اكتشف المستخدمين", - "home.explore_orgs": "اكتشف المنظمات" + "home.explore_orgs": "اكتشف المنظمات", + "moderation.abuse_category.illegal_content": "المحتوى غير المشروع", + "moderation.abuse_category.malware": "برمجية خبيثة" } diff --git a/options/locale_next/locale_be.json b/options/locale_next/locale_be.json index 0967ef424b..40dfec0b41 100644 --- a/options/locale_next/locale_be.json +++ b/options/locale_next/locale_be.json @@ -1 +1,3 @@ -{} +{ + "moderation.abuse_category.malware": "Шкодная праграма" +} diff --git a/options/locale_next/locale_bg.json b/options/locale_next/locale_bg.json index 1faf269aba..be8477a98a 100644 --- a/options/locale_next/locale_bg.json +++ b/options/locale_next/locale_bg.json @@ -7,7 +7,6 @@ "one": "иска да слее %[1]d подаване от %[2]s в %[3]s", "other": "иска да слее %[1]d подавания от %[2]s в %[3]s" }, - "mail.actions.run_info_ref": "Клон: %[1]s (%[2]s)", "mail.actions.run_info_trigger": "Задействано поради: %[1]s от: %[2]s", "meta.last_line": "В България расте най-старото дърво в страната, Байкушевата мура, на възраст над 1300 години.", "relativetime.1day": "вчера", diff --git a/options/locale_next/locale_bn.json b/options/locale_next/locale_bn.json index 0967ef424b..56a6e6dae4 100644 --- a/options/locale_next/locale_bn.json +++ b/options/locale_next/locale_bn.json @@ -1 +1,3 @@ -{} +{ + "moderation.abuse_category.malware": "ম্যালওয়্যার" +} diff --git a/options/locale_next/locale_ca.json b/options/locale_next/locale_ca.json index 8eefc65a1a..606ab99173 100644 --- a/options/locale_next/locale_ca.json +++ b/options/locale_next/locale_ca.json @@ -1,3 +1,4 @@ { - "search.milestone_kind": "Cerca fites..." + "search.milestone_kind": "Cerca fites...", + "moderation.abuse_category.malware": "Programari maliciós" } diff --git a/options/locale_next/locale_cs-CZ.json b/options/locale_next/locale_cs-CZ.json index 24380bea1b..3ce42e6bb0 100644 --- a/options/locale_next/locale_cs-CZ.json +++ b/options/locale_next/locale_cs-CZ.json @@ -28,7 +28,6 @@ "mail.actions.not_successful_run": "Workflow %[1]s selhal v repozitáři %[2]s", "mail.actions.run_info_cur_status": "Stav tohoto procesu: %[1]s (právě aktualizováno z %[2]s)", "mail.actions.run_info_previous_status": "Stav předchozího procesu: %[1]s", - "mail.actions.run_info_ref": "Větev: %[1]s (%[2]s)", "mail.actions.run_info_trigger": "Spuštěno z důvodu: %[1]s od: %[2]s", "mail.actions.successful_run_after_failure_subject": "Workflow %[1]s obnoven v repozitáři %[2]s", "mail.actions.successful_run_after_failure": "Workflow %[1]s obnoven v repozitáři %[2]s", @@ -111,5 +110,6 @@ "profile.edit.link": "Upravit profil", "feed.atom.link": "Zdroj Atom", "keys.ssh.link": "Klíče SSH", - "og.repo.summary_card.alt_description": "Karta se souhrnem repozitáře %[1]s, popsaným jako: %[2]s" + "og.repo.summary_card.alt_description": "Karta se souhrnem repozitáře %[1]s, popsaným jako: %[2]s", + "mail.actions.run_info_sha": "Revize: %[1]s" } diff --git a/options/locale_next/locale_da.json b/options/locale_next/locale_da.json index 8315e06bcc..2620127b8c 100644 --- a/options/locale_next/locale_da.json +++ b/options/locale_next/locale_da.json @@ -28,7 +28,6 @@ "mail.actions.not_successful_run": "Arbejdsgangen %[1]s mislykkedes i depotet %[2]s", "mail.actions.run_info_cur_status": "Status for denne kørsel: %[1]s (lige opdateret fra %[2]s)", "mail.actions.run_info_previous_status": "Status for forrige kørsel: %[1]s", - "mail.actions.run_info_ref": "Gren: %[1]s (%[2]s)", "mail.actions.run_info_trigger": "Udløst fordi: %[1]s af: %[2]s", "discussion.locked": "Denne diskussion er blevet låst. Kommentarer er begrænset til bidragydere.", "relativetime.now": "nu", @@ -97,5 +96,10 @@ "settings.visibility.description": "Profilsynlighed påvirker andres adgang til dine ikke-private depoter. Læs mere", "avatar.constraints_hint": "Brugerdefineret avatar må ikke overstige %[1]s i størrelse eller være større end %[2]dx%[3]d pixels", "repo.diff.commit.next-short": "Næste", - "repo.diff.commit.previous-short": "Forrige" + "repo.diff.commit.previous-short": "Forrige", + "profile.actions.tooltip": "Flere handlinger", + "profile.edit.link": "Redigere profil", + "feed.atom.link": "Atom feed", + "keys.ssh.link": "SSH Nøgler", + "keys.gpg.link": "GPG Nøgler" } diff --git a/options/locale_next/locale_de-DE.json b/options/locale_next/locale_de-DE.json index d256c54dc6..5d670aeedf 100644 --- a/options/locale_next/locale_de-DE.json +++ b/options/locale_next/locale_de-DE.json @@ -27,7 +27,6 @@ "mail.actions.successful_run_after_failure": "Arbeitsablauf %[1]s in Repository %[2]s wiederhergestellt", "mail.actions.not_successful_run": "Arbeitsablauf %[1]s in Repository %[2]s fehlgeschlagen", "mail.actions.run_info_previous_status": "Vorheriger Status des Runs: %[1]s", - "mail.actions.run_info_ref": "Branch: %[1]s (%[2]s)", "mail.actions.run_info_trigger": "Ausgelöst, weil: %[1]s durch: %[2]s", "mail.actions.run_info_cur_status": "Status dieses Runs: %[1]s (gerade eben von %[2]s aktualisiert)", "discussion.locked": "Diese Diskussion wurde gesperrt. Nur Mitwirkende können kommentieren.", @@ -103,5 +102,6 @@ "keys.ssh.link": "SSH-Schlüssel", "keys.gpg.link": "GPG-Schlüssel", "profile.actions.tooltip": "Mehr Aktionen", - "og.repo.summary_card.alt_description": "Zusammenfassungskarte des Repositorys %[1]s, beschrieben als %[2]s" + "og.repo.summary_card.alt_description": "Zusammenfassungskarte des Repositorys %[1]s, beschrieben als %[2]s", + "mail.actions.run_info_sha": "Commit: %[1]s" } diff --git a/options/locale_next/locale_el-GR.json b/options/locale_next/locale_el-GR.json index d3ba25b170..cca89efd0e 100644 --- a/options/locale_next/locale_el-GR.json +++ b/options/locale_next/locale_el-GR.json @@ -12,7 +12,6 @@ "mail.actions.successful_run_after_failure_subject": "Η ροή εργασίας %[1]s αποκαταστάθηκε στο αποθετήριο %[2]s", "mail.actions.not_successful_run_subject": "Η ροή εργασίας %[1]s απέτυχε στο αποθετήριο %[2]s", "mail.actions.run_info_trigger": "Ενεργοποιήθηκε επειδή: %[1]s από: %[2]s", - "mail.actions.run_info_ref": "Αποθετήριο: %[1]s (%[2]s)", "meta.last_line": "Ευχαριστούμε που μεταφράζετε το Forgejo! Αυτή η γραμμή δεν είναι ορατή από τους χρήστες αλλά εξυπηρετεί άλλους σκοπούς στη διαχείριση της μετάφρασης. Μπορείτε να γράψετε κάποιο αστείο αντί για μετάφραση.", "mail.actions.successful_run_after_failure": "Η ροή εργασίας %[1]s αποκαταστάθηκε στο αποθετήριο %[2]s", "discussion.locked": "Αυτή η συζήτηση έχει κλειδωθεί. Ο σχολιασμός περιορίζεται στους συνεισφέροντες.", diff --git a/options/locale_next/locale_es-ES.json b/options/locale_next/locale_es-ES.json index 37edef9211..82fbcfb4b6 100644 --- a/options/locale_next/locale_es-ES.json +++ b/options/locale_next/locale_es-ES.json @@ -30,5 +30,6 @@ "relativetime.future": "en el futuro", "home.explore_repos": "Explorar repositorios", "home.explore_users": "Explorar usuarios", - "home.explore_orgs": "Explorar organizaciones" + "home.explore_orgs": "Explorar organizaciones", + "moderation.abuse_category.malware": "Malware" } diff --git a/options/locale_next/locale_fi-FI.json b/options/locale_next/locale_fi-FI.json index cb26d76e66..fdc740b978 100644 --- a/options/locale_next/locale_fi-FI.json +++ b/options/locale_next/locale_fi-FI.json @@ -63,6 +63,6 @@ "mail.actions.successful_run_after_failure": "Työnkulku %[1]s palautettu tietovarastoon %[2]s", "mail.actions.run_info_cur_status": "Tämän juoksun tila: %[1]s (juuri päivitetty %[2]s:sta)", "mail.actions.run_info_previous_status": "Edellisen ajon tila: %[1]s", - "mail.actions.run_info_ref": "Haara: %[1]s (%[2]s)", - "mail.actions.run_info_trigger": "Laukaistui, koska: %[1]s, tekijänä: %[2]s" + "mail.actions.run_info_trigger": "Laukaistui, koska: %[1]s, tekijänä: %[2]s", + "moderation.abuse_category.malware": "Haittaohjelma" } diff --git a/options/locale_next/locale_fil.json b/options/locale_next/locale_fil.json index 84b537fbdc..2c62514648 100644 --- a/options/locale_next/locale_fil.json +++ b/options/locale_next/locale_fil.json @@ -25,7 +25,6 @@ "mail.actions.successful_run_after_failure": "Na-recover ang workflow na %[1]s sa repositoryong %[2]s", "mail.actions.not_successful_run": "Nabigo ang workflow na %[1]s sa repositoryong %[2]s", "mail.actions.run_info_previous_status": "Nakaraang Status ng Run: %[1]s", - "mail.actions.run_info_ref": "Branch: %[1]s (%[2]s)", "mail.actions.run_info_trigger": "Na-trigger dahil: %[1]s ni/ng: %[2]s", "mail.actions.successful_run_after_failure_subject": "Na-recover ang workflow na %[1]s sa repositoryong %[2]s", "mail.actions.not_successful_run_subject": "Nabigo ang workflow na %[1]s sa repositoryong %[2]s", diff --git a/options/locale_next/locale_fr-FR.json b/options/locale_next/locale_fr-FR.json index da26d56107..438e0433d0 100644 --- a/options/locale_next/locale_fr-FR.json +++ b/options/locale_next/locale_fr-FR.json @@ -10,7 +10,6 @@ "other": "" }, "search.milestone_kind": "Recherche dans les jalons…", - "mail.actions.run_info_ref": "Branche : %[1]s (%[2]s)", "discussion.locked": "Cette discussion a été bloqué. Les commentaires sont limités aux contributeurs.", "relativetime.now": "maintenant", "relativetime.future": "dans le future", diff --git a/options/locale_next/locale_hu-HU.json b/options/locale_next/locale_hu-HU.json index 9d52509102..1c02002e6e 100644 --- a/options/locale_next/locale_hu-HU.json +++ b/options/locale_next/locale_hu-HU.json @@ -1,5 +1,6 @@ { "repo.pulls.merged_title_desc": "egyesítve %[1]d változás(ok) a %[2]s-ból %[3]s-ba %[4]s", "repo.pulls.title_desc": "egyesíteni szeretné %[1]d változás(oka)t a(z) %[2]s-ból %[3]s-ba", - "search.milestone_kind": "Mérföldkövek keresése..." + "search.milestone_kind": "Mérföldkövek keresése...", + "moderation.abuse_category.malware": "Malware" } diff --git a/options/locale_next/locale_id-ID.json b/options/locale_next/locale_id-ID.json index f2dac8114f..14bf491789 100644 --- a/options/locale_next/locale_id-ID.json +++ b/options/locale_next/locale_id-ID.json @@ -1,8 +1,5 @@ { - "repo.pulls.merged_title_desc": { - "other": "commit %[1]d telah digabungkan dari %[2]s menjadi %[3]s %[4]s" - }, - "repo.pulls.title_desc": { - "other": "ingin menggabungkan komit %[1]d dari %[2]s menuju %[3]s" - } + "repo.pulls.merged_title_desc": "commit %[1]d telah digabungkan dari %[2]s menjadi %[3]s %[4]s", + "repo.pulls.title_desc": "ingin menggabungkan komit %[1]d dari %[2]s menuju %[3]s", + "moderation.abuse_category.malware": "Perangkat pembahaya" } diff --git a/options/locale_next/locale_it-IT.json b/options/locale_next/locale_it-IT.json index 8464d6244e..f4cc7755f0 100644 --- a/options/locale_next/locale_it-IT.json +++ b/options/locale_next/locale_it-IT.json @@ -82,7 +82,6 @@ "moderation.report_abuse_form.invalid": "Argomenti non validi", "moderation.reporting_failed": "Impossibile inviare segnalazione: %v", "moderation.reported_thank_you": "Grazie per la segnalazione. L'amministratore è stato avvertito.", - "mail.actions.run_info_ref": "Ramo: %[1]s (%[2]s)", "alert.asset_load_failed": "Impossibile caricare i file di risorsa da {path}. Controlla che i file di risorsa siano accessibili.", "install.invalid_lfs_path": "Non è possibile creare una root LFS nel percorso specificato: %[1]s", "home.welcome.activity_hint": "Non c'è nulla nel tuo feed. Le tue azioni e le attività dei repositori che segui verranno mostrate qui.", diff --git a/options/locale_next/locale_ja-JP.json b/options/locale_next/locale_ja-JP.json index 40edf8cb90..c4b3a0a2e0 100644 --- a/options/locale_next/locale_ja-JP.json +++ b/options/locale_next/locale_ja-JP.json @@ -1,5 +1,6 @@ { "repo.pulls.merged_title_desc": "が %[1]d 個のコミットを %[2]s から %[3]s へマージ %[4]s", "repo.pulls.title_desc": "が %[2]s から %[3]s への %[1]d コミットのマージを希望しています", - "search.milestone_kind": "マイルストーンを検索..." + "search.milestone_kind": "マイルストーンを検索...", + "moderation.abuse_category.malware": "悪意のコード" } diff --git a/options/locale_next/locale_ko-KR.json b/options/locale_next/locale_ko-KR.json index 98c949d517..2e51144cb7 100644 --- a/options/locale_next/locale_ko-KR.json +++ b/options/locale_next/locale_ko-KR.json @@ -1,5 +1,6 @@ { "repo.pulls.merged_title_desc": "님이 %[2]s 에서 %[3]s 로 %[1]d 커밋을 %[4]s 병합함", "repo.pulls.title_desc": "%[2]s 에서 %[3]s 로 %[1]d개의 커밋들을 병합하려함", - "home.welcome.no_activity": "활동 없음" + "home.welcome.no_activity": "활동 없음", + "moderation.abuse_category.malware": "악성 소프트웨어" } diff --git a/options/locale_next/locale_lv-LV.json b/options/locale_next/locale_lv-LV.json index 4deae220bf..22b80f2fad 100644 --- a/options/locale_next/locale_lv-LV.json +++ b/options/locale_next/locale_lv-LV.json @@ -30,7 +30,6 @@ "mail.actions.not_successful_run": "Darbplūsmas %[1] atteice glabātavā %[2]s", "mail.actions.run_info_cur_status": "Šī izpildījuma stāvoklis: %[1]s (tikko atjaunināts no %[2]s)", "mail.actions.run_info_previous_status": "Iepriekšējā izpildījuma stāvoklis: %[1]s", - "mail.actions.run_info_ref": "Zars: %[1]s (%[2]s)", "mail.actions.run_info_trigger": "Izraisīšanas iemesls: %[2]s no: %[2]s", "discussion.locked": "Šī apspriede tika slēgta. Piebilžu pievienošana ir ļauta tikai līdzdalībniekiem.", "relativetime.future": "nākotnē", @@ -111,5 +110,6 @@ "feed.atom.link": "Atom barotne", "keys.ssh.link": "SSH atslēgas", "keys.gpg.link": "GPG atslēgas", - "og.repo.summary_card.alt_description": "Glabātavas %[1]s kopsavilkuma kartīte, aprakstīta kā: %[2]s" + "og.repo.summary_card.alt_description": "Glabātavas %[1]s kopsavilkuma kartīte, aprakstīta kā: %[2]s", + "mail.actions.run_info_sha": "Iesūtījums: %[1]s" } diff --git a/options/locale_next/locale_nb_NO.json b/options/locale_next/locale_nb_NO.json index 3349e136b5..b6b10cebb5 100644 --- a/options/locale_next/locale_nb_NO.json +++ b/options/locale_next/locale_nb_NO.json @@ -98,7 +98,6 @@ "mail.actions.not_successful_run": "Arbeidsflyten %[1]s feilet i repository %[2]s", "mail.actions.run_info_cur_status": "Status for denne kjøringen: %[1]s (oppdatert fra %[2]s)", "mail.actions.run_info_previous_status": "Status for forrige kjøring: %[1]s", - "mail.actions.run_info_ref": "Branch: %[1]s (%[2]s)", "repo.diff.commit.next-short": "Neste", "repo.diff.commit.previous-short": "Forrige", "discussion.locked": "Denne diskusjonen er låst. Kommentarer kan kun gjøres av bidragsytere.", diff --git a/options/locale_next/locale_nds.json b/options/locale_next/locale_nds.json index 207a138926..20c1208c42 100644 --- a/options/locale_next/locale_nds.json +++ b/options/locale_next/locale_nds.json @@ -28,7 +28,6 @@ "mail.actions.not_successful_run": "Warkwies %[1]s in Repositorium %[2]s is fehlslagen", "mail.actions.run_info_cur_status": "Tostand vun deesem Utföhren: %[1]s (jüüst vun %[2]s verneeit)", "mail.actions.run_info_previous_status": "Tostand vun de vörig Utföhren: %[1]s", - "mail.actions.run_info_ref": "Twieg: %[1]s (%[2]s)", "mail.actions.run_info_trigger": "Utlööst um: %[1]s vun: %[2]s", "discussion.locked": "Deeser Snack is tosloten worden. Blots Bidragers könen kommenteren.", "relativetime.future": "in Tokunft", @@ -103,5 +102,6 @@ "keys.gpg.link": "GPG-Slötels", "profile.actions.tooltip": "Mehr Aktioonen", "profile.edit.link": "Profil bewarken", - "og.repo.summary_card.alt_description": "Tosamenfatens-Kaart vun de Repositorium %[1]s, beschrieven as: %[2]s" + "og.repo.summary_card.alt_description": "Tosamenfatens-Kaart vun de Repositorium %[1]s, beschrieven as: %[2]s", + "mail.actions.run_info_sha": "Kommitteren: %[1]s" } diff --git a/options/locale_next/locale_nl-NL.json b/options/locale_next/locale_nl-NL.json index 5df7db2b9d..e049db3d41 100644 --- a/options/locale_next/locale_nl-NL.json +++ b/options/locale_next/locale_nl-NL.json @@ -28,7 +28,6 @@ "mail.actions.not_successful_run": "Werkstroom %[1]s mislukt in repositorie %[2]s", "mail.actions.run_info_cur_status": "De status van deze run: %[1]s (zojuist bijgewerkt van %[2]s)", "mail.actions.run_info_previous_status": "Status vorige run: %[1]s", - "mail.actions.run_info_ref": "Branch: %[1]s (%[2]s)", "mail.actions.run_info_trigger": "Getriggerd omdat: %[1]s door: %[2]s", "discussion.locked": "Deze discussie is afgesloten. Commentaar is alleen mogelijk voor bijdragers.", "relativetime.now": "nu", @@ -103,5 +102,6 @@ "feed.atom.link": "Atom-feed", "repo.diff.commit.previous-short": "Vorige", "avatar.constraints_hint": "Eigen avatars mogen niet groter zijn dan %[1]s in grootte of groter zijn dan %[2]dx%[3]d pixels", - "og.repo.summary_card.alt_description": "Samenvattingsoverzicht van repositorie %[1]s, omschreven als: %[2]s" + "og.repo.summary_card.alt_description": "Samenvattingsoverzicht van repositorie %[1]s, omschreven als: %[2]s", + "mail.actions.run_info_sha": "Commit: %[1]s" } diff --git a/options/locale_next/locale_pt-BR.json b/options/locale_next/locale_pt-BR.json index 336dd5a484..6ed6c5defd 100644 --- a/options/locale_next/locale_pt-BR.json +++ b/options/locale_next/locale_pt-BR.json @@ -26,7 +26,6 @@ "meta.last_line": "real hot girl shit", "mail.actions.run_info_cur_status": "Status desta execução: %[1]s (atualizado recentemente de %[2]s)", "mail.actions.run_info_previous_status": "Status da execução anterior: %[1]s", - "mail.actions.run_info_ref": "Branch: %[1]s (%[2]s)", "mail.actions.successful_run_after_failure_subject": "Workflow %[1]s recuperado no repositório %[2]s", "mail.actions.not_successful_run_subject": "Workflow %[1]s falhou no repositório %[2]s", "mail.actions.successful_run_after_failure": "Workflow %[1]s recuperado no repositório %[2]s", @@ -83,7 +82,7 @@ "moderation.abuse_category": "Categoria", "moderation.abuse_category.placeholder": "Selecione uma categoria", "moderation.abuse_category.spam": "Spam", - "moderation.abuse_category.malware": "Malware", + "moderation.abuse_category.malware": "Software malicioso", "moderation.abuse_category.illegal_content": "Conteúdo ilegal", "moderation.abuse_category.other_violations": "Outras violações de regras da plataforma", "moderation.report_remarks": "Observações", @@ -111,5 +110,6 @@ "keys.gpg.link": "Chaves GPG", "og.repo.summary_card.alt_description": "Cartão de resumo do repositório %[1]s, descrito como: %[2]s", "profile.actions.tooltip": "Mais Actions", - "keys.ssh.link": "Chaves SSH" + "keys.ssh.link": "Chaves SSH", + "mail.actions.run_info_sha": "Commit: %[1]s" } diff --git a/options/locale_next/locale_pt-PT.json b/options/locale_next/locale_pt-PT.json index a0caa90b68..352e948966 100644 --- a/options/locale_next/locale_pt-PT.json +++ b/options/locale_next/locale_pt-PT.json @@ -27,7 +27,6 @@ "mail.actions.successful_run_after_failure_subject": "Sequência de trabalho %[1]s foi recuperada no repositório %[2]s", "mail.actions.not_successful_run_subject": "Sequência de trabalho %[1]s falhou no repositório %[2]s", "mail.actions.not_successful_run": "Sequência de trabalho %[1]s falhou no repositório %[2]s", - "mail.actions.run_info_ref": "Ramo: %[1]s (%[2]s)", "mail.actions.successful_run_after_failure": "Sequência de trabalho %[1]s foi recuperada no repositório %[2]s", "discussion.locked": "Esta discussão foi fechada. Apenas contribuidores podem publicar comentários.", "mail.actions.run_info_cur_status": "Estado desta execução: %[1]s (atualizado recentemente de %[2]s)", diff --git a/options/locale_next/locale_ru-RU.json b/options/locale_next/locale_ru-RU.json index 922e2612af..19167d7177 100644 --- a/options/locale_next/locale_ru-RU.json +++ b/options/locale_next/locale_ru-RU.json @@ -26,7 +26,6 @@ "meta.last_line": "Unskip..", "mail.actions.not_successful_run_subject": "Провал раб. потока %[1]s в репозитории %[2]s", "mail.actions.successful_run_after_failure_subject": "Возобновление раб. потока %[1]s в репозитории %[2]s", - "mail.actions.run_info_ref": "Ветвь: %[1]s (%[2]s)", "mail.actions.run_info_trigger": "Причина срабатывания: %[1]s by: %[2]s", "mail.actions.successful_run_after_failure": "Рабочий поток %[1]s в репозитории %[2]s был возобновлён после провала", "mail.actions.run_info_cur_status": "Текущее состояние: %[1]s (обновлено после %[2]s)", @@ -110,5 +109,7 @@ "feed.atom.link": "Atom-лента", "keys.ssh.link": "Ключи SSH", "keys.gpg.link": "Ключи GPG", - "profile.edit.link": "Изменить профиль" + "profile.edit.link": "Изменить профиль", + "og.repo.summary_card.alt_description": "Карточка со сводкой о репозитории %s. Описание: %[2]s", + "mail.actions.run_info_sha": "Коммит: %[1]s" } diff --git a/options/locale_next/locale_sr-SP.json b/options/locale_next/locale_sr-SP.json index 0967ef424b..611f997b3e 100644 --- a/options/locale_next/locale_sr-SP.json +++ b/options/locale_next/locale_sr-SP.json @@ -1 +1,3 @@ -{} +{ + "moderation.abuse_category.malware": "Малвер" +} diff --git a/options/locale_next/locale_sv-SE.json b/options/locale_next/locale_sv-SE.json index 3bc37deff8..1195647bf5 100644 --- a/options/locale_next/locale_sv-SE.json +++ b/options/locale_next/locale_sv-SE.json @@ -27,7 +27,6 @@ "moderation.reporting_failed": "Det gick inte att skicka in den nya övergreppsrapporten: %v", "mail.actions.run_info_cur_status": "Status för denna körning: %[1]s (just uppdaterad från %[2]s)", "mail.actions.run_info_previous_status": "Status för föregående körning: %[1]s", - "mail.actions.run_info_ref": "Gren: %[1]s (%[2]s)", "mail.actions.run_info_trigger": "Utlöses på grund av: %[1]s av: %[2]s", "alert.asset_load_failed": "Misslyckades med att läsa in resursfiler från {path}. Kontrollera att resursfilerna är åtkomliga.", "install.invalid_lfs_path": "Det gick inte att skapa LFS-roten på den angivna sökvägen: %[1]s", diff --git a/options/locale_next/locale_tr-TR.json b/options/locale_next/locale_tr-TR.json index b0e34e677f..fa71cb8e7d 100644 --- a/options/locale_next/locale_tr-TR.json +++ b/options/locale_next/locale_tr-TR.json @@ -1,5 +1,6 @@ { "repo.pulls.merged_title_desc": "%[4]s %[2]s içindeki %[1]d işlemeyi %[3]s ile birleştirdi", "repo.pulls.title_desc": "%[2]s içindeki %[1]d işlemeyi %[3]s ile birleştirmek istiyor", - "search.milestone_kind": "Kilometre taşlarını ara..." + "search.milestone_kind": "Kilometre taşlarını ara...", + "moderation.abuse_category.malware": "Malware" } diff --git a/options/locale_next/locale_uk-UA.json b/options/locale_next/locale_uk-UA.json index af219b50d0..8e99505e57 100644 --- a/options/locale_next/locale_uk-UA.json +++ b/options/locale_next/locale_uk-UA.json @@ -25,7 +25,6 @@ "alert.range_error": " має бути числом від %[1]s до %[2]s.", "meta.last_line": "Не зливай злий запити на злиття — зіллється зле.", "mail.actions.successful_run_after_failure": "Робочий потік %[1]s відновлено в репозиторії %[2]s", - "mail.actions.run_info_ref": "Гілка: %[1]s (%[2]s)", "mail.actions.successful_run_after_failure_subject": "Робочий потік %[1]s відновлено в репозиторії %[2]s", "mail.actions.run_info_previous_status": "Стан попереднього запуску: %[1]s", "mail.actions.run_info_cur_status": "Стан цього запуску: %[1]s (щойно оновлено з %[2]s)", @@ -111,5 +110,6 @@ "profile.edit.link": "Редагувати профіль", "feed.atom.link": "Стрічка Atom", "profile.actions.tooltip": "Більше дій", - "og.repo.summary_card.alt_description": "Підсумкова картка репозиторію %[1]s з описом: %[2]s" + "og.repo.summary_card.alt_description": "Підсумкова картка репозиторію %[1]s з описом: %[2]s", + "mail.actions.run_info_sha": "Коміт: %[1]s" } diff --git a/options/locale_next/locale_vi.json b/options/locale_next/locale_vi.json index 0967ef424b..7ae64113b6 100644 --- a/options/locale_next/locale_vi.json +++ b/options/locale_next/locale_vi.json @@ -1 +1,3 @@ -{} +{ + "moderation.abuse_category.malware": "Phần mềm ác ý" +} diff --git a/options/locale_next/locale_zh-CN.json b/options/locale_next/locale_zh-CN.json index 62277acb95..c235ebd0ad 100644 --- a/options/locale_next/locale_zh-CN.json +++ b/options/locale_next/locale_zh-CN.json @@ -20,7 +20,6 @@ "mail.actions.not_successful_run_subject": "仓库 %[2]s 中的工作流 %[1]s 已失败", "mail.actions.successful_run_after_failure": "仓库 %[2]s 中的工作流 %[1]s 已恢复", "mail.actions.run_info_previous_status": "上次运行的状态:%[1]s", - "mail.actions.run_info_ref": "分支:%[1]s(%[2]s)", "mail.actions.run_info_cur_status": "此次运行的状态:%[1]s(从 %[2]s 更新)", "mail.actions.run_info_trigger": "由 %[2]s %[1]s 触发", "mail.actions.not_successful_run": "仓库 %[2]s 中的工作流 %[1]s 已失败", @@ -71,12 +70,12 @@ "editor.textarea.shift_tab_hint": "此行无缩进。再次按 Shift + Tab 或按 Escape 退出编辑器。", "admin.dashboard.cleanup_offline_runners": "清理离线运行器", "settings.visibility.description": "个人资料可见性设置会影响他人对您的非私有仓库的访问。了解更多", - "avatar.constraints_hint": "自定义头像大小不得超过 %[1]s,或大于 %[2]d×%[3]d 像素", + "avatar.constraints_hint": "自定义头像大小不得超过 %[1]s,且分辨率不得大于 %[2]d×%[3]d 像素", "keys.ssh.link": "SSH 密钥", "keys.gpg.link": "GPG 密钥", "profile.actions.tooltip": "更多操作", - "repo.diff.commit.next-short": "下个", - "repo.diff.commit.previous-short": "上个", + "repo.diff.commit.next-short": "下一个", + "repo.diff.commit.previous-short": "上一个", "feed.atom.link": "Atom 订阅源", "profile.edit.link": "编辑个人资料", "og.repo.summary_card.alt_description": "仓库 %[1]s 的摘要卡片,描述为:%[2]s" diff --git a/options/locale_next/locale_zh-HK.json b/options/locale_next/locale_zh-HK.json index 6baf89e022..277385cf5f 100644 --- a/options/locale_next/locale_zh-HK.json +++ b/options/locale_next/locale_zh-HK.json @@ -1,5 +1,4 @@ { - "repo.pulls.merged_title_desc": { - "other": "於 %[4]s 將 %[1]d 次代碼提交從 %[2]s合併至 %[3]s" - } + "repo.pulls.merged_title_desc": "於 %[4]s 將 %[1]d 次代碼提交從 %[2]s合併至 %[3]s", + "moderation.abuse_category.malware": "惡意程式" } diff --git a/options/locale_next/locale_zh-TW.json b/options/locale_next/locale_zh-TW.json index 3ae0b00d2b..8a5a17a774 100644 --- a/options/locale_next/locale_zh-TW.json +++ b/options/locale_next/locale_zh-TW.json @@ -55,7 +55,6 @@ "mail.actions.not_successful_run": "儲存庫 %[2]s 中的工作流程 %[1]s 已失敗", "mail.actions.run_info_cur_status": "本次執行狀態:%[1]s(剛從 %[2]s 更新)", "mail.actions.run_info_previous_status": "前一次執行狀態:%[1]s", - "mail.actions.run_info_ref": "分支:%[1]s (%[2]s)", "mail.actions.run_info_trigger": "觸發原因:%[1]s,由 %[2]s 執行", "discussion.locked": "此討論已被鎖定。僅限貢獻者留言。", "alert.asset_load_failed": "無法從 {path} 載入資源檔案。請確保這些資源檔案可以被存取。", From 9dfdacf54f03bcfdae7ab050c17c2f8556f3a030 Mon Sep 17 00:00:00 2001 From: Paul Campbell Date: Sat, 12 Jul 2025 00:39:35 +0200 Subject: [PATCH 131/495] feat: add configuration to only push mirror selected branches (#7823) Adds the ability to selectively choose which branches are pushed to a mirror. This change adds an additional text box on the repository settings for each push mirror. Existing behavior is preserved when the field is left blank. When the repository is being pushed, only branches matching the comma separated branch filter are pushed. Resolves forgejo/forgejo#7242 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7823 Reviewed-by: Gusted Co-authored-by: Paul Campbell Co-committed-by: Paul Campbell --- models/forgejo_migrations/migrate.go | 1 + models/forgejo_migrations/v37.go | 16 + models/repo/pushmirror.go | 6 + models/repo/pushmirror_test.go | 136 ++++ modules/structs/mirror.go | 3 + options/locale_next/locale_en-US.json | 2 + routers/api/v1/repo/mirror.go | 1 + routers/web/repo/setting/setting.go | 19 + services/convert/mirror.go | 1 + services/forms/repo_form.go | 1 + services/mirror/mirror_push.go | 63 +- templates/repo/settings/options.tmpl | 6 + .../repo/settings/push_mirror_sync_modal.tmpl | 11 +- templates/swagger/v1_json.tmpl | 8 + tests/integration/api_push_mirror_test.go | 154 ++++ tests/integration/mirror_push_test.go | 671 ++++++++++++++++++ 16 files changed, 1089 insertions(+), 10 deletions(-) create mode 100644 models/forgejo_migrations/v37.go diff --git a/models/forgejo_migrations/migrate.go b/models/forgejo_migrations/migrate.go index fcea69d23f..384f382c82 100644 --- a/models/forgejo_migrations/migrate.go +++ b/models/forgejo_migrations/migrate.go @@ -111,6 +111,7 @@ var migrations = []*Migration{ NewMigration("Noop because of https://codeberg.org/forgejo/forgejo/issues/8373", NoopAddIndexToActionRunStopped), // v35 -> v36 NewMigration("Fix wiki unit default permission", FixWikiUnitDefaultPermission), + NewMigration("Add `branch_filter` to `push_mirror` table", AddPushMirrorBranchFilter), } // GetCurrentDBVersion returns the current Forgejo database version. diff --git a/models/forgejo_migrations/v37.go b/models/forgejo_migrations/v37.go new file mode 100644 index 0000000000..89358991af --- /dev/null +++ b/models/forgejo_migrations/v37.go @@ -0,0 +1,16 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package forgejo_migrations + +import ( + "xorm.io/xorm" +) + +func AddPushMirrorBranchFilter(x *xorm.Engine) error { + type PushMirror struct { + ID int64 `xorm:"pk autoincr"` + BranchFilter string `xorm:"VARCHAR(255)"` + } + return x.Sync2(new(PushMirror)) +} diff --git a/models/repo/pushmirror.go b/models/repo/pushmirror.go index d6d0d1135a..e57897fb7e 100644 --- a/models/repo/pushmirror.go +++ b/models/repo/pushmirror.go @@ -32,6 +32,7 @@ type PushMirror struct { Repo *Repository `xorm:"-"` RemoteName string RemoteAddress string `xorm:"VARCHAR(2048)"` + BranchFilter string `xorm:"VARCHAR(2048)"` // A keypair formatted in OpenSSH format. PublicKey string `xorm:"VARCHAR(100)"` @@ -122,6 +123,11 @@ func UpdatePushMirrorInterval(ctx context.Context, m *PushMirror) error { return err } +func UpdatePushMirrorBranchFilter(ctx context.Context, m *PushMirror) error { + _, err := db.GetEngine(ctx).ID(m.ID).Cols("branch_filter").Update(m) + return err +} + var DeletePushMirrors = deletePushMirrors func deletePushMirrors(ctx context.Context, opts PushMirrorOptions) error { diff --git a/models/repo/pushmirror_test.go b/models/repo/pushmirror_test.go index fbef835372..a7e063ff71 100644 --- a/models/repo/pushmirror_test.go +++ b/models/repo/pushmirror_test.go @@ -75,3 +75,139 @@ func TestPushMirrorPrivatekey(t *testing.T) { assert.Empty(t, actualPrivateKey) }) } + +func TestPushMirrorBranchFilter(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + t.Run("Create push mirror with branch filter", func(t *testing.T) { + m := &repo_model.PushMirror{ + RepoID: 1, + RemoteName: "test-branch-filter", + BranchFilter: "main,develop", + } + unittest.AssertSuccessfulInsert(t, m) + assert.NotZero(t, m.ID) + assert.Equal(t, "main,develop", m.BranchFilter) + }) + + t.Run("Create push mirror with empty branch filter", func(t *testing.T) { + m := &repo_model.PushMirror{ + RepoID: 1, + RemoteName: "test-empty-filter", + BranchFilter: "", + } + unittest.AssertSuccessfulInsert(t, m) + assert.NotZero(t, m.ID) + assert.Empty(t, m.BranchFilter) + }) + + t.Run("Create push mirror without branch filter", func(t *testing.T) { + m := &repo_model.PushMirror{ + RepoID: 1, + RemoteName: "test-no-filter", + // BranchFilter: "", + } + unittest.AssertSuccessfulInsert(t, m) + assert.NotZero(t, m.ID) + assert.Empty(t, m.BranchFilter) + }) + + t.Run("Update branch filter", func(t *testing.T) { + m := &repo_model.PushMirror{ + RepoID: 1, + RemoteName: "test-update", + BranchFilter: "main", + } + unittest.AssertSuccessfulInsert(t, m) + + m.BranchFilter = "main,develop" + require.NoError(t, repo_model.UpdatePushMirrorBranchFilter(db.DefaultContext, m)) + + updated := unittest.AssertExistsAndLoadBean(t, &repo_model.PushMirror{ID: m.ID}) + assert.Equal(t, "main,develop", updated.BranchFilter) + }) + + t.Run("Retrieve push mirror with branch filter", func(t *testing.T) { + original := &repo_model.PushMirror{ + RepoID: 1, + RemoteName: "test-retrieve", + BranchFilter: "main,develop", + } + unittest.AssertSuccessfulInsert(t, original) + + retrieved := unittest.AssertExistsAndLoadBean(t, &repo_model.PushMirror{ID: original.ID}) + assert.Equal(t, original.BranchFilter, retrieved.BranchFilter) + assert.Equal(t, "main,develop", retrieved.BranchFilter) + }) + + t.Run("GetPushMirrorsByRepoID includes branch filter", func(t *testing.T) { + mirrors := []*repo_model.PushMirror{ + { + RepoID: 2, + RemoteName: "mirror-1", + BranchFilter: "main", + }, + { + RepoID: 2, + RemoteName: "mirror-2", + BranchFilter: "develop,feature-*", + }, + { + RepoID: 2, + RemoteName: "mirror-3", + BranchFilter: "", + }, + } + + for _, mirror := range mirrors { + unittest.AssertSuccessfulInsert(t, mirror) + } + + retrieved, count, err := repo_model.GetPushMirrorsByRepoID(db.DefaultContext, 2, db.ListOptions{}) + require.NoError(t, err) + assert.Equal(t, int64(3), count) + assert.Len(t, retrieved, 3) + + filterMap := make(map[string]string) + for _, mirror := range retrieved { + filterMap[mirror.RemoteName] = mirror.BranchFilter + } + + assert.Equal(t, "main", filterMap["mirror-1"]) + assert.Equal(t, "develop,feature-*", filterMap["mirror-2"]) + assert.Empty(t, filterMap["mirror-3"]) + }) + + t.Run("GetPushMirrorsSyncedOnCommit includes branch filter", func(t *testing.T) { + mirrors := []*repo_model.PushMirror{ + { + RepoID: 3, + RemoteName: "sync-mirror-1", + BranchFilter: "main,develop", + SyncOnCommit: true, + }, + { + RepoID: 3, + RemoteName: "sync-mirror-2", + BranchFilter: "feature-*", + SyncOnCommit: true, + }, + } + + for _, mirror := range mirrors { + unittest.AssertSuccessfulInsert(t, mirror) + } + + retrieved, err := repo_model.GetPushMirrorsSyncedOnCommit(db.DefaultContext, 3) + require.NoError(t, err) + assert.Len(t, retrieved, 2) + + filterMap := make(map[string]string) + for _, mirror := range retrieved { + filterMap[mirror.RemoteName] = mirror.BranchFilter + } + + assert.Equal(t, "main,develop", filterMap["sync-mirror-1"]) + assert.Equal(t, "feature-*", filterMap["sync-mirror-2"]) + }) +} diff --git a/modules/structs/mirror.go b/modules/structs/mirror.go index 1b6566803a..4909ae20ca 100644 --- a/modules/structs/mirror.go +++ b/modules/structs/mirror.go @@ -13,6 +13,7 @@ type CreatePushMirrorOption struct { Interval string `json:"interval"` SyncOnCommit bool `json:"sync_on_commit"` UseSSH bool `json:"use_ssh"` + BranchFilter string `json:"branch_filter"` } // PushMirror represents information of a push mirror @@ -29,4 +30,6 @@ type PushMirror struct { Interval string `json:"interval"` SyncOnCommit bool `json:"sync_on_commit"` PublicKey string `json:"public_key"` + + BranchFilter string `json:"branch_filter"` } diff --git a/options/locale_next/locale_en-US.json b/options/locale_next/locale_en-US.json index e08c8b2aee..1778a1fc6c 100644 --- a/options/locale_next/locale_en-US.json +++ b/options/locale_next/locale_en-US.json @@ -55,6 +55,8 @@ "repo.form.cannot_create": "All spaces in which you can create repositories have reached the limit of repositories.", "repo.issue_indexer.title": "Issue Indexer", "search.milestone_kind": "Search milestones…", + "repo.settings.push_mirror.branch_filter.label": "Branch filter (optional)", + "repo.settings.push_mirror.branch_filter.description": "Branches to be mirrored. Leave blank to mirror all branches. See %[2]s documentation for syntax. Examples: main, release/*", "incorrect_root_url": "This Forgejo instance is configured to be served on \"%s\". You are currently viewing Forgejo through a different URL, which may cause parts of the application to break. The canonical URL is controlled by Forgejo admins via the ROOT_URL setting in the app.ini.", "themes.names.forgejo-auto": "Forgejo (follow system theme)", "themes.names.forgejo-light": "Forgejo light", diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go index bc48c6acb7..f08867dee4 100644 --- a/routers/api/v1/repo/mirror.go +++ b/routers/api/v1/repo/mirror.go @@ -389,6 +389,7 @@ func CreatePushMirror(ctx *context.APIContext, mirrorOption *api.CreatePushMirro Interval: interval, SyncOnCommit: mirrorOption.SyncOnCommit, RemoteAddress: remoteAddress, + BranchFilter: mirrorOption.BranchFilter, } var plainPrivateKey []byte diff --git a/routers/web/repo/setting/setting.go b/routers/web/repo/setting/setting.go index 6f35e19880..595fdace83 100644 --- a/routers/web/repo/setting/setting.go +++ b/routers/web/repo/setting/setting.go @@ -6,6 +6,7 @@ package setting import ( + go_context "context" "errors" "fmt" "net/http" @@ -589,6 +590,23 @@ func SettingsPost(ctx *context.Context) { ctx.ServerError("UpdatePushMirrorInterval", err) return } + + if m.BranchFilter != form.PushMirrorBranchFilter { + // replace `remote..push` in config and db + m.BranchFilter = form.PushMirrorBranchFilter + if err := db.WithTx(ctx, func(ctx go_context.Context) error { + // Update the DB + if err = repo_model.UpdatePushMirrorBranchFilter(ctx, m); err != nil { + return err + } + // Update the repo config + return mirror_service.UpdatePushMirrorBranchFilter(ctx, m) + }); err != nil { + ctx.ServerError("UpdatePushMirrorBranchFilter", err) + return + } + } + // Background why we are adding it to Queue // If we observed its implementation in the context of `push-mirror-sync` where it // is evident that pushing to the queue is necessary for updates. @@ -684,6 +702,7 @@ func SettingsPost(ctx *context.Context) { SyncOnCommit: form.PushMirrorSyncOnCommit, Interval: interval, RemoteAddress: remoteAddress, + BranchFilter: form.PushMirrorBranchFilter, } var plainPrivateKey []byte diff --git a/services/convert/mirror.go b/services/convert/mirror.go index 9e7d2659ab..5a815f3a5c 100644 --- a/services/convert/mirror.go +++ b/services/convert/mirror.go @@ -23,5 +23,6 @@ func ToPushMirror(ctx context.Context, pm *repo_model.PushMirror) (*api.PushMirr Interval: pm.Interval.String(), SyncOnCommit: pm.SyncOnCommit, PublicKey: pm.GetPublicKey(), + BranchFilter: pm.BranchFilter, }, nil } diff --git a/services/forms/repo_form.go b/services/forms/repo_form.go index bb81e939b0..d040b41395 100644 --- a/services/forms/repo_form.go +++ b/services/forms/repo_form.go @@ -141,6 +141,7 @@ type RepoSettingForm struct { PushMirrorSyncOnCommit bool PushMirrorInterval string PushMirrorUseSSH bool + PushMirrorBranchFilter string `binding:"MaxSize(2048)" preprocess:"TrimSpace"` Private bool Template bool EnablePrune bool diff --git a/services/mirror/mirror_push.go b/services/mirror/mirror_push.go index 11b8ad459a..fdd02dedea 100644 --- a/services/mirror/mirror_push.go +++ b/services/mirror/mirror_push.go @@ -33,19 +33,22 @@ var AddPushMirrorRemote = addPushMirrorRemote func addPushMirrorRemote(ctx context.Context, m *repo_model.PushMirror, addr string) error { addRemoteAndConfig := func(addr, path string) error { - cmd := git.NewCommand(ctx, "remote", "add", "--mirror=push").AddDynamicArguments(m.RemoteName, addr) - if strings.Contains(addr, "://") && strings.Contains(addr, "@") { - cmd.SetDescription(fmt.Sprintf("remote add %s --mirror=push %s [repo_path: %s]", m.RemoteName, util.SanitizeCredentialURLs(addr), path)) + var cmd *git.Command + if m.BranchFilter == "" { + cmd = git.NewCommand(ctx, "remote", "add", "--mirror").AddDynamicArguments(m.RemoteName, addr) } else { - cmd.SetDescription(fmt.Sprintf("remote add %s --mirror=push %s [repo_path: %s]", m.RemoteName, addr, path)) + cmd = git.NewCommand(ctx, "remote", "add").AddDynamicArguments(m.RemoteName, addr) + } + if strings.Contains(addr, "://") && strings.Contains(addr, "@") { + cmd.SetDescription(fmt.Sprintf("remote add %s %s [repo_path: %s]", m.RemoteName, util.SanitizeCredentialURLs(addr), path)) + } else { + cmd.SetDescription(fmt.Sprintf("remote add %s %s [repo_path: %s]", m.RemoteName, addr, path)) } if _, _, err := cmd.RunStdString(&git.RunOpts{Dir: path}); err != nil { return err } - if _, _, err := git.NewCommand(ctx, "config", "--add").AddDynamicArguments("remote."+m.RemoteName+".push", "+refs/heads/*:refs/heads/*").RunStdString(&git.RunOpts{Dir: path}); err != nil { - return err - } - if _, _, err := git.NewCommand(ctx, "config", "--add").AddDynamicArguments("remote."+m.RemoteName+".push", "+refs/tags/*:refs/tags/*").RunStdString(&git.RunOpts{Dir: path}); err != nil { + err := addRemotePushRefSpecs(ctx, path, m) + if err != nil { return err } return nil @@ -67,6 +70,49 @@ func addPushMirrorRemote(ctx context.Context, m *repo_model.PushMirror, addr str return nil } +func addRemotePushRefSpecs(ctx context.Context, path string, m *repo_model.PushMirror) error { + if m.BranchFilter == "" { + // If there is no branch filter, set the push refspecs to mirror all branches and tags. + if _, _, err := git.NewCommand(ctx, "config", "--add").AddDynamicArguments("remote."+m.RemoteName+".push", "+refs/heads/*:refs/heads/*").RunStdString(&git.RunOpts{Dir: path}); err != nil { + return err + } + } else { + branches := strings.SplitSeq(m.BranchFilter, ",") + for branch := range branches { + branch = strings.TrimSpace(branch) + if branch == "" { + continue + } + refspec := fmt.Sprintf("+refs/heads/%s:refs/heads/%s", branch, branch) + if _, _, err := git.NewCommand(ctx, "config", "--add").AddDynamicArguments("remote."+m.RemoteName+".push", refspec).RunStdString(&git.RunOpts{Dir: path}); err != nil { + return err + } + } + } + if _, _, err := git.NewCommand(ctx, "config", "--add").AddDynamicArguments("remote."+m.RemoteName+".push", "+refs/tags/*:refs/tags/*").RunStdString(&git.RunOpts{Dir: path}); err != nil { + return err + } + return nil +} + +func UpdatePushMirrorBranchFilter(ctx context.Context, m *repo_model.PushMirror) error { + path := m.Repo.RepoPath() + + // First, remove all existing push refspecs for this remote + cmd := git.NewCommand(ctx, "config", "--unset-all").AddDynamicArguments("remote." + m.RemoteName + ".push") + if _, _, err := cmd.RunStdString(&git.RunOpts{Dir: path}); err != nil { + // Ignore error if the key doesn't exist + if !strings.Contains(err.Error(), "does not exist") { + return err + } + } + err := addRemotePushRefSpecs(ctx, path, m) + if err != nil { + return err + } + return nil +} + // RemovePushMirrorRemote removes the push mirror remote. func RemovePushMirrorRemote(ctx context.Context, m *repo_model.PushMirror) error { cmd := git.NewCommand(ctx, "remote", "rm").AddDynamicArguments(m.RemoteName) @@ -212,7 +258,6 @@ func runPushSync(ctx context.Context, m *repo_model.PushMirror) error { return util.SanitizeErrorCredentialURLs(err) } - return nil } diff --git a/templates/repo/settings/options.tmpl b/templates/repo/settings/options.tmpl index 797dbe403b..c8061a75b0 100644 --- a/templates/repo/settings/options.tmpl +++ b/templates/repo/settings/options.tmpl @@ -254,6 +254,7 @@ data-modal-push-mirror-edit-id="{{.ID}}" data-modal-push-mirror-edit-interval="{{.Interval}}" data-modal-push-mirror-edit-address="{{.RemoteAddress}}" + data-modal-push-mirror-edit-branch-filter="{{.BranchFilter}}" > {{svg "octicon-pencil" 14}} @@ -288,6 +289,11 @@

{{ctx.Locale.Tr "repo.mirror_address_desc"}}

+
+ + +

{{ctx.Locale.Tr "repo.settings.push_mirror.branch_filter.description" "https://forgejo.org/docs/latest/user/repo-mirror/#branch-filter" "forgejo"}}

+
{{ctx.Locale.Tr "repo.need_auth"}} diff --git a/templates/repo/settings/push_mirror_sync_modal.tmpl b/templates/repo/settings/push_mirror_sync_modal.tmpl index e8dad61a48..32f0994f03 100644 --- a/templates/repo/settings/push_mirror_sync_modal.tmpl +++ b/templates/repo/settings/push_mirror_sync_modal.tmpl @@ -15,7 +15,16 @@
- +
+ +
+
+
+ +
+ +
+

{{ctx.Locale.Tr "repo.settings.push_mirror.branch_filter.description" "https://forgejo.org/docs/latest/user/repo-mirror/#branch-filter" "forgejo"}}

+ + + {{ctx.Locale.Tr "discussion.sidebar.reference"}} + + +
+
+ {{$issueReferenceLink}} + +
From 8efb6c09db70de54aa153f05b41a33ff7dbb4989 Mon Sep 17 00:00:00 2001 From: Codeberg Translate Date: Wed, 16 Jul 2025 16:04:57 +0000 Subject: [PATCH 159/495] i18n: update of translations from Codeberg Translate Co-authored-by: 0ko <0ko@noreply.codeberg.org> Co-authored-by: Benedikt Straub Co-authored-by: Codeberg Translate Co-authored-by: Edgarsons Co-authored-by: Fjuro Co-authored-by: Fjuro Co-authored-by: Gusted Co-authored-by: Juno Takano Co-authored-by: SomeTr Co-authored-by: Vyxie Co-authored-by: Wuzzy Co-authored-by: adf19 Co-authored-by: amv-bamboo Co-authored-by: justbispo Co-authored-by: oatbiscuits Co-authored-by: pixelcode Co-authored-by: xtex Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/ar/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/be/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/cs/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/de/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/fil/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/lv/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/nds/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/nl/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/pt_BR/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/pt_PT/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/ru/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/uk/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/zh_Hans/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/ar/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/de/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/uk/ Translation: Forgejo/forgejo Translation: Forgejo/forgejo-next --- options/locale/locale_ar.ini | 159 +++++++++++++----- options/locale/locale_de-DE.ini | 224 +++++++++++++------------- options/locale/locale_uk-UA.ini | 93 +++++++++-- options/locale_next/locale_ar.json | 136 +++++++++++++++- options/locale_next/locale_be.json | 7 +- options/locale_next/locale_cs-CZ.json | 4 +- options/locale_next/locale_de-DE.json | 12 +- options/locale_next/locale_fil.json | 9 +- options/locale_next/locale_lv-LV.json | 4 +- options/locale_next/locale_nds.json | 4 +- options/locale_next/locale_nl-NL.json | 4 +- options/locale_next/locale_pt-BR.json | 4 +- options/locale_next/locale_pt-PT.json | 8 +- options/locale_next/locale_ru-RU.json | 6 +- options/locale_next/locale_uk-UA.json | 4 +- options/locale_next/locale_zh-CN.json | 5 +- 16 files changed, 496 insertions(+), 187 deletions(-) diff --git a/options/locale/locale_ar.ini b/options/locale/locale_ar.ini index ba11586b44..638c2dc6ce 100644 --- a/options/locale/locale_ar.ini +++ b/options/locale/locale_ar.ini @@ -50,7 +50,7 @@ concept_user_organization = المنظمة link_account = ربط الحساب rerun_all = أعِد تشغيل جميع الوظائف your_profile = الملف الشخصي -sign_out = سجل الخروج +sign_out = سجّل الخروج settings = الإعدادات locked = مقفول error = خطأ @@ -87,7 +87,7 @@ add_all = أضف الكل new_fork = اشتقاق جديد لمستودع new_project_column = عمود جديد add = أضف -active_stopwatch = تتبع وقت الإنجاز +active_stopwatch = متتبِّع وقت النشاط organization = منظمة new_migrate = ترحيل جديد save = احفظ @@ -114,7 +114,7 @@ twofa_scratch = الرمز الاحتياطي للمصادقة بعاملين home = الرئيسية email = عنوان البريد الإلكتروني issues = المسائل -error404 = الصفحة التي تحاول الوصول لها إما لا توجد أو أنت لست مأذون لك بعرضها. +error404 = الصفحة التي تحاول الوصول لها إما غير موجودو أو أنك غير مصرح لك بعرضها. powered_by = مدعوم بواسطة %s retry = أعد المحاولة tracked_time_summary = ملخص للتتبع الزمني وفقًا لنتائج تصفية قائمة المسائل @@ -127,8 +127,8 @@ toggle_menu = تبديل القائمة more_items = عناصر اضافية copy_generic = نسخ إلى الحافظة invalid_data = بيانات غير صالحة: %v -filter.clear = مسح المرشحات -filter = مرشح +filter.clear = مسح عوامل التصفية +filter = عامل تصفية filter.is_archived = مؤرشف filter.is_template = قوالب filter.not_mirror = ليست مرايا @@ -137,13 +137,17 @@ filter.is_mirror = مرايا filter.is_fork = الاشتقاقات filter.not_fork = ليست اشتقاقات filter.not_archived = ليس مؤرشف -filter.public = علني +filter.public = عام filter.private = خاص new_repo.title = مستودع جديد new_migrate.title = انتقال جديد new_org.title = منظمة جديدة new_repo.link = مستودع جديد new_migrate.link = انتقال جديد +copy_path = نسخ المسار +test = اختبار +new_org.link = منظمة جديدة +error413 = لقد استنفدت حصتك. [install] db_name = اسم قاعدة البيانات @@ -170,7 +174,7 @@ reinstall_confirm_check_2 = وقد يلزم إعادة تزامن المستود run_user = شغّل عبر مستخدم err_admin_name_is_invalid = اسم مستخدم المدير غير صالح reinstall_confirm_check_3 = أنتِ تؤكد أنكِ متأكد تماماً من أن فورجيو يعمل مع مسار app.ini الصحيح وأنك متأكد من أنه يجب عليك إعادة تثبيته. أنت تُؤكّدُ بأنّك تُقرّ بالمخاطر السالفة الذكر. -repo_path = المسار الجذري للمستودع +repo_path = المسار الجذر للمستودع err_empty_admin_email = عنوان بريد المدير لا يمكن أن يكون فارغ. no_admin_and_disable_registration = لا يمكنك تعطيل التسجيل الذاتي للمستخدمين بدون إنشاء حساب إداري. err_admin_name_pattern_not_allowed = اسم مستخدم المدير غير صالح، هذا الأسم يطابق نمطا محجوز @@ -179,10 +183,10 @@ repo_path_helper = ستُحفظ كلّ مستودعات جِت البعيدة ف general_title = الإعدادات العامة lfs_path_helper = الملفات التي تم تعقبها بواسطة Git LFS ستُخزن في هذا الدليل. اتركه فارغًا لتعطيله. err_empty_db_path = طريق قاعدة بيانات SQLite3 لا يمكن أن يكون فارغا. -lfs_path = مسار جذر جِت LFS -app_name_helper = يمكنك إدخال اسم شركتك هنا. +lfs_path = مسار جذر Git LFS +app_name_helper = أدخل اسم المثيل هنا. سيظهر هذا الاسم في كل الصفحات. err_admin_name_is_reserved = اسم مستخدم المدير غير صالح، هذا الأسم محجوز -app_name = عنوان الموقع +app_name = عنوان المثيل log_root_path = مسار السجل log_root_path_helper = ستُكتب ملفات السجل في هذا الدليل. smtp_addr = مضيف SMTP @@ -190,7 +194,7 @@ smtp_port = منفذ SMTP mailer_password = كلمة مرور SMTP app_url_helper = العنوان الأساسي لاستنساخ عناوين URL HTTP(S) وإشعارات البريد الإلكتروني. mailer_user = اسم مستخدم SMTP -disable_gravatar.description = عطل جرافاتار والجهات الخارجية للصور الرمزية. ستُستخدم صورة رمزية مبدئية حتى يرفع المستخدم صورة. +disable_gravatar.description = عطل Gravatar والجهات الخارجية للصور الرمزية. ستُستخدم صورة رمزية مبدئية حتى يرفع المستخدم صورة. offline_mode.description = عطل خدمات توصيل المحتوى من الجهات الخارجية، واخدم كل المحتوى محلياً. run_user_helper = اسم مستخدم نظام التشغيل الذي يشغل فورجيو. ملاحظة: هذا المستخدم يجب أن يكون له حق الوصول إلى المسار الجذري للمستودع. domain = نطاق الخادم @@ -199,28 +203,28 @@ smtp_from = أرسل البريد الإلكتروني كـ federated_avatar_lookup = تفعيل الصور الرمزية الاتحادية optional_title = إعدادات اختيارية domain_helper = نطاق أو عنوان المضيف لخادمك. -mail_notify = فعّل التنبيه عبر البريد الإلكتروني -app_url = الرابط الأساس لفورجيو +mail_notify = فعّل التنبيهات عبر البريد الإلكتروني +app_url = الرابط الأساس smtp_from_helper = عنوان البريد الإلكتروني الذي سيستخدمه فورجيو. أدخل عنوان بريد إلكتروني عادي أو استخدم صيغة"Name" . ssh_port_helper = رقم المنفذ الذي يستمع له خادم SSH. اتركه فارغاً لتعطيله. -http_port_helper = المنفذ الذي سيستمع إليه خادم الويب لفورجيو. -http_port = منفذ استماع HTTP لفورجيو +http_port_helper = المنفذ الذي سيستمع إليه خادم ويب Forgejo. +http_port = منفذ استماع HTTP ssh_port = منفذ خادم SSH email_title = إعدادات البريد الإلكتروني offline_mode = فعل الوضع المحلي server_service_title = إعدادات الخادم وخدمات الجهات الخارجية register_confirm = الزم تأكيد البريد الإلكتروني للتسجيل -allow_only_external_registration.description = لا يسمح بالتسجيل إلا من خلال الخدمات الخارجية +allow_only_external_registration.description = لن يتمكن المستخدمون من إنشاء حسابات جديدة إلا باستخدام خدمات خارجية مهيأة. disable_registration = عطّل التسجيل الذاتي -federated_avatar_lookup.description = تفعيل الصور الرمزية الاتحادية باستخدام ليبرافاتار. +federated_avatar_lookup.description = تفعيل الصور الرمزية الاتحادية باستخدام Libravatar. openid_signup = فعّل التسجيل الذاتي عبر OpenID -disable_registration.description = عطل التسجيل الذاتي. المديرون فقط سيكونون قادرين على إنشاء حسابات جديدة للمستخدمين. +disable_registration.description = سيتمكن مسؤولو المثيل فقط من إنشاء حسابات مستخدمين جديدة. يوصى بشدة بإبقاء التسجيل معطلاً إلا إذا كنت تنوي استضافة مثيل عام للجميع ومستعد للتعامل مع كميات كبيرة من الحسابات غير المرغوب بها. openid_signin = فعّل تسجيل الدخول عبر OpenID openid_signin.description = فعّل تسجيل دخول المستخدمين عبر OpenID. enable_captcha = فعّل كابتشا التسجيل -enable_captcha.description = الزم وجود كابتشا للتسجيل الذاتي للمستخدمين. +enable_captcha.description = مطالبة المستخدمين باجتياز اختبار CAPTCHA من أجل إنشاء حسابات. openid_signup.description = فعّل التسجيل الذاتي للمستخدمين عبر OpenID. -require_sign_in_view = الزم تسجيل الدخول لعرض الصفحات +require_sign_in_view = يتطلب تسجيل الدخول لعرض محتوى المثيل require_sign_in_view.description = مكّن وصول الصفحات للمستخدمين فقط. لن يرى الزائرون سوى صفحات التسجيل والتسجيل. admin_setting.description = إنشاء حساب إداري هو اختياري. أول مستخدم مُسجل سيصبح تلقائيا مديرا. admin_password = كلمة المرور @@ -233,7 +237,7 @@ test_git_failed = يتعذر اختبار أمر جِت: %v confirm_password = أكّد كلمة المرور invalid_admin_setting = إعداد حساب المدير غير صالح: %v invalid_log_root_path = مسار السجل غير صالح: %v -default_enable_timetracking = فعّل تتبع الوقت مبدئيا +default_enable_timetracking = فعّل التتبع الزمني افتراضيًا env_config_keys_prompt = ستطبق المتغيرات البيئية التالية أيضاً على ملف الإعدادات: admin_title = إعدادات حساب المدير no_reply_address_helper = النطاق للمستخدمين بعنوان بريد إلكتروني مخفي. مثلاً، اسم المستخدم "sarah" سوف يسجل في جِت كـ"sarah@noreply.example.org" لو كان نطاق البريد الإلكتروني الخفي مدخل كـ"noreply.example.org". @@ -242,9 +246,9 @@ default_enable_timetracking.description = فعل تتبع الوقت للمست run_user_not_match = مستخدم التشغيل غير مطابق لأسم المستخدم الحالي: %s -> %s invalid_db_setting = إعدادات قاعدة البيانات غير صالحة: %v invalid_db_table = جدول قاعدة البيانات "%s" غير صالح: %v -default_keep_email_private.description = أخفِ عناوين البريد الإلكتروني للحسابات الجديدة مبدئيا. +default_keep_email_private.description = قم بتمكين إخفاء عنوان البريد الإلكتروني للمستخدمين الجدد افتراضيًا حتى لا يتم تسريب هذه المعلومات فور التسجيل. env_config_keys = إعدادات بيئية -default_allow_create_organization = اسمح بإنشاء المنظمات مبدئيا +default_allow_create_organization = اسمح بإنشاء المنظمات بشكل افتراضي invalid_app_data_path = مسار بيانات التطبيق غير صالح: %v enable_update_checker_helper = يفحص لإيجاد اصدارات جديدة عن طريق الإتصال بسيرفرات فورجيو. invalid_repo_path = المسار الجزري للمستودع غير صالح: %v @@ -252,10 +256,15 @@ internal_token_failed = فشل توليد الرمز الداخلي: %v no_reply_address = نطاقات البريد الإلكتروني المخفية default_keep_email_private = أخفِ عناوين البريد الإلكتروني مبدئيا admin_name = اسم مستخدم المدير -default_allow_create_organization.description = اسمح بحسابات المستخدمين الجديدة بإنشاء المنظمات مبدئيا. +default_allow_create_organization.description = السماح للمستخدمين الجدد بإنشاء منتديات المجموعة بشكل افتراضي. عند تعطيل هذا الخيار، سيتعين على المسؤول منح إذن لإنشاء منتديات المجموعة للمستخدمين الجدد. password_algorithm = خوارزمية تجزئة كلمة المرور invalid_password_algorithm = خوارزمية بصمة كلمة المرور غير صالحة password_algorithm_helper = اختر خوارزمية بصمة كلمة المرور. تختلف الخوارزميات في متطلباتها وقوتها. خوارزمية argon2 آمنة لكن تتطلب الكثير من الذاكرة ولذلك قد تكون غير ملائمة للأنظمة الصغيرة. +app_slogan_helper = أدخل شعار المثيل الخاص بك هنا. اتركه فارغاً لتعطيله. +app_slogan = شعار المثيل +allow_only_external_registration = السماح بالتسجيل عبر الخدمات الخارجية فقط +config_location_hint = سيتم حفظ خيارات التهيئة هذه في: +smtp_from_invalid = عنوان "،بريد الإرسال كـ" غير صالح [editor] buttons.list.ordered.tooltip = أضف قائمة مرقمة @@ -272,10 +281,22 @@ buttons.mention.tooltip = اذكر مستخدمًا أو فريقًا buttons.italic.tooltip = أضف نصًا مائلًا buttons.link.tooltip = اضف رابط buttons.disable_monospace_font = عطّل الخط الثابت العرض +buttons.unindent.tooltip = ‪عناصر غير متساوية من نفس المستوى +buttons.indent.tooltip = تداخل العناصر بنفس المستوى +table_modal.header = إضافة جدول +table_modal.placeholder.header = الترويسة +table_modal.placeholder.content = المحتوى +table_modal.label.rows = الصفوف +table_modal.label.columns = الأعمدة +link_modal.url = Url +link_modal.description = الوصف +buttons.new_table.tooltip = إضافة جدول +link_modal.header = إضافة رابط +link_modal.paste_reminder = تلميح: باستخدام عنوان URL في حافظتك، يمكنك اللصق مباشرةً في المحرر لإنشاء رابط. [aria] navbar = شريط التنقل -footer.software = عن البرمجية +footer.software = عن هذه البرمجية footer.links = روابط footer = الذيل @@ -1386,6 +1407,21 @@ repo.transfer.subject_to = %s يود نقل ملكية "%s" إلى %s issue.action.ready_for_review = @%[1]s علّم هذا الطلب للسحب كجاهز للمراجعة. issue_assigned.pull = @%[1]s عيّنك إلى طلب سحب %[2]s في مستودع %[3]s. issue.action.review_dismissed = @%[1]s أستبعد آخر مراجعة من %[2]s لهذا الطلب للسحب. +password_change.subject = تم تغيير كلمة مرورك +totp_disabled.subject = تم تعطيل TOTP +totp_disabled.text_1 = تم تعطيل كلمة المرور لمرة واحدة المستندة إلى الوقت (TOTP) على حسابك للتو. +totp_enrolled.text_1.has_webauthn = لقد قمت للتو بتمكين TOTP لحسابك. هذا يعني أنه بالنسبة لجميع عمليات تسجيل الدخول المستقبلية إلى حسابك، يمكنك استخدام TOTP كطريقة للمصادقة الثنائية ، أو استخدام أي من مفاتيح الأمان الخاصة بك. +totp_enrolled.subject = لقد قمت بتشيط TOTP كطريقة 2FA +removed_security_key.subject = تمت إزالة مفتاح الأمان +removed_security_key.text_1 = تم إزالة مفتاح الأمان ”%[1] s“ للتو من حسابك. +account_security_caution.text_1 = إذا كان هذا أنت، فيمكنك تجاهل هذا البريد بأمان. +totp_disabled.no_2fa = لم تعد هناك طرق أُخرى للمصادقة الثنائية (2FA) قيد التهيئة عد الآن ، أي أنه لم يعد من الضروري تسجيل الدخول إلى حسابك باستخدام المصادقة الثنائية (2FA). +removed_security_key.no_2fa = لم تعد هناك طرق أخرى للمصادقة الثنائية (2FA) قيد التهيئة بعد الآن، أي لم يعد من الضروري تسجيل الدخول إلى حسابك باستخدام المصادقة الثنائية (2FA). +primary_mail_change.subject = تم تغيير البريد الأساسي الخاص بك +password_change.text_1 = تم تغيير كلمة مرور حسابك للتو. +primary_mail_change.text_1 = تم تغيير البريد الإلكتروني الأساسي لحسابك إلى %[1]s. هذا يعني أن عنوان البريد الإلكتروني هذا لن يتلقى إشعارات البريد لحسابك بعد الآن. +account_security_caution.text_2 = إذا لم تكن أنت، فهذا يعني أن حسابك مخترق. يرجى الاتصال بمسؤولي هذا الموقع. +totp_enrolled.text_1.no_webauthn = لقد قمت للتو بتمكين TOTP لحسابك. هذا يعني أنه بالنسبة لجميع عمليات تسجيل الدخول المستقبلية إلى حسابك، يجب عليك استخدام TOTP كطريقة للمصادقة الثنائية. [error] not_found = تعذر العثور على الهدف. @@ -1421,7 +1457,7 @@ joined_on = انضم في %s user_bio = السيرة الذاتية repositories = المستودعات activity = النشاط العام -projects = مشاريع +projects = المشاريع unfollow = إلغِ المتابعة settings = إعدادات المستخدم following_few = %d يتابع @@ -1429,7 +1465,7 @@ follow = تابع followers_few = %d متابعين form.name_reserved = اسم المستخدم "%s" محجوز. email_visibility.limited = عنوان بريدك الإلكتروني ظاهر لكل المستخدمين المُستَوثَقين -code = البرمجية +code = الكود overview = نظرة عامة watched = المستودعات المشاهدة disabled_public_activity = هذا المستخدم عطّل الظهور العام للنشاط. @@ -1438,6 +1474,17 @@ email_visibility.private = عنوان بريدك الإلكتروني ظاهر starred = المستودعات المميّزة بنجمة form.name_chars_not_allowed = اسم المستخدم "%s" يحتوي على رموز غير صالحة. form.name_pattern_not_allowed = النمط "s%" غير مسموح به في إسم المستخدم. +followers.title.one = متابِع +public_activity.visibility_hint.admin_private = هذا النشاط مرئي لك لأنك مسؤول، ولكن المستخدم يريد أن يظل خاصاً. +public_activity.visibility_hint.self_private = نشاطك مرئي لك ولسُعاة المثيل فقط. تعديل الإعدادات. +followers_one = %d متابِع +following.title.one = متابعة +followers.title.few = متابعين +following_one = %d يُتابع +following.title.few = متابعة +public_activity.visibility_hint.self_public = نشاطك مرئي للجميع، باستثناء التفاعلات في المساحات الخاصة. اضبط الإعدادات. +public_activity.visibility_hint.admin_public = هذا النشاط مرئي للجميع، ولكن بصفتك مسؤولاً يمكنك أيضًا رؤية التفاعلات في المساحات الخاصة. +public_activity.visibility_hint.self_private_profile = نشاطك مرئي لك ولسُعاة المثيل فقط لأن ملفك الشخصي خاص. تعديل الإعدادات. [auth] change_unconfirmed_email_error = تعذر تغيير البريد الإلكتروني: %v @@ -1458,11 +1505,11 @@ active_your_account = فعّل حسابك register_helper_msg = هل لديك حساب بالفعل؟ سجل الدخول! manual_activation_only = تواصل مع مدير موقعك لإكمال التفعيل. must_change_password = حدّث كلمة المرور الخاصة بك -send_reset_mail = أرسل رسالة استعادة حساب +send_reset_mail = أرسل بريد الاستعادة resend_mail = اضغط هنا لإعادة إرسالة رسالة تفعيل حسابك has_unconfirmed_mail = أهلا يا %s، لديك عنوان بريد إلكتروني غير مؤكَّد (%s). إن لم تستلم رسالة تأكيد أو تريد إرسال واحدة جديدة، فنرجو الضغط على الزر الذي بالأسفل. email_not_associate = عنوان البريد هذا غير مرتبط بأي حساب. -reset_password = استعادة حساب +reset_password = استعادة الحساب oauth_signin_tab = أربط بحساب موجود invalid_password = كلمة المرور الخاصة بك لا تطابق كلمة المرور التي استخدمت لتسجيل الحساب. oauth_signin_title = سجّل الدخول لتأذن للحساب المربوط @@ -1483,13 +1530,13 @@ reset_password_wrong_user = أنت مُسجل كـ %s، لكن رابط أعاد openid_connect_title = اتصل بحساب موجود confirmation_mail_sent_prompt = تم إرسال بريد تأكيد جديد إلى %s. يرجى التأكد من صندوق بريدك في خلال %s حتى تكتمل عملية التسجيل. إذا كان عنوان البريد خاطئ، يمكنك تسجيل الدخول وطلب بريد تأكيد جديد يُرسل إلى عنوان آخر. scratch_code = رمز الخدش -invalid_code_forgot_password = رمز تأكيدك غير صحيح أو انتهى اضغط هنا للإعادة. +invalid_code_forgot_password = رمز تأكيدك غير صحيح أو انتهت صلاحيته. اضغط هنا للإعادة. openid_register_title = أنشئ حسابًا جديدًا verify = تحقق twofa_scratch_used = لقد استخدمت رمز الخدش الخاص بك. لقد تم إعادة توجيهك إلى إعدادات المصادقة الثنائية حتى يمكنك إزالة تسجيل جهازك أو توليد رمز خدش جديد. oauth_signup_submit = أكمل الحساب oauth.signin.error = كان هناك خطأ في تجهيز طلب الإذن إذا استمر هذا الخطأ، يرجى الاتصال بالمدير. -invalid_code = رمز تأكيدك غير صحيح أو انتهى. +invalid_code = رمز تأكيدك غير صحيح أو انتهت صلاحيته. oauth_signup_title = أكمل حساب جديد resent_limit_prompt = لقد طلبت بالفعل بريداً إلكترونياً للتفعيل مؤخراً من فضلك انتظر 3 دقائق وحاول مرة أخرى. reset_password_mail_sent_prompt = تم إرسال بريد تأكيد جديد إلى %s. يرجى التأكد من صندوق بريدك في خلال %s حتى تكتمل عملية استعادة الحساب. @@ -1513,6 +1560,13 @@ openid_register_desc = مسار الـOpenID المختار مجهول. اربط remember_me = تذكر هذا الجهاز remember_me.compromised = رمز الاحتفاظ بتسجيل الدخول لم يعد صالحا، مما قد يعني اختراق الحساب. نرجو مراجعة حسابك لرؤية أي نشاط غير مألوف. authorization_failed_desc = فشل التفويض لأننا اكتشفنا طلبًا غير صالح. يرجى الاتصال بمشرف التطبيق الذي حاولت ترخيصه. +sign_in_openid = المتابعة باستخدام OpenID +hint_login = لديك حساب بالفعل؟ سجّل الدخول الآن! +hint_register = يلزمك حساب ؟ سجِّل الآن. +sign_up_button = سجِّل الآن. +back_to_sign_in = العودة إلى تسجيل الدخول +use_onetime_code = استخدم رمزًا لمرة واحدة +unauthorized_credentials = بيانات الاعتماد غير صحيحة أو انتهت صلاحيتها. أعد محاولة تنفيذ الأمر أو راجع %s لمزيد من المعلومات [packages] rpm.repository.multiple_groups = هذه الحزمة متوفرة في مجموعات متعددة. @@ -1556,6 +1610,9 @@ less = أقل number_of_contributions_in_the_last_12_months = %s مساهم في آخر 12 شهر contributions_zero = بلا مساهمات more = أكثر +contributions_format = {contributions} مساهمة في {day} {month} {year} +contributions_one = المساهمة +contributions_few = المساهمات [admin] self_check.database_fix_mysql = لمستخدمين ميسكول/ماريا دي بي، يمكنك استخدام أمر "forgejo doctor convert" لإصلاح مشاكل التجمّع، أو يمكنك أيضاً إصلاح المشكلة عن طريق تعديل السيكول يدوياً. @@ -1707,7 +1764,7 @@ enterred_invalid_org_name = اسم المنظمة التي أدخلته خطأ. lang_select_error = اختر لغة من القائمة. alpha_dash_error = ` لا يجب أن يحتوي إلا على الحروف الإنجليزية والأرقام والشرطة ("-") والشرطة السفلية ("_").` alpha_dash_dot_error = ` لا يجب أن يحتوي إلا على الحروف الإنجليزية والأرقام والشرطة ("-") والشرطة السفلية ("_") والنقطة (".").` -repo_name_been_taken = اسم المستودع مستعمل بالفعل. +repo_name_been_taken = اسم المستودع مستخدم بالفعل. Email = البريد الإلكتروني auth_failed = فشل الاستيثاق: %v email_error = ` ليس عنوان بريد إلكتروني صالح.` @@ -1727,10 +1784,10 @@ still_has_org = "حسابك عضو في منظمة أو أكثر؛ غادرهم repository_files_already_exist.adopt_or_delete = الملفات موجودة بالفعل لهذا المستودع. إما اعتمادها أو حذفها. repository_files_already_exist.delete = الملفات موجودة بالفعل لهذا المستودع. يجب عليك حذفها. repository_files_already_exist.adopt = الملفات موجودة بالفعل لهذا المستودع ويمكن اعتمادها فقط. -repository_files_already_exist = الملفات موجودة بالفعل لهذا المستودع. تواصل مع مدير النظام. +repository_files_already_exist = الملفات موجودة بالفعل لهذا المستودع. اتصل بمدير النظام. TeamName = اسم الفريق username_has_not_been_changed = لم يتم تغيير اسم المستخدم -username_change_not_local_user = المستخدمين غير المحليين غير مسموح لهم بتغيير أسماؤهم. +username_change_not_local_user = المستخدمين غير المحليين غير مسموح لهم بتغيير أسمائهم. captcha_incorrect = الكابتشا خاطئة. AdminEmail = عنوان البريد الإلكتروني للمدير team_no_units_error = اسمح بالوصول إلى قسم واحد على الأقل في المستودعات. @@ -1757,6 +1814,23 @@ glob_pattern_error = `النمط الشامل غير صالح: %s.` CommitChoice = إختيار الإداع regex_pattern_error = ` نمط التعبير النمطي غير صالح: %s.` username_error = ` يُمكنه أن يحتوي على حروف إنجليزية وأرقام وشرطة ("-") وشرطة سفلية ("_") و نقطة (".") فقط. ويمكنه ان يبدأ وينتهي بحرف او برقم.` +Biography = النبذة +Website = موقع الويب +To = اسم الفرع +AccessToken = رمز الوصول +repository_force_private = وضع الخاص الإجباري مفعّل: لا يمكن تحويل المستودعات الخاصة إلى عامة. +FullName = الاسم الكامل +Description = الوصف +Pronouns = الضمائر +username_claiming_cooldown = لا يمكن المطالبة باسم المستخدم، لأن فترة تباطؤه لم تنتهِ بعد. يمكن المطالبة به عند %[1]s. +Location = الموقع +invalid_group_team_map_error = ` التعيين غير صالح: %s ` +visit_rate_limit = تناولت الزيارة عن بُعد الحد من معدلها. +email_domain_is_not_allowed = نطاق البريد الإلكتروني للمستخدم %s يتعارض مع قائمة النطاقات المسموحة ، أو الممنوعة. يرجى التأكد من إدخال عنوان البريد الإلكتروني بشكل صحيح. +unset_password = المستخدم المسجل لم يقم بتعيين كلمة مرور. +unsupported_login_type = نوع تسجيل الدخول غير مدعوم لحذف الحساب. +invalid_ssh_principal = أصل غير صالح: %s +required_prefix = المُدخل يجب أن يبدأ مع "%s" [home] filter = تصفيات أخرى @@ -1803,6 +1877,10 @@ code_no_results = لم يتم العثور على برمجية تطابق الب relevant_repositories_tooltip = تم أخفاء المستودعات التي هي مشتقات وأيضاً التي ليس لها موضوع، ولا أيقونة، ولا يوجد وصف. relevant_repositories = يتم اظهار المستودعات المتعلقة فقط. أظهر النتائج غير المصفاة. code_last_indexed_at = فُهرس آخر مرة %s +stars_few = %d نجوم +forks_one = %d نسخة +forks_few = %d نُسَخ +stars_one = %d نجمة [actions] variables.none = لا توجد متغيرات بعد. @@ -1976,7 +2054,7 @@ component_failed_to_load = حدث خطأ غير متوقع. [search] org_kind = بحث في المنظمات… code_search_unavailable = البحث في الكود غير متوفر حاليًا. يرجى الاتصال بمدير الموقع. -search = ابحث... +search = البحث… type_tooltip = نوع البحث fuzzy = أجعد fuzzy_tooltip = قم بتضمين النتائج التي تتطابق أيضًا مع مصطلح البحث بشكل وثيق @@ -1985,10 +2063,19 @@ match_tooltip = قم بتضمين النتائج التي تطابق مصطلح repo_kind = بحث في المستودعات… user_kind = بحث عن المستخدمين… team_kind = بحث عن الفرق… -code_kind = بحث في الكود… +code_kind = بحث ضمن الكود… project_kind = البحث ضمن المشاريع… branch_kind = البحث ضمن الفروع… no_results = لا توجد نتائج مطابقة. issue_kind = البحث ضمن الأعطال… pull_kind = البحث ضمن طلبات السحب… keyword_search_unavailable = البحث من خلال الكلمات المفتاحية ليس متوفر حالياً. رجاءاً تواصل مع مشرف الموقع. +package_kind = البحث ضمن الحزم… +regexp_tooltip = تعامل مع عبارة البحث على أنها تعبير نمطي +commit_kind = البحث ضمن الإيداعات… +union = مطابقة عامة +runner_kind = البحث ضمن المشغِّلات… +exact = مطابق +exact_tooltip = عرض النتائج التي تطابق مصطلح البحث بالضبط فقط +regexp = RegExp +union_tooltip = عرض النتائج التي تطابق أي من الكلمات المفتاحية المفصولة بمسافات diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 8f4dfda0d1..84bb4ccde1 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -251,12 +251,12 @@ db_schema_helper=Leer lassen, um den Datenbank-Standardwert („public“) zu ve ssl_mode=SSL path=Pfad sqlite_helper=Dateipfad zur SQLite3-Datenbank.
Gib einen absoluten Pfad an, wenn Forgejo als Service gestartet wird. -reinstall_error=Du versuchst, in eine bereits existierende Forgejo Datenbank zu installieren +reinstall_error=Du versuchst, in eine bereits existierende Forgejo-Datenbank zu installieren reinstall_confirm_message=Eine Neuinstallation mit einer bestehenden Forgejo-Datenbank kann mehrere Probleme verursachen. In den meisten Fällen solltest du deine vorhandene „app.ini“ verwenden, um Forgejo auszuführen. Wenn du weißt, was du tust, bestätige die folgenden Angaben: reinstall_confirm_check_1=Die von der SECRET_KEY in app.ini verschlüsselten Daten können verloren gehen: Benutzer können sich unter Umständen nicht mit 2FA/OTP einloggen und Spiegel könnten nicht mehr richtig funktionieren. Mit der Ankreuzung dieses Kästchens bestätigst du, dass die aktuelle app.ini-Datei den korrekten SECRET_KEY enthält. reinstall_confirm_check_2=Die Repositorys und Einstellungen müssen eventuell neu synchronisiert werden. Durch das Ankreuzen dieses Kästchens bestätigst du, dass du die Hooks für die Repositorys und die authorized_keys-Datei manuell neu synchronisierst. Du bestätigst, dass du sicherstellst, dass die Repository- und Spiegeleinstellungen korrekt sind. reinstall_confirm_check_3=Du bestätigst, dass du absolut sicher bist, dass diese Forgejo mit der richtigen app.ini läuft, und du sicher bist, dass du neu installieren musst. Du bestätigst, dass du die oben genannten Risiken anerkennst. -err_empty_db_path=Der SQLite3 Datenbankpfad darf nicht leer sein. +err_empty_db_path=Der SQLite3-Datenbankpfad darf nicht leer sein. no_admin_and_disable_registration=Du kannst Selbst-Registrierungen nicht deaktivieren, ohne ein Administratorkonto zu erstellen. err_empty_admin_password=Das Administrator-Passwort darf nicht leer sein. err_empty_admin_email=Die Administrator-E-Mail darf nicht leer sein. @@ -463,7 +463,7 @@ openid_register_title=Neues Konto einrichten openid_register_desc=Die gewählte OpenID-URI ist unbekannt. Ordne sie hier einem neuen Account zu. openid_signin_desc=Gib deine OpenID-URI ein, zum Beispiel alice.openid.example.org oder https://openid.example.org/alice. disable_forgot_password_mail=Die Kontowiederherstellung ist deaktiviert, da keine E-Mail eingerichtet ist. Bitte kontaktiere den zuständigen Administrator. -disable_forgot_password_mail_admin=Die Kontowiederherstellung ist nur verfügbar, wenn eine E-Mail eingerichtet wurde. Bitte richte eine E-Mail Adresse ein, um die Kontowiederherstellung freizuschalten. +disable_forgot_password_mail_admin=Die Kontowiederherstellung ist nur verfügbar, wenn eine E-Mail eingerichtet wurde. Bitte richte eine E-Mail-Adresse ein, um die Kontowiederherstellung freizuschalten. email_domain_blacklisted=Du kannst dich nicht mit deiner E-Mail-Adresse registrieren. authorize_application=Anwendung autorisieren authorize_redirect_notice=Du wirst zu %s weitergeleitet, wenn du diese Anwendung autorisierst. @@ -530,8 +530,8 @@ issue.action.merge=@%[1]s hat #%[2]d in %[3]s zusammengeführt. issue.action.approve=@%[1]s hat diesen Pull-Request genehmigt. issue.action.reject=@%[1]s hat Änderungen auf diesem Pull-Request angefordert. issue.action.review=@%[1]s hat diesen Pull-Request kommentiert. -issue.action.review_dismissed=@%[1]s hat das letzte Review von %[2]s für diesen Pull-Request verworfen. -issue.action.ready_for_review=@%[1]s hat diesen Pull-Request zum Review freigegeben. +issue.action.review_dismissed=@%[1]s hat die letzte Sichtung von %[2]s für diesen Pull-Request verworfen. +issue.action.ready_for_review=@%[1]s hat diesen Pull-Request für die Sichtung freigegeben. issue.action.new=@%[1]s hat #%[2]d geöffnet. issue.in_tree_path=In %s: @@ -540,8 +540,8 @@ release.new.text=@%[1]s hat %[2]s in %[3]s released release.title=Titel: %s release.note=Anmerkung: release.downloads=Downloads: -release.download.zip=Quellcode (ZIP Datei) -release.download.targz=Quellcode (TAR.GZ Datei) +release.download.zip=Quellcode (ZIP) +release.download.targz=Quellcode (TAR.GZ) repo.transfer.subject_to=%s möchte „%s“ an %s übertragen repo.transfer.subject_to_you=%s möchte dir „%s“ übertragen @@ -787,7 +787,7 @@ comment_type_group_time_tracking=Zeiterfassung comment_type_group_deadline=Frist comment_type_group_dependency=Abhängigkeit comment_type_group_lock=Sperrstatus -comment_type_group_review_request=Angeforderte Reviews +comment_type_group_review_request=Angeforderte Sichtungen comment_type_group_pull_request_push=Hinzugefügte Commits comment_type_group_project=Projekt comment_type_group_issue_ref=Issue-Referenz @@ -873,7 +873,7 @@ gpg_key_matched_identities_long=Die eingebetteten Identitäten in diesem Schlüs gpg_key_verified=Verifizierter Schlüssel gpg_key_verified_long=Der Schlüssel wurde mit einem Token verifiziert. Er kann verwendet werden, um Commits zu verifizieren, die mit irgendeiner für diesen Nutzer aktivierten E-Mail-Adresse und irgendeiner Identität dieses Schlüssels übereinstimmen. gpg_key_verify=Verifizieren -gpg_invalid_token_signature=Der GPG-Key, die Signatur, und das Token stimmen nicht überein, oder das Token ist veraltet. +gpg_invalid_token_signature=Der GPG-Key, die Signatur und das Token stimmen nicht überein, oder das Token ist veraltet. gpg_token_required=Du musst eine Signatur für das folgende Token angeben gpg_token=Token gpg_token_help=Du kannst eine Signatur wie folgt generieren: @@ -902,10 +902,10 @@ add_principal_success=Die SSH-Zertifikatsidentität „%s“ wurde hinzugefügt. delete_key=Entfernen ssh_key_deletion=SSH-Schlüssel entfernen gpg_key_deletion=GPG-Schlüssel entfernen -ssh_principal_deletion=SSH-Zertifik-Identität entfernen +ssh_principal_deletion=SSH-Zertifikats-Principal entfernen ssh_key_deletion_desc=Wenn du einen SSH-Key entfernst, hast du mit diesem Key keinen Zugriff mehr. Fortfahren? gpg_key_deletion_desc=Wenn du einen GPG-Schlüssel entfernst, können damit unterschriebene Commits nicht mehr verifiziert werden. Fortfahren? -ssh_principal_deletion_desc=Das Entfernen einer SSH-Zertifikat-Identität entzieht den Zugriff auf dein Konto. Fortfahren? +ssh_principal_deletion_desc=Das Entfernen eines SSH-Zertifikats-Principals entzieht den Zugriff auf dein Konto. Fortfahren? ssh_key_deletion_success=Der SSH-Schlüssel wurde entfernt. gpg_key_deletion_success=Der GPG-Schlüssel wurde entfernt. ssh_principal_deletion_success=Die Identität wurde entfernt. @@ -931,7 +931,7 @@ unbind_success=Das soziale Konto wurde erfolgreich entfernt. manage_access_token=Zugriffstokens generate_new_token=Neuen Token erzeugen -tokens_desc=Diese Tokens gewähren vollen Zugriff auf dein Konto via die Forgejo-API. +tokens_desc=Diese Tokens gewähren vollen Zugriff auf dein Konto mit der Forgejo-API. token_name=Token-Name generate_token=Token generieren generate_token_success=Ein neuer Token wurde generiert. Kopiere diesen jetzt, da er nicht erneut angezeigt wird. @@ -970,8 +970,8 @@ save_application=Speichern oauth2_client_id=Client-ID oauth2_client_secret=Client-Geheimnis oauth2_regenerate_secret=Geheimnis neu generieren -oauth2_regenerate_secret_hint=Secret verloren? -oauth2_client_secret_hint=Das Secret wird nach dem Verlassen oder Aktualisieren dieser Seite nicht mehr angezeigt. Bitte stelle sicher, dass du es gespeichert hast. +oauth2_regenerate_secret_hint=Geheimnis verloren? +oauth2_client_secret_hint=Das Geheimnis wird nach dem Verlassen oder Aktualisieren dieser Seite nicht mehr angezeigt. Bitte stelle sicher, dass du es gespeichert hast. oauth2_application_edit=Bearbeiten oauth2_application_create_description=OAuth2-Anwendungen geben deiner Drittanwendung Zugriff auf Benutzeraccounts dieser Forgejo-Instanz. oauth2_application_remove_description=Das Entfernen einer OAuth2-Anwendung hat zur Folge, dass diese nicht mehr auf autorisierte Benutzeraccounts auf dieser Instanz zugreifen kann. Möchtest Du fortfahren? @@ -996,11 +996,11 @@ twofa_disable_desc=Wenn du die Zwei-Faktor-Authentifizierung deaktivierst, wird regenerate_scratch_token_desc=Wenn du deinen Wiederherstellungsschlüssel verlegst oder es bereits benutzt hast, kannst du es hier zurücksetzen. twofa_disabled=Zwei-Faktor-Authentifizierung wurde deaktiviert. scan_this_image=Scanne diese Grafik mit deiner Authentifizierungs-App: -or_enter_secret=Oder gib das Secret ein: %s +or_enter_secret=Oder gib das Geheimnis ein: %s then_enter_passcode=Und gib dann die angezeigte PIN der Anwendung ein: passcode_invalid=Die PIN ist falsch. Probiere es erneut. twofa_enrolled=Die Zwei-Faktor-Authentifizierung wurde für dein Konto aktiviert. Bewahre deinen einmalig verwendbaren Wiederherstellungsschlüssel (%s) an einem sicheren Ort auf, da er nicht wieder angezeigt werden wird. -twofa_failed_get_secret=Fehler beim Abrufen des Secrets. +twofa_failed_get_secret=Fehler beim Abrufen des Geheimnisses. webauthn_desc=Sicherheitsschlüssel sind Geräte, die kryptografische Schlüssel beeinhalten. Diese können für die Zwei-Faktor-Authentifizierung verwendet werden. Der Sicherheitsschlüssel muss den Standard „WebAuthn“ unterstützen. webauthn_register_key=Sicherheitsschlüssel hinzufügen @@ -1185,9 +1185,9 @@ blame.ignore_revs=Revisionen in .git-blame-ignore-revs werden i blame.ignore_revs.failed=Fehler beim Ignorieren der Revisionen in .git-blame-ignore-revs. author_search_tooltip=Zeigt maximal 30 Benutzer -tree_path_not_found_commit=Pfad %[1]s existiert nicht in Commit%[2]s -tree_path_not_found_branch=Pfad %[1]s existiert nicht in Branch %[2]s -tree_path_not_found_tag=Pfad %[1]s existiert nicht in Tag %[2]s +tree_path_not_found_commit=Pfad %[1]s existiert nicht im Commit %[2]s +tree_path_not_found_branch=Pfad %[1]s existiert nicht im Branch %[2]s +tree_path_not_found_tag=Pfad %[1]s existiert nicht im Tag %[2]s transfer.accept=Übertragung akzeptieren transfer.accept_desc=Übertragung nach „%s“ @@ -1248,7 +1248,7 @@ migrate.clone_local_path=oder ein lokaler Serverpfad migrate.permission_denied=Du hast keine Berechtigung zum Importieren lokaler Repositorys. migrate.permission_denied_blocked=Du kannst von keinen nicht erlaubten Hosts importieren. Bitte fragen deinen Administrator, die Einstellungen ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS zu überprüfen. migrate.invalid_local_path=Der lokale Pfad ist ungültig. Er existiert nicht oder ist kein Verzeichnis. -migrate.invalid_lfs_endpoint=Ungültiger LFS Endpunkt. +migrate.invalid_lfs_endpoint=Der LFS-Endpunkt ist nicht gültig. migrate.failed=Fehler bei der Migration: %v migrate.migrate_items_options=Zugangs-Token wird benötigt, um zusätzliche Elemente zu migrieren migrated_from=Migriert von %[2]s @@ -1324,7 +1324,7 @@ commit=Commit release=Release releases=Releases tag=Tag -released_this=hat released +released_this=hat releast tagged_this=hat getaggt file.title=%s an %s file_raw=Originalformat @@ -1448,7 +1448,7 @@ commits.older=Älter commits.newer=Neuer commits.signed_by=Signiert von commits.signed_by_untrusted_user=Signiert von nicht vertrauenswürdigen Benutzern -commits.signed_by_untrusted_user_unmatched=Signiert von nicht vertrauenswürdigen Benutzern, der nicht mit dem Committer übereinstimmt +commits.signed_by_untrusted_user_unmatched=Von einem nicht vertrauenswürdigen Benutzer, der nicht auf den Committer passt, signiert commits.gpg_key_id=GPG-Schlüssel-ID commits.ssh_key_fingerprint=SSH-Schlüssel-Fingerabdruck commits.view_path=An diesem Punkt im Verlauf anzeigen @@ -1459,7 +1459,7 @@ commit.revert-header=Setze zurück: %s commit.revert-content=Branch auswählen, der zurückgesetzt werden soll: commit.cherry-pick=Cherry-Pick commit.cherry-pick-header=Cherry-Picke: %s -commit.cherry-pick-content=Branch auswählen, auf dem Cherry-Picked werden soll: +commit.cherry-pick-content=Branch auswählen, zu dem das Ergebnis des Cherry-Picks angewendet werden soll: commitstatus.error=Fehler commitstatus.failure=Fehler @@ -1515,7 +1515,7 @@ issues.filter_assignees=Verantwortliche filtern issues.filter_milestones=Meilenstein filtern issues.filter_projects=Projekt filtern issues.filter_labels=Label filtern -issues.filter_reviewers=Reviewer filtern +issues.filter_reviewers=Sichter filtern issues.new=Neues Issue issues.new.title_empty=Der Titel kann nicht leer sein issues.new.labels=Labels @@ -1535,7 +1535,7 @@ issues.new.closed_milestone=Geschlossene Meilensteine issues.new.assignees=Zuständige issues.new.clear_assignees=Zuständige entfernen issues.new.no_assignees=Niemand zuständig -issues.new.no_reviewers=Keine Reviewer +issues.new.no_reviewers=Keine Sichter issues.choose.get_started=Los geht's issues.choose.open_external_link=Öffnen issues.choose.blank=Standard @@ -1598,8 +1598,8 @@ issues.filter_type.all_issues=Alle Issues issues.filter_type.assigned_to_you=Dir zugewiesen issues.filter_type.created_by_you=Von dir erstellt issues.filter_type.mentioning_you=Hat dich erwähnt -issues.filter_type.review_requested=Review angefordert -issues.filter_type.reviewed_by_you=Von dir gereviewt +issues.filter_type.review_requested=Sichtung angefordert +issues.filter_type.reviewed_by_you=Von dir gesichtet issues.filter_sort=Sortieren issues.filter_sort.latest=Neueste issues.filter_sort.oldest=Älteste @@ -1621,8 +1621,8 @@ issues.action_milestone=Meilenstein issues.action_milestone_no_select=Kein Meilenstein issues.action_assignee=Zuständig issues.action_assignee_no_select=Niemand zuständig -issues.action_check=Auswählen/Auswahl aufheben -issues.action_check_all=Alles auswählen/Auswahl aufheben +issues.action_check=Auswählen / Auswahl aufheben +issues.action_check_all=Alles auswählen / Auswahl aufheben issues.opened_by=%[1]s von %[3]s geöffnet pulls.merged_by=von %[3]s wurde %[1]s zusammengeführt pulls.merged_by_fake=von %[2]s %[1]s zusammengeführt @@ -1673,12 +1673,12 @@ issues.role.first_time_contributor=Erstmaliger Mitwirkender issues.role.first_time_contributor_helper=Dies ist der erste Beitrag dieses Benutzers zum Repository. issues.role.contributor=Mitwirkender issues.role.contributor_helper=Dieser Benutzer hat schon zuvor zu dem Repository beigetragen. -issues.re_request_review=Review erneut anfordern -issues.is_stale=Seit diesem Review gab es Änderungen an diesem PR -issues.remove_request_review=Review-Anfrage entfernen -issues.remove_request_review_block=Review-Anfrage kann nicht entfernt werden -issues.dismiss_review=Review verwerfen -issues.dismiss_review_warning=Bist du dir sicher, dass du dieses Review verwerfen willst? +issues.re_request_review=Sichtung erneut anfordern +issues.is_stale=Seit dieser Sichtung gab es Änderungen an diesem PR +issues.remove_request_review=Sichtungsanfrage entfernen +issues.remove_request_review_block=Sichtungsanfrage kann nicht entfernt werden +issues.dismiss_review=Sichtung verwerfen +issues.dismiss_review_warning=Bist du dir sicher, dass du diese Sichtung verwerfen willst? issues.sign_in_require_desc=Anmelden, um an der Diskussion teilzunehmen. issues.edit=Bearbeiten issues.cancel=Abbrechen @@ -1809,20 +1809,20 @@ issues.dependency.add_error_dep_not_same_repo=Beide Issues müssen sich im selbe issues.review.self.approval=Du kannst nicht dein eigenen Pull-Request genehmigen. issues.review.self.rejection=Du kannst keine Änderungen an deinem eigenen Pull-Request anfragen. issues.review.approve=hat die Änderungen %s genehmigt -issues.review.comment=hat %s gereviewt +issues.review.comment=hat %s gesichtet issues.review.dismissed=verwarf %ss Review %s issues.review.dismissed_label=Verworfen issues.review.left_comment=hat einen Kommentar hinterlassen issues.review.content.empty=Du musst einen Kommentar hinterlassen, der die gewünschte(n) Änderung(en) beschreibt. issues.review.reject=hat %s Änderungen angefragt -issues.review.wait=wurde für ein Review %s angefragt -issues.review.add_review_request=hat ein Review von %[1]s %[2]s angefragt -issues.review.remove_review_request=hat die Aufforderung zum Review an %[1]s %[2]s entfernt -issues.review.remove_review_request_self=hat das Review verweigert %s +issues.review.wait=wurde für eine Sichtung von %s angefragt +issues.review.add_review_request=hat eine Sichtung von %[1]s %[2]s angefragt +issues.review.remove_review_request=hat die Sichtungsanfrage an %[1]s %[2]s entfernt +issues.review.remove_review_request_self=hat die Sichtung %s verweigert issues.review.pending=Ausstehend issues.review.pending.tooltip=Dieser Kommentar ist derzeit nicht für andere Benutzer sichtbar. Um deine ausstehenden Kommentare einzureichen, wähle „%s“ -> „%s/%s/%s“ oben auf der Seite. issues.review.review=Review -issues.review.reviewers=Reviewer +issues.review.reviewers=Sichter issues.review.outdated=Veraltet issues.review.outdated_description=Der Inhalt hat sich geändert, seit dieser Kommentar abgegeben wurde issues.review.option.show_outdated_comments=Veraltete Kommentare anzeigen @@ -1833,7 +1833,7 @@ issues.review.show_resolved=Erledigte anzeigen issues.review.hide_resolved=Erledigte ausblenden issues.review.resolve_conversation=Diskussion als „erledigt“ markieren issues.review.un_resolve_conversation=Diskussion als „nicht erledigt“ markieren -issues.review.resolved_by=markierte diese Unterhaltung als gelöst +issues.review.resolved_by=markierte diese Unterhaltung als „erledigt“ issues.assignee.error=Aufgrund eines unerwarteten Fehlers konnten nicht alle Zuständigen hinzugefügt werden. issues.reference_issue.body=Beschreibung issues.content_history.deleted=gelöscht @@ -1847,7 +1847,7 @@ issues.reference_link=Referenz: %s compare.compare_base=Basis compare.compare_head=vergleichen -pulls.desc=Pull-Requests und Code-Reviews aktivieren. +pulls.desc=Pull-Requests und Code-Sichtungen aktivieren. pulls.new=Neuer Pull-Request pulls.view=Pull-Request ansehen pulls.compare_changes=Neuer Pull-Request @@ -1856,7 +1856,7 @@ pulls.allow_edits_from_maintainers_desc=Nutzer mit Schreibzugriff auf den Basisb pulls.allow_edits_from_maintainers_err=Aktualisieren fehlgeschlagen pulls.compare_changes_desc=Wähle den Zielbranch, in das zusammengeführt werden soll, und den Quellbranch, von dem gepullt werden soll, aus. pulls.has_viewed_file=Gesehen -pulls.has_changed_since_last_review=Seit deinem letzten Review geändert +pulls.has_changed_since_last_review=Seit deiner letzten Sichtung geändert pulls.viewed_files_label=%[1]d / %[2]d Dateien betrachtet pulls.expand_files=Alle Dateien ausklappen pulls.collapse_files=Alle Dateien einklappen @@ -1867,11 +1867,11 @@ pulls.switch_head_and_base=Head und Base vertauschen pulls.filter_branch=Branch filtern pulls.no_results=Keine Ergebnisse verfügbar. pulls.show_all_commits=Alle Commits anzeigen -pulls.show_changes_since_your_last_review=Zeige Änderungen seit deinem letzten Review +pulls.show_changes_since_your_last_review=Zeige Änderungen seit deiner letzten Sichtung pulls.showing_only_single_commit=Nur Änderungen aus Commit %[1]s werden angezeigt pulls.showing_specified_commit_range=Zeige nur die Änderungen zwischen %[1]s..%[2]s pulls.select_commit_hold_shift_for_range=Commit auswählen. Halte Shift + klicke, um eine Reihe auszuwählen -pulls.review_only_possible_for_full_diff=Ein Review ist nur möglich, wenn das vollständige Diff angezeigt wird +pulls.review_only_possible_for_full_diff=Eine Sichtung ist nur möglich, wenn der vollständige Diff angezeigt wird pulls.filter_changes_by_commit=Nach Commit filtern pulls.nothing_to_compare=Diese Branches sind identisch. Es muss kein Pull-Request erstellt werden. pulls.nothing_to_compare_and_allow_empty_pr=Diese Branches sind gleich. Der Pull-Request wird leer sein. @@ -1905,8 +1905,8 @@ pulls.required_status_check_failed=Einige erforderliche Prüfungen waren nicht e pulls.required_status_check_missing=Einige erforderliche Prüfungen fehlen. pulls.required_status_check_administrator=Als Administrator kannst du diesen Pull-Request weiterhin zusammenführen. pulls.blocked_by_approvals=Dieser Pull-Request hat noch nicht genügend Genehmigungen. %d von %d Genehmigungen erteilt. -pulls.blocked_by_rejection=Dieser Pull-Request hat Änderungen, die von einem offiziellen Reviewer angefragt wurden. -pulls.blocked_by_official_review_requests=Dieser Pull-Request ist blockiert, weil ihm die Genehmigung von einem oder mehreren offiziellen Reviewern fehlt. +pulls.blocked_by_rejection=Dieser Pull-Request hat Änderungen, die von einem offiziellen Sichter angefragt wurden. +pulls.blocked_by_official_review_requests=Dieser Pull-Request ist blockiert, weil ihm die Genehmigung von einem oder mehreren offiziellen Sichtern fehlt. pulls.blocked_by_outdated_branch=Dieser Pull-Request ist blockiert, da er veraltet ist. pulls.blocked_by_changed_protected_files_1=Dieser Pull-Request ist blockiert, weil er eine geschützte Datei ändert: pulls.blocked_by_changed_protected_files_n=Dieser Pull-Request ist blockiert, weil er geschützte Dateien ändert: @@ -1919,14 +1919,14 @@ pulls.approve_count_1=%d Genehmigung pulls.approve_count_n=%d Genehmigungen pulls.reject_count_1=%d Änderungsanfrage pulls.reject_count_n=%d Änderungsanfragen -pulls.waiting_count_1=%d wartendes Review -pulls.waiting_count_n=%d wartende Reviews +pulls.waiting_count_1=%d wartende Sichtung +pulls.waiting_count_n=%d wartende Sichtungen pulls.wrong_commit_id=die Commit-ID muss eine Commit-ID auf dem Zielbranch sein pulls.no_merge_desc=Dieser Pull-Request kann nicht zusammengeführt werden, da alle Repository-Merge-Optionen deaktiviert sind. pulls.no_merge_helper=Aktiviere Mergeoptionen in den Repositoryeinstellungen oder führe den Pull-Request manuell zusammen. pulls.no_merge_wip=Dieser Pull-Request kann nicht zusammengeführt werden, da er als „Work in Progress“ (in Bearbeitung) markiert ist. -pulls.no_merge_not_ready=Dieser Pull-Request kann nicht zusammengeführt werden, überprüfe den Reviewstatus und die Statusprüfungen. +pulls.no_merge_not_ready=Dieser Pull-Request kann nicht zusammengeführt werden, überprüfe den Sichtungsstatus und die Statusprüfungen. pulls.no_merge_access=Du bist nicht berechtigt, diesen Pull-Request zusammenzuführen. pulls.merge_pull_request=Merge-Commit erstellen pulls.rebase_merge_pull_request=Rebasen und dann fast-forwarden @@ -2202,7 +2202,7 @@ settings.tracker_issue_style.numeric=Numerisch settings.tracker_issue_style.alphanumeric=Alphanumerisch settings.tracker_issue_style.regexp=Regulärer Ausdruck settings.tracker_issue_style.regexp_pattern=Regulärer Ausdruck -settings.tracker_issue_style.regexp_pattern_desc=Die erste gecapturte Gruppe wird statt {index} verwendet. +settings.tracker_issue_style.regexp_pattern_desc=Die erste gefundene Gruppe wird statt {index} verwendet. settings.tracker_url_format_desc=Du kannst die Platzhalter {user}, {repo}, {index} für den Benutzernamen, den Namen des Repositorys und die Issue-Nummer verwenden. settings.enable_timetracker=Zeiterfassung aktivieren settings.allow_only_contributors_to_track_time=Nur Mitarbeitern erlauben, die Zeiterfassung zu nutzen @@ -2261,14 +2261,14 @@ settings.trust_model.collaborator=Mitarbeiter settings.trust_model.collaborator.long=Mitarbeiter: Vertraue Signaturen von Mitarbeitern settings.trust_model.collaborator.desc=Gültige Signaturen von Mitarbeitern dieses Projekts werden als „vertrauenswürdig“ markiert (egal, ob sie mit dem Committer übereinstimmen oder nicht). Andernfalls werden gültige Signaturen als „nicht vertrauenswürdig“ markiert, falls die Signatur zum Committer passt, ansonsten werden sie als „nicht übereinstimmend“ markiert. settings.trust_model.committer=Committer -settings.trust_model.committer.long=Committer: Vertraue Signaturen, die zu Committern passen (Dies stimmt mit GitHub überein und zwingt signierte Commits von Forgejo dazu, Forgejo als Committer zu haben) +settings.trust_model.committer.long=Committer: Vertraue Signaturen, die zu Committern passen (dies stimmt mit GitHub überein und zwingt signierte Commits von Forgejo dazu, Forgejo als Committer zu haben) settings.trust_model.committer.desc=Gültige Signaturen werden nur dann als „vertrauenswürdig“ gekennzeichnet, wenn sie mit ihrem Committer übereinstimmen. Ansonsten werden sie als „nicht übereinstimmend“ markiert. Das führt dazu, dass Forgejo auf signierten Commits, bei denen der echte Committer als „Co-authored-by:“ oder „Co-committed-by:“ in der Beschreibung eingetragen wurde, als Committer gilt. Der Forgejo-Standard-Key muss zu einem Benutzer in der Datenbank passen. settings.trust_model.collaboratorcommitter=Mitarbeiter+Committer settings.trust_model.collaboratorcommitter.long=Mitarbeiter+Committer: Signaturen der Mitarbeiter vertrauen die mit dem Committer übereinstimmen settings.trust_model.collaboratorcommitter.desc=Gültige Signaturen von Mitarbeitern dieses Projekts werden als „vertrauenswürdig“ markiert, wenn sie mit dem Committer übereinstimmen. Andernfalls werden gültige Signaturen als „nicht vertrauenswürdig“ markiert, wenn die Signatur mit dem Committer übereinstimmt. Ansonsten werden sie als „nicht übereinstimmend“ markiert. Dies zwingt Forgejo, als Committer bei signierten Commits mit dem echten Committer als „Co-Authored-By:“ und „Co-Committed-By:“ im Commit zu markieren. Der Standard-Forgejo-Schlüssel muss mit einem Benutzer in der Datenbank übereinstimmen. settings.wiki_delete=Wiki-Daten löschen settings.wiki_delete_desc=Das Löschen von Wiki-Daten kann nicht rückgängig gemacht werden. Bitte sei vorsichtig. -settings.wiki_delete_notices_1=– Dies löscht und deaktiviert das Wiki für %s. +settings.wiki_delete_notices_1=– Dies wird das Repository-Wiki für %s dauerhaft löschen und deaktivieren. settings.confirm_wiki_delete=Wiki-Daten löschen settings.wiki_deletion_success=Repository-Wiki-Daten wurden gelöscht. settings.delete=Dieses Repository löschen @@ -2327,7 +2327,7 @@ settings.add_webhook_desc=Forgejo sendet eine POST-Anfrage mit fest settings.payload_url=Ziel-URL settings.http_method=HTTP-Methode settings.content_type=POST-Content-Type -settings.secret=Secret +settings.secret=Geheimnis settings.slack_username=Benutzername settings.slack_icon_url=Icon-URL settings.slack_color=Farbe @@ -2374,12 +2374,12 @@ settings.event_pull_request_milestone=Meilensteine settings.event_pull_request_milestone_desc=Meilenstein hinzugefügt, entfernt oder bearbeitet. settings.event_pull_request_comment=Kommentare settings.event_pull_request_comment_desc=Pull-Request-Kommentar angelegt, geändert oder gelöscht. -settings.event_pull_request_review=Reviews -settings.event_pull_request_review_desc=Pull-Request genehmigt, abgelehnt oder Review-Kommentare hinterlassen. +settings.event_pull_request_review=Sichtungen +settings.event_pull_request_review_desc=Pull-Request genehmigt, abgelehnt oder Sichtungskommentare hinterlassen. settings.event_pull_request_sync=Synchronisiert settings.event_pull_request_sync_desc=Branch automatisch mit Zielbranch aktualisiert. -settings.event_pull_request_review_request=Review-Anfragen -settings.event_pull_request_review_request_desc=Überprüfung des Pull-Requests angefragt oder die Anfrage entfernt. +settings.event_pull_request_review_request=Sichtungsanfragen +settings.event_pull_request_review_request_desc=Pull-Request-Sichtung angefragt oder Sichtungsanfrage entfernt. settings.event_pull_request_approvals=Genehmigungen zum Pull-Request settings.event_pull_request_merge=Pull-Request-Merge settings.event_package=Paket @@ -2467,11 +2467,11 @@ settings.protect_status_check_matched=Übereinstimmung settings.protect_invalid_status_check_pattern=Ungültiges Statusprüfungspattern: „%s“. settings.protect_no_valid_status_check_patterns=Keine gültigen Statuscheck-Muster. settings.protect_required_approvals=Erforderliche Genehmigungen -settings.protect_required_approvals_desc=Erlaube das Zusammenführen des Pull-Requests nur mit genügend positiven Reviews. +settings.protect_required_approvals_desc=Erlaube das Zusammenführen des Pull-Requests nur mit genügend positiven Sichtungen. settings.protect_approvals_whitelist_enabled=Genehmigungen auf Benutzer oder Teams auf der Positivliste beschränken -settings.protect_approvals_whitelist_enabled_desc=Nur Reviews von Benutzern oder Teams auf der Positivliste zählen zu den erforderlichen Genehmigungen. Existiert keine Positivliste, so zählen Reviews von jedem mit Schreibzugriff zu den erforderlichen Genehmigungen. -settings.protect_approvals_whitelist_users=Nutzer, die reviewen dürfen -settings.protect_approvals_whitelist_teams=Teams, die reviewen dürfen +settings.protect_approvals_whitelist_enabled_desc=Nur Sichtungen von Benutzern oder Teams auf der Positivliste zählen zu den erforderlichen Genehmigungen. Existiert keine Positivliste, so zählen Sichtungen von jedem mit Schreibzugriff zu den erforderlichen Genehmigungen. +settings.protect_approvals_whitelist_users=Nutzer, die sichten dürfen +settings.protect_approvals_whitelist_teams=Teams, die sichten dürfen settings.dismiss_stale_approvals=Entferne alte Genehmigungen settings.dismiss_stale_approvals_desc=Wenn neue Commits gepusht werden, die den Inhalt des Pull-Requests ändern, werden alte Genehmigungen entfernt. settings.require_signed_commits=Signierte Commits erforderlich @@ -2489,10 +2489,10 @@ settings.remove_protected_branch_success=Branchschutzregel „%s“ wurde entfer settings.remove_protected_branch_failed=Entfernen der Branchschutzregel „%s“ fehlgeschlagen. settings.protected_branch_deletion=Branch-Schutz löschen settings.protected_branch_deletion_desc=Wenn du den Branch-Schutz deaktivierst, können alle Nutzer mit Schreibrechten auf den Branch pushen. Fortfahren? -settings.block_rejected_reviews=Zusammenführung bei abgelehnten Reviews blockieren -settings.block_rejected_reviews_desc=Merge ist nicht möglich, wenn Änderungen durch offizielle Reviewer angefragt werden, auch wenn genügend Genehmigungen existieren. -settings.block_on_official_review_requests=Merge bei offiziellen Review-Anfragen blockieren -settings.block_on_official_review_requests_desc=Merge ist nicht möglich, wenn offizielle Review-Anfrangen vorliegen, selbst wenn genügend Genehmigungen existieren. +settings.block_rejected_reviews=Zusammenführung bei abgelehnten Sichtungen blockieren +settings.block_rejected_reviews_desc=Merge ist nicht möglich, wenn Änderungen durch offizielle Sichter angefragt werden, auch wenn genügend Genehmigungen existieren. +settings.block_on_official_review_requests=Merge bei offiziellen Sichtungsanfragen blockieren +settings.block_on_official_review_requests_desc=Merge ist nicht möglich, wenn offizielle Sichtungsanfrangen vorliegen, selbst wenn genügend Genehmigungen existieren. settings.block_outdated_branch=Merge blockieren, wenn der Pull-Request veraltet ist settings.block_outdated_branch_desc=Merge ist nicht möglich, wenn der Head-Branch hinter dem Basis-Branch ist. settings.default_branch_desc=Wähle einen Standardbranch für Pull-Requests und Code-Commits: @@ -2539,7 +2539,7 @@ settings.lfs_filelist=LFS-Dateien, die in diesem Repository gespeichert sind settings.lfs_no_lfs_files=In diesem Repository sind keine LFS-Dateien gespeichert settings.lfs_findcommits=Commits finden settings.lfs_lfs_file_no_commits=Keine Commits für diese LFS-Datei gefunden -settings.lfs_noattribute=Dieser Pfad hat nicht das sperrbare Attribut im Standard-Branch +settings.lfs_noattribute=Dieser Pfad hat nicht das „lockable“-Attribut im Standard-Branch settings.lfs_delete=LFS-Datei mit OID %s löschen settings.lfs_delete_warning=Das Löschen einer LFS-Datei kann dazu führen, dass „Objekt existiert nicht“-Fehler beim Checkout auftreten. Bist du sicher? settings.lfs_findpointerfiles=Pointer-Dateien finden @@ -2580,8 +2580,8 @@ diff.show_unified_view=Gesamtansicht diff.whitespace_button=Leerzeichen diff.whitespace_show_everything=Alle Änderungen anzeigen diff.whitespace_ignore_all_whitespace=Ignoriere Leerzeichen beim Zeilen vergleichen -diff.whitespace_ignore_amount_changes=Ignoriere whitespace-Änderungen -diff.whitespace_ignore_at_eol=Ignoriere EOL-whitespace-Änderungen +diff.whitespace_ignore_amount_changes=Änderungen in der Anzahl der Leerzeichen und ähnlichen Zeichen ignorieren +diff.whitespace_ignore_at_eol=Änderungen an den Leerzeichen und ähnlichen Zeichen am Zeilenende ignorieren diff.stats_desc= %d geänderte Dateien mit %d neuen und %d gelöschten Zeilen diff.stats_desc_file=%d Änderungen: %d Ergänzungen und %d Löschungen diff.bin=BIN @@ -2604,11 +2604,11 @@ diff.comment.placeholder=Kommentieren diff.comment.markdown_info=Styling mit Markdown wird unterstützt. diff.comment.add_single_comment=Einzelnen Kommentar hinzufügen diff.comment.add_review_comment=Kommentar hinzufügen -diff.comment.start_review=Review starten +diff.comment.start_review=Sichtung starten diff.comment.reply=Antworten -diff.review=Review abschließen -diff.review.header=Review einreichen -diff.review.placeholder=Kommentar zum Review +diff.review=Sichtung abschließen +diff.review.header=Sichtung einreichen +diff.review.placeholder=Kommentar zur Sichtung diff.review.comment=Kommentieren diff.review.approve=Genehmigen diff.review.self_reject=Pull-Request-Autoren können keine Änderungen an ihren eigenen Pull-Request anfordern @@ -2656,7 +2656,7 @@ release.edit_release=Release aktualisieren release.delete_release=Release löschen release.delete_tag=Tag löschen release.deletion=Release löschen -release.deletion_desc=Beim Entfernen wird ein Release nur von Forgejo gelöscht. Es betrifft weder den Git-Tag, noch den Inhalt des Repos oder seinen Änderungsverlauf. Fortfahren? +release.deletion_desc=Beim Entfernen wird ein Release nur von Forgejo gelöscht. Es betrifft weder den Git-Tag noch den Inhalt des Repos oder seinen Änderungsverlauf. Fortfahren? release.deletion_success=Das Release wurde gelöscht. release.deletion_tag_desc=Löscht dieses Tag aus dem Projektarchiv. Repository-Inhalt und Verlauf bleiben unverändert. Fortfahren? release.deletion_tag_success=Der Tag wurde gelöscht. @@ -2666,7 +2666,7 @@ release.tag_name_protected=Der Tag-Name ist geschützt. release.tag_already_exist=Dieser Tag-Name existiert bereits. release.downloads=Downloads release.download_count=Downloads: %s -release.add_tag_msg=Titel und Beschreibung des Releases als Tag Nachricht verwenden. +release.add_tag_msg=Titel und Beschreibung des Releases als Tag-Nachricht verwenden. release.add_tag=Tag erstellen release.releases_for=Releases für %s release.tags_for=Tags für %s @@ -2766,7 +2766,7 @@ wiki.cancel = Abbrechen settings.wiki_globally_editable = Allen erlauben, das Wiki zu bearbeiten settings.protect_branch_name_pattern_desc = Geschützte Branch-Namens-Patterns. Siehe die Dokumentation für Pattern-Syntax. Beispiele: main, release/** settings.ignore_stale_approvals = Abgestandene Genehmigungen ignorieren -settings.ignore_stale_approvals_desc = Genehmigungen, welche für ältere Commits gemacht wurden (abgestandene Reviews), nicht in die Gesamtzahl der Genehmigung des PRs mitzählen. Irrelevant, falls abgestandene Reviews bereits verworfen werden. +settings.ignore_stale_approvals_desc = Genehmigungen, welche für ältere Commits gemacht wurden (abgestandene Sichtungen), nicht in die Gesamtzahl der Genehmigung des PRs mitzählen. Irrelevant, falls abgestandene Sichtungen bereits verworfen werden. pulls.commit_ref_at = `referenzierte diesen Pull-Request aus einem Commit %s` pulls.fast_forward_only_merge_pull_request = Nur Fast-forward pulls.cmd_instruction_checkout_desc = Checke einen neuen Branch aus deinem Projekt-Repository aus und teste die Änderungen. @@ -2782,7 +2782,7 @@ activity.navbar.contributors = Mitwirkende contributors.contribution_type.deletions = Löschungen contributors.contribution_type.additions = Einfügungen contributors.contribution_type.filter_label = Art des Beitrags: -vendored = Vendored +vendored = Gevendort activity.navbar.pulse = Puls pulls.made_using_agit = AGit settings.confirmation_string = Bestätigungsstring @@ -2795,7 +2795,7 @@ pulls.merged_title_desc_one = hat %[1]d Commit von %[2]s nach %[2]s nach %[3]s zusammenführen open_with_editor = Öffnen mit %s commits.search_branch = Dieser Branch -pulls.ready_for_review = Bereit zum Review? +pulls.ready_for_review = Bereit zur Sichtung? settings.rename_branch_failed_protected = Branch %s kann nicht umbenannt werden, weil er ein geschützter Branch ist. editor.commit_id_not_matching = Die Datei wurde geändert, während du sie bearbeitet hast. Committe in einen neuen Branch, dann führe einen Merge durch. editor.push_out_of_date = Der Push scheint veraltet zu sein. @@ -2824,7 +2824,7 @@ settings.sourcehut_builds.secrets_helper = Dem Job zugriff auf die Build-Geheimn settings.web_hook_name_sourcehut_builds = SourceHut-Builds settings.graphql_url = GraphQL-URL settings.matrix.room_id_helper = Die Raum-ID kann über den Element-Webclient ermittelt werden: Raumeinstellungen > erweitert > interne Raum-ID. Beispielsweise %s. -settings.sourcehut_builds.access_token_helper = Zugangstoken, der die JOBS:RW-Freigabe hat. Generiere auf meta.sr.ht einen builds.sr.ht-Token oder einen builds.sr.ht-Token mit Zugriff auf die Secrets. +settings.sourcehut_builds.access_token_helper = Zugangstoken, der die JOBS:RW-Freigabe hat. Generiere auf meta.sr.ht einen builds.sr.ht-Token oder einen builds.sr.ht-Token mit Zugriff auf die Geheimnisse. settings.matrix.access_token_helper = Es wird empfohlen, hierfür ein dediziertes Matrix-Konto anzulegen. Der Zugangstoken kann in einem Inkognito-Tab über den Element-Webclient geholt werden: Benutzermenü (oben links) > alle Einstellungen > Hilfe & Info > erweitert > Zugriffstoken (direkt unter der Heim-Server-URL). Schließe dann den Inkognito-Tab (Abmelden würde den Token ungültig machen). release.hide_archive_links = Automatisch generierte Archive verstecken release.hide_archive_links_helper = Verstecke automatisch generierte Quellcodearchive für diesen Release. Zum Beispiel, wenn du deine eigenen hochlädst. @@ -2873,9 +2873,9 @@ mirror_use_ssh.not_available = SSH-Authentifizierung ist nicht verfügbar. issues.new.assign_to_me = Mir selbst zuweisen issues.all_title = Alle settings.discord_icon_url.exceeds_max_length = Die Icon-URL darf eine Länge von 2048 Zeichen nicht überschreiten -issues.review.add_review_requests = hat Reviews von %[1]s %[2]s angefragt -issues.review.remove_review_requests = hat Aufforderungen zum Review an %[1]s %[2]s entfernt -issues.review.add_remove_review_requests = hat Reviews von %[1]s angefragt und hat die Aufforderungen zum Review an %[2]s %[3]s entfernt +issues.review.add_review_requests = hat Sichtungen von %[1]s %[2]s angefragt +issues.review.remove_review_requests = hat die Sichtungsanfragen an %[1]s %[2]s entfernt +issues.review.add_remove_review_requests = hat Sichtungen von %[1]s angefragt und die Sichtungsanfragen an %[2]s %[3]s entfernt pulls.delete_after_merge.head_branch.is_default = Der Head-Branch, den du löschen willst, ist der Standardbranch und kann nicht gelöscht werden. pulls.delete_after_merge.head_branch.is_protected = Der Head-Branch, den du löschen willst, ist ein geschützter Branch und kann nicht gelöscht werden. pulls.delete_after_merge.head_branch.insufficient_branch = Du hast keine Erlaubnis, den Head-Branch zu löschen. @@ -2883,9 +2883,9 @@ issues.filter_sort.relevance = Relevanz diff.git-notes.add = Anmerkung hinzufügen diff.git-notes.remove-header = Anmerkung entfernen diff.git-notes.remove-body = Diese Anmerkung wird entfernt. -issues.num_reviews_one = %d Review +issues.num_reviews_one = %d Sichtung issues.summary_card_alt = Zusammenfassung eines Issues mit dem Titel „%s“ im Repository %s -issues.num_reviews_few = %d Reviews +issues.num_reviews_few = %d Sichtungen editor.add_tmpl.filename = Dateiname settings.default_update_style_desc = Standard-Aktualisierungsart um Pull-Requests zu aktualisieren, die hinter dem Base-Branch sind. new_advanced = Erweiterte Einstellungen @@ -2902,7 +2902,7 @@ issues.reaction.alt_add = Füge %[1]s Reaktion zum Kommentar hinzu. issues.reaction.alt_remove = Entferne %[1]s Reaktion von diesem Kommentar. summary_card_alt = Zusammenfassungskarte des Repositorys %s release.summary_card_alt = Übersichtskarte eines Releases mit dem Titel „%s“ im Repository %s -archive.pull.noreview = Dieses Repository ist archiviert. Pull-Requests können nicht gereviewt werden. +archive.pull.noreview = Dieses Repository ist archiviert. Pull-Requests können nicht gesichtet werden. editor.commit_email = Commit-E-Mail commits.view_single_diff = Änderungen an dieser Datei, die in diesem Commit eingeführt wurden, betrachten pulls.editable = Bearbeitbar @@ -2922,7 +2922,7 @@ settings.event_action_success_desc = Action-Run war erfolgreich. settings.event_action_failure = Fehlschlag settings.event_action_success = Erfolg settings.event_header_action = Action-Run-Ereignisse -settings.event_action_recover_desc = Action-Run war erfolgreich, nachdem der letzte Action-Run im selben Arbeitsablauf fehlgeschlagen ist. +settings.event_action_recover_desc = Action-Run war erfolgreich, nachdem der letzte Action-Run im selben Workflow fehlgeschlagen ist. settings.event_action_recover = Wiederherstellen issues.filter_type.all_pull_requests = Alle Pull-Requests @@ -3116,7 +3116,7 @@ dashboard.repo_health_check=Healthchecks für alle Repositorys ausführen dashboard.check_repo_stats=Überprüfe alle Repository-Statistiken dashboard.archive_cleanup=Alte Repository-Archive löschen dashboard.deleted_branches_cleanup=Gelöschte Branches bereinigen -dashboard.update_migration_poster_id=Migration Poster-IDs updaten +dashboard.update_migration_poster_id=Migrations-Poster-IDs aktualisieren dashboard.git_gc_repos=Garbage-Collection für alle Repositorys ausführen dashboard.resync_all_sshkeys=Die Datei „.ssh/authorized_keys“ mit Forgejo-SSH-Schlüsseln aktualisieren. dashboard.resync_all_sshprincipals=Aktualisiere die Datei „.ssh/authorized_principals“ mit Forgejo-SSH-Principals. @@ -3159,7 +3159,7 @@ dashboard.delete_old_actions=Alle alten Aktivitäten aus der Datenbank löschen dashboard.delete_old_actions.started=Löschen aller alten Aktivitäten aus der Datenbank gestartet. dashboard.update_checker=Update-Checker dashboard.delete_old_system_notices=Alle alten Systemmeldungen aus der Datenbank löschen -dashboard.gc_lfs=Garbage-Collection für LFS Meta-Objekte ausführen +dashboard.gc_lfs=Garbage-Collection für LFS-Meta-Objekte ausführen dashboard.stop_zombie_tasks=Zombie-Actions-Aufgaben stoppen dashboard.stop_endless_tasks=Endlose Actions-Aufgaben stoppen dashboard.cancel_abandoned_jobs=Aufgegebene Actions-Jobs abbrechen @@ -3335,7 +3335,7 @@ auths.pam_email_domain=PAM-E-Mail-Domain (optional) auths.oauth2_provider=OAuth2-Anbieter auths.oauth2_icon_url=Symbol-URL auths.oauth2_clientID=Client-ID (Schlüssel) -auths.oauth2_clientSecret=Client-Secret +auths.oauth2_clientSecret=Client-Geheimnis auths.openIdConnectAutoDiscoveryURL=OpenID-Connect-Auto-Discovery-URL auths.oauth2_use_custom_url=Benutzerdefinierte URLs anstelle von Standard-URLs verwenden auths.oauth2_tokenURL=Token-URL @@ -3343,14 +3343,14 @@ auths.oauth2_authURL=Authorisierungs-URL auths.oauth2_profileURL=Profil-URL auths.oauth2_emailURL=E-Mail-URL auths.skip_local_two_fa=Lokale 2FA überspringen -auths.skip_local_two_fa_helper=Leer lassen bedeutet, dass lokale User die 2FA immer noch bestehen müssen, um sich anzumelden +auths.skip_local_two_fa_helper=Das Leerlassen bedeutet, dass lokale User die 2FA immer noch bestehen müssen, um sich anzumelden auths.oauth2_tenant=Inhaber auths.oauth2_scopes=Zusätzliche Bereiche auths.oauth2_required_claim_name=Benötigter Claim-Name auths.oauth2_required_claim_name_helper=Setze diesen Namen, damit Nutzer aus dieser Quelle sich nur anmelden dürfen, wenn sie einen Claim mit diesem Namen besitzen auths.oauth2_required_claim_value=Benötigter Claim-Wert auths.oauth2_required_claim_value_helper=Setze diesen Wert, damit Nutzer aus dieser Quelle sich nur anmelden dürfen, wenn sie einen Claim mit diesem Namen und Wert besitzen -auths.oauth2_group_claim_name=Claim-Name, der Gruppennamen für diese Quelle angibt. (Optional) +auths.oauth2_group_claim_name=Claim-Name, der Gruppennamen für diese Quelle angibt (optional). auths.oauth2_admin_group=Gruppen-Claim-Wert für Administratoren (optional – erfordert Claim-Namen oben). auths.oauth2_restricted_group=Gruppen-Claim-Wert für eingeschränkte User. (Optional – erfordert Claim-Namen oben) auths.oauth2_map_group_to_team=Gruppen aus OAuth-Claims den Organisationsteams zuordnen (optional – oben muss der Name des Claims angegeben werden). @@ -3395,7 +3395,7 @@ auths.still_in_used=Diese Authentifizierungsquelle wird noch verwendet. Bearbeit auths.deletion_success=Die Authentifizierungsquelle „%s“ wurde gelöscht. auths.login_source_exist=Die Authentifizierungsquelle „%s“ existiert bereits. auths.login_source_of_type_exist=Eine Authentifizierungart dieses Typs existiert bereits. -auths.unable_to_initialize_openid=OpenID Connect Provider konnte nicht initialisiert werden: %s +auths.unable_to_initialize_openid=Provider für OpenID Connect konnte nicht initialisiert werden: %s auths.invalid_openIdConnectAutoDiscoveryURL=Ungültige Auto-Discovery-URL (dies muss eine gültige URL sein, die mit http:// oder https:// beginnt) config.server_config=Serverkonfiguration @@ -3526,7 +3526,7 @@ config.git_pull_timeout=Zeitlimit für Pull config.git_gc_timeout=Zeitlimit für GC config.log_config=Protokollierungs-Konfiguration -config.logger_name_fmt=Logger: %s +config.logger_name_fmt=Protokollierer: %s config.disabled_logger=Deaktiviert config.access_log_mode=Zugriffsprotokoll-Modus config.access_log_template=Zugriffsprotokoll-Vorlage @@ -3650,7 +3650,7 @@ mirror_sync_delete=hat die Referenz des Spiegels %[2]s in %[3]s#%[2]s genehmigt` reject_pull_request=`schlug Änderungen für %[3]s#%[2]s vor` publish_release=`veröffentlichte Release %[4]s in %[3]s` -review_dismissed=`verwarf das Review von %[4]s in %[3]s#%[2]s` +review_dismissed=`verwarf die Sichtung von %[4]s in %[3]s#%[2]s` review_dismissed_reason=Grund: create_branch=legte den Branch %[3]s in %[4]s an starred_repo=favorisierte %[2]s @@ -3765,9 +3765,9 @@ conda.registry=Richte diese Registry als Conda-Repository in deiner .conda conda.install=Um das Paket mit Conda zu installieren, führe den folgenden Befehl aus: container.details.type=Abbildtyp container.details.platform=Plattform -container.pull=Downloade das Container-Image aus der Kommandozeile: +container.pull=Lade das Container-Image von der Kommandozeile aus herunter: container.digest=Prüfsumme -container.multi_arch=Betriebsystem / Architektur +container.multi_arch=Betriebsystem/Architektur container.layers=Abbildebenen container.labels=Labels container.labels.key=Schlüssel @@ -3781,7 +3781,7 @@ debian.repository=Repository-Informationen debian.repository.distributions=Distributionen debian.repository.components=Komponenten debian.repository.architectures=Architekturen -generic.download=Downloade das Paket aus der Kommandozeile: +generic.download=Lade das Paket mit der Kommandozeile herunter: go.install=Installiere das Paket über die Kommandozeile: helm.registry=Diese Paketverwaltung über die Kommandozeile einrichten: helm.install=Nutze folgenden Befehl, um das Paket zu installieren: @@ -3813,10 +3813,10 @@ rubygems.install=Um das Paket mit gem zu installieren, führe den folgenden Befe rubygems.install2=oder füg es zum Gemfile hinzu: rubygems.dependencies.runtime=Laufzeitabhängigkeiten rubygems.dependencies.development=Entwicklungsabhängigkeiten -rubygems.required.ruby=Benötigt Ruby Version -rubygems.required.rubygems=Benötigt RubyGem Version +rubygems.required.ruby=Benötigt Ruby-Version +rubygems.required.rubygems=Benötigt RubyGem-Version swift.registry=Diese Registry über die Kommandozeile einrichten: -swift.install=Füge das Paket deiner Package.swift Datei hinzu: +swift.install=Füge das Paket deiner Package.swift-Datei hinzu: swift.install2=und führe den folgenden Befehl aus: vagrant.install=Um eine Vagrant-Box hinzuzufügen, führe den folgenden Befehl aus: settings.link=Dieses Paket einem Repository zuweisen @@ -3892,19 +3892,19 @@ alt.repository.architectures = Architekturen alt.repository.multiple_groups = Dieses Paket ist in verschiedenen Gruppen verfügbar. [secrets] -secrets=Secrets -description=Secrets werden an bestimmte Aktionen weitergegeben und können nicht anderweitig ausgelesen werden. -none=Noch keine Secrets vorhanden. -creation=Secret hinzufügen +secrets=Geheimnisse +description=Geheimnisse werden an bestimmte Aktionen weitergegeben und können nicht anderweitig ausgelesen werden. +none=Noch keine Geheimnisse vorhanden. +creation=Geheimnis hinzufügen creation.name_placeholder=Groß-/Kleinschreibung wird ignoriert, nur alphanumerische Zeichen oder Unterstriche, darf nicht mit GITEA_ oder GITHUB_ beginnen creation.value_placeholder=Beliebigen Inhalt eingeben. Leerzeichen am Anfang und Ende werden weggelassen. -creation.success=Das Secret „%s“ wurde hinzugefügt. -creation.failed=Secret konnte nicht hinzugefügt werden. -deletion=Secret entfernen -deletion.description=Das Entfernen eines Secrets kann nicht rückgängig gemacht werden. Fortfahren? -deletion.success=Das Secret wurde entfernt. -deletion.failed=Secret konnte nicht entfernt werden. -management=Secrets verwalten +creation.success=Das Geheimnis „%s“ wurde hinzugefügt. +creation.failed=Geheimnis konnte nicht hinzugefügt werden. +deletion=Geheimnis entfernen +deletion.description=Das Entfernen eines Geheimnisses kann nicht rückgängig gemacht werden. Fortfahren? +deletion.success=Das Geheimnis wurde entfernt. +deletion.failed=Geheimnis konnte nicht entfernt werden. +management=Geheimnisse verwalten [actions] actions=Actions diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index b94cb64af1..e071fa76f4 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -29,7 +29,7 @@ password=Пароль access_token=Токен доступу re_type=Підтвердження пароля captcha=CAPTCHA -twofa=Двофакторна авторизація +twofa=Двофакторна автентифікація twofa_scratch=Двофакторний одноразовий пароль passcode=Код доступу @@ -112,7 +112,7 @@ webauthn_error_unknown = Сталася невідома помилка. Буд webauthn_error_unable_to_process = Сервер не зміг обробити запит. webauthn_error_duplicated = Запит із наданим ключем безпеки відхилено. Впевніться, що цього ключа ще не зареєстровано. webauthn_error_empty = Ключ слід якось назвати. -new_project_column = Нова колонка +new_project_column = Новий стовпчик retry = Повторити rerun = Перезапустити rerun_all = Перезапустити всі завдання @@ -201,7 +201,7 @@ buttons.mention.tooltip = Згадати користувача чи коман buttons.ref.tooltip = Послатися на задачу чи на запит на злиття buttons.enable_monospace_font = Увімкнути моноширинний шрифт buttons.new_table.tooltip = Додати таблицю -table_modal.label.columns = Стовпці +table_modal.label.columns = Стовпчики table_modal.header = Додати таблицю table_modal.placeholder.header = Заголовок table_modal.placeholder.content = Вміст @@ -343,13 +343,13 @@ enable_update_checker = Увімкнути перевірку оновлень require_db_desc = Forgejo вимагає MySQL, PostgreSQL, SQLite3 чи TiDB (протокол MySQL). allow_only_external_registration = Дозволити реєстрацію тільки через зовнішні сервіси require_sign_in_view.description = Обмежити доступ до контенту лише користувачам, що увійшли. Гості зможуть лише відвідувати сторінки автентифікації. -password_algorithm_helper = Встановити алгоритм хешування паролів. Алгоритми мають різні вимоги та силу. Алгоритм argon2 є досить безпечним, проте споживає багато памʼяті та є недоречним для малих систем. +password_algorithm_helper = Установіть алгоритм хешування паролів. Алгоритми мають різні вимоги і стійкість. Алгоритм argon2 є досить безпечним, проте споживає багато памʼяті та є недоречним для малих систем. app_slogan = Гасло екземпляра app_slogan_helper = Уведіть гасло вашого екземпляра тут. Залиште порожнім, аби вимкнути. run_user_helper = Імʼя користувача операційної системи, від якого запущено Forgejo. Зауважте, що цей користувач повинен мати доступ до кореневої теки репозиторію. smtp_from_invalid = Адреса з «Відправляти email від імені» недійсна allow_dots_in_usernames = Дозволити використання крапки в іменах користувачів. Не впливає на облікові записи, що вже існують. -invalid_password_algorithm = Недійсний варіант алгоритму хешування паролів +invalid_password_algorithm = Недійсний алгоритм хешування паролів enable_update_checker_helper_forgejo = Наявність нових версій Forgejo періодично перевірятиметься через перевірку запису TXT DNS на release.forgejo.org. [home] @@ -734,7 +734,7 @@ applications=Додатки orgs=Організації repos=Репозиторії delete=Видалити обліковий запис -twofa=Двофакторна авторизація (TOTP) +twofa=Двофакторна автентифікація (TOTP) account_link=Прив'язані облікові записи organization=Організації @@ -1709,7 +1709,7 @@ pulls.reject_count_1=%d запит на зміну pulls.reject_count_n=%d запити на зміну pulls.waiting_count_1=очікується %d рецензія pulls.waiting_count_n=очікується %d рецензії(й) -pulls.wrong_commit_id=ID коміта повинен бути ID коміта в цільовій гілці +pulls.wrong_commit_id=ID коміту повинен бути ID коміту в цільовій гілці pulls.no_merge_desc=Цей запити на злиття неможливо злити, оскільки всі параметри об'єднання репозиторія вимкнено. pulls.no_merge_helper=Увімкніть параметри злиття в налаштуваннях репозиторія або злийте запити на злиття вручну. @@ -1727,7 +1727,7 @@ 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=Не вдалося об'єднати: виник конфлікт під час перебазування коміту: %[1]s. Підказка: спробуйте іншу стратегію pulls.rebase_conflict_summary=Повідомлення про помилку pulls.unrelated_histories=Не вдалося об'єднати: head та base злиття не мають спільної історії. Підказка: спробуйте іншу стратегію pulls.merge_out_of_date=Не вдалося об'єднати: base було оновлено, поки відбувалося об'єднання. Підказка: спробуйте знову. @@ -1896,7 +1896,7 @@ settings.mirror_settings.direction=Напрямок settings.mirror_settings.direction.pull=Pull settings.mirror_settings.direction.push=Push settings.mirror_settings.last_update=Останнє оновлення -settings.mirror_settings.push_mirror.none=Не налаштовано дзеркало push +settings.mirror_settings.push_mirror.none=Push-дзеркала не налаштовано settings.mirror_settings.push_mirror.remote_url=URL віддаленого репозиторію Git settings.mirror_settings.push_mirror.add=Додати push-дзеркало @@ -2343,7 +2343,7 @@ issues.author = Автор issues.author_helper = Цей користувач - автор. issues.close = Закрити задачу issues.role.owner_helper = Цей користувач є власником цього репозиторію. -settings.mirror_settings.docs.more_information_if_disabled = Докладніше про push та pull дзеркала можна дізнатися тут: +settings.mirror_settings.docs.more_information_if_disabled = Докладніше про push- та pull-дзеркала можна дізнатися тут: issues.comment.blocked_by_user = Ви не можете коментувати цю задачу, оскільки вас заблокував власник репозиторію або автор цієї задачі. editor.add_file = Додати файл from_comment = (коментар) @@ -2431,7 +2431,7 @@ pulls.is_ancestor = Цю гілку вже включено в цільову г pulls.has_merged = Помилка: запит на злиття вже об'єднано, неможливо об'єднати знову чи змінити цільову гілку. pulls.head_out_of_date = Не вдалося об'єднати: head було оновлено, поки відбувалося об'єднання. Підказка: спробуйте знову. no_eol.tooltip = У цьому файлі відсутній символ закінчення рядка (EOL) у кінці. -settings.trust_model.committer.desc = Допустимі підписи будуть позначатися як «довірені», тільки якщо вони відповідають автору коміта, в іншому випадку вони позначатимуться як «невідповідні». Це змусить Forgejo бути автором підписаних комітів, а фактичного автора зазначати в трейлерах «Co-authored-by» і «Co-committed-by» в описі коміта. Типовий ключ Forgejo повинен відповідати користувачу в базі даних. +settings.trust_model.committer.desc = Допустимі підписи будуть позначатися як «довірені», тільки якщо вони відповідають авторові коміту, в іншому випадку вони позначатимуться як «невідповідні». Це змусить Forgejo бути автором підписаних комітів, а фактичного автора зазначати в трейлерах «Co-authored-by» і «Co-committed-by» в описі коміту. Типовий ключ Forgejo повинен відповідати користувачу в базі даних. pulls.clear_merge_message_hint = Очищення повідомлення про об'єднання видалить лише вміст повідомлення коміту і збереже згенеровані git-трейлери, такі як «Co-Authored-By…». branch.delete_branch_has_new_commits = Гілку «%s» не можна видалити, оскільки після об'єднання було додано нові коміти. settings.graphql_url = Посилання GraphQL @@ -2514,7 +2514,7 @@ projects.column.set_default = Установити за замовчування settings.federation_following_repos = URL-адреси відстежуваних репозиторіїв. Через «;», без пробілів. settings.federation_not_enabled = Федерацію вимкнено у вашому екземплярі. settings.federation_settings = Налаштування федерації -signing.wont_sign.nokey = Цей екземпляр не має ключа для підписання цього коміта. +signing.wont_sign.nokey = Цей екземпляр не має ключа для підписання цього коміту. settings.federation_apapiurl = URL федерації цього репозиторію. Скопіюйте її та вставте в налаштування федерації іншого репозиторію як URL-адресу відстежуваного репозиторію. fork_branch = Гілка, яку буде клоновано у форк already_forked = Ви вже створили форк %s @@ -2554,7 +2554,7 @@ activity.navbar.pulse = Пульс open_with_editor = Відкрити в %s commits.view_single_diff = Переглянути зміни до цього файлу, внесені у цьому коміті pulls.editable = Редаговане -pulls.editable_explanation = Цей запит на злиття дозволяє редагування від розробників. Ви можете зробити свій внесок безпосередньо до нього. +pulls.editable_explanation = Цей запит на злиття дозволено редагувати супроводжувачам. Ви можете зробити свій внесок безпосередньо до нього. admin.failed_to_replace_flags = Не вдалося замінити прапорці репозиторія admin.enabled_flags = Для репозиторія ввімкнено прапорці: admin.flags_replaced = Прапорці репозиторія замінено @@ -2773,6 +2773,58 @@ issues.closed_by = від %[3]s закрито %[1]s issues.action_check = Поставити/зняти позначку issues.action_check_all = Поставити/зняти позначку з усіх елементів vendored = Сторонній +blame.ignore_revs.failed = Не вдалося проігнорувати зміни в .git-blame-ignore-revs. +blame.ignore_revs = Зміни в .git-blame-ignore-revs ігноруються. Натисніть тут, щоб обійти це і переглянути авторство у звичайному вигляді. +editor.new_branch_name = Укажіть назву нової гілки для цього коміту +projects.column.deletion_desc = Видалення стовпчика проєкту призведе до переміщення всіх пов'язаних із ним задач до стовпчика за замовчуванням. Продовжити? +signing.wont_sign.approved = Злиття не буде підписано, оскільки запит на злиття не схвалено. +pulls.allow_edits_from_maintainers = Дозволити редагування від супроводжувачів +pulls.showing_only_single_commit = Показано тільки зміни коміту %[1]s +pulls.showing_specified_commit_range = Показано тільки зміни між %[1]s..%[2]s +pulls.blocked_by_outdated_branch = Цей запит на злиття заблоковано, оскільки він застарів. +pulls.blocked_by_changed_protected_files_n = Цей запит на злиття заблоковано, оскільки він змінює захищені файли: +pulls.auto_merge_newly_scheduled = Заплановано об'єднати запит на злиття після успішного завершення всіх перевірок. +pulls.auto_merge_newly_scheduled_comment = `планує автоматично об'єднати цей запит на злиття після успішного завершення всіх перевірок %[1]s` +comments.edit.already_changed = Не вдається зберегти зміни. Схоже, що хтось інший уже змінив вміст коментаря. Оновіть сторінку і спробуйте відредагувати ще раз, щоб уникнути перезапису чужих змін +pulls.auto_merge_canceled_schedule_comment = `скасовує автоматичне об'єднання цього запиту на злиття після успішного завершення всіх перевірок %[1]s` +signing.wont_sign.pubkey = Коміт не буде підписано, оскільки у вас немає публічного ключа, пов'язаного з вашим обліковим записом. +signing.wont_sign.basesigned = Злиття не буде підписано, оскільки не підписано базовий коміт. +signing.wont_sign.headsigned = Злиття не буде підписано, оскільки не підписано головний коміт. +projects.column.new_submit = Створити стовпчик +settings.authorization_header_desc = За наявності буде включено як заголовок авторизації для запитів. Приклади: %s. +template.git_hooks_tooltip = Наразі ви не можете змінювати або видаляти додані Git-хуки. Вибирайте лише якщо ви довіряєте репозиторію шаблону. +projects.column.edit = Редагувати стовпчик +projects.column.set_default_desc = Призначити цей стовпчик за замовчуванням для задач і запитів на злиття без категорії +projects.column.new = Новий стовпчик +projects.column.delete = Видалити стовпчик +pulls.blocked_by_official_review_requests = Цей запит на злиття заблоковано, оскільки йому бракує схвалення від одного або кількох офіційних рецензентів. +pulls.auto_merge_has_pending_schedule = %[1]s планує автоматично об'єднати цей запит на злиття після успішного завершення всіх перевірок %[2]s. +signing.wont_sign.commitssigned = Злиття не буде підписано, оскільки всі пов'язані з ним коміти не підписані. +settings.authorization_header = Заголовок авторизації +issues.archived_label_description = (Архівна) %s +issues.reaction.add = Додати реакцію +issues.reaction.alt_add = Додати реакцію %[1]s до коментаря. +issues.reaction.alt_remove = Прибрати реакцію %[1] з коментаря. +migrate.github_token_desc = Ви можете ввести тут один або кілька токенів через кому, щоб пришвидшити міграцію в обхід обмеження частоти звернень до API GitHub. ОБЕРЕЖНО: зловживання цією функцією може порушити політику постачальника послуг і призвести до блокування облікового запису. +issues.edit.already_changed = Не вдається зберегти зміни. Схоже, що хтось інший уже змінив вміст задачі. Оновіть сторінку і спробуйте відредагувати ще раз, щоб уникнути перезапису чужих змін +pulls.edit.already_changed = Не вдається зберегти зміни. Схоже, що хтось інший уже змінив вміст запиту на злиття. Оновіть сторінку і спробуйте відредагувати ще раз, щоб уникнути перезапису чужих змін +issues.reaction.alt_many = %[1]s і ще %[2]d реагують %[3]s. +settings.pulls.default_allow_edits_from_maintainers = За замовчуванням дозволити редагування від супроводжувачів +pulls.blocked_by_changed_protected_files_1 = Цей запит на злиття заблоковано, оскільки він змінює захищений файл: +pulls.delete.text = Ви дійсно хочете видалити цей запит на злиття? (Весь його вміст буде остаточно видалено. Можливо, варто його закрити і зберегти в архіві) +pulls.blocked_by_rejection = Цей запит на злиття містить зміни, запропоновані офіційним рецензентом. +signing.wont_sign.parentsigned = Цей коміт не буде підписано, оскільки не підписано батьківський коміт. +settings.ignore_stale_approvals = Ігнорувати застарілі схвалення +pulls.blocked_by_approvals = Цей запит на злиття ще не має достатньої кількості схвалень. Отримано %d з %d схвалень. +issues.delete.text = Ви дійсно хочете видалити цю задачу? (Весь її вміст буде остаточно видалено. Можливо, варто її закрити і зберегти в архіві) +signing.wont_sign.twofa = Щоб підписувати коміти, у вас повинна бути ввімкнена двофакторна автентифікація. +settings.mirror_settings.docs = Налаштуйте свій репозиторій на автоматичну синхронізацію комітів, тегів і гілок з іншим репозиторієм. +settings.mirror_settings.docs.disabled_push_mirror.instructions = Налаштуйте свій проєкт на автоматичне отримання комітів, тегів і гілок з іншого репозиторію. +settings.mirror_settings.docs.disabled_push_mirror.info = Push-дзеркала вимкнено адміністратором сайту. +settings.mirror_settings.docs.disabled_pull_mirror.instructions = Налаштуйте свій проєкт на автоматичне надсилання комітів, тегів і гілок до іншого репозиторію. Pull-дзеркала вимкнено адміністратором сайту. +issues.label_templates.fail_to_load_file = Не вдалося завантажити файл шаблону міток «%s»: %v +migrate.github.description = Перенесіть дані з github.com або сервера GitHub Enterprise. +migrate.cancel_migrating_confirm = Бажаєте скасувати перенесення? [graphs] contributors.what = внески @@ -3016,7 +3068,7 @@ users.prohibit_login=Заблокований обліковий запис users.is_admin=Обліковий запис адміністратора users.is_restricted=Обмежений users.allow_git_hook=Може створювати Git-хуки -users.allow_git_hook_tooltip=Git хуки виконуються від імені користувача OS сервісу Forgejo і мають однаковий рівень доступу до хоста. Як результат, користувачі з доступом до Git-хуків можуть отримати доступ і змінювати всі репозиторії Forgejo, а також базу даних, що використовуються в Forgejo. Отже, вони також здатні отримати права адміністратора Forgejo. +users.allow_git_hook_tooltip=Git-хуки виконуються від імені користувача ОС, від якого запущено Forgejo, і мають той самий рівень доступу до хоста. Таким чином, користувачі зі спеціальними правами Git-хуків можуть отримати доступ і змінювати всі репозиторії Forgejo, а також базу даних Forgejo. Вони також здатні отримати права адміністратора Forgejo. users.allow_import_local=Може імпортувати локальні репозиторії users.allow_create_organization=Може створювати організації users.update_profile=Оновити обліковий запис @@ -3170,7 +3222,7 @@ auths.tip.discord=Зареєструйте новий додаток на %s auths.tip.yandex=Створіть новий додаток на %s. У розділі «Yandex.Passport API» виберіть такі дозволи: «Доступ до адреси електронної пошти», «Доступ до аватара» і «Доступ до імені користувача, імені та прізвища, статі» auths.tip.mastodon=Введіть URL спеціального екземпляра для екземпляра mastodon, який ви хочете автентифікувати за допомогою (або використовувати за замовчуванням) auths.edit=Редагувати джерело автентифікації -auths.activated=Це джерело авторизації активоване +auths.activated=Це джерело автентифікація активоване auths.update_success=Параметри аутентифікації оновлені. auths.update=Оновити джерело автентифікації auths.delete=Видалити джерело автентифікації @@ -3196,7 +3248,7 @@ config.repo_root_path=Шлях до кореня репозиторію config.lfs_root_path=Кореневий шлях LFS config.log_file_root_path=Шлях до лог файлу config.script_type=Тип скрипта -config.reverse_auth_user=Ім'я користувача для авторизації на reverse proxy +config.reverse_auth_user=Користувач для авторизації на зворотному проксі config.ssh_config=Конфігурація SSH config.ssh_enabled=Увімкнено @@ -3423,6 +3475,12 @@ config.mailer_smtp_addr = Адреса SMTP dashboard.update_checker = Перевірка оновлень auths.map_group_to_team_removal = Видаляти користувачів із синхронізованих команд, якщо користувачі не належать до відповідної групи LDAP auths.enable_ldap_groups = Увімкнути групи LDAP +auths.unable_to_initialize_openid = Не вдалося ініціалізувати постачальника OpenID Connect: %s +auths.new_success = Метод автентифікації «%s» додано. +config.cache_test_slow = Перевірку кешу завершено успішно, але відповідь повільна: %s. +config.cache_test_succeeded = Перевірку кешу завершено успішно, відповідь отримано через %s. +config.cache_test = Перевірити кеш +config.cache_test_failed = Не вдалося перевірити кеш: %v. [action] @@ -3704,7 +3762,7 @@ variables.management = Керування змінними variables.id_not_exist = Змінної з ідентифікатором %d не існує. variables.edit = Редагувати змінну runs.expire_log_message = Журнали очищено, тому що вони були занадто старі. -runs.empty_commit_message = (порожнє повідомлення коміта) +runs.empty_commit_message = (порожнє повідомлення коміту) runners.status.unspecified = Невідомо runs.status_no_select = Усі стани runs.status = Стан @@ -3826,6 +3884,7 @@ wiki.write = Писати: створювати, оновлювати т issues.read = Читати: дивитись і створювати задачі та коментарі. wiki.read = Читати: переглядати вбудовану вікі та її історію. actions.write = Писати: вручну запускати, перезапускати, скасовувати або схвалювати конвеєри CI/CD в очікуванні. +projects.write = Писати: створювати проєкти і стовпчики та редагувати їх. [munits.data] pib = ПіБ diff --git a/options/locale_next/locale_ar.json b/options/locale_next/locale_ar.json index cef0f06e23..eca76a5ba7 100644 --- a/options/locale_next/locale_ar.json +++ b/options/locale_next/locale_ar.json @@ -4,6 +4,138 @@ "home.explore_repos": "اكتشف المستودعات", "home.explore_users": "اكتشف المستخدمين", "home.explore_orgs": "اكتشف المنظمات", - "moderation.abuse_category.illegal_content": "المحتوى غير المشروع", - "moderation.abuse_category.malware": "برمجية خبيثة" + "moderation.abuse_category.illegal_content": "محتوى غير مشروع", + "moderation.abuse_category.malware": "برمجية خبيثة", + "relativetime.now": "الآن", + "relativetime.1month": "الشهر الفائت", + "relativetime.2weeks": "منذ أسبوعين", + "search.milestone_kind": "معالم البحث…", + "moderation.abuse_category.other_violations": "انتهاكات أخرى لقواعد المنصة", + "repo.issue_indexer.title": "مفهرس الإبلاغات", + "incorrect_root_url": "تم تكوين هذه النسخة من Forgejo لتعمل على العنوان \"%s\". أنت تقوم حاليًا بتصفّح Forgejo عبر رابط مختلف، مما قد يتسبب في تعطل بعض أجزاء التطبيق. يتم تحديد الرابط الرسمي (canonical URL) من قِبل مسؤولي Forgejo من خلال إعداد `ROOT_URL` في ملف `app.ini`.", + "error.not_found.title": "الصفحة غير موجودة", + "themes.names.forgejo-auto": "فورجيو (اتبع سمة النظام)", + "themes.names.forgejo-light": "فورجيجو المضيء", + "themes.names.forgejo-dark": "فورجيجو الداكن", + "stars.list.none": "لم يقم أحد بتمييز هذا المستودع بنجمة.", + "watch.list.none": "لا أحد يشاهد هذا المستودع.", + "followers.incoming.list.self.none": "لا أحد يتابع ملفك الشخصي.", + "followers.incoming.list.none": "لا أحد يتابع هذا المستخدم.", + "followers.outgoing.list.self.none": "أنت لا تتبع أي شخص.", + "relativetime.1day": "الأمس", + "followers.outgoing.list.none": "لا يتابع %s أي شخص.", + "relativetime.1week": "أخر أسبوع", + "relativetime.2days": "منذ يومين", + "relativetime.2months": "منذ شهرين", + "relativetime.1year": "السنة الفائتة", + "relativetime.2years": "منذ سنتين", + "repo.form.cannot_create": "بلغت جميع المساحات التي يمكنك إنشاء مستودعات بها حدها.", + "alert.asset_load_failed": "تعذّر تحميل ملفات الأصول من {path}. تأكد من أن الملفات متاحة للوصول.", + "settings.visibility.description": "رؤية ملفك الشخصي تؤثر في قدرة الآخرين على الوصول إلى مستودعاتك غير الخاصة. اعرف المزيد", + "relativetime.mins": { + "zero": "الآن", + "one": "منذ دقيقة مضت", + "two": "منذ دقيقتين مضت", + "few": "منذ %d دقائق مضت", + "many": "منذ %d دقيقة مضت", + "other": "منذ %d دقيقة مضت" + }, + "relativetime.hours": { + "zero": "الآن", + "one": "منذ ساعة", + "two": "منذ ساعتين", + "few": "منذ %d ساعات", + "many": "منذ %d ساعة", + "other": "منذ %d ساعة" + }, + "moderation.report_remarks": "الملاحظات", + "repo.diff.commit.next-short": "التالي", + "repo.diff.commit.previous-short": "السابق", + "admin.dashboard.cleanup_offline_runners": "تنظيف وحدات التشغيل غير المتصلة", + "relativetime.days": { + "zero": "اليوم", + "one": "منذ يوم واحد", + "two": "منذ يومين", + "few": "منذ %d أيام", + "many": "منذ %d يوماً", + "other": "منذ %d يوماً" + }, + "relativetime.weeks": { + "zero": "هذا الأسبوع", + "one": "منذ أسبوع واحد", + "two": "منذ أسبوعين", + "few": "منذ %d أسابيع", + "many": "منذ %d أسبوعاً", + "other": "منذ %d أسبوعاً" + }, + "relativetime.years": { + "zero": "هذه السنة", + "one": "منذ سنة واحدة", + "two": "منذ سنتين", + "few": "منذ %d سنوات", + "many": "منذ %d سنة", + "other": "منذ %d سنة" + }, + "repo.settings.push_mirror.branch_filter.label": "تصفية الفرع (اختياري)", + "repo.settings.push_mirror.branch_filter.description": "الفروع المطلوب عكسها. اترك الحقل فارغًا لعكس جميع الفروع. راجع توثيق %[2]s للاطلاع على الصيغة. أمثلة: main, release/*", + "og.repo.summary_card.alt_description": "بطاقة تلخيصية للمستودع %[1]، موصوفة بـ %[1]: %[2]s", + "meta.last_line": "شكرًا لك على ترجمة Forgejo! هذا السطر لا يراه المستخدمون ولكنه يخدم أغراضًا أخرى في إدارة الترجمة. يمكنك وضع حقيقة ممتعة في الترجمة بدلاً من ترجمتها.", + "relativetime.future": "في المستقبل", + "avatar.constraints_hint": "لا يمكن أن يتجاوز حجم الصورة الشخصية المخصصة %[1]s، ولا أبعادها عن %[2]d×%[3]d بكسل", + "repo.pulls.merged_title_desc": { + "zero": "لم دمج أي إيداع من %[2]s إلى %[3]s %[4]s", + "one": "تم دمج إيداع واحد من %[2]s إلى %[3]s %[4]s", + "two": "تم دمج إيداعين اثنين من %[2]s إلى %[3]s %[4]s", + "few": "تم دمج %[1]d إيداعات من %[2]s إلى %[3]s %[4]s", + "many": "تم دمج %[1]d إيداعاً من %[2]s إلى %[3]s %[4]s", + "other": "تم دمج %[1]d إيداعاً من %[2]s إلى %[3]s %[4]s" + }, + "relativetime.months": { + "zero": "هذا الشهر", + "one": "منذ شهر", + "two": "منذ شهرين", + "few": "منذ %d أشهر", + "many": "منذ %d شهراً", + "other": "منذ %d شهراً" + }, + "repo.pulls.title_desc": { + "zero": "لا يريد دمج أي إيداع من %[2]s إلى %[3]s", + "one": "يريد دمج إيداع واحد من %[2]s إلى %[3]s", + "two": "يريد دمج إيداعين من %[2]s إلى %[3]s", + "few": "يريد دمج %[1]d إيداعات من %[2]s إلى %[3]s", + "many": "يريد دمج %[1]d إيداعًا من %[2]s إلى %[3]s", + "other": "يريد دمج %[1]d إيداعًا من %[2]s إلى %[3]s" + }, + "mail.actions.run_info_sha": "إيداع: %[1]s", + "keys.gpg.link": "مفاتيح GPG", + "moderation.abuse_category.spam": "غير مرغوب به", + "keys.ssh.link": "مفاتيح SSH", + "profile.edit.link": "عدِّل ملف التعريف", + "moderation.abuse_category": "الفئة", + "moderation.abuse_category.placeholder": "حدد الفئة", + "moderation.report_remarks.placeholder": "يُرجى تقديم بعض التفاصيل المتعلقة بالإساءة التي أبلغت عنها.", + "moderation.submit_report": "إرسال التقرير", + "moderation.reporting_failed": "تعذر إرسال تقرير إساءة الاستخدام الجديد: %v", + "moderation.reported_thank_you": "شكراُ لك على تقريرك. وقد تم إبلاغ الإدارة به.", + "mail.actions.run_info_trigger": "تم تشغيله بسبب: %[1]s عبر: %[2]s", + "install.invalid_lfs_path": "غير قادر على إنشاء جذر LFS في المسار المحدد: %[1]s", + "alert.range_error": " يجب أن يكون رقمًا بين %[1]s و %[2]s.", + "mail.actions.not_successful_run_subject": "سير العمل %[1]s فشل في المستودت %[2]s", + "mail.actions.successful_run_after_failure": "تم استعادة سير العمل %[1]s في المستودع %[2]s", + "mail.actions.not_successful_run": "فشل سير العمل %[1]s في المستودع %[2]s", + "mail.actions.run_info_cur_status": "حالة هذا التشغيل: %[1]s (تم تحديثها من %[2]s للتو)", + "mail.actions.run_info_previous_status": "حالة التشغيل السابقة: %[1]s", + "discussion.locked": "تم إغلاق هذه المناقشة. يقتصر التعليق على المساهمين فقط.", + "editor.textarea.tab_hint": "السطر مُزاح بالفعل. اضغط Tab مرة أخرى أو Escape لمغادرة المحرر.", + "editor.textarea.shift_tab_hint": "لا توجد مسافة بادئة في هذا السطر. اضغط Shift + Tab مرة أخرى أو Escape لمغادرة المحرر.", + "profile.actions.tooltip": "إجراءات إضافية", + "moderation.report_content": "محتوى التقارير", + "moderation.report_abuse_form.header": "الإبلاغ عن الإساءة إلى المسؤول", + "moderation.report_abuse_form.details": "يتعين استخدام هذا النموذج للإبلاغ عن المستخدمين الذين ينشئون ملفات تعريف ، أو مستودعات ، أو إبلاغات ، أو تعليقات ، أو يتصرفون بشكل غير لائق.", + "moderation.report_abuse_form.invalid": "معاملا غير صالحة", + "moderation.report_abuse_form.already_reported": "‍لقد قمت بالفعل بالإبلاغ عن هذا المحتوى", + "moderation.report_abuse": "الإبلاغ عن إساءة الاستخدام", + "feed.atom.link": "موجز Atom", + "admin.config.moderation_config": "تهيئة الإشراف", + "mail.actions.successful_run_after_failure_subject": "تم استعادة سير العمل %[1]s في المستودع %[2]s" } diff --git a/options/locale_next/locale_be.json b/options/locale_next/locale_be.json index 40dfec0b41..c8ff00bd87 100644 --- a/options/locale_next/locale_be.json +++ b/options/locale_next/locale_be.json @@ -1,3 +1,8 @@ { - "moderation.abuse_category.malware": "Шкодная праграма" + "moderation.abuse_category.malware": "Шкодная праграма", + "home.welcome.no_activity": "Няма падзей", + "home.welcome.activity_hint": "У вашай стужцы пакуль што нічога няма. Вашыя дзеяньні ды падзеі з рэпазыторыяў зьявяцца тут.", + "home.explore_repos": "Агляд рэпазыторыяў", + "home.explore_users": "Агляд карыстальнікаў", + "home.explore_orgs": "Агляд арганізацый" } diff --git a/options/locale_next/locale_cs-CZ.json b/options/locale_next/locale_cs-CZ.json index 3ce42e6bb0..b47c594348 100644 --- a/options/locale_next/locale_cs-CZ.json +++ b/options/locale_next/locale_cs-CZ.json @@ -111,5 +111,7 @@ "feed.atom.link": "Zdroj Atom", "keys.ssh.link": "Klíče SSH", "og.repo.summary_card.alt_description": "Karta se souhrnem repozitáře %[1]s, popsaným jako: %[2]s", - "mail.actions.run_info_sha": "Revize: %[1]s" + "mail.actions.run_info_sha": "Revize: %[1]s", + "repo.settings.push_mirror.branch_filter.label": "Filtr větve (nepovinný)", + "repo.settings.push_mirror.branch_filter.description": "Větve, které mají být zrcadleny. Ponechte prázdné pro zrcadlení všech větví. Syntaxi naleznete v dokumentaci %[2]s. Příklady: main, release/*" } diff --git a/options/locale_next/locale_de-DE.json b/options/locale_next/locale_de-DE.json index 5d670aeedf..5a3ceef7e5 100644 --- a/options/locale_next/locale_de-DE.json +++ b/options/locale_next/locale_de-DE.json @@ -90,11 +90,11 @@ "followers.outgoing.list.none": "%s folgt niemanden.", "stars.list.none": "Niemand hat dieses Repo favorisiert.", "followers.incoming.list.none": "Niemand folgt diesem Benutzer.", - "editor.textarea.tab_hint": "Zeile bereits eingerückt. Drücke nochmals Tab oder Escape um den Editor zu verlassen.", - "editor.textarea.shift_tab_hint": "Keine Einrückung auf dieser Zeile. Drücke nochmals Shift + Tab oder Escape um den Editor zu verlassen.", - "admin.dashboard.cleanup_offline_runners": "Aufräumen der offline Runner", + "editor.textarea.tab_hint": "Zeile bereits eingerückt. Drücke nochmals Tab oder Escape, um den Editor zu verlassen.", + "editor.textarea.shift_tab_hint": "Keine Einrückung auf dieser Zeile. Drücke nochmals Shift + Tab oder Escape, um den Editor zu verlassen.", + "admin.dashboard.cleanup_offline_runners": "Aufräumen der Offline-Runner", "settings.visibility.description": "Die Profilsichtbarkeit beeinflusst die Möglichkeit anderer, auf deine nicht-privaten Repositorys zuzugreifen. Erfahre mehr", - "avatar.constraints_hint": "Individuelles Profilbild darf %[1]s in der Größe nicht überschreiten, und nicht größer als %[2]dx%[3]d Pixel sein", + "avatar.constraints_hint": "Individuelles Profilbild darf %[1]s in der Größe nicht überschreiten, und nicht größer als %[2]d×%[3]d Pixel sein", "repo.diff.commit.next-short": "Nächste", "repo.diff.commit.previous-short": "Vorherige", "profile.edit.link": "Profil bearbeiten", @@ -103,5 +103,7 @@ "keys.gpg.link": "GPG-Schlüssel", "profile.actions.tooltip": "Mehr Aktionen", "og.repo.summary_card.alt_description": "Zusammenfassungskarte des Repositorys %[1]s, beschrieben als %[2]s", - "mail.actions.run_info_sha": "Commit: %[1]s" + "mail.actions.run_info_sha": "Commit: %[1]s", + "repo.settings.push_mirror.branch_filter.label": "Branch-Filter (optional)", + "repo.settings.push_mirror.branch_filter.description": "Zu spiegelnde Branches. Leer lassen, um alle Branches zu spiegeln. Siehe die „%[2]s“-Dokumentation für die Syntax. Beispiele: main, release/*" } diff --git a/options/locale_next/locale_fil.json b/options/locale_next/locale_fil.json index 2c62514648..6ec601c538 100644 --- a/options/locale_next/locale_fil.json +++ b/options/locale_next/locale_fil.json @@ -1,6 +1,6 @@ { "repo.pulls.merged_title_desc": { - "one": "isinali ang %[1]d commit mula%[2]s patungong %[3]s %[4]s", + "one": "isinali ang %[1]d commit mula %[2]s patungong %[3]s %[4]s", "other": "isinali ang %[1]d mga commit mula sa %[2]s patungong %[3]s %[4]s" }, "repo.pulls.title_desc": { @@ -21,7 +21,7 @@ "alert.asset_load_failed": "Nabigong i-load ang mga asset file mula sa {path}. Siguraduhin na maa-access ang mga asset file.", "install.invalid_lfs_path": "Nabigong gawin ang LFS root sa tinakdang path: %[1]s", "alert.range_error": " dapat ay numero sa pagitan ng %[1]s at %[2]s.", - "meta.last_line": "Every day, I imagine a future where I can be with you. In my hand is a pen that will write a poem of me and you. The ink flows down into a dark puddle... Just move your hand, write the way into his heart. But in this world of infinite choices. What will it take just to find that special day? Have I found everybody a fun assignment to do today? When you're here, everything that we do is fun for them anyway... When I can't even read my own feelings. What good are words when a smile says it all? And if this world won't write me an ending... What will it take just for me to have it all? Does my pen only write bitter words for those who are dear to me? Is it love if I take you, or is it love if I set you free? The ink flows down into a dark puddle... How can I write love into reality? If I can't hear the sound of your heartbeat What do you call love in your reality? And in your reality, if I don't know how to love you... I'll leave you be.", + "meta.last_line": "Every day, I imagine a future where I can be with you. In my hand is a pen that will write a poem of me and you. The ink flows down into a dark puddle... Just move your hand, write the way into his heart. But in this world of infinite choices, what will it take just to find that special day? Have I found everybody a fun assignment to do today? When you're here, everything that we do is fun for them anyway... When I can't even read my own feelings, what good are words when a smile says it all? And if this world won't write me an ending, what will it take just for me to have it all? Does my pen only write bitter words for those who are dear to me? Is it love if I take you, or is it love if I set you free? The ink flows down into a dark puddle... How can I write love into reality? If I can't hear the sound of your heartbeat, what do you call love in your reality? And in your reality, if I don't know how to love you... I'll leave you be.", "mail.actions.successful_run_after_failure": "Na-recover ang workflow na %[1]s sa repositoryong %[2]s", "mail.actions.not_successful_run": "Nabigo ang workflow na %[1]s sa repositoryong %[2]s", "mail.actions.run_info_previous_status": "Nakaraang Status ng Run: %[1]s", @@ -102,5 +102,8 @@ "keys.ssh.link": "Mga SSH key", "keys.gpg.link": "Mga GPG key", "profile.actions.tooltip": "Higit pang mga aksyon", - "og.repo.summary_card.alt_description": "Card ng pangkalahatang ideya ng repositoryong %[1]s, inilalarawan bilang: %[2]s" + "og.repo.summary_card.alt_description": "Card ng pangkalahatang ideya ng repositoryong %[1]s, inilalarawan bilang: %[2]s", + "mail.actions.run_info_sha": "Commit: %[1]s", + "repo.settings.push_mirror.branch_filter.label": "Filter ng branch (opsyonal)", + "repo.settings.push_mirror.branch_filter.description": "Mga branch na imi-mirror. Iwanang walang laman para i-mirror ang lahat ng mga branch. Tignan ang dokumentasyon ng %[2]s para sa syntax. Halimbawa: main, your-reality, release/*" } diff --git a/options/locale_next/locale_lv-LV.json b/options/locale_next/locale_lv-LV.json index 22b80f2fad..5503763dd3 100644 --- a/options/locale_next/locale_lv-LV.json +++ b/options/locale_next/locale_lv-LV.json @@ -111,5 +111,7 @@ "keys.ssh.link": "SSH atslēgas", "keys.gpg.link": "GPG atslēgas", "og.repo.summary_card.alt_description": "Glabātavas %[1]s kopsavilkuma kartīte, aprakstīta kā: %[2]s", - "mail.actions.run_info_sha": "Iesūtījums: %[1]s" + "mail.actions.run_info_sha": "Iesūtījums: %[1]s", + "repo.settings.push_mirror.branch_filter.description": "Zarus, kurus spoguļot. Atstāt tukšu, lai spoguļotu visus zarus. Pierakstu skatīt %[2]s dokumentācijā. Piemēri: main, release/*", + "repo.settings.push_mirror.branch_filter.label": "Zaru atlasītājs (izvēles)" } diff --git a/options/locale_next/locale_nds.json b/options/locale_next/locale_nds.json index 20c1208c42..4a796aaee9 100644 --- a/options/locale_next/locale_nds.json +++ b/options/locale_next/locale_nds.json @@ -103,5 +103,7 @@ "profile.actions.tooltip": "Mehr Aktioonen", "profile.edit.link": "Profil bewarken", "og.repo.summary_card.alt_description": "Tosamenfatens-Kaart vun de Repositorium %[1]s, beschrieven as: %[2]s", - "mail.actions.run_info_sha": "Kommitteren: %[1]s" + "mail.actions.run_info_sha": "Kommitteren: %[1]s", + "repo.settings.push_mirror.branch_filter.description": "Twiegen tum Spegeln. Laat dat leeg, um all Twiegen to spegeln. Lees de %[2]s-Dokumenteren för de Syntax. Bispölen: main, release/*", + "repo.settings.push_mirror.branch_filter.label": "Twieg-Filter (wenn du willst)" } diff --git a/options/locale_next/locale_nl-NL.json b/options/locale_next/locale_nl-NL.json index e049db3d41..7491458957 100644 --- a/options/locale_next/locale_nl-NL.json +++ b/options/locale_next/locale_nl-NL.json @@ -103,5 +103,7 @@ "repo.diff.commit.previous-short": "Vorige", "avatar.constraints_hint": "Eigen avatars mogen niet groter zijn dan %[1]s in grootte of groter zijn dan %[2]dx%[3]d pixels", "og.repo.summary_card.alt_description": "Samenvattingsoverzicht van repositorie %[1]s, omschreven als: %[2]s", - "mail.actions.run_info_sha": "Commit: %[1]s" + "mail.actions.run_info_sha": "Commit: %[1]s", + "repo.settings.push_mirror.branch_filter.label": "Branch filter (optioneel)", + "repo.settings.push_mirror.branch_filter.description": "Branches die gespiegeld moeten worden. Laat het laag om alle branches te spiegelen. Zie %[2]s documentatie voor de syntax. Voorbeeld: main, release/*" } diff --git a/options/locale_next/locale_pt-BR.json b/options/locale_next/locale_pt-BR.json index 6ed6c5defd..80395b020b 100644 --- a/options/locale_next/locale_pt-BR.json +++ b/options/locale_next/locale_pt-BR.json @@ -111,5 +111,7 @@ "og.repo.summary_card.alt_description": "Cartão de resumo do repositório %[1]s, descrito como: %[2]s", "profile.actions.tooltip": "Mais Actions", "keys.ssh.link": "Chaves SSH", - "mail.actions.run_info_sha": "Commit: %[1]s" + "mail.actions.run_info_sha": "Commit: %[1]s", + "repo.settings.push_mirror.branch_filter.label": "Filtro de branches (opcional)", + "repo.settings.push_mirror.branch_filter.description": "Branches para espelhar. Deixe em branco para espelhar todos os branches. Veja %[2]s documentação sobre a sintaxe. Exemplos: main, release/*" } diff --git a/options/locale_next/locale_pt-PT.json b/options/locale_next/locale_pt-PT.json index 352e948966..4710d3d868 100644 --- a/options/locale_next/locale_pt-PT.json +++ b/options/locale_next/locale_pt-PT.json @@ -83,7 +83,7 @@ "moderation.abuse_category": "Categoria", "moderation.abuse_category.placeholder": "Escolha uma categoria", "moderation.abuse_category.spam": "Spam", - "moderation.abuse_category.malware": "Malware", + "moderation.abuse_category.malware": "Software malicioso", "moderation.abuse_category.illegal_content": "Conteúdo ilegal", "moderation.abuse_category.other_violations": "Outras violações das regras da plataforma", "moderation.report_remarks": "Observações", @@ -109,5 +109,9 @@ "feed.atom.link": "Feed Atom", "keys.ssh.link": "Chaves SSH", "keys.gpg.link": "Chaves GPG", - "repo.diff.commit.previous-short": "Ant." + "repo.diff.commit.previous-short": "Ant.", + "og.repo.summary_card.alt_description": "Cartão de resumo do repositório %[1]s, descrito como: %[2]s", + "repo.settings.push_mirror.branch_filter.label": "Filtro de ramos (opcional)", + "repo.settings.push_mirror.branch_filter.description": "Ramos a serem espelhados. Deixe em branco para espelhar todos os ramos. Veja a %[2]s documentação sobre a sintaxe. Exemplos: main, release/*", + "mail.actions.run_info_sha": "Cometimento: %[1]s" } diff --git a/options/locale_next/locale_ru-RU.json b/options/locale_next/locale_ru-RU.json index 19167d7177..ecd58b8b62 100644 --- a/options/locale_next/locale_ru-RU.json +++ b/options/locale_next/locale_ru-RU.json @@ -23,7 +23,7 @@ "alert.asset_load_failed": "Не удалось получить ресурсы из {path}. Убедитесь, что файлы ресурсов доступны.", "install.invalid_lfs_path": "Не удалось расположить корень LFS по указанному пути: %[1]s", "alert.range_error": " - число должно быть в диапазоне от %[1]s-%[2]s.", - "meta.last_line": "Unskip..", + "meta.last_line": "...ъъ", "mail.actions.not_successful_run_subject": "Провал раб. потока %[1]s в репозитории %[2]s", "mail.actions.successful_run_after_failure_subject": "Возобновление раб. потока %[1]s в репозитории %[2]s", "mail.actions.run_info_trigger": "Причина срабатывания: %[1]s by: %[2]s", @@ -111,5 +111,7 @@ "keys.gpg.link": "Ключи GPG", "profile.edit.link": "Изменить профиль", "og.repo.summary_card.alt_description": "Карточка со сводкой о репозитории %s. Описание: %[2]s", - "mail.actions.run_info_sha": "Коммит: %[1]s" + "mail.actions.run_info_sha": "Коммит: %[1]s", + "repo.settings.push_mirror.branch_filter.description": "Синхронизируемые ветви. Оставьте пустым, чтобы синхронизировать все. Ознакомьтесь с синтаксисом в документации %[2]s. Примеры: main, release/*", + "repo.settings.push_mirror.branch_filter.label": "Выбор ветвей (опционально)" } diff --git a/options/locale_next/locale_uk-UA.json b/options/locale_next/locale_uk-UA.json index 8e99505e57..f014a8dc66 100644 --- a/options/locale_next/locale_uk-UA.json +++ b/options/locale_next/locale_uk-UA.json @@ -111,5 +111,7 @@ "feed.atom.link": "Стрічка Atom", "profile.actions.tooltip": "Більше дій", "og.repo.summary_card.alt_description": "Підсумкова картка репозиторію %[1]s з описом: %[2]s", - "mail.actions.run_info_sha": "Коміт: %[1]s" + "mail.actions.run_info_sha": "Коміт: %[1]s", + "repo.settings.push_mirror.branch_filter.description": "Гілки для дзеркалювання. Залиште порожнім, щоб віддзеркалити всі гілки. Дивіться синтаксис у документації %[2]s. Приклади: main, release/*", + "repo.settings.push_mirror.branch_filter.label": "Фільтр гілок (необов'язково)" } diff --git a/options/locale_next/locale_zh-CN.json b/options/locale_next/locale_zh-CN.json index c235ebd0ad..467c990d3a 100644 --- a/options/locale_next/locale_zh-CN.json +++ b/options/locale_next/locale_zh-CN.json @@ -78,5 +78,8 @@ "repo.diff.commit.previous-short": "上一个", "feed.atom.link": "Atom 订阅源", "profile.edit.link": "编辑个人资料", - "og.repo.summary_card.alt_description": "仓库 %[1]s 的摘要卡片,描述为:%[2]s" + "og.repo.summary_card.alt_description": "仓库 %[1]s 的摘要卡片,描述为:%[2]s", + "repo.settings.push_mirror.branch_filter.label": "分支过滤器(可选)", + "repo.settings.push_mirror.branch_filter.description": "欲镜像的分支。留空以镜像所有分支。关于语法的更多信息,请参见 %[2]s 文档。例如:main, release/*", + "mail.actions.run_info_sha": "提交:%[1]s" } From edceb0c3d93cd0086da61bf3d1a26997099af253 Mon Sep 17 00:00:00 2001 From: 0ko <0ko@noreply.codeberg.org> Date: Wed, 16 Jul 2025 21:52:50 +0500 Subject: [PATCH 160/495] [v12.0/forgejo] i18n: update of translations from Codeberg Translate Translation updates that were relevant to v11 branch were picked from this commit: 8cc20864029ff0ee705f0705da0b3790880c49d1 (#8295) Changes to strings that are only present in the v13 branch were not picked. Below is a list of co-authors of the ported commit. It may contain co-authors who's changes were not picked due to only being relevant to v13. Co-authored-by: Benedikt Straub Co-authored-by: Codeberg Translate Co-authored-by: Dirk Co-authored-by: Edgarsons Co-authored-by: Fjuro Co-authored-by: Gusted Co-authored-by: Juno Takano Co-authored-by: Outbreak2096 Co-authored-by: SomeTr Co-authored-by: Vyxie Co-authored-by: Xinayder Co-authored-by: artnay Co-authored-by: earl-warren Co-authored-by: jedik Co-authored-by: justbispo Co-authored-by: kwoot Co-authored-by: leandro-costa Co-authored-by: xtex Co-authored-by: yeager Co-authored-by: zub --- options/locale/locale_cs-CZ.ini | 6 +- options/locale/locale_fi-FI.ini | 4 +- options/locale/locale_fr-FR.ini | 4 +- options/locale/locale_lv-LV.ini | 2 +- options/locale/locale_nb_NO.ini | 120 +++++++++++++++++++++++++- options/locale/locale_nds.ini | 2 +- options/locale/locale_nl-NL.ini | 17 +++- options/locale/locale_pt-BR.ini | 18 ++-- options/locale/locale_pt-PT.ini | 12 +-- options/locale/locale_sv-SE.ini | 12 +-- options/locale/locale_uk-UA.ini | 51 +++++++++-- options/locale/locale_zh-CN.ini | 2 +- options/locale_next/locale_cs-CZ.json | 7 +- options/locale_next/locale_lv-LV.json | 7 +- options/locale_next/locale_nb_NO.json | 74 +++++++++++++++- options/locale_next/locale_nl-NL.json | 12 ++- options/locale_next/locale_pt-BR.json | 7 +- options/locale_next/locale_pt-PT.json | 9 +- options/locale_next/locale_sv-SE.json | 9 +- 19 files changed, 326 insertions(+), 49 deletions(-) diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index 830065fb64..168965a740 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -1063,7 +1063,7 @@ language.localization_project = Pomozte nám s překladem Forgejo do vašeho jaz user_block_yourself = Nemůžete zablokovat sami sebe. pronouns_custom_label = Vlastní zájmena change_username_redirect_prompt.with_cooldown.few = Staré uživatelské jméno bude dostupné ostatním po %[1]d dnech. Do té doby budete moci své staré uživatelské jméno znovu získat. -change_username_redirect_prompt.with_cooldown.one = Staré uživatelské jméno bude dostupné ostatním po %[1]d dni. Do té doby budete moci své staré uživatelské jméno znovu získat. +change_username_redirect_prompt.with_cooldown.one = Staré uživatelské jméno bude dostupné ostatním po %[1]d dnu. Do té doby budete moci své staré uživatelské jméno znovu získat. keep_pronouns_private = Zobrazovat zájmena pouze přihlášeným uživatelům keep_pronouns_private.description = Toto nastavení skryje vaše zájmena před návštěvníky, kteří nejsou přihlášeni. quota = Kvóta @@ -1579,7 +1579,7 @@ issues.remove_ref_at=`odstranil/a referenci %s %s` issues.add_ref_at=`přidal/a referenci %s %s` issues.delete_branch_at=`odstranil/a větev %s %s` issues.filter_label=Štítek -issues.filter_label_exclude=`Chcete-li vyloučit štítky, použijte alt + click/enter` +issues.filter_label_exclude=Chcete-li vyloučit štítky, použijte Alt + kliknutí issues.filter_label_no_select=Všechny štítky issues.filter_label_select_no_label=Bez štítku issues.filter_milestone=Milník @@ -3058,7 +3058,7 @@ teams.invite.by=Pozvání od %s teams.invite.description=Pro připojení k týmu klikněte na tlačítko níže. follow_blocked_user = Tuto organizaci nemůžete sledovat, protože jste v ní zablokováni. open_dashboard = Otevřít nástěnku -settings.change_orgname_redirect_prompt.with_cooldown.one = Starý název organizace bude dostupný ostatním po %[1]d dni. Do té doby budete moci staré jméno znovu získat. +settings.change_orgname_redirect_prompt.with_cooldown.one = Starý název organizace bude dostupný ostatním po %[1]d dnu. Do té doby budete moci staré jméno znovu získat. settings.change_orgname_redirect_prompt.with_cooldown.few = Starý název organizace bude dostupný ostatním po %[1]d dnech. Do té doby budete moci starý název znovu získat. [admin] diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini index 164a60cc8d..efd8a16526 100644 --- a/options/locale/locale_fi-FI.ini +++ b/options/locale/locale_fi-FI.ini @@ -2255,14 +2255,14 @@ pulls.cmd_instruction_merge_warning = Varoitus: Asetusta ”Tunnista manu pulls.cmd_instruction_merge_desc = Yhdistä muutokset ja päivitä Forgejossa. pulls.cannot_auto_merge_desc = Tätä vetopyyntöä ei voida yhdistää automaattisesti ristiriitojen vuoksi. adopt_preexisting_success = Omaksuttu tiedostot ja luotu tietovarasto lähteestä %s -issues.comment_manually_pull_merged_at = manuaalisesti yhdistetty kommitti %[1]s %[2]s tietovarastoon %[3]s +issues.comment_manually_pull_merged_at = manuaalisesti yhdisti kommitin %[1]s %[2]s tietovarastoon %[3]s pulls.cmd_instruction_merge_title = Yhdistä pulls.has_merged = Epäonnistui: vetopyyntö on yhdistetty, joten et voi yhdistää uudelleen tai muuttaa kohdehaaraa. pulls.cmd_instruction_checkout_title = Uloskuittaus pulls.cmd_instruction_checkout_desc = Kuittaa ulos uusi haara projektitietovarastostasi ja testaa muutokset. pulls.clear_merge_message_hint = Yhdistämisviestin tyhjentäminen poistaa vain kommittiviestin sisällön ja säilyttää luodut git-trailerit, kuten "Co-Authored-By…". settings.protect_check_status_contexts_desc = Vaadi tilatarkistusten läpäisy ennen yhdistämistä. Kun käytössä, kommitit on ensin työnnettävä toiseen haaraan ja sitten yhdistettävä tai työnnettävä suoraan tätä sääntöä vastaavaan haaraan tilantarkistuksen jälkeen. Jos konteksteja ei löydy, viimeisen kommitin on oltava onnistunut kontekstista riippumatta. -issues.comment_pull_merged_at = yhdistetty kommitti %[1]s %[2]s tietovarastoon %[3]s +issues.comment_pull_merged_at = yhdisti kommitin %[1]s %[2]s haaraan %[3]s settings.pulls.enable_autodetect_manual_merge = Ota Tunnista manuaalinen yhdistäminen automaattisesti -asetus käyttöön (Huomaa: joissakin erityistapauksissa voi esiintyä virhearviointeja) pulls.no_merge_desc = Tätä vetopyyntöä ei voida yhdistää, koska kaikki tietovaraston yhdistämisvaihtoehdot ovat poistettu käytöstä. pulls.no_merge_not_ready = Tämä vetopyyntö ei ole valmis yhdistettäväksi. Tarkista katselmoinnin tila ja tilantarkistukset. diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 1cb7103bc0..e522d5ab92 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -1579,7 +1579,7 @@ issues.remove_ref_at=`a supprimé la référence %s %s.` issues.add_ref_at=`a ajouté la référence %s %s.` issues.delete_branch_at=`a supprimé la branche %s %s.` issues.filter_label=Label -issues.filter_label_exclude=`Utilisez Alt + Clic/entrée pour exclure les labels.` +issues.filter_label_exclude=`Utilisez Alt + Click pour exclure les étiquettes.` issues.filter_label_no_select=Toutes les labels issues.filter_label_select_no_label=Aucun label issues.filter_milestone=Jalon @@ -4091,4 +4091,4 @@ issues.write = Écrire : Fermer des tickets et gérer les métadonnées t pulls.read = Lire : Lire et créer des demandes de tirage. [translation_meta] -test = Ceci est une chaîne de test. Elle n'est pas affichée dans l'interface de Forgejo mais est utilisée à des fins de test. N'hésitez pas à entrer 'ok' pour gagner du temps (ou un fait amusant de votre choix) pour atteindre ce difficile 100 % de complétion. :-) +test = Ceci est une chaîne de test. Elle n'est pas affichée dans Forgejo mais est utilisée à des fins de test. N'hésitez pas à entrer 'ok' pour gagner du temps (ou un fait amusant de votre choix) pour atteindre ce difficile 100 % de complétion. :-) diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 98baff217b..4a98e1aa9d 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -1577,7 +1577,7 @@ issues.remove_ref_at=`noņēma atsauci no %s %s` issues.add_ref_at=`pievienoja atsauci uz %s %s` issues.delete_branch_at=`izdzēsa zaru %s %s` issues.filter_label=Iezīme -issues.filter_label_exclude=`Jāizmanto alt + klikšķis/Enter, lai neiekļautu iezīmes` +issues.filter_label_exclude=Jāizmanto Alt + klikšķis, lai neiekļautu iezīmes issues.filter_label_no_select=Visas iezīmes issues.filter_label_select_no_label=Bez iezīmes issues.filter_milestone=Atskaites punkts diff --git a/options/locale/locale_nb_NO.ini b/options/locale/locale_nb_NO.ini index 2c8b5cfc64..7dda7499a5 100644 --- a/options/locale/locale_nb_NO.ini +++ b/options/locale/locale_nb_NO.ini @@ -60,7 +60,7 @@ rerun = Kjør på nytt rerun_all = Kjør alle jobber på nytt save = Lagre cancel = Avbryt -forks = Forks +forks = Kopier milestones = Milepæler ok = OK test = Test @@ -134,14 +134,44 @@ webauthn_error_timeout = Et tidsavbrudd oppsto før nøkkelen din kunne leses. V new_fork = Ny fork av repository collaborative = Samarbeidende +tracked_time_summary = Oppsummering av sporet tid basert på problemfiltre +pull_requests = Pull requests +issues = Saker +copy_branch = Kopier branch navn +error404 = Siden du forsøker å nå eksisterer ikke, er blitt fjernet eller du har ikke tilgang til å se den. +error413 = Du har brukt opp kvoten din. +unpin = Løsne +filter.is_fork = Forks +filter.not_fork = Ikke forks + [search] -search = Søk... +search = Søk… type_tooltip = Søketype fuzzy = Fuzzy union = Union regexp = RegExp exact = Nøyaktig +fuzzy_tooltip = Inkluder resultater som også stemmer godt overens med søketermen +union_tooltip = Inkluder resultater som samsvarer med ett eller flere av nøkkelordene adskilt med mellomrom +exact_tooltip = Inkluder kun resultater som samsvarer nøyaktig med søkeordet +regexp_tooltip = Tolk søkeordet som et regulæruttrykk +repo_kind = Søk i repositorer… +user_kind = Søk i brukere… +org_kind = Søk i organisasjoner… +team_kind = Søk i teams… +code_kind = Søk i kode… +code_search_unavailable = Kodesøk er ikke tilgjengelig. Kontakt administratoren. +package_kind = Søk i pakker… +project_kind = Søk i prosjekter… +branch_kind = Søk i brancher… +commit_kind = Søk i commits… +runner_kind = Søk i runners… +no_results = Ingen treff funnet. +issue_kind = Søk i saker… +pull_kind = Søk i pulls… +keyword_search_unavailable = Søk etter nøkkelord er for øyeblikket ikke tilgjengelig. Kontakt administratoren. + [auth] verify = Bekreft sign_up_button = Opprett konto nå. @@ -152,4 +182,88 @@ oauth_signup_title = Fullfør ny konto oauth_signup_submit = Fullfør konto [home] -uname_holder = Brukernavn eller e-postadresse \ No newline at end of file +uname_holder = Brukernavn eller e-postadresse + +[aria] +navbar = Navigasjonslinje +footer = Bunntekst +footer.software = Om dette programmet +footer.links = Linker + +[heatmap] +number_of_contributions_in_the_last_12_months = %s bidrag de siste 12 månedene +contributions_zero = Ingen bidrag +contributions_format = {contributions} den {day} {month} {year} +contributions_one = bidrag +contributions_few = bidrag +less = Mindre +more = Mer + +[editor] +buttons.heading.tooltip = Legg til overskrift +buttons.bold.tooltip = Legg til uthevet tekst +buttons.italic.tooltip = Legg til kursiv text +buttons.quote.tooltip = Siter tekst +buttons.code.tooltip = Legg til kode +buttons.link.tooltip = Legg til link +buttons.list.unordered.tooltip = Legg til punktliste +buttons.list.ordered.tooltip = Legg til nummerert liste +buttons.list.task.tooltip = Legg til liste over saker +buttons.mention.tooltip = Nevn en bruker eller team +buttons.ref.tooltip = Referanse til en sak eller pull request +buttons.switch_to_legacy.tooltip = Bruk den gamle editoren istedenfor +buttons.enable_monospace_font = Aktiver monospace font +buttons.disable_monospace_font = Deaktiver monospace font +buttons.indent.tooltip = Grupper elementene med et nivå +buttons.unindent.tooltip = Pakk ut elementene med et nivå +buttons.new_table.tooltip = Legg til tabell +table_modal.header = Legg til tabell +table_modal.placeholder.header = Overskrift +table_modal.placeholder.content = Innhold +table_modal.label.rows = Rader +table_modal.label.columns = Kolonner +link_modal.header = Legg til en link +link_modal.url = Url +link_modal.description = Beskrivelse +link_modal.paste_reminder = Tips: Når du har en URL i utklippstavlen kan du lime den direkte inn i editoren for å lage en lenke. + +[filter] +string.asc = A - Z +string.desc = Z - A + +[error] +occurred = En feil oppstod +report_message = Hvis du mener dette er en feil i Forgejo kan du søke på Codeberg eller åpne en ny sak. +not_found = Kunne ikke finne målet. +network_error = Nettverks feil +server_internal = Intern server feil + +[startpage] +app_desc = En enkel Git-tjeneste du kan drifte selv +install = Enkel å installere +install_desc = Du kan enkelt kjøre programfilen for din platform, bruke Docker, eller hente den som en ferdig pakke. +platform = Plattformuavhengig +platform_desc = Forgejo fungerer på frie operativsystemer som Linux og FreeBSD, og støtter flere CPU-arkitekturer. Velg den plattformen du foretrekker! +lightweight = Lettvekt +lightweight_desc = Forgejo krever lite ressurser og kan kjøres på en rimelig Raspberry Pi. Spar strøm og miljøet! +license = Åpen kildekode +license_desc = Last ned Forgejo! Bli med ved å bidra for å gjøre prosjektet enda bedre. Ikke vær redd for å bli en bidragsyter! + +[install] +install = Installasjon +title = Førstegangsoppsett +docker_helper = Dersom du bruker Forgejo med Docker, anbefales det å lese dokumentasjonen før du gjør endringer i konfigurasjonen. +require_db_desc = Forgejo krever MySQL, PostgreSQL, SQLite3 eller TiDB (MySQL protokoll). +db_title = Database innstillinger +db_type = Database type +host = Server +user = Brukernavn +password = Passord +db_name = Database navn +db_schema = Skjema +db_schema_helper = La stå tomt for databasens standardverdi ("public"). +ssl_mode = SSL +path = Sti +sqlite_helper = Sti til SQLite3-databasen.
Bruk absolutt filsti dersom Forgejo kjøres som en tjeneste. +reinstall_error = Du prøver å installere i en eksisterende Forgejo-database +reinstall_confirm_message = Å installere på nytt med en eksisterende Forgejo-database kan føre til problemer. I de fleste tilfeller bør du bruke din eksisterende "app.ini" for å kjøre Forgejo. Hvis du vet hva du gjør, og vil fortsette, bekreft følgende: \ No newline at end of file diff --git a/options/locale/locale_nds.ini b/options/locale/locale_nds.ini index 68fe899d6e..cd91f7c35a 100644 --- a/options/locale/locale_nds.ini +++ b/options/locale/locale_nds.ini @@ -1552,7 +1552,7 @@ issues.dependency.pr_close_blocks = Deeser Haalvörslag blockeert dat Dichtmaken issues.dependency.issue_batch_close_blocked = Kann de utköört Gefallens nich all tosamen dichtmaken, denn Gefall #%d hett noch open Ofhangens issues.dependency.pr_close_blocked = Du muttst all Gefallens, wat deesen Haalvörslag blockeren, dichtmaken, ehr du dat hier tosamenföhren kannst. issues.dependency.blocks_short = Blockeert -issues.dependency.blocked_by_short = Hang of vun +issues.dependency.blocked_by_short = Hangt of vun issues.dependency.remove_header = Ofhangen wegdoon issues.dependency.setting = Ofhangens för Gefallens un Haalvörslagen anknipsen issues.dependency.add_error_same_issue = Du kannst een Gefall nich vun sik sülvst ofhangen laten. diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index 48442bc39f..7f121395b9 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -559,7 +559,7 @@ team_invite.text_2 = Klik alstublieft op de volgende link om aan het team deel t admin.new_user.text = Klik hier om deze gebruiker te beheren vanuit het beheerderspaneel. password_change.subject = Uw wachtwoord is gewijzigd password_change.text_1 = Het wachtwoord voor je account is zojuist gewijzigd. -reset_password.text_1 = +reset_password.text_1 = totp_disabled.subject = TOTP is uitgeschakeld primary_mail_change.subject = Uw primaire e-mail is gewijzigd totp_disabled.no_2fa = Er zijn geen andere 2FA methodes meer geconfigureerd, wat betekent dat het niet langer nodig is om in te loggen op uw account met 2FA. @@ -1495,7 +1495,7 @@ issues.remove_ref_at=`heeft referentie %s verwijderd %s` issues.add_ref_at=`heeft referentie %s toegevoegd %s` issues.delete_branch_at=`heeft %[2]s de branch %[1]s verwijderd.` issues.filter_label=Label -issues.filter_label_exclude=Gebruik alt + klik/voer in om labels uit te sluiten +issues.filter_label_exclude=Gebruik alt + klik om labels uit te sluiten issues.filter_label_no_select=Alle labels issues.filter_milestone=Mijlpaal issues.filter_project=Project @@ -1554,8 +1554,8 @@ issues.close_comment_issue=Sluit met commentaar issues.reopen_issue=Heropen issues.reopen_comment_issue=Heropen met commentaar issues.create_comment=Reageer -issues.closed_at=`heeft dit probleem gesloten %s` -issues.reopened_at=`heropende dit probleem %s` +issues.closed_at=`heeft deze issue gesloten %s` +issues.reopened_at=`heropende deze issue %s` issues.commit_ref_at=`verwees naar dit probleem vanuit commit %s` issues.ref_issue_from=`refereerde aan dit issue %[3]s %[1]s` issues.ref_pull_from=`refereerde aan deze pull request %[3]s %[1]s` @@ -2915,6 +2915,15 @@ sync_fork.branch_behind_few = Deze branch is %[1]d commits achter %[2]s +issues.filter_type.all_pull_requests = Alle pull requests +settings.event_header_action = Actie run evenementen +settings.event_action_failure = Mislukking +settings.event_action_failure_desc = Action run is mislukt. +settings.event_action_recover = Herstel +settings.event_action_recover_desc = Action run is geslaagd nadat de laatste action run in dezelfde workflow is mislukt. +settings.event_action_success = Succes +settings.event_action_success_desc = Action run is geslaagd. + [graphs] component_loading_info = Dit kan even duren… component_failed_to_load = Er is een onverwachte fout opgetreden. diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 8de0374eb2..cd5cc14833 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -1278,7 +1278,7 @@ star_guest_user=Entre para adicionar este repositório aos favoritos. unwatch=Deixar de observar watch=Observar unstar=Retirar dos favoritos -star=Juntar aos favoritos +star=Adicionar aos favoritos fork=Fork download_archive=Baixar repositório more_operations=Mais operações @@ -1934,7 +1934,7 @@ pulls.status_checks_success=Todas as verificações foram bem sucedidas pulls.status_checks_warning=Algumas verificações reportaram avisos pulls.status_checks_failure=Algumas verificações falharam pulls.status_checks_error=Algumas verificações reportaram erros -pulls.status_checks_requested=Obrigatário +pulls.status_checks_requested=Obrigatório pulls.status_checks_details=Detalhes pulls.update_branch=Atualizar branch por merge pulls.update_branch_rebase=Atualizar branch por rebase @@ -2803,7 +2803,7 @@ mirror_use_ssh.helper = Forgejo irá espelhar o repositório via Git através de mirror_denied_combination = Não é possível combinar o uso de chave pública e autenticação baseada em senha. mirror_public_key = Chave SSH pública mirror_use_ssh.text = Usar autenticação por SSH -mirror_use_ssh.not_available = Autenticação por SSH não está disponível. +mirror_use_ssh.not_available = A autenticação via SSH não está disponível. settings.push_mirror_sync_in_progress = Fazendo push das mudanças para o remoto %s nesse momento. settings.federation_apapiurl = URL de federação deste repositório. Copie e cole isso nas Configurações de Federação de outro repositório como uma URL de um Repositório Seguidor. pulls.agit_explanation = Criado usando o fluxo de trabalho AGit. AGit permite que contribuidores proponham mudanças usando "git push" sem criar um fork ou novo branch. @@ -2817,7 +2817,7 @@ settings.mirror_settings.pushed_repository = Repositório enviado settings.mirror_settings.docs.disabled_pull_mirror.instructions = Configure seu projeto para automaticamente fazer push de commits, tags e branches para outro repositório. Espelhos de pull foram desativados pelo administrador do seu site. settings.mirror_settings.docs.disabled_push_mirror.instructions = Configure seu projeto para automaticamente fazer pull de commits, tags e branches de outro repositório. settings.mirror_settings.docs.doc_link_pull_section = a seção "Fazendo pull de um repositório remoto" da documentação. -subscribe.pull.guest.tooltip = Entre para receber notificações deste pull request. +subscribe.pull.guest.tooltip = Inicie a sessão para receber notificações deste pull request. settings.pull_mirror_sync_quota_exceeded = Cota excedida, não será feito pull das mudanças. settings.mirror_settings.docs.more_information_if_disabled = Saiba mais sobre espelhos de push e pull aqui: settings.transfer_quota_exceeded = O novo dono (%s) excedeu a cota. O repositório não foi transferido. @@ -3900,7 +3900,7 @@ deletion=Excluir segredo deletion.description=A exclusão de um segredo é permanente e não pode ser desfeita. Continuar? deletion.success=O segredo foi excluído. deletion.failed=Falha ao excluir segredo. -management=Gerenciar segredos +management=Gerenciamento de segredos [actions] actions=Ações @@ -3909,12 +3909,12 @@ unit.desc=Gerenciar pipelines integradas de CI/CD com Forgejo Actions. status.unknown=Desconhecido status.waiting=Aguardando -status.running=Rodando +status.running=Executando status.success=Sucesso status.failure=Falha -status.cancelled=Cancelado -status.skipped=Ignorado -status.blocked=Bloqueado +status.cancelled=Cancelada +status.skipped=Ignorada +status.blocked=Bloqueada runners=Runners runners.runner_manage_panel=Gerenciar runners diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index 0e8f2d485e..d82ae69fa4 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -1063,8 +1063,8 @@ language.description = Este idioma vai ser guardado na sua conta e ser usado com language.localization_project = Ajude-nos a traduzir o Forgejo para o seu idioma! Ler mais. pronouns_custom_label = Pronomes personalizados user_block_yourself = Não se pode bloquear a si próprio. -change_username_redirect_prompt.with_cooldown.one = O nome de utilizador antigo estará disponível para todos após um período de espera de %[1]d dia, podendo ainda reivindicar o nome de utilizador antigo durante o período de espera. -change_username_redirect_prompt.with_cooldown.few = O nome de utilizador antigo ficará disponível para todos após um período de espera de %[1]d dias, podendo ainda reivindicar o nome de utilizador antigo durante o período de espera. +change_username_redirect_prompt.with_cooldown.one = O nome de utilizador antigo estará disponível para todos após um período de espera de %[1]d dia. Pode ainda reivindicar o nome de utilizador antigo durante o período de espera. +change_username_redirect_prompt.with_cooldown.few = O nome de utilizador antigo ficará disponível para todos após um período de espera de %[1]d dias. Pode ainda reivindicar o nome de utilizador antigo durante o período de espera. quota.applies_to_user = As seguintes regras de quotas aplicam-se à sua conta quota.sizes.assets.artifacts = Artefactos quota.rule.exceeded.helper = O tamanho total dos objectos para esta regra excedeu a quota. @@ -1583,7 +1583,7 @@ issues.remove_ref_at=`removeu a referência %s %s` issues.add_ref_at=`adicionou a referência %s %s` issues.delete_branch_at=`eliminou o ramo %s %s` issues.filter_label=Rótulo -issues.filter_label_exclude=`Use alt + clique/enter para excluir rótulos` +issues.filter_label_exclude=Use Alt + Clique para excluir rótulos issues.filter_label_no_select=Todos os rótulos issues.filter_label_select_no_label=Sem rótulo issues.filter_milestone=Etapa @@ -2923,6 +2923,8 @@ settings.event_action_recover_desc = A execução de ação foi bem sucedida dep settings.event_action_success = Sucesso settings.event_action_success_desc = A Execução de ação foi bem sucedida. +issues.filter_type.all_pull_requests = Todos os pedidos de integração + [graphs] component_loading=A carregar %s… component_loading_failed=Não foi possível carregar %s @@ -3057,8 +3059,8 @@ teams.invite.by=Convidado(a) por %s teams.invite.description=Clique no botão abaixo para se juntar à equipa. follow_blocked_user = Não pode seguir esta organização porque esta organização bloqueou-o/a. open_dashboard = Abrir painel de controlo -settings.change_orgname_redirect_prompt.with_cooldown.one = O nome antigo da organização estará disponível para todos após um período de espera de %[1]d dia, podendo ainda reivindicar o nome antigo durante o período de espera. -settings.change_orgname_redirect_prompt.with_cooldown.few = O nome antigo da organização estará disponível para todos após um período de espera de %[1]d dias, podendo ainda reivindicar o nome antigo durante o período de espera. +settings.change_orgname_redirect_prompt.with_cooldown.one = O nome antigo da organização estará disponível para todos após um período de espera de %[1]d dia. Pode ainda reivindicar o nome antigo durante o período de espera. +settings.change_orgname_redirect_prompt.with_cooldown.few = O nome antigo da organização estará disponível para todos após um período de espera de %[1]d dias. Pode ainda reivindicar o nome antigo durante o período de espera. [admin] dashboard=Painel de controlo diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index 8b43cb29b8..2e212c8c49 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -918,7 +918,7 @@ migrate.migrate_items_options=Åtkomsttoken krävs för att migrera ytterligare migrated_from=Migrerad från %[2]s migrated_from_fake=Migrerad från %[1]s migrate.migrate=Migrera från %s -migrate.migrating=Migrerar från %s ... +migrate.migrating=Migrerar från %s … migrate.migrating_failed=Migrering från %s misslyckades. migrate.migrating_issues=Migrerar ärenden @@ -2324,15 +2324,15 @@ exact = Exakt exact_tooltip = Inkludera bara resultat som exakt matchar söktermen repo_kind = Sök repon… user_kind = Sök användare… -code_kind = Sök kod... -package_kind = Sök paket... +code_kind = Sök kod… +package_kind = Sök paket… runner_kind = Sök exekutorer... -branch_kind = Sök grenar... +branch_kind = Sök grenar… commit_kind = Sök commiter... -project_kind = Sök projekt... +project_kind = Sök projekt… search = Sök… type_tooltip = Söktyp -team_kind = Sök lag... +team_kind = Sök team… org_kind = Sök organisationer… issue_kind = Sök ärenden... regexp_tooltip = Tolka söktermen som ett reguljärt uttryck diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index faa3f2a56e..11954dd625 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -198,7 +198,7 @@ buttons.disable_monospace_font = Вимкнути моноширинний шр buttons.indent.tooltip = Вкласти предмет на один рівень buttons.unindent.tooltip = Викласти об'єкт на один рівень buttons.mention.tooltip = Згадати користувача чи команду -buttons.ref.tooltip = Послатись на задачу чи на запит на злиття +buttons.ref.tooltip = Послатися на задачу чи на запит на злиття buttons.enable_monospace_font = Увімкнути моноширинний шрифт buttons.new_table.tooltip = Додати таблицю table_modal.label.columns = Стовпці @@ -1276,7 +1276,7 @@ file_raw=Неформатований file_history=Історія file_view_source=Переглянути вихідний код file_view_rendered=Переглянути відрендерено -file_view_raw=Перегляд Raw +file_view_raw=Переглянути неформатований file_permalink=Постійне посилання file_too_large=Цей файл завеликий щоб бути показаним. @@ -2670,6 +2670,32 @@ commitstatus.success = Успіх commitstatus.failure = Збій issues.filter_type.all_pull_requests = Усі запити на злиття +summary_card_alt = Підсумкова картка репозиторію %s +migrate_options_lfs_endpoint.placeholder = Якщо залишити порожнім, то кінцеву точку буде визначено з URL-адреси клону +migrate.invalid_local_path = Локальний шлях недійсний. Він не існує або не є каталогом. +subscribe.issue.guest.tooltip = Увійдіть, щоб підписатися на цю задачу. +subscribe.pull.guest.tooltip = Увійдіть, щоб підписатися на цей запит на злиття. +cite_this_repo = Послатися на цей репозиторій +broken_message = Неможливо прочитати дані Git, що лежать в основі цього репозиторію. Зверніться до адміністратора цього екземпляра або видаліть репозиторій. +invisible_runes_header = `Цей файл містить невидимі символи Юнікоду` +invisible_runes_description = `Цей файл містить невидимі символи Юнікоду, які людині неможливо розрізнити, але які по-різному обробляються комп'ютером. Якщо так зроблено навмисно, можете ігнорувати це попередження. Щоб показати ці символи, скористайтеся кнопкою «Escape».` +ambiguous_runes_header = `Цей файл містить неоднозначні символи Юнікоду` +ambiguous_runes_description = `Цей файл містить символи Юнікоду, які легко сплутати з іншими символами. Якщо так зроблено навмисно, можете ігнорувати це попередження. Щоб показати ці символи, скористайтеся кнопкою «Escape».` +invisible_runes_line = `У цьому рядку є невидимі символи Юнікоду` +ambiguous_runes_line = `У цьому рядку є неоднозначні символи Юнікоду` +ambiguous_character = `%[1]c [U+%04[1]X] можна сплутати з %[2]c [U+%04[2]X]` +escape_control_characters = Escape +unescape_control_characters = Unescape +no_eol.text = Без EOL +editor.filename_is_invalid = Хибна назва файлу: «%s». +editor.directory_is_a_file = Назва каталогу «%s» уже використовується в цьому репозиторії як назва файлу. +editor.filename_is_a_directory = Назва файлу «%s» уже використовується в цьому репозиторії як назва каталогу. +issues.choose.invalid_config = У конфігурації задачі є помилки: +issues.summary_card_alt = Підсумкова картка задачі «%s» в репозиторії %s +settings.sourcehut_builds.secrets_helper = Надати завданню доступ до секретів збірки (потрібен дозвіл SECRETS:RO) +settings.remove_protected_branch_failed = Не вдалося видалити правило захисту гілок «%s». +release.summary_card_alt = Підсумкова картка випуску «%s» в репозиторії %s + [graphs] contributors.what = внески component_loading_info = Це може зайняти деякий час… @@ -3193,7 +3219,7 @@ config.git_gc_timeout=Тайм-аут операції збирача смітт config.log_config=Конфігурація журналу config.disabled_logger=Вимкнено -config.access_log_mode=Режим доступу до журналу +config.access_log_mode=Режим журналювання доступу config.xorm_log_sql=Журнал SQL @@ -3250,7 +3276,7 @@ packages.package_manage_panel = Керування пакунками packages.published = Опубліковано notices.operations = Дії packages.cleanup = Очистити недійсні дані -packages.cleanup.success = Успішно очищено недійсні дані +packages.cleanup.success = Недійсні дані успішно очищено users.still_own_packages = Цей користувач досі володіє одним чи більше пакунками, спочатку видаліть ці пакунки. users.purge_help = Примусово видалити користувача і будь-які репозиторії, організації та пакунки, якими він володіє. Всі коментарі та задачі, створені цим користувачем, також будуть видалені. dashboard.cleanup_packages = Очистити непридатні пакунки @@ -3308,6 +3334,13 @@ auths.invalid_openIdConnectAutoDiscoveryURL = Неправильна URL-адр settings = Налаштування адміністратора +dashboard.cancel_abandoned_jobs = Скасувати покинуті завдання дій +dashboard.start_schedule_tasks = Запустити заплановані завдання дій +config.logger_name_fmt = Журнал: %s +config.access_log_template = Шаблон журналу доступу +config.set_setting_failed = Не вдалося встановити параметр %s +monitor.download_diagnosis_report = Завантажити діагностичний звіт + [action] create_repo=створив(ла) репозиторій %s rename_repo=репозиторій перейменовано з %[1]s на %[3]s @@ -3527,6 +3560,9 @@ npm.registry = Налаштуйте цей реєстр у файлі .npm chef.registry = Налаштуйте цей реєстр у файлі ~/.chef/config.rb: owner.settings.chef.keypair.description = Запити до реєстру Chef повинні бути криптографічно підписані як засіб автентифікації. При генерації пари ключів на Forgejo зберігається тільки публічний ключ. Приватний ключ надається вам для використання команд knife. Генерація нової пари ключів замінить попередню. +nuget.dependency.framework = Цільовий фреймворк +owner.settings.cleanuprules.preview.overview = Заплановано видалити %d пакунків. + [secrets] deletion = Видалити секрет creation.success = Секрет «%s» додано. @@ -3633,6 +3669,11 @@ runners.status.idle = Простоює +runs.invalid_workflow_helper = Недійсний файл конфігурації робочого потоку. Будь ласка, перевірте файл конфігурації: %s +runs.no_job_without_needs = Робочий потік повинен містити принаймні одне завдання без залежностей. +runs.no_job = Робочий потік повинен містити принаймні одне завдання +workflow.dispatch.use_from = Використати робочий потік із + [projects] type-3.display_name = Проєкт організації type-2.display_name = Проєкт репозиторію @@ -3641,7 +3682,7 @@ deleted.display_name = Видалений проєкт [git.filemode] symbolic_link=Символічне посилання -directory = Тека +directory = Каталог submodule = Підмодуль normal_file = Звичайний файл executable_file = Виконуваний файл diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index c6c534df9f..d87ad53676 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -171,7 +171,7 @@ copy_path = 复制路径 [aria] navbar=导航栏 footer=页脚 -footer.software=关于软件 +footer.software=关于此软件 footer.links=链接 [heatmap] diff --git a/options/locale_next/locale_cs-CZ.json b/options/locale_next/locale_cs-CZ.json index 97a8536d4f..3a32d3a95a 100644 --- a/options/locale_next/locale_cs-CZ.json +++ b/options/locale_next/locale_cs-CZ.json @@ -105,5 +105,10 @@ "settings.visibility.description": "Viditelnost profilu ovlivňuje možnost ostatních přistupovat k vašim veřejným repozitářům. Zjistit více", "avatar.constraints_hint": "Velikost vlastního avataru nesmí překročit %[1]s nebo být větší než %[2]dx%[3]d pixelů", "repo.diff.commit.next-short": "Další", - "repo.diff.commit.previous-short": "Předchozí" + "repo.diff.commit.previous-short": "Předchozí", + "profile.actions.tooltip": "Další akce", + "profile.edit.link": "Upravit profil", + "feed.atom.link": "Zdroj Atom", + "keys.ssh.link": "Klíče SSH", + "keys.gpg.link": "Klíče GPG" } diff --git a/options/locale_next/locale_lv-LV.json b/options/locale_next/locale_lv-LV.json index f71cfa227d..242c22bbf3 100644 --- a/options/locale_next/locale_lv-LV.json +++ b/options/locale_next/locale_lv-LV.json @@ -105,5 +105,10 @@ "settings.visibility.description": "Profila redzamība ietekmē iespēju citiem piekļūt Tavām glabātavām, kas nav privātas. Uzzināt vairāk", "avatar.constraints_hint": "Pielāgots profila attēls nevar pārsniegt %[1]s vai būt lielāks par %[2]dx%[3]d pikseļiem", "repo.diff.commit.next-short": "Nāk.", - "repo.diff.commit.previous-short": "Iepr." + "repo.diff.commit.previous-short": "Iepr.", + "profile.actions.tooltip": "Vairāk darbību", + "profile.edit.link": "Labot profilu", + "feed.atom.link": "Atom barotne", + "keys.ssh.link": "SSH atslēgas", + "keys.gpg.link": "GPG atslēgas" } diff --git a/options/locale_next/locale_nb_NO.json b/options/locale_next/locale_nb_NO.json index 0967ef424b..8f2f9b5e1c 100644 --- a/options/locale_next/locale_nb_NO.json +++ b/options/locale_next/locale_nb_NO.json @@ -1 +1,73 @@ -{} +{ + "home.welcome.no_activity": "Ingen aktivitet", + "home.welcome.activity_hint": "Det er foreløpig ingenting i feeden din. Aktivitetene dine og handlingene dine fra repositorier du følger, vil vises her etter hvert.", + "home.explore_repos": "Utforsk repositorier", + "home.explore_users": "Utforsk brukere", + "home.explore_orgs": "Utforsk organisasjoner", + "stars.list.none": "Ingen har gitt stjerner til dette repoet.", + "watch.list.none": "Ingen følger dette repoet.", + "followers.incoming.list.self.none": "Ingen følger profilen din.", + "followers.incoming.list.none": "Ingen følger denne brukeren.", + "followers.outgoing.list.self.none": "Du følger ikke noen.", + "followers.outgoing.list.none": "%s følger ikke noen.", + "relativetime.now": "nå", + "relativetime.future": "i fremtiden", + "relativetime.1day": "i går", + "relativetime.2days": "to dager siden", + "relativetime.1week": "forrige uke", + "relativetime.2weeks": "to uker siden", + "relativetime.1month": "forrige måned", + "relativetime.2months": "to måneder siden", + "relativetime.1year": "i fjor", + "relativetime.2years": "to år siden", + "repo.form.cannot_create": "Det maksimale antallet repositories er nådd i alle områdene du har tilgang til.", + "repo.issue_indexer.title": "Saksindekserer", + "search.milestone_kind": "Søker i milepæler…", + "incorrect_root_url": "Denne Forgejo instansen er konfigurert til å bruke \"%s\". Du bruker Forgejo via en annen URL, noe som kan forårsake at deler av applikasjonen ikke fungerer. Den kanoniske URL-en styres av Forgejo-administratorer via innstillingen ROOT_URL i app.ini-filen.", + "themes.names.forgejo-auto": "Forgejo (følg systemtema)", + "themes.names.forgejo-light": "Forgejo lyst", + "themes.names.forgejo-dark": "Forgejo mørk", + "error.not_found.title": "Fant ikke siden", + "alert.asset_load_failed": "Kunne ikke laste inn ressursfiler fra {path}. Sørg for at ressursfilene er tilgjengelige.", + "alert.range_error": " må være et nummer mellom %[1]s og %[2]s.", + "install.invalid_lfs_path": "Kan ikke opprette LFS-root på: %[1]s", + "profile.actions.tooltip": "Flere handlinger", + "profile.edit.link": "Rediger profil", + "feed.atom.link": "Atom feed", + "keys.ssh.link": "SSH nøkler", + "keys.gpg.link": "GPG nøkler", + "admin.config.moderation_config": "Moderasjonskonfigurasjon", + "moderation.report_abuse": "Rapporter missbruk", + "moderation.report_content": "Rapporter innhold", + "moderation.report_abuse_form.header": "Rapporter missbruk til en administrator", + "moderation.report_abuse_form.details": "Denne formen skal brukes for å rapporterer brukere som oppretter spam profiler, repositorier, saker, kommentarer eller oppfører seg upassende.", + "moderation.report_abuse_form.invalid": "Ugyldige argumenter", + "moderation.report_abuse_form.already_reported": "Du har allerede rapportert dette innholdet", + "moderation.abuse_category": "Kategori", + "moderation.abuse_category.placeholder": "Velg en kategori", + "moderation.abuse_category.spam": "Spam", + "moderation.abuse_category.malware": "Skadelig programvare", + "moderation.abuse_category.illegal_content": "Ulovlig innhold", + "moderation.abuse_category.other_violations": "Andre regel overtredelser", + "moderation.report_remarks": "Kommentar", + "moderation.report_remarks.placeholder": "Skriv noen detaljer rundt missbruket du rapporterer.", + "moderation.submit_report": "Send rapport", + "moderation.reporting_failed": "Missbruk rapporten kunne ikke sendes inn: %v", + "moderation.reported_thank_you": "Takk for meldingen. Vi har varslet administratorene.", + "mail.actions.successful_run_after_failure_subject": "Arbeidsflyten %[1]s er gjenopprettet i repository %[2]s", + "mail.actions.not_successful_run_subject": "Arbeidsflyten %[1]s feilet i repository %[2]s", + "mail.actions.successful_run_after_failure": "Arbeidsflyten %[1]s er gjenopprettet i repository %[2]s", + "mail.actions.not_successful_run": "Arbeidsflyten %[1]s feilet i repository %[2]s", + "mail.actions.run_info_cur_status": "Status for denne kjøringen: %[1]s (oppdatert fra %[2]s)", + "mail.actions.run_info_previous_status": "Status for forrige kjøring: %[1]s", + "mail.actions.run_info_trigger": "Startet på grunn av: %[1]s by: %[2]s", + "repo.diff.commit.next-short": "Neste", + "repo.diff.commit.previous-short": "Forrige", + "discussion.locked": "Denne diskusjonen er låst. Kommentarer kan kun gjøres av bidragsytere.", + "editor.textarea.tab_hint": "Linjen er allerede innrykket. Trykk Tab igjen eller trykk Escape for å gå ut av editoren.", + "editor.textarea.shift_tab_hint": "Ingen innrykk på denne linjen. Trykk Shift + Tab igjen eller Escape for å gå ut av editoren.", + "admin.dashboard.cleanup_offline_runners": "Rydd opp offline runners", + "settings.visibility.description": "Profilens synlighet påvirker andres mulighet til å få tilgang til dine ikke-private repositorier. Les mer", + "avatar.constraints_hint": "Egendefinert avatar kan ikke overstige %[1]s i størrelse eller være større enn %[2]d × %[3]d piksler", + "meta.last_line": "Vi gir oss ikke. Kongen har sagt nei!" +} diff --git a/options/locale_next/locale_nl-NL.json b/options/locale_next/locale_nl-NL.json index 4f109825aa..690a522b80 100644 --- a/options/locale_next/locale_nl-NL.json +++ b/options/locale_next/locale_nl-NL.json @@ -92,5 +92,15 @@ "watch.list.none": "Niemand houdt deze repo in de gaten.", "followers.incoming.list.self.none": "Niemand volgt uw profiel.", "followers.incoming.list.none": "Deze gebruiker wordt door niemand gevolgd.", - "followers.outgoing.list.self.none": "U volgt niemand." + "followers.outgoing.list.self.none": "U volgt niemand.", + "profile.actions.tooltip": "Meer acties", + "profile.edit.link": "Profiel bewerken", + "feed.atom.link": "Atom-feed", + "keys.ssh.link": "SSH sleutels", + "keys.gpg.link": "GPG sleutels", + "repo.diff.commit.next-short": "Volgende", + "repo.diff.commit.previous-short": "Vorige", + "admin.dashboard.cleanup_offline_runners": "Offline runners opruimen", + "settings.visibility.description": "Profielzichtbaarheid beïnvloedt de mogelijkheid van anderen om toegang te krijgen tot je niet-privé repositories. Lees meer", + "avatar.constraints_hint": "Eigen avatars mogen niet groter zijn dan %[1]s in grootte of groter zijn dan %[2]dx%[3]d pixels" } diff --git a/options/locale_next/locale_pt-BR.json b/options/locale_next/locale_pt-BR.json index 1a5eca6d34..acff9ff364 100644 --- a/options/locale_next/locale_pt-BR.json +++ b/options/locale_next/locale_pt-BR.json @@ -105,5 +105,10 @@ "avatar.constraints_hint": "Imagem de perfil personalizada não pode exceder %[1]s em tamanho ou ser maior que %[2]dx%[3]d pixels", "settings.visibility.description": "A visibilidade do perfil afeta a habilidade de acessarem seus repositórios não-privados. Saiba mais", "repo.diff.commit.next-short": "Próximo", - "repo.diff.commit.previous-short": "Anterior" + "repo.diff.commit.previous-short": "Anterior", + "profile.actions.tooltip": "Mais Actions", + "profile.edit.link": "Editar perfil", + "feed.atom.link": "Feed Atom", + "keys.ssh.link": "Chaves SSH", + "keys.gpg.link": "Chaves GPG" } diff --git a/options/locale_next/locale_pt-PT.json b/options/locale_next/locale_pt-PT.json index 78e6dc4493..8697bbaec0 100644 --- a/options/locale_next/locale_pt-PT.json +++ b/options/locale_next/locale_pt-PT.json @@ -103,5 +103,12 @@ "stars.list.none": "Ninguém juntou este repositório aos favoritos.", "admin.dashboard.cleanup_offline_runners": "Limpeza de executores offline", "settings.visibility.description": "A visibilidade do perfil afecta a capacidade de outros acederem aos seus repositórios não privados. Ler mais", - "avatar.constraints_hint": "O avatar personalizado não pode exceder %[1]s de tamanho ou ser maior do que %[2]dx%[3]d pixéis" + "avatar.constraints_hint": "O avatar personalizado não pode exceder %[1]s de tamanho ou ser maior do que %[2]dx%[3]d pixéis", + "profile.actions.tooltip": "Mais Actions", + "profile.edit.link": "Editar perfil", + "feed.atom.link": "Feed Atom", + "keys.ssh.link": "Chaves SSH", + "keys.gpg.link": "Chaves GPG", + "repo.diff.commit.next-short": "Seg.", + "repo.diff.commit.previous-short": "Ant." } diff --git a/options/locale_next/locale_sv-SE.json b/options/locale_next/locale_sv-SE.json index 9a8762212c..c8c50baa76 100644 --- a/options/locale_next/locale_sv-SE.json +++ b/options/locale_next/locale_sv-SE.json @@ -95,5 +95,12 @@ "moderation.abuse_category.spam": "Skräppost", "moderation.abuse_category.malware": "Skadlig kod", "settings.visibility.description": "Profilens synlighet påverkar andras möjlighet att komma åt dina icke-privata förråd. Läs mer", - "avatar.constraints_hint": "Anpassade avatarer får inte vara större än %[1] eller %[2]dx%[3] bildpunkter" + "avatar.constraints_hint": "Anpassade avatarer får inte vara större än %[1] eller %[2]dx%[3] bildpunkter", + "profile.actions.tooltip": "Fler åtgärder", + "profile.edit.link": "Redigera profil", + "feed.atom.link": "Atom-flöde", + "keys.ssh.link": "SSH-nycklar", + "keys.gpg.link": "GPG-nycklar", + "repo.diff.commit.next-short": "Nästa", + "repo.diff.commit.previous-short": "Föreg" } From 49b4965e1f8267627289b4c63bbb40d235639105 Mon Sep 17 00:00:00 2001 From: 0ko <0ko@noreply.codeberg.org> Date: Wed, 16 Jul 2025 21:54:14 +0500 Subject: [PATCH 161/495] [v12.0/forgejo] i18n: update of translations from Codeberg Translate Translation updates that were relevant to v11 branch were picked from this commit: dc6626453a1645bc48affd4583b439aae8b4bffd (#8410) Changes to strings that are only present in the v13 branch were not picked. Below is a list of co-authors of the ported commit. It may contain co-authors who's changes were not picked due to only being relevant to v13. Co-authored-by: 0ko <0ko@noreply.codeberg.org> Co-authored-by: Atul_Eterno Co-authored-by: Benedikt Straub Co-authored-by: Codeberg Translate Co-authored-by: Dirk Co-authored-by: Edgarsons Co-authored-by: Fjuro Co-authored-by: Gusted Co-authored-by: Juno Takano Co-authored-by: Laxystem Co-authored-by: Miguel P.L Co-authored-by: Salif Mehmed Co-authored-by: SomeTr Co-authored-by: aivot-on Co-authored-by: earl-warren Co-authored-by: kne Co-authored-by: oster5 Co-authored-by: readevalprintloop Co-authored-by: tacaly Co-authored-by: volkan Co-authored-by: xtex Co-authored-by: yurtpage --- options/locale/locale_ar.ini | 26 +- options/locale/locale_bg.ini | 407 +++++++++++++++++++++++++- options/locale/locale_ca.ini | 24 +- options/locale/locale_cs-CZ.ini | 6 +- options/locale/locale_da.ini | 17 +- options/locale/locale_de-DE.ini | 2 +- options/locale/locale_el-GR.ini | 10 +- options/locale/locale_eo.ini | 12 +- options/locale/locale_es-ES.ini | 11 +- options/locale/locale_et.ini | 26 +- options/locale/locale_fa-IR.ini | 30 +- options/locale/locale_fi-FI.ini | 10 + options/locale/locale_fil.ini | 4 +- options/locale/locale_fr-FR.ini | 2 +- options/locale/locale_ga-IE.ini | 28 +- options/locale/locale_gl.ini | 24 +- options/locale/locale_he.ini | 36 ++- options/locale/locale_hu-HU.ini | 24 +- options/locale/locale_id-ID.ini | 38 +-- options/locale/locale_is-IS.ini | 22 +- options/locale/locale_it-IT.ini | 32 +- options/locale/locale_ja-JP.ini | 28 +- options/locale/locale_ko-KR.ini | 18 +- options/locale/locale_lt.ini | 24 +- options/locale/locale_ml-IN.ini | 6 +- options/locale/locale_nds.ini | 2 +- options/locale/locale_pl-PL.ini | 28 +- options/locale/locale_ro.ini | 15 +- options/locale/locale_ru-RU.ini | 8 +- options/locale/locale_si-LK.ini | 6 +- options/locale/locale_sk-SK.ini | 6 +- options/locale/locale_sl.ini | 8 +- options/locale/locale_sv-SE.ini | 6 +- options/locale/locale_tr-TR.ini | 133 ++++++--- options/locale/locale_uk-UA.ini | 173 ++++++++--- options/locale/locale_zh-CN.ini | 4 +- options/locale/locale_zh-TW.ini | 2 +- options/locale_next/locale_ar.json | 4 +- options/locale_next/locale_be.json | 4 +- options/locale_next/locale_bn.json | 4 +- options/locale_next/locale_ca.json | 3 +- options/locale_next/locale_cs-CZ.json | 3 +- options/locale_next/locale_da.json | 7 +- options/locale_next/locale_de-DE.json | 3 +- options/locale_next/locale_es-ES.json | 3 +- options/locale_next/locale_fi-FI.json | 3 +- options/locale_next/locale_hu-HU.json | 3 +- options/locale_next/locale_id-ID.json | 13 +- options/locale_next/locale_ja-JP.json | 3 +- options/locale_next/locale_ko-KR.json | 3 +- options/locale_next/locale_lv-LV.json | 3 +- options/locale_next/locale_nds.json | 3 +- options/locale_next/locale_nl-NL.json | 3 +- options/locale_next/locale_pt-BR.json | 5 +- options/locale_next/locale_ru-RU.json | 3 +- options/locale_next/locale_sr-SP.json | 4 +- options/locale_next/locale_tr-TR.json | 3 +- options/locale_next/locale_uk-UA.json | 3 +- options/locale_next/locale_vi.json | 4 +- options/locale_next/locale_zh-CN.json | 6 +- options/locale_next/locale_zh-HK.json | 7 +- 61 files changed, 966 insertions(+), 392 deletions(-) diff --git a/options/locale/locale_ar.ini b/options/locale/locale_ar.ini index 15d614e8bc..956f9a302a 100644 --- a/options/locale/locale_ar.ini +++ b/options/locale/locale_ar.ini @@ -297,7 +297,7 @@ twofa_disabled = عُطِّل الاستيثاق الثنائي. theme_desc = ستكون هذه السمة المبدئية لك عبر الموقع. new_password = كلمة المرور الجديدة twofa_disable_desc = تعطيل الاستيثاق الثنائي سيجعل حسابك أقل أمانًا. أتريد الاستمرار؟ -manage_themes = اختر السمة المبدئية +manage_themes = الموضوع الافتراضي delete_prompt = هذه العملية ستحذف حسابك إلى الأبد. لا يمكن التراجع عنها بعد ذلك. cancel = ألغ repos_none = ليس لديك أي مستودع. @@ -390,7 +390,7 @@ account = الحساب uploaded_avatar_is_too_big = حجم الملف المرفوع (%d كي‌ب) يتخطى الحجم الأقصى (%d كي‌ب). biography_placeholder = أخبرنا شيئا عن نفسك! (يمكنك استخدام ماركداون) comment_type_group_reference = الإشارات -orgs = إدارة المنظمات +orgs = المنظمات update_profile = حدِّث الملف الشخصي profile = الملف الشخصي comment_type_group_dependency = الاعتماديات @@ -421,7 +421,7 @@ keep_email_private_popup = سيؤدي هذا إلى إخفاء عنوان بري ssh_key_name_used = هناك مفتاح SSH بنفس الاسم موجود بالفعل على حسابك. authorized_oauth2_applications = تطبيقات OAuth2 المأذونة uid = المعرّف الرمزي -manage_openid = إدارة عناوين OpenID +manage_openid = عناوين OpenID webauthn = استيثاق ثنائي (مفاتيح الأمان) comment_type_group_deadline = الموعد النهائي add_key = أضف مفتاح @@ -503,6 +503,8 @@ oauth2_redirect_uris = روابط إعادة التوجيه. نرجو وضع ك remove_account_link = أزل الحساب المربوط remove_account_link_success = أُزيل الحساب المربوط. +quota = كوتا + [org] follow_blocked_user = لا يمكنك إتباع هذه المنظمة لأن هذه المنظمة حظرتك. settings.delete_prompt = ستزال المنظمة إلى الأبد. لا يمكن التراجع عنها بعد ذلك! @@ -1973,7 +1975,7 @@ component_failed_to_load = حدث خطأ غير متوقع. [search] -org_kind = بحث في المنظمات... +org_kind = بحث في المنظمات… code_search_unavailable = البحث في الكود غير متوفر حاليًا. يرجى الاتصال بمدير الموقع. search = ابحث... type_tooltip = نوع البحث @@ -1981,13 +1983,13 @@ fuzzy = أجعد fuzzy_tooltip = قم بتضمين النتائج التي تتطابق أيضًا مع مصطلح البحث بشكل وثيق match = تتناسب match_tooltip = قم بتضمين النتائج التي تطابق مصطلح البحث المحدد فقط -repo_kind = بحث في المستودعات... -user_kind = بحث عن المستخدمين... -team_kind = بحث عن الفرق ... -code_kind = بحث في الكود... -project_kind = البحث ضمن المشاريع... -branch_kind = البحث ضمن الفروع... +repo_kind = بحث في المستودعات… +user_kind = بحث عن المستخدمين… +team_kind = بحث عن الفرق… +code_kind = بحث في الكود… +project_kind = البحث ضمن المشاريع… +branch_kind = البحث ضمن الفروع… no_results = لا توجد نتائج مطابقة. -issue_kind = البحث ضمن الأعطال... -pull_kind = البحث ضمن طلبات السحب... +issue_kind = البحث ضمن الأعطال… +pull_kind = البحث ضمن طلبات السحب… keyword_search_unavailable = البحث من خلال الكلمات المفتاحية ليس متوفر حالياً. رجاءاً تواصل مع مشرف الموقع. diff --git a/options/locale/locale_bg.ini b/options/locale/locale_bg.ini index 1b9767f674..35e33f4430 100644 --- a/options/locale/locale_bg.ini +++ b/options/locale/locale_bg.ini @@ -142,6 +142,8 @@ webauthn_error = Неуспешно прочитане на вашия ключ webauthn_unsupported_browser = Вашият браузър в момента не поддържа WebAuthn. webauthn_error_duplicated = Ключът за сигурност не е разрешен за тази заявка. Моля, уверете се, че ключът не е вече регистриран. +tracked_time_summary = Обобщение на проследеното време въз основа на филтрите в списъка със задачи + [settings] ui = Тема delete_key = Премахване @@ -324,7 +326,7 @@ permissions_list = Разрешения: edit_oauth2_application = Редактиране на OAuth2 приложение remove_oauth2_application = Премахване на OAuth2 приложение twofa_recovery_tip = Ако загубите устройството си, ще можете да използвате ключ за еднократно възстановяване, за да си върнете достъпа до акаунта. -visibility.private_tooltip = Видим само за членове на организации, в които участвате +visibility.private_tooltip = Видим само за участници в организации, в които участвате quota.applies_to_user = Следните правила за квота се прилагат за вашия акаунт quota.rule.no_limit = Неограничена hints = Подсказки @@ -381,6 +383,20 @@ comment_type_group_lock = Състояние на заключване can_not_add_email_activations_pending = Има чакаща активация, опитайте отново след няколко минути, ако искате да добавите нова ел. поща. storage_overview = Преглед на съхранението +webauthn = Двуфакторно удостоверяване (Ключове за сигурност) +quota.sizes.all = Всички +quota.sizes.repos.all = Хранилища +quota.sizes.repos.public = Публични хранилища +quota.sizes.repos.private = Частни хранилища +quota.sizes.git.all = Git съдържание +quota.sizes.git.lfs = Git LFS +quota.sizes.assets.attachments.all = Прикачени файлове +quota.sizes.assets.attachments.issues = Прикачени файлове към задачи +quota.sizes.assets.attachments.releases = Прикачени файлове към издания +quota.sizes.assets.artifacts = Артефакти +quota.sizes.assets.packages.all = Пакети +quota.sizes.wiki = Уики + [packages] container.labels.value = Стойност alpine.repository.repositories = Хранилища @@ -439,6 +455,113 @@ arch.version.conflicts = В конфликт alpine.repository.branches = Клонове arch.pacman.repo.multi.item = Конфигурация за %s +desc = Управление на пакетите на хранилището. +alpine.registry = Настройте този регистър, като добавите URL адреса във вашия файл /etc/apk/repositories: +alpine.registry.key = Изтеглете публичния RSA ключ на регистъра в папката /etc/apk/keys/, за да проверите подписа на индекса: +alpine.registry.info = Изберете $branch и $repository от списъка по-долу. +alpine.install = За да инсталирате пакета, изпълнете следната команда: +arch.version.properties = Свойства на версията +arch.version.makedepends = Зависимости за изграждането +arch.version.checkdepends = Зависимости за проверката +chef.registry = Настройте този регистър във вашия файл ~/.chef/config.rb: +chef.install = За да инсталирате пакета, изпълнете следната команда: +composer.registry = Настройте този регистър във вашия файл ~/.composer/config.json: +composer.install = За да инсталирате пакета с Composer, изпълнете следната команда: +composer.dependencies = Зависимости +conan.details.repository = Хранилище +conan.registry = Настройте този регистър от командния ред: +conan.install = За да инсталирате пакета с Conan, изпълнете следната команда: +conda.registry = Настройте този регистър като Conda хранилище във вашия файл .condarc: +conda.install = За да инсталирате пакета с Conda, изпълнете следната команда: +container.pull = Издърпайте образа от командния ред: +container.multi_arch = ОС / Архитектура +container.layers = Слоеве на образа +cran.registry = Настройте този регистър във вашия файл Rprofile.site: +cran.install = За да инсталирате пакета, изпълнете следната команда: +debian.registry = Настройте този регистър от командния ред: +debian.registry.info = Изберете $distribution и $component от списъка по-долу. +debian.install = За да инсталирате пакета, изпълнете следната команда: +debian.repository = Информация за хранилището +debian.repository.distributions = Дистрибуции +debian.repository.components = Компоненти +debian.repository.architectures = Архитектури +helm.registry = Настройте този регистър от командния ред: +helm.install = За да инсталирате пакета, изпълнете следната команда: +maven.registry = Настройте този регистър във файла на вашия проект pom.xml: +maven.install = За да използвате пакета, включете следното в блока dependencies във файла pom.xml: +maven.install2 = Изпълнете през командния ред: +maven.download = За да изтеглите зависимостта, изпълнете през командния ред: +nuget.registry = Настройте този регистър от командния ред: +nuget.install = За да инсталирате пакета с NuGet, изпълнете следната команда: +nuget.dependency.framework = Целева платформа +npm.registry = Настройте този регистър във файла на вашия проект .npmrc: +npm.install = За да инсталирате пакета с npm, изпълнете следната команда: +npm.install2 = или го добавете във файла package.json: +npm.dependencies.optional = Опционални зависимости +npm.details.tag = Маркер +pub.install = За да инсталирате пакета с Dart, изпълнете следната команда: +pypi.requires = Изисква Python +pypi.install = За да инсталирате пакета с pip, изпълнете следната команда: +rpm.registry = Настройте този регистър от командния ред: +rpm.distros.redhat = на дистрибуции, базирани на RedHat +rpm.distros.suse = на дистрибуции, базирани на SUSE +rpm.install = За да инсталирате пакета, изпълнете следната команда: +rpm.repository = Информация за хранилището +rpm.repository.architectures = Архитектури +rpm.repository.multiple_groups = Този пакет е наличен в няколко групи. +alt.registry = Настройте този регистър от командния ред: +alt.registry.install = За да инсталирате пакета, изпълнете следната команда: +alt.install = Инсталиране на пакет +alt.setup = Добавете хранилище към списъка със свързани хранилища (изберете необходимата архитектура вместо „_arch_“): +alt.repository = Информация за хранилището +alt.repository.architectures = Архитектури +alt.repository.multiple_groups = Този пакет е наличен в няколко групи. +swift.registry = Настройте този регистър от командния ред: +swift.install = Добавете пакета във вашия файл Package.swift: +swift.install2 = и изпълнете следната команда: +vagrant.install = За да добавите Vagrant box, изпълнете следната команда: +settings.link = Свързване на този пакет с хранилище +settings.link.description = Ако свържете пакет с хранилище, пакетът се изброява в списъка с пакети на хранилището. +settings.link.select = Изберете хранилище +settings.link.button = Обновяване на връзката на хранилището +settings.link.success = Връзката на хранилището беше успешно обновена. +settings.link.error = Неуспешно обновяване на връзката на хранилището. +settings.delete.description = Изтриването на пакет е трайно и не може да бъде отменено. +settings.delete.notice = На път сте да изтриете %s (%s). Тази операция е необратима, сигурни ли сте? +owner.settings.cargo.title = Индекс на регистъра на Cargo +owner.settings.cargo.initialize = Инициализиране на индекс +owner.settings.cargo.initialize.description = Необходимо е специално Git хранилище за индекс, за да се използва регистърът на Cargo. Използването на тази опция ще (пре)създаде хранилището и ще го конфигурира автоматично. +owner.settings.cargo.initialize.error = Неуспешно инициализиране на индекса на Cargo: %v +owner.settings.cargo.initialize.success = Индексът на Cargo беше успешно създаден. +owner.settings.cargo.rebuild = Преизграждане на индекс +owner.settings.cargo.rebuild.description = Преизграждането може да бъде полезно, ако индексът не е синхронизиран със съхранените Cargo пакети. +owner.settings.cargo.rebuild.error = Неуспешно преизграждане на индекса на Cargo: %v +owner.settings.cargo.rebuild.success = Индексът на Cargo беше успешно преизграден. +owner.settings.cargo.rebuild.no_index = Не може да се преизгради, няма инициализиран индекс. +owner.settings.cleanuprules.title = Правила за почистване +owner.settings.cleanuprules.add = Добавяне на правило за почистване +owner.settings.cleanuprules.edit = Редактиране на правилото за почистване +owner.settings.cleanuprules.none = Все още няма правила за почистване. +owner.settings.cleanuprules.preview = Преглед на правило за почистване +owner.settings.cleanuprules.preview.overview = %d пакета са насрочени за премахване. +owner.settings.cleanuprules.preview.none = Правилото за почистване не съвпада с нито един пакет. +owner.settings.cleanuprules.enabled = Включено +owner.settings.cleanuprules.pattern_full_match = Прилагане на шаблона към пълното име на пакета +owner.settings.cleanuprules.keep.title = Версиите, които съответстват на тези правила, се запазват, дори ако съответстват на правило за премахване по-долу. +owner.settings.cleanuprules.keep.count = Запазване на най-новите +owner.settings.cleanuprules.keep.count.1 = 1 версия на пакет +owner.settings.cleanuprules.keep.count.n = %d версии на пакет +owner.settings.cleanuprules.keep.pattern = Запазване на версии, съответстващи на +owner.settings.cleanuprules.keep.pattern.container = Версията latest винаги се запазва за Container пакети. +owner.settings.cleanuprules.remove.title = Версиите, които съответстват на тези правила, се премахват, освен ако правило по-горе не казва да се запазят. +owner.settings.cleanuprules.remove.days = Премахване на версии, по-стари от +owner.settings.cleanuprules.remove.pattern = Премахване на версии, съответстващи на +owner.settings.cleanuprules.success.update = Правилото за почистване е обновено. +owner.settings.cleanuprules.success.delete = Правилото за почистване е изтрито. +owner.settings.chef.title = Регистър на Chef +owner.settings.chef.keypair = Генериране на двойка ключове +owner.settings.chef.keypair.description = Заявките, изпратени до регистъра на Chef, трябва да бъдат криптографски подписани като средство за удостоверяване. При генериране на двойка ключове, само публичният ключ се съхранява във Forgejo. Частният ключ ви се предоставя, за да се използва с knife. Генерирането на нова двойка ключове ще презапише предишната. + [tool] hours = %d часа now = сега @@ -940,9 +1063,9 @@ editor.no_changes_to_show = Няма промени за показване. issues.choose.get_started = Първи стъпки issues.change_milestone_at = `промени етапа от %s на %s %s` issues.change_project_at = `промени проекта от %s на %s %s` -issues.self_assign_at = `си само-възложи това %s` +issues.self_assign_at = `си самовъзложи това %s` issues.remove_assignee_at = `е премахнат като изпълнител от %s %s` -issues.remove_self_assignment = `се само-премахна като изпълнител %s` +issues.remove_self_assignment = `се самопремахна като изпълнител %s` issues.add_assignee_at = `му бе възложено това от %s %s` pulls.merged_by = от %[3]s бе слята %[1]s pulls.merged_by_fake = от %[2]s бе слята %[1]s @@ -1272,7 +1395,7 @@ issues.review.show_resolved = Показване на решено issues.review.hide_resolved = Скриване на решено issues.review.resolve_conversation = Решаване на обсъждането diff.comment.markdown_info = Поддържа се стилизиране с Маркдаун. -diff.file_suppressed = Разликите не са показани, защото са твърде много +diff.file_suppressed = Разликите във файла са потиснати, защото са твърде много pulls.reject_count_n = %d поискани промени settings.pulls.default_allow_edits_from_maintainers = Позволяване на редакции от поддържащите по подразбиране fork_branch = Клон за клониране в разклонението @@ -1347,7 +1470,7 @@ settings.default_branch_desc = Изберете стандартен клон з settings.transfer.button = Прехвърляне на притежанието settings.transfer.modal.title = Прехвърляне на притежанието ambiguous_runes_line = `Този ред съдържа двусмислени Уникод знаци` -ambiguous_character = `%[1]c [U+%04[1]X] може да бъде объркан с %[2]c [U+%04[2]X]` +ambiguous_character = `%[1]c [U+%04[1]X] може да бъде объркан със %[2]c [U+%04[2]X]` invisible_runes_header = `Този файл съдържа невидими Уникод знаци` issues.all_title = Общо issues.new.assign_to_me = Възлагане на мен @@ -1446,7 +1569,7 @@ generated_from = генерирано от clear_ref = `Изчистване на текущата препратка` file_follow = Последване на символната връзка commitstatus.failure = Неуспех -issues.filter_label_exclude = `Използвайте alt + click/enter, за да изключите етикети` +issues.filter_label_exclude = Използвайте Alt + Click, за да изключите етикети migrate.migrating_failed = Мигрирането от %s е неуспешно. migrate.migrating_issues = Мигриране на задачи mirror_from = огледално на @@ -1576,6 +1699,178 @@ issues.force_push_compare = Сравняване pulls.status_checking = Някои проверки са в очакване pulls.nothing_to_compare = Тези клонове са равни. Не е нужно да създавате заявка за сливане. +rss.must_be_on_branch = Трябва да сте на клон, за да имате RSS емисия. +admin.manage_flags = Управление на флаговете +admin.enabled_flags = Флагове, включени за хранилището: +admin.update_flags = Обновяване на флаговете +admin.failed_to_replace_flags = Неуспешна замяна на флаговете на хранилището +admin.flags_replaced = Флаговете на хранилището са заменени +fork_to_different_account = Разклоняване в друг акаунт +mirror_interval = Интервал на огледалото (валидни единици за време са „h“, „m“, „s“). 0 за изключване на периодичната синхронизация. (Минимален интервал: %s) +mirror_interval_invalid = Интервалът на огледалото не е валиден. +mirror_use_ssh.text = Използване на SSH удостоверяване +mirror_use_ssh.helper = Forgejo ще създаде огледало на хранилището чрез Git през SSH и ще генерира двойка ключове за вас, когато изберете тази опция. Трябва да се уверите, че генерираният публичен ключ е упълномощен да изтласква към целевото хранилище. Не можете да използвате удостоверяване, базирано на парола, когато избирате това. +mirror_use_ssh.not_available = SSH удостоверяването не е налично. +mirror_denied_combination = Не може да се използва удостоверяване с публичен ключ и парола едновременно. +mirror_sync_on_commit = Синхронизиране при изтласкване на подавания +mirror_address_desc = Поставете всички необходими данни за удостоверяване в секцията „Упълномощаване“. +mirror_address_url_invalid = Предоставеният URL е невалиден. Трябва да екранирате правилно всички компоненти на URL адреса. +mirror_address_protocol_invalid = Предоставеният URL е невалиден. Само http(s):// или git:// адреси могат да се използват за огледални хранилища. +mirror_lfs = Съхранение на големи файлове (LFS) +mirror_password_help = Променете потребителското име, за да изтриете запазена парола. +unit_disabled = Администраторът на сайта е изключил тази секция на хранилището. +summary_card_alt = Карта с обобщение на хранилище %s +template.items = Елементи на шаблона +template.git_content = Git съдържание (стандартен клон) +template.git_hooks = Git куки +template.git_hooks_tooltip = В момента не можете да променяте или премахвате Git куки, след като са добавени. Изберете това само ако се доверявате на шаблонното хранилище. +template.one_item = Трябва да изберете поне един елемент от шаблона +template.invalid = Трябва да изберете шаблонно хранилище +migrate.cancel_migrating_title = Отказ от миграцията +migrate.cancel_migrating_confirm = Искате ли да откажете тази миграция? +invisible_runes_description = `Този файл съдържа невидими Уникод знаци, които са неразличими за хората, но могат да бъдат обработени по различен начин от компютър. Ако смятате, че това е умишлено, можете спокойно да пренебрегнете това предупреждение. Използвайте бутона „Екраниране“, за да ги разкриете.` +ambiguous_runes_header = `Този файл съдържа двусмислени Уникод знаци` +ambiguous_runes_description = `Този файл съдържа Уникод знаци, които могат да бъдат объркани с други знаци. Ако смятате, че това е умишлено, можете спокойно да пренебрегнете това предупреждение. Използвайте бутона „Екраниране“, за да ги разкриете.` +file_copy_permalink = Копиране на постоянна връзка +view_git_blame = Преглед на git blame +video_not_supported_in_browser = Вашият браузър не поддържа HTML5 тага „video“. +audio_not_supported_in_browser = Вашият браузър не поддържа HTML5 тага „audio“. +stored_lfs = Съхранено с Git LFS +commit_graph.select = Изберете клонове +editor.cannot_edit_lfs_files = LFS файлове не могат да се редактират в уеб интерфейса. +editor.filename_help = Добавете директория, като въведете името ѝ, последвано от наклонена черта („/“). Премахнете директория, като натиснете backspace в началото на полето за въвеждане. +editor.commit_signed_changes = Подаване на подписани промени +editor.require_signed_commit = Клонът изисква подписано подаване +editor.commit_email = Ел. поща на подаването +commits.desc = Разглеждане на историята на промените в програмния код. +commits.search.tooltip = Можете да добавите префикс към ключовите думи с „author:“, „committer:“, „after:“ или „before:“, напр. „revert author:Alice before:2019-01-13“. +commits.signed_by = Подписано от +commits.signed_by_untrusted_user = Подписано от недоверен потребител +commits.signed_by_untrusted_user_unmatched = Подписано от недоверен потребител, който не съвпада с подаващия +commits.ssh_key_fingerprint = Отпечатък на SSH ключ +commits.view_single_diff = Преглед на промените в този файл, въведени в това подаване +commit.revert = Връщане +commit.revert-header = Връщане: %s +commit.revert-content = Изберете клон, върху който да се върне: +issues.desc = Организирайте доклади за грешки, задачи и етапи. +issues.choose.ignore_invalid_templates = Невалидните шаблони са игнорирани +issues.choose.invalid_config = Конфигурацията на задачите съдържа грешки: +issues.filter_type.all_pull_requests = Всички заявки за сливане +issues.role.member_helper = Този потребител е участник в организацията, притежаваща това хранилище. +issues.lock.unknown_reason = Не може да се заключи задача с неизвестна причина. +issues.lock_duplicate = Задача не може да бъде заключена два пъти. +issues.unlock_error = Не може да се отключи задача, която не е заключена. +issues.lock.notice_1 = - Други потребители не могат да добавят нови коментари към тази задача. +issues.lock.notice_2 = - Вие и други сътрудници с достъп до това хранилище все още можете да оставяте коментари, които другите да виждат. +issues.lock.notice_3 = - Винаги можете да отключите тази задача отново в бъдеще. +issues.unlock.notice_1 = - Всеки ще може отново да коментира тази задача. +issues.unlock.notice_2 = - Винаги можете да заключите тази задача отново в бъдеще. +issues.lock.title = Заключване на обсъждането по тази задача. +issues.unlock.title = Отключване на обсъждането по тази задача. +issues.comment_on_locked = Не можете да коментирате заключена задача. +issues.delete.text = Наистина ли искате да изтриете тази задача? (Това ще премахне трайно цялото съдържание. Помислете дали вместо това да не я затворите, ако възнамерявате да я запазите архивирана) +issues.cancel_tracking_history = `отмени проследяването на времето %s` +issues.add_time_sum_to_small = Не е въведено време. +issues.due_date_form = гггг-мм-дд +issues.due_date_invalid = Крайният срок е невалиден или извън обхвата. Моля, използвайте формата „гггг-мм-дд“. +issues.dependency.no_permission_1 = Нямате разрешение да прочетете %d зависимост +issues.dependency.no_permission_n = Нямате разрешение да прочетете %d зависимости +issues.dependency.no_permission.can_remove = Нямате разрешение да прочетете тази зависимост, но можете да я премахнете +issues.dependency.issue_batch_close_blocked = Не могат да бъдат затворени групово избраните задачи, защото задача #%d все още има отворени зависимости +issues.dependency.blocked_by_short = Зависи от +issues.dependency.setting = Включване на зависимости за задачи и заявки за сливане +issues.dependency.add_error_same_issue = Не можете да направите задача зависима от самата нея. +issues.dependency.add_error_dep_issue_not_exist = Зависимата задача не съществува. +issues.dependency.add_error_cannot_create_circular = Не можете да създадете зависимост с две задачи, които се блокират взаимно. +issues.dependency.add_error_dep_not_same_repo = И двете задачи трябва да са в едно и също хранилище. +issues.review.self.rejection = Не можете да поискате промени в собствената си заявка за сливане. +issues.review.dismissed = отхвърли рецензията на %s %s +issues.review.content.empty = Трябва да оставите коментар, посочващ исканите промени. +issues.review.add_review_requests = поиска рецензии от %[1]s %[2]s +issues.review.remove_review_request = премахна заявката за рецензия за %[1]s %[2]s +issues.review.remove_review_requests = премахна заявките за рецензия за %[1]s %[2]s +issues.review.remove_review_request_self = отказа да рецензира %s +issues.review.pending.tooltip = Този коментар в момента не е видим за други потребители. За да изпратите изчакващите си коментари, изберете „%s“ -> „%s/%s/%s“ в горната част на страницата. +issues.review.outdated = Остарял +issues.review.outdated_description = Съдържанието е променено, след като е направен този коментар +issues.review.show_outdated = Показване на остарели +issues.review.hide_outdated = Скриване на остарели +issues.content_history.options = Опции +issues.blocked_by_user = Не можете да създавате задачи в това хранилище, защото сте блокирани от притежателя на хранилището. +comment.blocked_by_user = Коментирането не е възможно, защото сте блокирани от притежателя на хранилището или от автора. +issues.reopen.blocked_by_user = Не можете да отворите наново тази задача, защото сте блокирани от притежателя на хранилището или от автора на тази задача. +compare.compare_base = основа +compare.compare_head = сравняване +pulls.desc = Включване на заявки за сливане и рецензии на код. +pulls.view = Преглед на заявката за сливане +pulls.allow_edits_from_maintainers_desc = Потребители с право на запис в основния клон могат също да изтласкват към този клон +pulls.allow_edits_from_maintainers_err = Обновяването е неуспешно +pulls.has_changed_since_last_review = Променено след последната ви рецензия +pulls.switch_comparison_type = Превключване на типа сравнение +pulls.filter_branch = Филтриране на клон +pulls.review_only_possible_for_full_diff = Рецензирането е възможно само при преглед на пълните разлики +pulls.wrong_commit_id = ID на подаването трябва да бъде ID на подаване в целевия клон +pulls.blocked_by_user = Не можете да създадете заявка за сливане в това хранилище, защото сте блокирани от притежателя на хранилището. +pulls.no_merge_desc = Тази заявка за сливане не може да бъде слята, защото всички опции за сливане в хранилището са изключени. +pulls.no_merge_helper = Включете опциите за сливане в настройките на хранилището или слейте заявката за сливане ръчно. +pulls.no_merge_wip = Тази заявка за сливане не може да бъде слята, защото е отбелязана като в процес на работа. +pulls.squash_merge_pull_request = Създаване на сплескано подаване +pulls.merge_manually = Ръчно слята +pulls.merge_commit_id = ID на подаването със сливане +pulls.require_signed_wont_sign = Клонът изисква подписани подавания, но това сливане няма да бъде подписано +pulls.merge_conflict = Сливането е неуспешно: Възникна конфликт по време на сливането. Подсказка: Опитайте различна стратегия +pulls.merge_conflict_summary = Съобщение за грешка +pulls.rebase_conflict_summary = Съобщение за грешка +pulls.has_merged = Неуспешно: Заявката за сливане е слята, не можете да слеете отново или да промените целевия клон. +pulls.push_rejected = Изтласкването е неуспешно: Изтласкването е отхвърлено. Прегледайте Git куките за това хранилище. +pulls.push_rejected_no_message = Изтласкването е неуспешно: Изтласкването е отхвърлено, но няма отдалечено съобщение. Прегледайте Git куките за това хранилище +pulls.update_not_allowed = Нямате разрешение да обновявате клона +pulls.outdated_with_base_branch = Този клон е остарял спрямо основния клон +pulls.cmd_instruction_merge_warning = Предупреждение: Настройката „Автоматично откриване на ръчно сливане“ не е включена за това хранилище, ще трябва да отбележите тази заявка за сливане като ръчно слята след това. +pulls.editable_explanation = Тази заявка за сливане позволява редакции от поддържащите. Можете да допринесете директно към нея. +pulls.auto_merge_button_when_succeed = (Когато проверките са успешни) +pulls.auto_merge_when_succeed = Автоматично сливане, когато всички проверки са успешни +pulls.auto_merge_newly_scheduled = Заявката за сливане е насрочена за сливане, когато всички проверки са успешни. +pulls.auto_merge_has_pending_schedule = %[1]s насрочи тази заявка за сливане за автоматично сливане, когато всички проверки са успешни %[2]s. +pulls.auto_merge_cancel_schedule = Отмяна на автоматичното сливане +pulls.auto_merge_not_scheduled = Тази заявка за сливане не е насрочена за автоматично сливане. +pulls.auto_merge_canceled_schedule = Автоматичното сливане е отменено за тази заявка за сливане. +pulls.auto_merge_newly_scheduled_comment = `насрочи тази заявка за сливане за автоматично сливане, когато всички проверки са успешни %[1]s` +pulls.auto_merge_canceled_schedule_comment = `отмени автоматичното сливане на тази заявка за сливане, когато всички проверки са успешни %[1]s` +pulls.delete.title = Да се изтрие ли тази заявка за сливане? +pulls.delete.text = Наистина ли искате да изтриете тази заявка за сливане? (Това ще премахне трайно цялото съдържание. Помислете дали вместо това да не я затворите, ако възнамерявате да я запазите архивирана) +diff.data_not_available = Съдържанието на разликите не е налично +diff.bin = ДВОИЧЕН +diff.file_suppressed_line_too_long = Разликите във файла са потиснати, защото един или повече редове са твърде дълги +diff.too_many_files = Някои файлове не бяха показани, защото твърде много файлове имат промени в тези разлики +diff.show_more = Показване на още +diff.generated = генериран +diff.comment.add_line_comment = Добавяне на коментар към ред +diff.comment.add_review_comment = Добавяне на коментар +diff.review.self_reject = Авторите на заявки за сливане не могат да поискват промени в собствените си заявки +diff.review.self_approve = Авторите на заявки за сливане не могат да одобряват собствените си заявки +diff.image.side_by_side = Едно до друго +diff.image.swipe = Плъзгане +diff.image.overlay = Наслагване +diff.has_escaped = Този ред има скрити Уникод знаци +release.tag_name_protected = Името на маркера е защитено. +release.add_tag_msg = Използване на заглавието и съдържанието на изданието като съобщение на маркера. +release.hide_archive_links = Скриване на автоматично генерираните архиви +release.hide_archive_links_helper = Скрийте автоматично генерираните архиви с програмен код за това издание. Например, ако качвате свои собствени. +release.asset_external_url = Външен URL адрес +release.summary_card_alt = Карта с обобщение на издание със заглавие „%s“ в хранилище %s +branch.protected_deletion_failed = Клонът „%s“ е защитен. Не може да бъде изтрит. +branch.default_deletion_failed = Клонът „%s“ е стандартният клон. Не може да бъде изтрит. +branch.included_desc = Този клон е част от стандартния клон +branch.included = Включен +branch.warning_rename_default_branch = Преименувате стандартния клон. +topic.count_prompt = Не можете да изберете повече от 25 теми +find_file.no_matching = Не е намерен съвпадащ файл +error.csv.too_large = Не може да се визуализира този файл, защото е твърде голям. +error.csv.unexpected = Не може да се визуализира този файл, защото съдържа неочакван знак на ред %d и колона %d. +error.csv.invalid_field_count = Не може да се визуализира този файл, защото има грешен брой полета на ред %d. +error.broken_git_hook = Git куките на това хранилище изглеждат повредени. Моля, последвайте документацията, за да ги поправите, след което изтласкайте подавания, за да обновите статуса. + [modal] confirm = Потвърждаване no = Не @@ -1663,18 +1958,18 @@ follow_blocked_user = Не можете да следвате тази орга settings.delete_prompt = Организацията ще бъде премахната завинаги. Това НЕ МОЖЕ да бъде отменено! settings.labels_desc = Добавете етикети, които могат да се използват за задачи за всички хранилища в тази организация. teams.none_access = Без достъп -teams.members.none = Няма членове в този екип. +teams.members.none = Няма участници в този екип. repo_updated = Обновено %s teams.delete_team_success = Екипът е изтрит. teams.search_repo_placeholder = Потърсете хранилище… teams.delete_team_title = Изтриване на екипа -teams.add_team_member = Добавяне на член на екипа +teams.add_team_member = Добавяне на участник в екипа teams.read_access_helper = Членовете могат да преглеждат и клонират хранилищата на екипа. teams.invite.description = Моля, щракнете върху бутона по-долу, за да се присъедините към екипа. teams.invite.title = Поканени сте да се присъедините към екип %s в организация %s. team_permission_desc = Разрешение members.public_helper = Да е скрит -teams.members = Членове на екипа +teams.members = Участници в екипа teams.delete_team = Изтриване на екипа members.owner = Притежател members.member_role = Роля на участника: @@ -1685,6 +1980,38 @@ settings.delete_org_desc = Тази организация ще бъде изт open_dashboard = Отваряне на таблото settings.change_orgname_prompt = Бележка: Промяната на името на организацията ще промени и URL адреса на вашата организация и ще освободи старото име. +team_access_desc = Достъп до хранилище +team_unit_desc = Разрешаване на достъп до секции на хранилището +team_unit_disabled = (Изключено) +form.name_reserved = Името на организацията „%s“ е резервирано. +form.name_pattern_not_allowed = Шаблонът „%s“ не е разрешен в име на организация. +form.create_org_not_allowed = Нямате разрешение да създавате организация. +settings.update_setting_success = Настройките на организацията са обновени. +settings.change_orgname_redirect_prompt = Старото име ще се пренасочва, докато не бъде взето. +settings.change_orgname_redirect_prompt.with_cooldown.one = Старото име на организацията ще бъде достъпно за всички след период на изчакване от %[1]d ден. Все още можете да си върнете старото име по време на периода на изчакване. +settings.change_orgname_redirect_prompt.with_cooldown.few = Старото име на организацията ще бъде достъпно за всички след период на изчакване от %[1]d дни. Все още можете да си върнете старото име по време на периода на изчакване. +settings.update_avatar_success = Профилната снимка на организацията е обновена. +settings.hooks_desc = Добавете уеб-куки, които ще се задействат за всички хранилища в тази организация. +members.membership_visibility = Видимост на участничеството: +members.public = Видим +members.private = Скрит +members.invite_desc = Добавяне на нов участник към %s: +members.invite_now = Поканване сега +teams.admin_access = Администраторски достъп +teams.invite_team_member = Поканване в %s +teams.invite_team_member.list = Чакащи покани +teams.delete_team_desc = Изтриването на екип отнема достъпа до хранилището от неговите участници. Продължаване? +teams.remove_all_repos_desc = Това ще премахне всички хранилища от екипа. +teams.add_all_repos_title = Добавяне на всички хранилища +teams.add_all_repos_desc = Това ще добави всички хранилища на организацията към екипа. +teams.add_nonexistent_repo = Хранилището, което се опитвате да добавите, не съществува, моля, първо го създайте. +teams.add_duplicate_users = Потребителят вече е участник в екипа. +teams.repos.none = Няма хранилища, до които този екип да има достъп. +teams.specific_repositories = Конкретни хранилища +teams.specific_repositories_helper = Участниците ще имат достъп само до хранилища, изрично добавени към екипа. Избирането на това няма автоматично да премахне хранилища, вече добавени с Всички хранилища. +teams.all_repositories_helper = Екипът има достъп до всички хранилища. Избирането на това ще добави всички съществуващи хранилища към екипа. +teams.invite.by = Поканен от %s + [install] admin_password = Парола user = Потребителско име @@ -1978,14 +2305,14 @@ Pronouns = Местоимения Biography = Биография Website = Уебсайт Location = Местоположение -cannot_add_org_to_team = Организация не може да бъде добавена като член на екип. +cannot_add_org_to_team = Организация не може да бъде добавена като участник в екип. auth_failed = Неуспешно удостоверяване: %v team_no_units_error = Разрешете достъп до поне една секция на хранилището. password_uppercase_one = Поне един голям знак CommitSummary = Обобщение на подаването username_error = ` може да съдържа само буквено-цифрови знаци („0-9“, „a-z“, „A-Z“), тире („-“), долна черта („_“) и точка („.“). Не може да започва или завършва с не-буквено-цифрови знаци, като също така са забранени и последователни не-буквено-цифрови знаци.` username_error_no_dots = ` може да съдържа само буквено-цифрови знаци („0-9“, „a-z“, „A-Z“), тире („-“) и долна черта („_“). Не може да започва или завършва с не-буквено-цифрови знаци, като също така са забранени и последователни не-буквено-цифрови знаци.` -duplicate_invite_to_team = Потребителят вече е поканен като член на екипа. +duplicate_invite_to_team = Потребителят вече е поканен като участник в екипа. must_use_public_key = Ключът, който предоставихте, е частен ключ. Моля, не качвайте частния си ключ никъде. Вместо това използвайте публичния си ключ. org_still_own_packages = Тази организация все още притежава един или повече пакети, първо ги изтрийте. admin_cannot_delete_self = Не можете да изтриете себе си, когато сте администратор. Моля, първо премахнете администраторските си привилегии. @@ -2006,7 +2333,7 @@ enterred_invalid_repo_name = Името на хранилището, което enterred_invalid_org_name = Името на организацията, което въведохте, е неправилно. enterred_invalid_password = Паролата, която въведохте, е неправилна. organization_leave_success = Успешно напуснахте организацията %s. -still_has_org = Вашият акаунт е член на една или повече организации, първо ги напуснете. +still_has_org = Вашият акаунт е участник в една или повече организации, първо ги напуснете. org_still_own_repo = Тази организация все още притежава едно или повече хранилища, първо ги изтрийте или прехвърлете. target_branch_not_exist = Целевият клон не съществува. glob_pattern_error = ` glob шаблонът е невалиден: %s.` @@ -2017,6 +2344,18 @@ AdminEmail = Администраторски адрес за ел. поща email_domain_is_not_allowed = Домейнът на адреса за ел. поща на потребителя %s е в конфликт с EMAIL_DOMAIN_ALLOWLIST или EMAIL_DOMAIN_BLOCKLIST. Уверете се, че сте въвели правилно адреса за ел. поща. email_been_used = Адресът за ел. поща вече се използва. +NewBranchName = Име на новия клон +git_ref_name_error = ` трябва да е правилно форматирано име на Git препратка.` +regex_pattern_error = ` шаблонът на регулярния израз е невалиден: %s.` +repository_files_already_exist = Вече съществуват файлове за това хранилище. Свържете се със системния администратор. +repository_files_already_exist.delete = Вече съществуват файлове за това хранилище. Трябва да ги изтриете. +enterred_invalid_owner_name = Името на новия притежател не е валидно. +last_org_owner = Не можете да премахнете последния потребител от екипа на „притежателите“. Трябва да има поне един притежател за организация. +invalid_ssh_key = Не може да се потвърди вашият SSH ключ: %s +invalid_gpg_key = Не може да се потвърди вашият GPG ключ: %s +unable_verify_ssh_key = Не може да се потвърди SSH ключът, проверете го отново за грешки. +required_prefix = Въведеният текст трябва да започва с „%s“ + [action] close_issue = `затвори задача %[3]s#%[2]s` rename_repo = преименува хранилище от %[1]s на %[3]s @@ -2045,6 +2384,12 @@ compare_branch = Сравняване compare_commits_general = Сравняване на подавания compare_commits = Сравнете %d подавания +transfer_repo = прехвърли хранилище %s към %s +mirror_sync_push = синхронизира подавания към %[3]s на %[4]s от огледало +mirror_sync_create = синхронизира нова препратка %[3]s към %[4]s от огледало +mirror_sync_delete = синхронизира и изтри препратка %[2]s на %[3]s от огледало +review_dismissed = `отхвърли рецензия от %[4]s за %[3]s#%[2]s` + [auth] tab_openid = OpenID openid_connect_submit = Свързване @@ -2178,6 +2523,15 @@ variables.not_found = Променливата не е открита. variables.id_not_exist = Променлива с идентификатор %d не съществува. runners.owner_type = Тип +unit.desc = Управление на интегрирани CI/CD pipelines с Forgejo Actions. +status.unknown = Неизвестно +status.waiting = Изчаква се +status.running = Изпълнява се +status.success = Успешно +status.failure = Неуспешно +status.cancelled = Отменено +status.skipped = Пропуснато + [heatmap] less = По-малко number_of_contributions_in_the_last_12_months = %s приноса през последните 12 месеца @@ -2258,3 +2612,32 @@ eib = ЕиБ [translation_meta] test = окей + +[repo.permissions] +code.read = Четене: Достъп и клониране на кода на хранилището. +code.write = Писане: Изтласкване към хранилището, създаване на клонове и маркери. +issues.read = Четене: Четене и създаване на задачи и коментари. +issues.write = Писане: Затваряне на задачи и управление на метаданни като етикети, етапи, изпълнители, крайни срокове и зависимости. +pulls.read = Четене: Четене и създаване на заявки за сливане. +pulls.write = Писане: Затваряне на заявки за сливане и управление на метаданни като етикети, етапи, изпълнители, крайни срокове и зависимости. +releases.read = Четене: Преглед и изтегляне на издания. +wiki.read = Четене: Четене на интегрираното уики и неговата история. +wiki.write = Писане: Създаване, обновяване и изтриване на страници в интегрираното уики. +projects.read = Четене: Достъп до проектните табла на хранилището. +projects.write = Писане: Създаване и редактиране на проекти и колони. + +[gpg] +default_key = Подписано с ключ по подразбиране +error.extract_sign = Неуспешно извличане на подпис +error.generate_hash = Неуспешно генериране на хеш на подаването +error.no_committer_account = Няма акаунт, свързан с адреса за ел. поща на подаващия +error.no_gpg_keys_found = Не е намерен известен ключ за този подпис в базата данни +error.not_signed_commit = Не е подписано подаване +error.failed_retrieval_gpg_keys = Неуспешно извличане на ключ, свързан с акаунта на подаващия +error.probable_bad_signature = ВНИМАНИЕ! Въпреки че има ключ с това ID в базата данни, той не потвърждава това подаване! Това подаване е ПОДОЗРИТЕЛНО. +error.probable_bad_default_signature = ВНИМАНИЕ! Въпреки че ключът по подразбиране има това ID, той не потвърждава това подаване! Това подаване е ПОДОЗРИТЕЛНО. + +[units] +unit = Елемент +error.no_unit_allowed_repo = Нямате разрешение за достъп до никоя секция на това хранилище. +error.unit_not_allowed = Нямате разрешение за достъп до тази секция на хранилището. diff --git a/options/locale/locale_ca.ini b/options/locale/locale_ca.ini index 9cb7d5e50c..ea2af3b645 100644 --- a/options/locale/locale_ca.ini +++ b/options/locale/locale_ca.ini @@ -153,26 +153,26 @@ fuzzy = Difusa search = Cerca... type_tooltip = Tipus de cerca fuzzy_tooltip = Inclou resultats que s'assemblen al terme de la cerca -repo_kind = Cerca repos... -user_kind = Cerca usuaris... +repo_kind = Cerca repos… +user_kind = Cerca usuaris… code_search_unavailable = La cerca de codi no està disponible actualment. Si us plau concteu amb l'administrador del lloc. code_search_by_git_grep = Els resultats actuals de la cerca de codi són proporcionats per "git grep". Podríen haver-hi millors resultats si l'administrador del lloc habilita l'indexador de codi. -package_kind = Cerca paquets... -project_kind = Cerca projectes... -branch_kind = Cerca branques... -commit_kind = Cerca commits... -runner_kind = Cerca executors... +package_kind = Cerca paquets… +project_kind = Cerca projectes… +branch_kind = Cerca branques… +commit_kind = Cerca commits… +runner_kind = Cerca executors… no_results = Cap resultat coincident trobat. keyword_search_unavailable = La cerca per paraula clau no està disponible ara mateix. Si us plau contacteu amb l'administrador del lloc. union = Paraules clau union_tooltip = Inclou resultats que encaixen amb qualsevol paraula clau separada per espais -org_kind = Cerca organitzacions... -team_kind = Cerca teams... -code_kind = Cerca codi... -pull_kind = Cerca "pulls"... +org_kind = Cerca organitzacions… +team_kind = Cerca teams… +code_kind = Cerca codi… +pull_kind = Cerca "pulls"… exact = Exacte exact_tooltip = Inclou només resultats que són exactament el terme de cerca -issue_kind = Cerca problemes... +issue_kind = Cerca problemes… regexp = RegExp regexp_tooltip = Interpreta el terme de cerca com una expressió regular diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index 168965a740..30fa95e6be 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -1556,7 +1556,7 @@ issues.label_templates.info=Zatím nebyly vytvořeny žádné štítky. Vytvořt issues.label_templates.helper=Vyberte přednastavené značky issues.label_templates.use=Použít přednastavené štítky issues.label_templates.fail_to_load_file=Nepodařilo se načíst soubor šablony popisku „%s“: %v -issues.add_label=přidal/a %s štítek %s +issues.add_label=přidal/a štítek %s %s issues.add_labels=přidal/a %s štítky %s issues.remove_label=odstranil/a %s štítek %s issues.remove_labels=odstranil/a %s štítky %s @@ -1763,7 +1763,7 @@ issues.error_modifying_due_date=Změna termínu dokončení selhala. issues.error_removing_due_date=Odstranění termínu dokončení selhalo. issues.push_commit_1=přidal/a %d revizi %s issues.push_commits_n=přidal/a %d revize %s -issues.force_push_codes=`vynucené nahrání %[1]s od %[2]s do %[4]s %[6]s` +issues.force_push_codes=`vynutil/a nahrání %[1]s od %[2]s do %[4]s %[6]s` issues.force_push_compare=Porovnat issues.due_date_form=rrrr-mm-dd issues.due_date_form_add=Přidat termín dokončení @@ -1813,7 +1813,7 @@ issues.review.approve=schválil/a tyto změny %s issues.review.comment=posoudil/a %s issues.review.dismissed=zamítl/a posouzení uživatele %s %s issues.review.dismissed_label=Zamítnuto -issues.review.left_comment=zanechal komentář +issues.review.left_comment=zanechal/a komentář issues.review.content.empty=Je potřeba zanechat poznámku s uvedením požadované změny (požadovaných změn). issues.review.reject=požádal/a o změny %s issues.review.wait=byl/a požádán/a o posouzení %s diff --git a/options/locale/locale_da.ini b/options/locale/locale_da.ini index c82779ab60..99b5789de3 100644 --- a/options/locale/locale_da.ini +++ b/options/locale/locale_da.ini @@ -1,6 +1,3 @@ - - - [common] home = Hjem dashboard = Instrumentpanel @@ -978,8 +975,8 @@ delete_with_all_comments = Din konto er yngre end %s. For at undgå spøgelsesko delete_account_title = Slet brugerkonto user_block_yourself = Du kan ikke blokere dig selv. pronouns_custom_label = Brugerdefinerede stedord -change_username_redirect_prompt.with_cooldown.one = Det gamle brugernavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dag, du kan stadig kræve det gamle brugernavn tilbage i nedkølingsperioden. -change_username_redirect_prompt.with_cooldown.few = Det gamle brugernavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dage, du kan stadig kræve det gamle brugernavn tilbage i nedkølingsperioden. +change_username_redirect_prompt.with_cooldown.one = Det gamle brugernavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dag, år. Du kan stadig kræve det gamle brugernavn tilbage i nedkølingsperioden. +change_username_redirect_prompt.with_cooldown.few = Det gamle brugernavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dage, år. Du kan stadig kræve det gamle brugernavn tilbage i nedkølingsperioden. keep_pronouns_private = Vis kun stedord til godkendte brugere keep_pronouns_private.description = Dette vil skjule dine stedord for besøgende, der ikke er logget ind. quota.applies_to_user = Følgende kvoteregler gælder for din konto @@ -1520,13 +1517,13 @@ issues.add_labels = tilføjede %s etiketterne %s issues.add_remove_labels = tilføjede %s og fjernede %s etiketter %s issues.add_milestone_at = `føjede dette til %s milepælen %s` issues.add_project_at = `føjede dette til %s- projektet %s` -issues.ref_reopening_from = `henviste til dette problem fra en pull-anmodning %[3]s, der vil genåbne den, %[1]s` +issues.ref_reopening_from = `henviste til dette problem fra en pull-anmodning %[3]s, der vil genåbne det, %[1]s` issues.ref_closed_from = `lukkede dette problem %[4]s %[2 ]s` issues.ref_reopened_from = `genåbnede dette problem %[4]s %[2 ]s` issues.ref_from = `fra %[1]s` issues.author = Forfatter issues.commit_ref_at = `henviste til dette problem fra en commit %s` -issues.ref_issue_from = `henviste til dette problem %[3]s %[2 ]s` +issues.ref_issue_from = `henviste til dette problem %[3]s %[1]s` issues.ref_pull_from = `henviste til denne pull-anmodning %[3]s %[1]s` issues.ref_closing_from = `henviste til dette problem fra en pull-anmodning %[3]s, der vil lukke det, %[1]s` issues.author.tooltip.issue = Denne bruger er forfatteren til dette problem. @@ -1582,7 +1579,7 @@ issues.change_ref_at = `ændret reference fra %s til issues.remove_ref_at = `fjernet reference %s %s` issues.add_ref_at = `tilføjet reference %s %s` issues.delete_branch_at = `slettet gren %s %s` -issues.filter_label_exclude = `Brug alt + klik/enter for at ekskludere etiketter` +issues.filter_label_exclude = Brug Alt + klik for at ekskludere etiketter issues.filter_milestone = Milepæl issues.filter_milestone_all = Alle milepæle issues.filter_milestone_none = Ingen milepæle @@ -2833,8 +2830,8 @@ team_permission_desc = Tilladelse members.member = Medlem settings.change_orgname_prompt = Bemærk: Ændring af organisationens navn vil også ændre din organisations URL og frigøre det gamle navn. settings.change_orgname_redirect_prompt = Det gamle navn vil omdirigere, indtil det gøres krav på. -settings.change_orgname_redirect_prompt.with_cooldown.one = Det gamle organisationsnavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dag, du kan stadig kræve det gamle navn tilbage i nedkølingsperioden. -settings.change_orgname_redirect_prompt.with_cooldown.few = Det gamle organisationsnavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dage, du kan stadig kræve det gamle navn tilbage i . +settings.change_orgname_redirect_prompt.with_cooldown.one = Det gamle organisationsnavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dag, år. Du kan stadig kræve det gamle navn tilbage i nedkølingsperioden. +settings.change_orgname_redirect_prompt.with_cooldown.few = Det gamle organisationsnavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dage, år. Du kan stadig kræve det gamle navn tilbage i. settings.update_avatar_success = Organisationens avatar er blevet opdateret. members.public_helper = Gør skjult members.private = Skjult diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index f8bfc9258a..35d1dfddaf 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -752,7 +752,7 @@ organization=Organisationen uid=UID webauthn=Hardware-Sicherheitsschlüssel -public_profile=Öffentliches Profil +public_profile=Öffentliches profil biography_placeholder=Erzähle anderen ein wenig über dich selbst! (Markdown wird unterstützt) location_placeholder=Teile deinen ungefähren Standort mit anderen profile_desc=Über dich diff --git a/options/locale/locale_el-GR.ini b/options/locale/locale_el-GR.ini index 398a0d9ce4..41c55beb11 100644 --- a/options/locale/locale_el-GR.ini +++ b/options/locale/locale_el-GR.ini @@ -3939,12 +3939,12 @@ submodule=Υπομονάδα [search] code_search_unavailable = Η αναζήτηση κώδικα δεν είναι επί του παρόντος διαθέσιμη. Παρακαλώ επικοινωνήστε με τον διαχειριστή σας. keyword_search_unavailable = Η αναζήτηση με την χρήση λέξεων-κλειδιών δεν είναι επί του παρόντος διαθέσιμη. Παρακαλώ επικοινωνήστε με τον διαχειριστή σας. -runner_kind = Αναζήτηση runner... +runner_kind = Αναζήτηση runner… code_search_by_git_grep = Για την αναζήτηση κώδικα, χρησιμοποιείται η εντολή «git grep». Ίσως να παρουσιαστούν καλύτερα αποτελέσματα, αν ο διαχειριστής σας ενεργοποιήσει ένα ευρετήριο για αποθετήρια («Repository Indexer»). package_kind = Αναζήτηση πακέτων… -project_kind = Αναζήτηση έργων... +project_kind = Αναζήτηση έργων… branch_kind = Αναζήτηση κλάδων… -commit_kind = Αναζήτηση commit... +commit_kind = Αναζήτηση commit… no_results = Δεν βρέθηκαν κατάλληλα αποτελέσματα. search = Αναζήτηση… type_tooltip = Είδος αναζήτησης @@ -3958,8 +3958,8 @@ org_kind = Αναζήτηση οργανισμών… team_kind = Αναζήτηση ομαδών… code_kind = Αναζήτηση κώδικα… exact_tooltip = Να συμπεριληφθούν μόνο αποτελέσματα που ταιριάζουν με τον όρο αναζήτησης -issue_kind = Αναζήτηση ζητημάτων... -pull_kind = Αναζήτηση pull... +issue_kind = Αναζήτηση ζητημάτων… +pull_kind = Αναζήτηση pull… exact = Ακριβής milestone_kind = Αναζήτηση ορόσημων... union = Ένωση diff --git a/options/locale/locale_eo.ini b/options/locale/locale_eo.ini index 6393765d63..5a06120e9e 100644 --- a/options/locale/locale_eo.ini +++ b/options/locale/locale_eo.ini @@ -630,7 +630,7 @@ account = Konto ssh_gpg_keys = SSH / GPG-ŝlosiloj twofa_disable = Malaktivigi duoblan aŭtentikigon twofa_enroll = Ŝalti duoblan aŭtentikigon -orgs = Mastrumi organizaĵojn +orgs = Organizaĵoj blocked_users = Blokitaj uzantoj profile = Profilo ui = Haŭto @@ -686,7 +686,7 @@ verify_ssh_key_success = SSH-ŝlosilo «%s» jam konfirmiĝis. edit_oauth2_application = Redakti OAuth2-programon gpg_key_deletion = Forigi GPG-ŝlosilon gpg_key_matched_identities = Akordaj identecoj: -manage_themes = Elekti implicitan haŭton +manage_themes = Defaŭlta temo ssh_key_deletion = Forigi SSH-ŝlosilon key_state_desc = Ĉi tiu ŝlosilo uziĝis dum la pasintaj 7 tagoj valid_forever = Validos dumĉiame @@ -700,7 +700,7 @@ primary = Ĉefa ssh_disabled = SSH malaktivigita update_avatar_success = Via profilbildo konserviĝis. keep_email_private = Kaŝi retpoŝtadreson -manage_openid = Mastrumi OpenID-adresojn +manage_openid = OpenID-adresoj delete_current_avatar = Forigi nunan profilbildon email_preference_set_success = Retpoŝta prefero konserviĝis sukcese. permissions_access_all = Ĉiu (publika, privata, kaj limigita) @@ -884,9 +884,9 @@ commit_kind = Serĉi enmetojn… no_results = Ne trovis kongruantajn rezultojn. exact = Ĝusta exact_tooltip = Inkluzivas nur rezultojn kongruantajn kun la ĝustaj serĉoterminoj -issue_kind = Serĉi erarojn... +issue_kind = Serĉi erarojn… regexp_tooltip = Interpretas la serĉoterminoj kiel regulesprimo fuzzy = Svaga branch_kind = Serĉi disbranĉigojn… -runner_kind = Serĉi rulantojn... -pull_kind = Serĉi tirpetojn... \ No newline at end of file +runner_kind = Serĉi rulantojn… +pull_kind = Serĉi tirpetojn… \ No newline at end of file diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini index bdafba93b4..c783b1605b 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -740,7 +740,7 @@ avatar=Avatar ssh_gpg_keys=Claves SSH / GPG social=Redes sociales applications=Aplicaciones -orgs=Administrar organizaciones +orgs=Organizaciones repos=Repositorios delete=Eliminar cuenta twofa=Autenticación de dos factores (TOTP) @@ -1075,8 +1075,8 @@ keep_pronouns_private = Mostrar pronombres solo a personas autenticadas storage_overview = Resumen del almacenamiento quota.sizes.assets.artifacts = Artefactos quota.sizes.assets.attachments.releases = Archivos adjuntos del lanzamiento -change_username_redirect_prompt.with_cooldown.few = El antiguo nombre de usuario estará disponible para todos después un periodo de tiempo de espera de %[1]d días, aún puedes reclamar el antiguo nombre de usuario durante el periodo de tiempo de espera. -change_username_redirect_prompt.with_cooldown.one = El antiguo nombre de usuario estará disponible para todos después un periodo de tiempo de espera de %[1]d día, aún puedes reclamar el antiguo nombre de usuario durante el periodo de tiempo de espera. +change_username_redirect_prompt.with_cooldown.few = El antiguo nombre de usuario estará disponible para todos después un periodo de tiempo de espera de %[1]d días. Aún puedes reclamar el antiguo nombre de usuario durante el periodo de tiempo de espera. +change_username_redirect_prompt.with_cooldown.one = El antiguo nombre de usuario estará disponible para todos después un periodo de tiempo de espera de %[1]d día. Aún puedes reclamar el antiguo nombre de usuario durante el periodo de tiempo de espera. quota.rule.exceeded = Excedido quota.rule.no_limit = Ilimitado quota.sizes.assets.all = Activos @@ -1574,7 +1574,7 @@ issues.remove_ref_at=`eliminó la referencia %s %s` issues.add_ref_at=`añadió la referencia %s %s` issues.delete_branch_at=`eliminó la rama %s %s` issues.filter_label=Etiqueta -issues.filter_label_exclude=`Usa alt + clic/enter para excluir etiquetas` +issues.filter_label_exclude=Usa Alt + Click para excluir etiquetas issues.filter_label_no_select=Todas las etiquetas issues.filter_label_select_no_label=Sin etiqueta issues.filter_milestone=Hito @@ -2888,6 +2888,9 @@ summary_card_alt = Tarjeta de resumen del repositorio %s settings.pull_mirror_sync_quota_exceeded = Cuota excedida, no se empujan los cambios. archive.nocomment = No es posible hacer comentarios porque el repositorio está archivado. +sync_fork.branch_behind_one = Esta rama esta %[1]d cambios detrás de %[2]s +sync_fork.branch_behind_few = Esta rama está %[1]d confirmaciones detrás de %[2]s + [graphs] component_loading = Cargando %s… component_loading_failed = No se pudo cargar %s diff --git a/options/locale/locale_et.ini b/options/locale/locale_et.ini index e54ceadbb5..441a7d8e07 100644 --- a/options/locale/locale_et.ini +++ b/options/locale/locale_et.ini @@ -108,7 +108,7 @@ never = Mitte kunagi unknown = Teadmata rss_feed = RSS infovoog confirm_delete_artifact = Kas oled kindel et soovite artefakti "%s" kustutada? -pin = +pin = artifacts = Artefaktid archived = Arhiveeritud concept_system_global = Ülemaailmne @@ -145,25 +145,25 @@ fuzzy_tooltip = Lisage tulemused mis vastavad ka otsingu terminile union = Märksõnad exact = Täpne exact_tooltip = Sisaldab ainult tulemusi mis vastavad täpsele otsingusõnale -repo_kind = Otsi hoidlad... -user_kind = Otsi kasutajaid... -org_kind = Otsi organisatsioone... -team_kind = Otsi meeskonnad... -code_kind = Otsi koodi... +repo_kind = Otsi hoidlad… +user_kind = Otsi kasutajaid… +org_kind = Otsi organisatsioone… +team_kind = Otsi meeskonnad… +code_kind = Otsi koodi… code_search_by_git_grep = Praeguse koodi otsingu tulemused annab "git grep". Paremaid tulemusi võib saada, kui saidi administraator lubab koodi indekseerija. -package_kind = Otsi pakette... -project_kind = Otsi projekte... -branch_kind = Otsi harusid... -commit_kind = Otsi kommiteid... -runner_kind = Otsi jooksjaid... +package_kind = Otsi pakette… +project_kind = Otsi projekte… +branch_kind = Otsi harusid… +commit_kind = Otsi kommiteid… +runner_kind = Otsi jooksjaid… no_results = Sobivaid tulemusi ei leitud. -issue_kind = Otsi probleeme... +issue_kind = Otsi probleeme… milestone_kind = Otsi verstapostid... type_tooltip = Otsingu tüüp code_search_unavailable = Koodide otsing ei ole praegu saadaval. Palun võtke ühendust saidi administraatoriga. union_tooltip = Sisaldab tulemused mis vastavad mis tahes tühikutega eraldatud võtmesõnadele keyword_search_unavailable = Otsing märksõna järgi ei ole praegu saadaval. Palun võtke ühendust saidi administraatoriga. -pull_kind = Otsi tõmbepäringuid... +pull_kind = Otsi tõmbepäringuid… [aria] navbar = Navigatsiooniriba diff --git a/options/locale/locale_fa-IR.ini b/options/locale/locale_fa-IR.ini index dae0695495..23cb74f814 100644 --- a/options/locale/locale_fa-IR.ini +++ b/options/locale/locale_fa-IR.ini @@ -608,7 +608,7 @@ avatar=آواتار ssh_gpg_keys=کلید‌های SSH / GPG social=حساب های اجتماعی applications=برنامه‌ها -orgs=مدیریت سازمان‌ها +orgs=سازمان‌ها repos=مخازن delete=حذف حساب کاربری twofa=احراز هویت دوگانه @@ -653,8 +653,8 @@ password_change_disabled=کاربران غیر محلی نمیتوانند گذ emails=نشانی‌های ایمیل manage_emails=مدیریت نشانی‌های ایمیل -manage_themes=تم پیش فرض را انتخاب کنید -manage_openid=مدیریت نشانی‌های OpenID +manage_themes=تم پیش فرض +manage_openid=آدرس‌های OpenID theme_desc=این پوشته پیش فرض شما در سراسر سایت می باشد. primary=اصلی activated=فعال شده @@ -2766,23 +2766,23 @@ search = جستجو... fuzzy = درهم fuzzy_tooltip = پیامدهایی را درج کنید که دقیقا با عبارت جستجو همخوانی داشته باشند regexp = عبارات باقاعده -pull_kind = جستجو واکشی‌ها... +pull_kind = جستجو واکشی‌ها… no_results = نتیجه درخوری یافت نشد. -runner_kind = جستجو دونده‌ها... +runner_kind = جستجو دونده‌ها… keyword_search_unavailable = جستجو کلیدواژه اکنون در درسترس نیست. لطفا با مدیر سایت در میان بگذارید. -repo_kind = جستجو مخازن... +repo_kind = جستجو مخازن… regexp_tooltip = اصطلاح جستجو شده را با عبارات باقاعده تفسیر کن -user_kind = جستجو کاربران... -org_kind = جستجو سازمان‌ها... -team_kind = جستجو گروه‌ها... -package_kind = جستجو بسته‌ها... -project_kind = جستجو پروژه‌ها... +user_kind = جستجو کاربران… +org_kind = جستجو سازمان‌ها… +team_kind = جستجو گروه‌ها… +package_kind = جستجو بسته‌ها… +project_kind = جستجو پروژه‌ها… code_search_unavailable = جستجوی کد اکنون در دسترس نیست. لطفا با مدیر سایت درمیان بگذارید. -code_kind = جستجو کدها... +code_kind = جستجو کدها… union = بهم پیوستگی union_tooltip = نتایجی را در بر بگیر که با هر یک از کلیدواژه‌های جدا شده از فضای‌خالی مطابقت دارد -branch_kind = جستجو شاخه‌ها... -commit_kind = جستجو سپرده‌ها... -issue_kind = جستجو مشکلات... +branch_kind = جستجو شاخه‌ها… +commit_kind = جستجو سپرده‌ها… +issue_kind = جستجو مشکلات… exact = مو به مو exact_tooltip = نتایجی را در بر بگیر که مو به مو با اصطلاح جستجو شده یکی باشد diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini index efd8a16526..7eea87f959 100644 --- a/options/locale/locale_fi-FI.ini +++ b/options/locale/locale_fi-FI.ini @@ -669,6 +669,13 @@ username_claiming_cooldown = Käyttäjänimeä ei voi ottaa käyttöön, koska s email_domain_is_not_allowed = Käyttäjän sähköpostiosoitteen %s verkkotunnus on ristiriidassa EMAIL_DOMAIN_ALLOWLIST:in tai EMAIL_DOMAIN_BLOCKLIST:in kanssa. Varmista, että olen asettanut sähköpostiosoitteen oikein. +invalid_group_team_map_error = ` kuvaus ei ole kelvollinen: %s` +visit_rate_limit = Etävierailujen pyyntörajoitukset. +2fa_auth_required = Etävierailu vaati kaksivaiheisen todennuksen. +unset_password = Kirjautuneen käyttäjän salasanaa ei ole asetettu. +unsupported_login_type = Tällä kirjautumistavalla ei voi poistaa tunnusta. +invalid_ssh_principal = Väärä toimija: %s + [user] change_avatar=Vaihda profiilikuvasi… repositories=Tietovarastot @@ -1038,6 +1045,9 @@ then_enter_passcode = Kirjoita sovelluksessa näkyvä pääsykoodi: gpg_key_matched_identities_long = Tähän avaimeen upotetut identiteetit vastaavat tämän käyttäjän seuraavia aktivoituja sähköpostiosoitteita. Kommitit, jotka vastaavat näitä sähköpostiosoitteita, voidaan vahvistaa tällä avaimella. twofa_failed_get_secret = Salaisuuden saaminen epäonnistui. +uid = UID +hidden_comment_types.ref_tooltip = Kommentit missä tähän ongelmaan viitattiin toisesta ongelmasta/kommitista/… + [repo] owner=Omistaja owner_helper=Jotkin organisaatiot eivät välttämättä näy pudotusvalikossa, koska tietovarastojen enimmäismäärää on rajoitettu. diff --git a/options/locale/locale_fil.ini b/options/locale/locale_fil.ini index 8c9badb04b..487768ea22 100644 --- a/options/locale/locale_fil.ini +++ b/options/locale/locale_fil.ini @@ -699,7 +699,7 @@ security = Seguridad avatar = Avatar ssh_gpg_keys = Mga SSH / GPG key applications = Mga Aplikasyon -orgs = Ipamahala ang mga organisasyon +orgs = Mga organisasyon repos = Mga Repositoryo delete = Burahin ang account twofa = Authentikasyong two-factor (TOTP) @@ -707,7 +707,7 @@ account_link = Mga naka-link na account uid = UID webauthn = Authentikasyong two-factor (Mga security key) blocked_users = Mga hinarang na user -public_profile = Pampublikong Profile +public_profile = Pampublikong profile location_placeholder = Ibahagi ang iyong tinatayang lokasyon sa iba password_username_disabled = Ang mga di-lokal na gumagamit ay hindi pinapayagan na baguhin ang kanilang username. Mangyaring makipag-ugnayan sa iyong tagapangasiwa ng site para sa higit pang mga detalye. full_name = Buong pangalan diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index e522d5ab92..db9872236b 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -4091,4 +4091,4 @@ issues.write = Écrire : Fermer des tickets et gérer les métadonnées t pulls.read = Lire : Lire et créer des demandes de tirage. [translation_meta] -test = Ceci est une chaîne de test. Elle n'est pas affichée dans Forgejo mais est utilisée à des fins de test. N'hésitez pas à entrer 'ok' pour gagner du temps (ou un fait amusant de votre choix) pour atteindre ce difficile 100 % de complétion. :-) +test = Ceci est une chaîne de test. Elle n'est pas affichée dans Forgejo même mais est utilisée à des fins de test. N'hésitez pas à entrer 'ok' pour gagner du temps (ou un fait amusant de votre choix) pour atteindre ce difficile 100 % de complétion. :-) diff --git a/options/locale/locale_ga-IE.ini b/options/locale/locale_ga-IE.ini index 3bb06e8c21..c8f4d2a72c 100644 --- a/options/locale/locale_ga-IE.ini +++ b/options/locale/locale_ga-IE.ini @@ -132,20 +132,20 @@ fuzzy = Doiléir fuzzy_tooltip = Cuir san áireamh torthaí a mheaitseálann an téarma cuardaigh go dlúth freisin exact = Beacht exact_tooltip = Ní chuir san áireamh ach torthaí a mheaitseálann leis an téarma -repo_kind = Cuardaigh stórtha... -user_kind = Cuardaigh úsáideoirí... -org_kind = Cuardaigh eagraíochtaí... -team_kind = Cuardaigh foirne... -code_kind = Cód cuardaigh... +repo_kind = Cuardaigh stórtha… +user_kind = Cuardaigh úsáideoirí… +org_kind = Cuardaigh eagraíochtaí… +team_kind = Cuardaigh foirne… +code_kind = Cód cuardaigh… code_search_unavailable = Níl cuardach cód ar fáil faoi láthair. Déan teagmháil le riarthóir an láithreáin. -package_kind = Cuardaigh pacáistí... -project_kind = Cuardaigh tionscadail... -branch_kind = Cuardaigh brainsí... -commit_kind = Cuardaigh tiomáintí... -runner_kind = Cuardaigh reathaithe... +package_kind = Cuardaigh pacáistí… +project_kind = Cuardaigh tionscadail… +branch_kind = Cuardaigh brainsí… +commit_kind = Cuardaigh tiomáintí… +runner_kind = Cuardaigh reathaithe… no_results = Níl aon torthaí meaitseála le fáil. -issue_kind = Saincheisteanna cuardaigh... -pull_kind = Cuardaigh iarratais tarraingthe... +issue_kind = Saincheisteanna cuardaigh… +pull_kind = Cuardaigh iarratais tarraingthe… keyword_search_unavailable = Níl cuardach de réir eochairfhocal ar fáil faoi láthair. Déan teagmháil le riarthóir an láithreáin. [aria] @@ -507,12 +507,12 @@ avatar = Abhatár ssh_gpg_keys = Eochracha SSH/GPG applications = Iarratais repos = Stórais -delete = Scrios Cuntas +delete = Scrios cuntas twofa = Fíordheimhniú Dhá Fachtóir (TOTP) organization = Eagraíochtaí uid = UID webauthn = Fíordheimhniú Dhá-Fachtóir (Eochracha Slándála) -public_profile = Próifíl Phoiblí +public_profile = Próifíl phoiblí location_placeholder = Comhroinn do shuíomh thart le daoine eile full_name = Ainm Iomlán website = Láithreán Gréasáin diff --git a/options/locale/locale_gl.ini b/options/locale/locale_gl.ini index 3854b375af..c380e9b2ff 100644 --- a/options/locale/locale_gl.ini +++ b/options/locale/locale_gl.ini @@ -196,29 +196,29 @@ link_modal.paste_reminder = Consello: Coa URL no portapapeis, podes pegala direc [search] search = Buscar... type_tooltip = Tipo de procura -repo_kind = Buscar repositorios... -user_kind = Buscar usuarios... +repo_kind = Buscar repositorios… +user_kind = Buscar usuarios… regexp = RegExp regexp_tooltip = Interpretar o termo da procura como expresión regular -org_kind = Procurar organizacións... -team_kind = Procurar equipos... -code_kind = Procurar código... +org_kind = Procurar organizacións… +team_kind = Procurar equipos… +code_kind = Procurar código… code_search_unavailable = A procura de código non está dispoñible neste momento. Por favor contacte coa persoa responsable da administración da páxina. -package_kind = Buscar paquetes... +package_kind = Buscar paquetes… fuzzy = Difusa fuzzy_tooltip = Incluír resultados que tamén coincidan estreitamente co termo da procura union = Palabras clave union_tooltip = Incluír resultados correspondentes a calquera dal palabras clave separadas por espazos en branco exact = Exacta exact_tooltip = Incluír só resultados correspondentes ao termo exacto da procura -issue_kind = Procurar incidencias... -project_kind = Buscar proxectos... -branch_kind = Buscar ramas... +issue_kind = Procurar incidencias… +project_kind = Buscar proxectos… +branch_kind = Buscar ramas… no_results = Non se atoparon resultados coincidentes. keyword_search_unavailable = A busca por palabra clave non está dispoñible actualmente. Póñase en contacto co administrador do sitio. -commit_kind = Buscar achegas... -runner_kind = Buscar executores... -pull_kind = Buscar pulls... +commit_kind = Buscar achegas… +runner_kind = Buscar executores… +pull_kind = Buscar pulls… [startpage] platform = Multiplataforma diff --git a/options/locale/locale_he.ini b/options/locale/locale_he.ini index 19c4815277..26e3084809 100644 --- a/options/locale/locale_he.ini +++ b/options/locale/locale_he.ini @@ -1,6 +1,3 @@ - - - [common] webauthn_error_unable_to_process = שרת זה נכשל בעיבוד בקשתך. help = עזרה @@ -150,24 +147,24 @@ union = מילות מפתח exact = מדויק exact_tooltip = תוצאות יתאימו במדויק לתוכן תיבת החיפוש regexp = רג'קס -user_kind = חיפוש אנשים... -code_kind = חיפוש קוד... -team_kind = חיפוש צוותים... +user_kind = חיפוש אנשים… +code_kind = חיפוש קוד… +team_kind = חיפוש צוותים… no_results = לא נמצאו תוצאות. union_tooltip = תוצאות יכללו לפחות מילת מפתח אחת; אפשר להפריד מילות מפתח עם רווחים -org_kind = חיפוש ארגונים... -package_kind = חיפוש חבילות... -project_kind = חיפוש פרוייקטים... -branch_kind = חיפוש ענפים... -commit_kind = חיפוש קומיטים... -issue_kind = חיפוש סוגיות... +org_kind = חיפוש ארגונים… +package_kind = חיפוש חבילות… +project_kind = חיפוש פרוייקטים… +branch_kind = חיפוש ענפים… +commit_kind = חיפוש קומיטים… +issue_kind = חיפוש סוגיות… fuzzy_tooltip = תוצאות יתאימו לתוכן תיבת החיפוש בקירוב; מומלץ כנגד שגיאות כתיב -repo_kind = חיפוש קרפיפים... +repo_kind = חיפוש קרפיפים… code_search_by_git_grep = תוצאות החיפוש יוצרו על ידי "git grep"; יכול להיות שיתקבלו תוצאות טובות יותר אם מנהלי המערכת יפעילו את המפתחן. -runner_kind = חיפוש מריצים... +runner_kind = חיפוש מריצים… keyword_search_unavailable = חיפוש מילות מפתח לא זמין. נא לדווח למנהלי המערכת. code_search_unavailable = חיפוש קוד לא זמין. נא לדווח למנהלי המערכת. -pull_kind = חיפוש בקשות מיזוג... +pull_kind = חיפוש בקשות מיזוג… [heatmap] number_of_contributions_in_the_last_12_months = % תרומות ב־12 החודשים האחרונים @@ -385,6 +382,9 @@ account_activated = חשבונך הופעל resent_limit_prompt = כבר ביקשת מייל אימות בשלושת הדקות האחרונות. נא לחכות ולנסות שוב. has_unconfirmed_mail = שלום %s, חשבונך משויך לכתובת אימייל לא מאומתת (%s). אם לא קיבלת הודעת אימות באימייל, או שאתה צריך חדשה, נא ללחוץ על הכפתור למטה. +confirmation_mail_sent_prompt = אימייל אימות חדש נשלח ל־%s. יש לבדוק את תיבת הדואר וללחוץ על הלינק תוך %s על מנת להשלים את רישום החשבון. אם כתובת המייל שגוייה, אפשר להיכנס לחשבון ולבקש דוא"ל אימות לכתובת אחרת. +reset_password_mail_sent_prompt = אימייל אימות חדש נשלח ל־%s. יש לבדוק את תיבת הדואר וללחוץ על הלינק תוך %s על מנת להשלים את רישום החשבון. + [settings] key_content = תוכן principal_content = תוכן @@ -469,7 +469,7 @@ uploaded_avatar_not_a_image = הקובץ שהועלה לא תמונה. [repo] new_advanced = הגדרות מתקדמות -new_advanced_expand = +new_advanced_expand = owner = בעלים repo_name = שם הקרפיף repo_name_helper = שמות קרפיפים טובים הם זכירים, קצרים וייחודיים. @@ -662,6 +662,10 @@ issues.label_archive = לארכיון issues.label_archived_filter = הצגת תוויות מהארכיון issues.label_archive_tooltip = תוויות בארכיון לא מוצעות בחיפוש על־בסיס תווית כברירת מחדל. +issues.deleted_milestone = נמחק +issues.deleted_project = נמחק +issues.self_assign_at = `שייךה עצמית %s` + [translation_meta] test = ואהבת לרעך כמוך diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini index 3e93ee8ba9..c6eca84ac7 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -330,7 +330,7 @@ code_no_results=Nincs találat a keresési kifejezésedre. code_last_indexed_at=Utoljára indexelve: %s [auth] -create_new_account=Regisztráció +create_new_account=Fiók regisztrálása register_helper_msg=Van már felhasználói fiókja? Jelentkezzen be! social_register_helper_msg=Van már felhasználói fiókja? Csatlakoztassa most! disable_register_prompt=Regisztráció le van tiltva. Kérjük, lépjen kapcsolatba az oldal adminisztrátorával. @@ -532,8 +532,8 @@ password_change_disabled=A nem helyi felhasználók nem frissíthetik jelszavuka emails=E-mail címek manage_emails=E-mail címek kezelése -manage_themes=Válassza ki az alapértelmezett témát -manage_openid=OpenID címek kezelése +manage_themes=Alapértelmezett téma +manage_openid=OpenID címek theme_desc=Ez lesz az alapértelmezett téma az oldalon. primary=Elsődleges activated=Aktivált @@ -1779,14 +1779,14 @@ directory = Könyvtár [search] search = Keresés... type_tooltip = Keresés típusa -code_kind = Kód keresése... +code_kind = Kód keresése… code_search_unavailable = A kódban való keresés jelenleg nem elérhető. Kérem vegye fel a kapcsolatot az oldal adminisztrátorával. -package_kind = Csomagok keresése... -project_kind = Projektek keresése... -user_kind = Felhasználók keresése... -repo_kind = Tárak keresése... -org_kind = Szervezetek keresése... -team_kind = Csapatok keresése... +package_kind = Csomagok keresése… +project_kind = Projektek keresése… +user_kind = Felhasználók keresése… +repo_kind = Tárak keresése… +org_kind = Szervezetek keresése… +team_kind = Csapatok keresése… exact = Pontos code_search_by_git_grep = A kódkeresés jelenleg a "git grep" parancsot használja. Lehet, hogy jobb találatok is lennének, ha a webhely adminisztrátora bekapcsolja a forráskód indexelését. milestone_kind = Mérföldkövek keresése... @@ -1794,8 +1794,8 @@ fuzzy_tooltip = A keresési kifejezéshez hasonló találatok mutatása fuzzy = Hasonlók union = Kulcsszavakra union_tooltip = A szóközzel elválasztott kulcsszavak bármelyikét tartalmazó találatok mutatása -branch_kind = Ágak keresése... +branch_kind = Ágak keresése… no_results = Nincsenek megfelelő találatok. -issue_kind = Hibajegyek keresése... +issue_kind = Hibajegyek keresése… exact_tooltip = Csak a keresési kifejezést pontosan tartalmazó találatok mutatása keyword_search_unavailable = A kulcsszó alapú keresés jelenleg nem elérhető. Kérlek értesítsd az oldal rendszergazdáját. diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini index f1a392105e..56993bec0d 100644 --- a/options/locale/locale_id-ID.ini +++ b/options/locale/locale_id-ID.ini @@ -206,9 +206,9 @@ email_title = Pengaturan email smtp_from = Kirim Email Sebagai [home] -uname_holder=Nama Pengguna atau Alamat Surel +uname_holder=Nama pengguna atau alamat surel password_holder=Kata Sandi -switch_dashboard_context=Alihkan Dasbor Konteks +switch_dashboard_context=Alihkan dasbor konteks my_repos=Repositori show_more_repos=Tampilkan repositori lainnya… collaborative_repos=Repositori Kolaboratif @@ -236,7 +236,7 @@ org_no_results=Tidak ada organisasi yang cocok ditemukan. code_no_results=Tidak ada kode sumber yang cocok dengan istilah yang anda cari. [auth] -create_new_account=Daftar Akun +create_new_account=Daftar akun register_helper_msg=Sudah memiliki akun? Masuk sekarang! social_register_helper_msg=Sudah memiliki akun? Hubungkan sekarang! disable_register_prompt=Maaf, pendaftaran telah dinonaktifkan. Silakan hubungi administrator situs. @@ -269,11 +269,11 @@ twofa_passcode_incorrect=Kata sandi Anda salah. Jika Anda salah tempatkan perang twofa_scratch_token_incorrect=Kode coretan anda tidak tepat. login_userpass=Masuk tab_openid=OpenID -oauth_signup_tab=Daftar Akun Baru -oauth_signup_submit=Akun Lengkap -oauth_signin_tab=Tautkan ke Akun yang Tersedia -oauth_signin_title=Masuk untuk Izinkan Akun Tertaut -oauth_signin_submit=Taut Akun +oauth_signup_tab=Daftar akun baru +oauth_signup_submit=Akun lengkap +oauth_signin_tab=Tautkan ke akun yang tersedia +oauth_signin_title=Masuk untuk izinkan akun tertaut +oauth_signin_submit=Taut akun openid_connect_submit=Sambungkan openid_connect_title=Sambungkan ke akun yang sudah ada openid_connect_desc=OpenID URI yang dipilih tak dikenal. Asosiasikan dengan akun baru disini. @@ -398,14 +398,14 @@ avatar=Avatar ssh_gpg_keys=Kunci SSH / GPG social=Akun Sosial applications=Aplikasi -orgs=Kelola organisasi +orgs=Organisasi repos=Repositori -delete=Hapus Akun +delete=Hapus akun twofa=Otentikasi Dua-Faktor account_link=Akun Tertaut organization=Organisasi -public_profile=Profil Publik +public_profile=Profil publik password_username_disabled=Pengguna non-lokal tidak diizinkan untuk mengubah nama pengguna mereka. Silakan hubungi administrator sistem anda untuk lebih lanjut. full_name=Nama Lengkap website=Situs Web @@ -438,8 +438,8 @@ password_change_disabled=Pengguna non-lokal tidak dapat mengganti kata sandi mer emails=Alamat Surel manage_emails=Kelola Alamat Surel -manage_themes=Pilih tema default -manage_openid=Kelola alamat OpenID +manage_themes=Tema default +manage_openid=Alamat OpenID theme_desc=Ini akan menjadi tema asal Anda pada keseluruhan situs. primary=Utama activated=Diaktifkan @@ -1484,10 +1484,10 @@ search = Cari... type_tooltip = Tipe pencarian fuzzy_tooltip = Termasuk juga hasil yang mendekati kata pencarian exact_tooltip = Hanya menampilkan hasil yang cocok dengan istilah pencarian -repo_kind = Cari repo... -user_kind = Telusuri pengguna... -org_kind = Cari organisasi... -team_kind = Cari tim... -code_kind = Cari kode... +repo_kind = Cari repo… +user_kind = Telusuri pengguna… +org_kind = Cari organisasi… +team_kind = Cari tim… +code_kind = Cari kode… code_search_unavailable = Pencarian kode saat ini tidak tersedia. Silahkan hubungi administrator. -branch_kind = Cari cabang... +branch_kind = Cari cabang… diff --git a/options/locale/locale_is-IS.ini b/options/locale/locale_is-IS.ini index baf8286923..f3333dbea2 100644 --- a/options/locale/locale_is-IS.ini +++ b/options/locale/locale_is-IS.ini @@ -223,7 +223,7 @@ default_keep_email_private.description=Fela sjálfgefið netföng nýrra notenda no_reply_address_helper=Lén fyrir notendur með falið netfang. Til dæmis notandanafnið „joe“ verður skráð í Git sem „joe@noreply.example.org“ ef falið tölvupóstlén er stillt á „noreply.example.org“. [home] -uname_holder=Notandanafn eða Netfang +uname_holder=Notandanafn eða netfang password_holder=Lykilorð my_repos=Hugbúnaðarsöfn show_more_repos=Sýna fleiri hugbúnaðarsöfn… @@ -255,7 +255,7 @@ org_no_results=Engar samsvarandi stofnanir fundust. code_no_results=Enginn samsvarandi frumkóði fannst eftur þínum leitarorðum. [auth] -create_new_account=Skrá Notanda +create_new_account=Skrá notanda register_helper_msg=Ertu nú þegar með notanda? Skráðu þig inn núna! social_register_helper_msg=Ertu nú þegar með reikning? Tengdu hann núna! manual_activation_only=Hafðu samband við stjórnanda vefsvæðisins til að ljúka virkjun. @@ -276,13 +276,13 @@ verify=Staðfesta scratch_code=Skrapkóði use_scratch_code=Nota skrapkóða twofa_scratch_token_incorrect=Skrapkóði þinn er rangur. -login_userpass=Skrá Inn +login_userpass=Skrá inn tab_openid=OpenID -oauth_signup_tab=Skrá Nýjan Notanda -oauth_signup_title=Klára Nýjum Notanda -oauth_signup_submit=Klára Notanda -oauth_signin_tab=Tengja Núverandi Reikning -oauth_signin_submit=Tengja Notanda +oauth_signup_tab=Skrá nýjan notanda +oauth_signup_title=Klára nýjum notanda +oauth_signup_submit=Klára notanda +oauth_signin_tab=Tengja núverandi reikning +oauth_signin_submit=Tengja notanda openid_connect_submit=Tengjast openid_register_title=Skrá nýjan notanda disable_forgot_password_mail=Endurheimting reiknings er óvirk vegna þess að enginn tölvupóstur er uppsettur. Vinsamlegast hafðu samband við síðustjórann þinn. @@ -434,15 +434,15 @@ avatar=Notandamynd ssh_gpg_keys=SSH og GPG Lyklar social=Félagsreikningar applications=Forrit -orgs=Stjórna Stofnunum +orgs=Stofnanir repos=Hugbúnaðarsöfn -delete=Eyða Reikningi +delete=Eyða reikningi twofa=Tvíþætt Auðkenning account_link=Tengdir Reikningar organization=Stofnanir webauthn=Öryggislyklar -public_profile=Opinber Notandasíða +public_profile=Opinber notandasíða password_username_disabled=Notendum utan staðarins er ekki heimilt að breyta notendanafni sínu. Vinsamlegast hafðu samband við síðustjórann þinn til að fá frekari upplýsingar. full_name=Fullt Nafn website=Vefsíða diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index d46f709cde..50405ed756 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -423,7 +423,7 @@ allow_password_change=Richiede all'utente di cambiare la password (scelta consig reset_password_mail_sent_prompt=Un'e-mail di conferma è stata inviata a %s. Per completare il processo di recupero dell'account, controlla la tua posta in arrivo e clicca sul link entro i prossimi %s secondi. active_your_account=Attiva il tuo account account_activated=L'account è stato attivato -prohibit_login=L'accesso è proibito +prohibit_login=L'account è sospeso 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 @@ -742,7 +742,7 @@ avatar=Avatar ssh_gpg_keys=Chiavi SSH / GPG social=Account Sociali applications=Applicazioni -orgs=Gestisci le organizzazioni +orgs=Organizzazioni repos=Repositori delete=Elimina account twofa=Verifica in due passaggi @@ -803,8 +803,8 @@ password_change_disabled=Gli utenti non locali non possono cambiare la loro pass emails=Indirizzi email manage_emails=Gestisci indirizzi email -manage_themes=Seleziona il tema predefinito -manage_openid=Gestisci gli indirizzi OpenID +manage_themes=Tema predefinito +manage_openid=Indirizzi OpenID theme_desc=Questo sarà il tuo tema di predefinito in tutto il sito. primary=Primario activated=Attivato @@ -4014,25 +4014,25 @@ type_tooltip = Tipo ricerca search = Cerca… fuzzy = Approssimativa match = Precisa -org_kind = Cerca organizzazioni... -package_kind = Ricerca pacchetti... +org_kind = Cerca organizzazioni… +package_kind = Ricerca pacchetti… code_search_unavailable = La ricerca del codice non è attualmente disponibile. Contatta l'amministratorə del sito. -code_kind = Cerca nel codice... -team_kind = Cerca team... +code_kind = Cerca nel codice… +team_kind = Cerca team… code_search_by_git_grep = I risultati della ricerca del codice sono forniti da "git grep". Potrebbero esserci risultati migliori se l'amministratore del sito avesse abilitato l'indicizzatore del codice. -project_kind = Ricerca progetti... -commit_kind = Ricerca commit... -branch_kind = Ricerca rami... +project_kind = Ricerca progetti… +commit_kind = Ricerca commit… +branch_kind = Ricerca rami… no_results = Non è stato trovato alcun risultato. keyword_search_unavailable = La ricerca per parole chiave non è attualmente disponibile. Contatta l'amministratore del sito. -runner_kind = Ricerca esecutori... +runner_kind = Ricerca esecutori… match_tooltip = Includi solo risultati che corrispondono precisamente al termine di ricerca fuzzy_tooltip = Includi anche risultati che corrispondono approssimativamente al termine di ricerca -user_kind = Cerca utenti... -repo_kind = Cerca repo... +user_kind = Cerca utenti… +repo_kind = Cerca repo… exact_tooltip = Includi solo i risultati che corrispondono esattamente al termine di ricerca -issue_kind = Cerca segnalazioni... -pull_kind = Cerca richieste... +issue_kind = Cerca segnalazioni… +pull_kind = Cerca richieste… exact = Esatto milestone_kind = Ricerca tappe... regexp_tooltip = Interpreta i termini di ricerca come un'espressione regolare diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index 555f5c6a75..f3a8922f88 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -250,7 +250,7 @@ err_empty_db_path=SQLite3のデータベースパスを空にすることはで no_admin_and_disable_registration=管理者アカウントを作成せずに、セルフ登録を無効にすることはできません。 err_empty_admin_password=管理者パスワードは空にできません。 err_empty_admin_email=管理者のメールアドレスは空にできません。 -err_admin_name_is_reserved=管理者のユーザー名が不正です。予約済みのユーザー名です。 +err_admin_name_is_reserved=管理者のユーザー名が不正です。予約済みのユーザー名です err_admin_name_pattern_not_allowed=管理者のユーザー名が不正です。 予約済みのパターンにマッチしています err_admin_name_is_invalid=管理者のユーザー名が不正です @@ -1048,6 +1048,8 @@ keep_activity_private.description = 公開アクティビティ language.description = この言語はアカウントに保存され、ログイン後にデフォルトとして使用されます。 language.localization_project = Forgejo をあなたの言語に翻訳するのを手伝ってください。詳細はこちら。 +quota = クオータ + [repo] new_repo_helper=リポジトリには、プロジェクトのすべてのファイルとリビジョン履歴が入ります。 すでにほかの場所でホストしていますか? リポジトリを移行 もどうぞ。 owner=オーナー @@ -3903,20 +3905,20 @@ submodule=サブモジュール [search] search = 検索... type_tooltip = 検索タイプ -org_kind = 組織の検索... -code_kind = コードの検索... +org_kind = 組織を検索… +code_kind = コードを検索… fuzzy = あいまい -repo_kind = リポジトリの検索... +repo_kind = リポジトリを検索… code_search_unavailable = コード検索は現在利用できません。サイト管理者にお問い合わせください。 -branch_kind = ブランチの検索... -commit_kind = コミットの検索... -user_kind = ユーザーの検索... -team_kind = チームの検索... +branch_kind = ブランチを検索… +commit_kind = コミットを検索… +user_kind = ユーザーを検索… +team_kind = チームを検索… code_search_by_git_grep = 現在のコード検索結果は「git grep」によって提供されます。サイト管理者がコード インデクサーを有効にすると、より良い結果が得られる可能性があります。 -package_kind = パッケージの検索... -project_kind = プロジェクトの検索... +package_kind = パッケージを検索… +project_kind = プロジェクトを検索… keyword_search_unavailable = キーワードによる検索は現在ご利用いただけません。サイト管理者にお問い合わせください。 -runner_kind = ランナーの検索... +runner_kind = ランナーを検索… no_results = 一致する結果が見つかりませんでした。 fuzzy_tooltip = 入力された語句に近いものも結果に含める match = 一致 @@ -3924,8 +3926,8 @@ match_tooltip = 検索語句に厳密に一致するもののみ結果に含め milestone_kind = マイルストーンを検索... union_tooltip = 空白で区切られたキーワードのいずれかに一致する結果を含める exact_tooltip = 検索語句と完全に一致する結果のみを含める -issue_kind = イシューを検索... -pull_kind = プルを検索... +issue_kind = イシューを検索… +pull_kind = プルを検索… exact = 完全一致 regexp_tooltip = 検索語句を正規表現として解釈する regexp = 正規表現 diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini index be0400bea4..5e2354f3a8 100644 --- a/options/locale/locale_ko-KR.ini +++ b/options/locale/locale_ko-KR.ini @@ -384,7 +384,7 @@ allow_password_change=사용자에게 비밀번호 변경을 요청 (권장됨) reset_password_mail_sent_prompt=확인 메일이 %s로 전송되었습니다. 받은 편지함으로 도착한 메일을 %s 안에 확인해서 비밀번호 찾기 절차를 완료하십시오. active_your_account=계정 활성화 account_activated=계정이 활성화 되었습니다 -prohibit_login = +prohibit_login = resent_limit_prompt=활성화를 위한 이메일을 이미 전송했습니다. 3분 내로 이메일을 받지 못한 경우 재시도해주세요. has_unconfirmed_mail=안녕하세요 %s, 이메일 주소(%s)가 확인되지 않았습니다. 확인 메일을 받으시지 못하겼거나 새로운 확인 메일이 필요하다면, 아래 버튼을 클릭해 재발송하실 수 있습니다. resend_mail=여기를 눌러 확인 메일 재전송 @@ -588,8 +588,8 @@ password_change_disabled=로컬 유저가 아닌 경우 Forgejo 웹 인터페이 emails=이메일 주소 manage_emails=이메일 주소 관리 -manage_themes=기본 테마 선택 -manage_openid=OpenID 주소 관리 +manage_themes=기본 테마 +manage_openid=OpenID 주소 theme_desc=이 테마가 사이트 전체 기본 테마가 됩니다. primary=대표 activated=활성화됨 @@ -1900,9 +1900,9 @@ runs.commit=커밋 [search] code_search_by_git_grep = 현재 코드 검색 결과는 "git grep"에 의해 제공됩니다.관리자가 코드 인덱서를 활성화하면 더 나은 결과가 제공될 수 있습니다. -branch_kind = 브랜치 검색... +branch_kind = 브랜치 검색… keyword_search_unavailable = 지금은 키워드로 검색이 지원되지 않습니다. 사이트 관리자에게 문의하십시오. -commit_kind = 커밋 검색... +commit_kind = 커밋 검색… no_results = 일치하는 결과를 찾을 수 없습니다. search = 검색… type_tooltip = 검색 타입 @@ -1910,11 +1910,11 @@ fuzzy_tooltip = 검색어와 밀접하게 일치하는 결과도 포함 repo_kind = 저장소 검색… user_kind = 사용자 검색… org_kind = 조직 검색… -team_kind = 팀 검색... -code_kind = 코드 검색... +team_kind = 팀 검색… +code_kind = 코드 검색… code_search_unavailable = 코드 검색은 현재 허용되지 않았습니다. 사이트 관리자와 연락하세요. -package_kind = 패키지 검색... -project_kind = 프로젝트 검색... +package_kind = 패키지 검색… +project_kind = 프로젝트 검색… exact_tooltip = 검색어와 정확하게 일치하는 결과만 포함 issue_kind = 이슈 검색… pull_kind = 풀 검색… diff --git a/options/locale/locale_lt.ini b/options/locale/locale_lt.ini index 868e5bff6e..9d1c938379 100644 --- a/options/locale/locale_lt.ini +++ b/options/locale/locale_lt.ini @@ -149,24 +149,24 @@ fuzzy = Tikslintinas union_tooltip = Įtraukti rezultatus, atitinkančius bet kurį iš matomą tarpą atskirtų raktažodžių exact = Tiksliai exact_tooltip = Įtraukti tik tuos rezultatus, kurie atitinka tikslią paieškos frazę -user_kind = Ieškoti naudotojų... -team_kind = Ieškoti komandų... -code_kind = Ieškoti kodo... +user_kind = Ieškoti naudotojų… +team_kind = Ieškoti komandų… +code_kind = Ieškoti kodo… fuzzy_tooltip = Įtraukti rezultatus, kurie taip pat labai atitinka paieškos terminą -repo_kind = Ieškoti saugyklų... +repo_kind = Ieškoti saugyklų… code_search_unavailable = Kodų paieška šiuo metu nepasiekiama. Kreipkis į svetainės administratorių. -org_kind = Ieškoti organizacijų... +org_kind = Ieškoti organizacijų… union = Bendrinis code_search_by_git_grep = Dabartiniai kodo paieškos rezultatai pateikiami atliekant „git grep“. Rezultatai gali būti geresni, jei svetainės administratorius įjungs kodo indeksuotoją. -package_kind = Ieškoti paketų... -project_kind = Ieškoti projektų... -commit_kind = Ieškoti įsipareigojimų... -runner_kind = Ieškoti vykdyklių... +package_kind = Ieškoti paketų… +project_kind = Ieškoti projektų… +commit_kind = Ieškoti įsipareigojimų… +runner_kind = Ieškoti vykdyklių… no_results = Nerasta atitinkamų rezultatų. -issue_kind = Ieškoti problemų... -branch_kind = Ieškoti šakų... +issue_kind = Ieškoti problemų… +branch_kind = Ieškoti šakų… milestone_kind = Ieškoti gairių... -pull_kind = Ieškoti sujungimų... +pull_kind = Ieškoti sujungimų… keyword_search_unavailable = Ieškoti pagal raktažodį šiuo metu nepasiekiamas. Susisiekite su svetainės administratoriumi. regexp = Reguliarusis reiškinys regexp_tooltip = Interpretuoti paieškos terminą kaip reguliariąją reiškinį diff --git a/options/locale/locale_ml-IN.ini b/options/locale/locale_ml-IN.ini index fcc9888d8e..c4c266ad86 100644 --- a/options/locale/locale_ml-IN.ini +++ b/options/locale/locale_ml-IN.ini @@ -356,7 +356,7 @@ avatar=അവതാര്‍ ssh_gpg_keys=SSH / GPG കീകള്‍ social=സോഷ്യൽ അക്കൗണ്ടുകൾ applications=അപ്ലിക്കേഷനുകൾ -orgs=സംഘടനകളെ നിയന്ത്രിക്കുക +orgs=സംഘടനകൾ repos=കലവറകള്‍ delete=അക്കൗണ്ട് ഇല്ലാതാക്കുക twofa=ഇരട്ട ഘടക പ്രാമാണീകരണം @@ -400,8 +400,8 @@ password_change_disabled=പ്രാദേശിക ഇതര ഉപയോക emails=ഇ-മെയില്‍ വിലാസങ്ങള്‍ manage_emails=ഇമെയിൽ വിലാസങ്ങൾ നിയന്ത്രിക്കുക -manage_themes=സ്ഥിരസ്ഥിതി പ്രമേയം തിരഞ്ഞെടുക്കുക -manage_openid=ഓപ്പൺഐഡി വിലാസങ്ങൾ നിയന്ത്രിക്കുക +manage_themes=ഡിഫോൾട്ട് തീം +manage_openid=OpenID വിലാസങ്ങൾ email_desc=അറിയിപ്പുകൾക്കും മറ്റ് പ്രവർത്തനങ്ങൾക്കുമായി നിങ്ങളുടെ പ്രാഥമിക ഇമെയിൽ വിലാസം ഉപയോഗിക്കും. theme_desc=സൈറ്റിലുടനീളം ഇത് നിങ്ങളുടെ സ്ഥിരസ്ഥിതി പ്രമേയം ആയിരിക്കും. primary=പ്രാഥമികം diff --git a/options/locale/locale_nds.ini b/options/locale/locale_nds.ini index cd91f7c35a..fe504b2a04 100644 --- a/options/locale/locale_nds.ini +++ b/options/locale/locale_nds.ini @@ -568,7 +568,7 @@ organization = Vereenigungen uid = UID webauthn = Twee-Faktooren-Anmellen (Sekerheids-Slötels) blocked_users = Blockeert Brukers -public_profile = Publikes Profil +public_profile = Publikes profil location_placeholder = Deel waar du umslags büst mit Annerns pronouns = Pronomens pronouns_custom = Eegene diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index 189e663618..a788badb47 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -1043,8 +1043,8 @@ language.title = Domyślny język language.localization_project = Pomóż nam przetłumaczyć Forgejo na twój język! Dowiedz się więcej. update_hints = Zaktualizuj wskazówki update_hints_success = Wskazówki zostały zaktualizowane. -change_username_redirect_prompt.with_cooldown.one = Stara nazwa użytkownika będzie dostępna dla każdego po okresie ochronnym wynoszącym %[1]d dzień, nadal możesz uzyskać z powrotem starą nazwę użytkownika podczas okresu ochronnego. -change_username_redirect_prompt.with_cooldown.few = Stara nazwa użytkownika będzie dostępna dla każdego po okresie ochronnym wynoszącym %[1]d dni, nadal możesz uzyskać z powrotem starą nazwę użytkownika podczas okresu ochronnego. +change_username_redirect_prompt.with_cooldown.one = Stara nazwa użytkownika będzie dostępna dla każdego po okresie ochronnym wynoszącym %[1]d dzień. Nadal możesz uzyskać z powrotem starą nazwę użytkownika podczas okresu ochronnego. +change_username_redirect_prompt.with_cooldown.few = Stara nazwa użytkownika będzie dostępna dla każdego po okresie ochronnym wynoszącym %[1]d dni. Nadal możesz uzyskać z powrotem starą nazwę użytkownika podczas okresu ochronnego. language.description = Ten język zostanie zapisany na twoim koncie i będzie używany jako domyślny po zalogowaniu. hidden_comment_types_description = Rodzaje komentarzy zaznaczone tutaj nie będą wyświetlały się na stronach zgłoszeń. Zaznaczenie "Etykieta" na przykład usunie wszystkie komentarze " dodał/usunął ". principal_desc = Te podmioty certyfikatu SSH będą powiązane z twoim kontem i pozwolą na pełen dostęp do twoich repozytoriów. @@ -3951,29 +3951,29 @@ normal_file = Zwykły plik search = Wyszukaj... type_tooltip = Typ wyszukiwania fuzzy = Przybliżone -package_kind = Wyszukaj pakiety... +package_kind = Wyszukaj pakiety… fuzzy_tooltip = Uwzględnij wyniki, które są bliskie wyszukiwanemu hasłu match = Dopasuj match_tooltip = Uwzględniaj tylko wyniki pasujące do wyszukiwanego hasła -repo_kind = Wyszukaj repozytoria... -user_kind = Wyszukaj użytkownilków... +repo_kind = Wyszukaj repozytoria… +user_kind = Wyszukaj użytkownilków… code_search_unavailable = Wyszukiwanie kodu jest obecnie niedostępne. Skontakuj sie z administratorem strony. no_results = Nie znaleziono pasujących wyników. -org_kind = Wyszukaj organizacje... -team_kind = Wyszukaj zespoły... -code_kind = Wyszukaj kod... +org_kind = Wyszukaj organizacje… +team_kind = Wyszukaj zespoły… +code_kind = Wyszukaj kod… code_search_by_git_grep = Obecne wyniki wyszukiwania kodu są dostarczane przez "git grep". Wyniki mogą być lepsze, jeśli administrator witryny włączy indeksator kodu. -project_kind = Wyszukaj projekty... -branch_kind = Wyszukaj gałęzie... -commit_kind = Wyszukaj commity... -runner_kind = Wyszukaj runnery... +project_kind = Wyszukaj projekty… +branch_kind = Wyszukaj gałęzie… +commit_kind = Wyszukaj commity… +runner_kind = Wyszukaj runnery… keyword_search_unavailable = Wyszukiwanie według słów kluczowych jest obecnie niedostępne. Skontaktuj się z administratorem strony. milestone_kind = Wyszukaj kamienie milowe... union_tooltip = Uwzględnia wyniki pasujące do dowolnego słowa kluczowego rozdzielonego białymi znakami exact = Dokładne exact_tooltip = Uwzględniaj tylko wyniki pasujące do wyszukiwanego hasła -issue_kind = Wyszukaj zgłoszenia... -pull_kind = Wyszukaj pull requesty... +issue_kind = Wyszukaj zgłoszenia… +pull_kind = Wyszukaj pull requesty… union = Unia regexp = RegExp regexp_tooltip = Interpretuj wyszukiwane hasło jako wyrażenie regularne diff --git a/options/locale/locale_ro.ini b/options/locale/locale_ro.ini index 305c34d013..c52788a05e 100644 --- a/options/locale/locale_ro.ini +++ b/options/locale/locale_ro.ini @@ -1,6 +1,3 @@ - - - [common] return_to_forgejo = Înapoi la Forgejo explore = Explorează @@ -223,12 +220,12 @@ invalid_db_setting = Setările pentru bază de date sunt invalide: %v no_reply_address = Domeniu pentru adrese de email ascunse [search] -user_kind = Caută utilizatori... -team_kind = Caută echipe... -code_kind = Caută cod... -project_kind = Caută proiecte... -package_kind = Caută pachete... -org_kind = Caută organizații... +user_kind = Caută utilizatori… +team_kind = Caută echipe… +code_kind = Caută cod… +project_kind = Caută proiecte… +package_kind = Caută pachete… +org_kind = Caută organizații… code_search_unavailable = Căutarea de cod nu este disponibilă momentan. Te rog contactează administratorul site-ului. keyword_search_unavailable = Căutarea după cuvânt cheie nu este disponibilă momentan. Te rog contactează administratorul site-ului. no_results = Nu a fost găsit niciun rezultat corespunzător. diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 2ef1b868d4..304b07b7ee 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -1063,7 +1063,7 @@ language.description = Выбранный язык будет сохранён language.localization_project = Помогите с переводом Forgejo на свой язык! Подробнее. user_block_yourself = Нельзя заблокировать себя. pronouns_custom_label = Другие местоимения -change_username_redirect_prompt.with_cooldown.one = Прежнее имя будет доступно для использования другим пользователям после истечения защиты в %[1]d день. Вы сможете вернуть его себе во время срока защиты. +change_username_redirect_prompt.with_cooldown.one = Прежнее имя будет доступно для использования другим пользователям после истечения простоя в %[1]d день. Вы сможете вернуть его себе во время срока простоя. change_username_redirect_prompt.with_cooldown.few = Прежнее имя будет доступно для использования другим пользователям после истечения защиты в %[1]d дней. Вы сможете вернуть его себе во время срока защиты. keep_pronouns_private = Показывать местоимения только зарегистрированным пользователям keep_pronouns_private.description = Местоимения будут скрыты от пользователей, не имеющих учётных записей на сервере. @@ -1641,9 +1641,9 @@ issues.closed_at=`задача была закрыта %s` issues.reopened_at=`задача была открыта снова %s` issues.commit_ref_at=`упоминание этой задачи в коммите %s` issues.ref_issue_from=`упоминание этой задачи %[3]s %[1]s` -issues.ref_pull_from=`упоминание этого запроса слияния %[3]s %[1]s` -issues.ref_closing_from=`упоминание из запроса на слияние %[3]s, который закроет эту задачу %[1]s` -issues.ref_reopening_from=`упоминание из запроса на слияние %[3]s, который повторно откроет эту задачу %[1]s` +issues.ref_pull_from=`упомянул этот запрос на слияние %[3]s %[1]s` +issues.ref_closing_from=`упомянул эту задачу в запросе на слияние %[3]s, который закроет её %[1]s` +issues.ref_reopening_from=`упомянул эту задачу в запросе на слияние %[3]s, который переоткроет эту задачу %[1]s` issues.ref_closed_from=`закрыл этот запрос %[4]s %[2]s` issues.ref_reopened_from=`задача была открыта снова %[4]s %[2]s` issues.ref_from=`из %[1]s` diff --git a/options/locale/locale_si-LK.ini b/options/locale/locale_si-LK.ini index 54b0b246db..e1e19fa78e 100644 --- a/options/locale/locale_si-LK.ini +++ b/options/locale/locale_si-LK.ini @@ -482,7 +482,7 @@ avatar=අවතාර් ssh_gpg_keys=SSH/ජීපීජී යතුරු social=සමාජ ගිණුම් applications=යෙදුම් -orgs=සංවිධාන කළමනාකරණය +orgs=සංවිධාන repos=කෝෂ්ඨ delete=ගිණුම මකන්න twofa=ද්වි-සාධක සත්යාපනය @@ -527,8 +527,8 @@ password_change_disabled=දේශීය නොවන පරිශීලකය emails=වි-තැපැල් ලිපින manage_emails=වි-තැපැල් ලිපින කළමනාකරණය -manage_themes=පෙරනිමි තේමාව තෝරන්න -manage_openid=OpenID ලිපිනයන් කළමනාකරණය කරන්න +manage_themes=පෙරනිමි තේමාව +manage_openid=OpenID ලිපින theme_desc=මෙම වෙබ් අඩවිය හරහා ඔබගේ පෙරනිමි තේමාව වනු ඇත. primary=ප්රාථමික activated=සක්රිය diff --git a/options/locale/locale_sk-SK.ini b/options/locale/locale_sk-SK.ini index 0c44df326a..aa2f863b14 100644 --- a/options/locale/locale_sk-SK.ini +++ b/options/locale/locale_sk-SK.ini @@ -597,7 +597,7 @@ avatar=Avatar ssh_gpg_keys=SSH / GPG kľúče social=Sociálne účty applications=Aplikácie -orgs=Spravovať organizácie +orgs=Organizácie repos=Repozitáre delete=Zmazať účet twofa=Dvojfaktorové overenie @@ -656,8 +656,8 @@ password_change_disabled=Externe overovaní používatelia nemôžu aktualizova emails=E-mailové adresy manage_emails=Správa e-mailových adries -manage_themes=Nastavenie predvolenej témy -manage_openid=Správa OpenID adries +manage_themes=Predvolená téma +manage_openid=Adresy OpenID theme_desc=Toto bude vaša predvolená téma vzhľadu naprieč stránkou. primary=Primárny activated=Aktivovaný diff --git a/options/locale/locale_sl.ini b/options/locale/locale_sl.ini index 608e05afa4..07ccaed259 100644 --- a/options/locale/locale_sl.ini +++ b/options/locale/locale_sl.ini @@ -133,7 +133,7 @@ reinstall_confirm_check_3 = Potrjujete, da ste popolnoma prepričani, da se ta p require_db_desc = Forgejo zahteva MySQL, PostgreSQL, SQLite3 ali TiDB (protokol MySQL). password_algorithm_helper = Nastavite algoritem za stiskanje gesla. Algoritmi imajo različne zahteve in moč. Algoritem argon2 je precej varen, vendar porabi veliko pomnilnika in je lahko neprimeren za majhne sisteme. reinstall_confirm_message = Ponovna namestitev z obstoječo zbirko podatkov Forgejo lahko povzroči več težav. V večini primerov morate za zagon programa Forgejo uporabiti obstoječi "app.ini". Če veste, kaj počnete, potrdite naslednje: -err_admin_name_is_reserved = Administrator Uporabniško ime je neveljavno, uporabniško ime je rezervirano +err_admin_name_is_reserved = Administrator uporabniško ime je neveljavno, uporabniško ime je rezervirano disable_gravatar.description = Onemogočite vire avatarjev Gravatar in avatarje tretjih oseb. Uporabi se privzeti avatar, razen če uporabnik lokalno naloži avatar. install = Namestitev title = Začetna nastavitev @@ -367,7 +367,7 @@ delete = Brisanje računa uploaded_avatar_is_too_big = Velikost naložene datoteke (%d KiB) presega največjo velikost (%d KiB). webauthn = Dvofaktorsko preverjanje pristnosti (varnostni ključi) change_username_redirect_prompt = Staro uporabniško ime bo preusmerjeno, dokler ga nekdo ne prevzame. -orgs = Upravljanje organizacij +orgs = Organizacije public_profile = Javni profil gpg_key_verified_long = Ključ je bil preverjen z žetonom in ga je mogoče uporabiti za preverjanje zavez, ki ustrezajo vsem aktiviranim e-poštnim naslovom tega uporabnika, poleg vseh ujemajočih se identitet za ta ključ. @@ -495,14 +495,14 @@ tab_openid = Odprta identiteta [home] show_both_archived_unarchived = Prikazovanje arhiviranih in nearhiviranih -switch_dashboard_context = Kontekst stikala Nadzorna plošča +switch_dashboard_context = Kontekst stikala nadzorna plošča search_repos = Poiščite skladišče… filter_by_team_repositories = Filtriranje po skupinskih skladiščih show_archived = Arhivirano collaborative_repos = Sodelovalni repozitoriji my_mirrors = Moja ogledala show_only_public = Prikazovanje samo javnih -uname_holder = Uporabniško ime ali E-poštovni naslov +uname_holder = Uporabniško ime ali e-poštni naslov password_holder = Geslo my_repos = Repozitoriji show_more_repos = Prikaži več skladišč… diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index 2e212c8c49..ec57f025cd 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -2326,15 +2326,15 @@ repo_kind = Sök repon… user_kind = Sök användare… code_kind = Sök kod… package_kind = Sök paket… -runner_kind = Sök exekutorer... +runner_kind = Sök exekutorer… branch_kind = Sök grenar… -commit_kind = Sök commiter... +commit_kind = Sök commiter… project_kind = Sök projekt… search = Sök… type_tooltip = Söktyp team_kind = Sök team… org_kind = Sök organisationer… -issue_kind = Sök ärenden... +issue_kind = Sök ärenden… regexp_tooltip = Tolka söktermen som ett reguljärt uttryck code_search_unavailable = Kodsökning är för närvarande inte tillgänglig. Vänligen kontakta webbplatsadministratören. fuzzy_tooltip = Inkludera resultat som är närliggande till söktermen diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini index c07cefdab9..0bb49a2181 100644 --- a/options/locale/locale_tr-TR.ini +++ b/options/locale/locale_tr-TR.ini @@ -163,8 +163,8 @@ new_repo.link = Yeni depo new_org.link = Yeni organizasyon error413 = Kotanızı doldurdunuz. toggle_menu = Menüyü aç-kapa -new_migrate.title = Yeni geçiş -new_migrate.link = Yeni geçiş +new_migrate.title = Yeni göç +new_migrate.link = Yeni göç copy_path = Dizini kopyala confirm_delete_artifact = "%s" adlı öğeyi silmek istediğinizden emin misiniz? @@ -179,8 +179,10 @@ number_of_contributions_in_the_last_12_months=son 12 ayda %s katkı contributions_zero=Katkı yapılmamış less=Daha az more=Daha Fazla -contributions_one = katılım -contributions_few = katılımlar +contributions_one = katkı +contributions_few = katkı + +contributions_format = {day} {month} {year} tarihinde {contributions} katkı [editor] buttons.heading.tooltip=Başlık ekle @@ -204,6 +206,13 @@ table_modal.placeholder.content = İçerik table_modal.label.rows = Satırlar table_modal.label.columns = Sütunlar +buttons.indent.tooltip = Bir seviye girinti artır +buttons.unindent.tooltip = Bir seviye girinti azalt +link_modal.header = Bağlantı ekle +link_modal.url = Url +link_modal.description = Açıklama +link_modal.paste_reminder = İpucu: Panonuzdaki bir URL'yi doğrudan düzenleyiciye yapıştırarak bir bağlantı oluşturabilirsiniz. + [filter] string.asc=A - Z string.desc=Z - A @@ -227,6 +236,8 @@ lightweight_desc=Forgejo'nın minimal gereksinimleri çok düşüktür ve ucuz b license=Açık Kaynak license_desc=Gidin ve Forgejo'yı edinin! Bu projeyi daha da iyi yapmak için katkıda bulunarak bize katılın. Katkıda bulunmaktan çekinmeyin! +platform_desc = Forgejo'nun Linux ve FreeBSD gibi özgür işletim sistemlerinde ve farklı CPU mimarilerinde çalıştığı doğrulandı. Sevdiğinizi seçin! + [install] install=Kurulum title=Başlangıç Yapılandırması @@ -252,9 +263,9 @@ err_empty_db_path=SQLite3 veritabanı dosya yolu boş olamaz. no_admin_and_disable_registration=Bir yönetici hesabı oluşturmadan kullanıcı kaydını kapatamazsınız. err_empty_admin_password=Yönetici parolası boş olamaz. err_empty_admin_email=Yönetici e-postası boş olamaz. -err_admin_name_is_reserved=Yönetici Kullanıcı Adı geçersiz, bu kullanıcı adı rezerv edilen bir kelimedir +err_admin_name_is_reserved=Yönetici kullanıcı adı geçersiz, bu kullanıcı adı rezerv edilen bir kelimedir err_admin_name_pattern_not_allowed=Yönetici kullanıcı adı geçersiz, kullanıcı adı ayrılmış bir desenle eşleşiyor -err_admin_name_is_invalid=Yönetici Kullanıcı Adı geçersiz +err_admin_name_is_invalid=Yönetici kullanıcı adı geçersiz general_title=Genel ayarlar app_name=Site Başlığı @@ -345,6 +356,8 @@ allow_dots_in_usernames = Kullanıcı isimlerinde noktaya izin ver. Var olan kul smtp_from_invalid = `"E-posta Olarak Gönder" adresi geçersiz` +config_location_hint = Bu yapılandırma seçenekleri şuraya kaydedilecek: + [home] uname_holder=Kullanıcı adı veya e-posta adresi password_holder=Parola @@ -478,6 +491,8 @@ sign_in_openid = OpenID ile giriş yap hint_login = Mevcut hesabın var mı? Hemen giriş yap! use_onetime_code = Tek kullanımlık kod kullan +change_unconfirmed_email = Kayıt sırasında yanlış e-posta adresi verdiyseniz, aşağıdan değiştirebilirsiniz; yeni adresinize bir onay mesajı gönderilecektir. + [mail] view_it_on=%s üzerinde görüntüle reply=veya doğrudan bu e-postayı yanıtlayın @@ -722,16 +737,16 @@ avatar=Avatar ssh_gpg_keys=SSH / GPG Anahtarları social=Sosyal Medya Hesapları applications=Uygulamalar -orgs=Organizasyonları Yönet +orgs=Kuruluşlar repos=Depolar -delete=Hesabı Sil -twofa=İki Aşamalı Doğrulama +delete=Hesabı sil +twofa=İki aşamalı doğrulama account_link=Bağlı Hesaplar organization=Organizasyonlar uid=UID webauthn=Güvenlik Anahtarları -public_profile=Herkese Açık Profil +public_profile=Herkese açık profil biography_placeholder=Bize kendiniz hakkında birşeyler söyleyin! (Markdown kullanabilirsiniz) location_placeholder=Yaklaşık konumunuzu başkalarıyla paylaşın profile_desc=Profilinizin başkalarına nasıl gösterildiğini yönetin. Ana e-posta adresiniz bildirimler, parola kurtarma ve web tabanlı Git işlemleri için kullanılacaktır. @@ -796,8 +811,8 @@ password_change_disabled=Yerel olmayan kullanıcılar parolalarını Forgejo web emails=E-Posta Adresleri manage_emails=E-posta Adreslerini Yönet -manage_themes=Varsayılan temayı seç -manage_openid=OpenID Adreslerini Yönet +manage_themes=Varsayılan tema +manage_openid=OpenID adresleri email_desc=Ana e-posta adresiniz bildirimler, parola kurtarma ve gizlenmemişse eğer web tabanlı Git işlemleri için kullanılacaktır. theme_desc=Bu, sitedeki varsayılan temanız olacak. primary=Birincil @@ -1166,7 +1181,7 @@ form.name_reserved=Depo adı "%s" rezerve edilmiş. form.name_pattern_not_allowed=Depo adında "%s" deseni kullanılamaz. need_auth=Yetkilendirme -migrate_options=Göç Seçenekleri +migrate_options=Göç seçenekleri migrate_service=Göç Hizmeti migrate_options_mirror_helper=Bu depo bir yansı olacaktır migrate_options_lfs=LFS dosyalarını taşı @@ -1174,7 +1189,7 @@ migrate_options_lfs_endpoint.label=LFS Uç Noktası migrate_options_lfs_endpoint.description=Taşıma, LFS sunucusunu belirlemek için Git uzak sunucusunu kullanmaya çalışacak. Eğer LFS veri deposu başka yerdeyse özel bir uç nokta da belirtebilirsiniz. migrate_options_lfs_endpoint.description.local=Yerel bir sunucu yolu da destekleniyor. migrate_options_lfs_endpoint.placeholder=Boş bırakılırsa, uç nokta klon URL'sinden türetilecektir -migrate_items=Göç Öğeleri +migrate_items=Göç öğeleri migrate_items_wiki=Wiki migrate_items_milestones=Kilometre Taşları migrate_items_labels=Etiketler @@ -1215,7 +1230,7 @@ migrate.migrating_labels=Etiketleri Taşıma migrate.migrating_releases=Sürümleri Taşıma migrate.migrating_issues=Konuları Taşıma migrate.migrating_pulls=Değişiklik İsteklerini Taşıma -migrate.cancel_migrating_title=Göçü İptal Et +migrate.cancel_migrating_title=Göçü iptal et migrate.cancel_migrating_confirm=Bu göçü iptal etmek istiyor musunuz? mirror_from=şunun yansıması @@ -1252,7 +1267,7 @@ find_tag=Etiketi bul branches=Dal tags=Etiket issues=Konular -pulls=Değişiklik İstekleri +pulls=Değişiklik istekleri project_board=Projeler packages=Paketler actions=İşlemler @@ -1443,7 +1458,7 @@ projects.column.set_default=Varsayılanı Ayarla projects.column.set_default_desc=Bu sütunu kategorize edilmemiş konular ve değişiklik istekleri için varsayılan olarak ayarlayın projects.column.unset_default=Varsayılanları Geri Al projects.column.unset_default_desc=Bu sütunu varsayılan olarak geri al -projects.column.delete=Sutün Sil +projects.column.delete=Sütunu sil projects.column.deletion_desc=Bir proje sütununun silinmesi, ilgili tüm konuları 'Kategorize edilmemiş'e taşır. Devam edilsin mi? projects.column.color=Renk projects.open=Aç @@ -1595,7 +1610,7 @@ issues.reopen_issue=Yeniden aç issues.reopen_comment_issue=Yorum Yap ve Yeniden Aç issues.create_comment=Yorum yap issues.closed_at=`%s konusunu kapattı` -issues.reopened_at=`%s konusunu yeniden açtı` +issues.reopened_at=%s sorununu yeniden açtı issues.commit_ref_at=`%s işlemesinde bu konuyu işaret etti` issues.ref_issue_from=`bu konuya referansta bulundu %[3]s %[1]s` issues.ref_pull_from=`bu değişiklik isteğine referansta bulundu %[3]s %[1]s` @@ -1647,7 +1662,7 @@ issues.label.filter_sort.alphabetically=Alfabetik issues.label.filter_sort.reverse_alphabetically=Ters alfabetik issues.label.filter_sort.by_size=En küçük boyut issues.label.filter_sort.reverse_by_size=En büyük boyut -issues.num_participants_few=%d Katılımcı +issues.num_participants_few=%d katılımcı issues.attachment.open_tab=`Yeni bir sekmede "%s" görmek için tıkla` issues.attachment.download=`"%s" indirmek için tıkla` issues.subscribe=Abone Ol @@ -1984,7 +1999,7 @@ ext_wiki=Harici Vikiye Erişim ext_wiki.desc=Harici bir wiki'ye bağlantı. wiki=Wiki -wiki.welcome=Wiki'ye Hoşgeldiniz. +wiki.welcome=Viki'ye Hoş geldiniz. wiki.welcome_desc=Wiki, katkıcılarla belge yazmanıza ve paylaşmanıza olanak tanır. wiki.desc=Katkıcılarla belgeler yazın ve paylaşın. wiki.create_first_page=İlk sayfayı oluştur @@ -2140,15 +2155,15 @@ settings.use_external_wiki=Harici Wiki Kullan settings.external_wiki_url=Harici Wiki bağlantısı settings.external_wiki_url_error=Harici wiki URL'si geçerli bir URL değil. settings.external_wiki_url_desc=Ziyaretçiler, wiki sekmesine tıklandığında harici wiki URL'sine yönlendirilir. -settings.issues_desc=Depo Konu İzleyicisini Etkinleştir -settings.use_internal_issue_tracker=Yerleşik Konu İzleyici Kullan -settings.use_external_issue_tracker=Harici Konu İzleyici Kullan -settings.external_tracker_url=Harici Konu İzleyici URLsi +settings.issues_desc=Depo sorun izleyicisini etkinleştir +settings.use_internal_issue_tracker=Yerleşik sorun izleyici kullan +settings.use_external_issue_tracker=Harici sorun izleyici kullan +settings.external_tracker_url=Harici sorun izleyici URL'si settings.external_tracker_url_error=Harici konu izleyici URL'si geçerli bir URL değil. settings.external_tracker_url_desc=Ziyaretçiler, konular sekmesine tıkladığında harici konu izleyici URL'sine yönlendirilir. -settings.tracker_url_format=Harici Konu İzleyici URL Biçimi +settings.tracker_url_format=Harici sorun izleyici URL Biçimi settings.tracker_url_format_error=Harici konu izleyici URL biçimi geçerli bir URL değil. -settings.tracker_issue_style=Harici Konu İzleyici Numara Biçimi +settings.tracker_issue_style=Harici sorun izleyici Numara Biçimi settings.tracker_issue_style.numeric=Sayısal settings.tracker_issue_style.alphanumeric=Alfanumerik settings.tracker_issue_style.regexp=Düzenli ifade @@ -2158,13 +2173,13 @@ settings.tracker_url_format_desc=Kullanıcı adı, depo adı ve yayın dizini i settings.enable_timetracker=Zaman Takibini Etkinleştir settings.allow_only_contributors_to_track_time=Sadece Katkıcılar İçin Zaman Takibine İzin Ver settings.pulls_desc=Değişiklik İsteklerini Etkinleştir -settings.pulls.ignore_whitespace=Çakışmalar için Boşlukları Gözardı Et +settings.pulls.ignore_whitespace=Çakışmalar için boşlukları gözardı et settings.pulls.enable_autodetect_manual_merge=Kendiliğinden algılamalı elle birleştirmeyi etkinleştir (Not: Bazı özel durumlarda yanlış kararlar olabilir) settings.pulls.allow_rebase_update=Değişiklik isteği dalının yeniden yapılandırmayla güncellenmesine izin ver settings.pulls.default_delete_branch_after_merge=Varsayılan olarak birleştirmeden sonra değişiklik isteği dalını sil settings.pulls.default_allow_edits_from_maintainers=Bakımcıların düzenlemelerine izin ver settings.releases_desc=Depo Sürümlerini Etkinleştir -settings.packages_desc=Depo paket kütüğünü etkinleştir +settings.packages_desc=Depo paket kayıt defterini etkinleştir settings.projects_desc=Depo Projelerini Etkinleştir settings.actions_desc=Depo İşlemlerini Etkinleştir settings.admin_settings=Yönetici Ayarları @@ -2188,7 +2203,7 @@ settings.convert_fork_desc=Bu çatalı normal bir depoya dönüştürebilirsiniz settings.convert_fork_notices_1=Bu işlem çatalı normal bir depoya dönüştürür ve geri alınamaz. settings.convert_fork_confirm=Depoyu Dönüştür settings.convert_fork_succeed=Çatal normal bir depoya dönüştürüldü. -settings.transfer.title=Sahipliği Aktar +settings.transfer.title=Sahipliği aktar settings.transfer.rejected=Depo aktarımı reddedildi. settings.transfer.success=Depo aktarımı başarıyla tamamlandı. settings.transfer_abort=Aktarımı iptal et @@ -2448,7 +2463,7 @@ settings.block_on_official_review_requests_desc=Yeterli onay olsa bile, resmi in settings.block_outdated_branch=Değişiklik isteği güncel değilse birleştirmeyi engelle settings.block_outdated_branch_desc=Baş dal taban dalın arkasındayken birleştirme mümkün olmayacaktır. settings.default_branch_desc=Değişiklik istekleri ve kod işlemeleri için varsayılan bir depo dalı seçin: -settings.merge_style_desc=Biçimleri Birleştir +settings.merge_style_desc=Birleştirme biçemleri settings.default_merge_style_desc=Değişiklik istekleri için varsayılan birleştirme tarzı: settings.choose_branch=Bir dal seç… settings.no_protected_branch=Korumalı dal yok. @@ -2701,7 +2716,7 @@ settings.new_owner_blocked_doer = Yeni sahip sizi engelledi. open_with_editor = %s ile aç object_format = Nesne Biçimi -mirror_sync = eşitlendi +mirror_sync = eşitlenme: stars = Yıldızlar desc.sha256 = SHA256 vendored = Sağlanmış @@ -2722,6 +2737,26 @@ settings.ignore_stale_approvals = Eskimiş onayları yoksay settings.ignore_stale_approvals_desc = Daha eski işlemelere (eski incelemelere) yapılmış olan onayları, Dİ'nin kaç onayı olduğunu belirlerken sayma. Eskimiş incelemeler atıldıysa bu ilgisizdir. error.broken_git_hook = Bu deponun Git İstemcileri bozuk gibi gözüküyor. Onarmak için lütfen belgelere bakın, daha sonra durumu yenilemek için bazı işlemeler itin. +mirror_public_key = Ortak SSH anahtarı +mirror_use_ssh.text = SSH yetkilendirme kullan +mirror_use_ssh.helper = Forgejo, bu seçeneği seçtiğinizde deponuzu SSH üzerinden Git üzerinden yansıtacak ve sizin için bir anahtar çifti oluşturacaktır. Oluşturulan ortak anahtarın hedef depoya gönderilmek üzere yetkilendirildiğinden emin olmalısınız. Bunu seçerken parola tabanlı yetkilendirme kullanamazsınız. +mirror_use_ssh.not_available = SSH yetkilendirme kullanılamıyor. +mirror_denied_combination = Ortak anahtar ve parola tabanlı kimlik doğrulama birlikte kullanılamaz. +n_commit_few = %s gönderi +n_branch_one = %s dal +n_branch_few = %s dal +n_tag_few = %s etiket +commits.browse_further = Daha fazlasına göz at +commits.renamed_from = %s adından yeniden adlandırıldı +issues.filter_no_results = Sonuç yok +issues.filter_no_results_placeholder = Arama filtrelerini değiştirmeyi deneyin. +issues.num_participants_one = %d katılımcı +settings.units.units = Birimler +settings.units.add_more = Daha fazlasını etkinleştir +settings.wiki_globally_editable = Vikiyi herkesin düzenlemesine izin ver +settings.default_update_style_desc = Temel dalın ardındaki çekme isteklerini güncellemek için kullanılan varsayılan güncelleme stili. +settings.wiki_rename_branch_main = Viki dal adını normalleştir + [graphs] component_loading = %s yükleniyor... component_loading_failed = %s yüklenemedi @@ -2736,7 +2771,7 @@ org_name_holder=Organizasyon Adı org_full_name_holder=Organizasyon Tam Adı org_name_helper=Organizasyon adları kısa ve hatırlanabilir olmalıdır. create_org=Organizasyon Oluştur -repo_updated=Güncellendi %s +repo_updated=%s güncellendi members=Üyeler teams=Takımlar code=Kod @@ -2792,7 +2827,7 @@ members.membership_visibility=Üyelik Görünürlüğü: members.public=Görünür members.public_helper=gizle members.private=Gizlenmiş -members.private_helper=görünür yap +members.private_helper=Görünür yap members.member_role=Üye Rolü: members.owner=Sahibi members.member=Üye @@ -3311,7 +3346,7 @@ config.git_max_diff_lines=Maksimum Değişiklik Satırı (tek bir dosya için) config.git_max_diff_line_characters=Maksimum Değişiklik Karakteri (tek bir satır için) config.git_max_diff_files=Maksimum Değişiklik Dosyaları (gösterilecek) config.git_gc_args=GC Argümanları -config.git_migrate_timeout=Göç İşlemi Zaman Aşımı +config.git_migrate_timeout=Göç işlemi zaman aşımı config.git_mirror_timeout=Yansı Güncelleme Zaman Aşımı config.git_clone_timeout=Klonlama İşlemi Zaman Aşımı config.git_pull_timeout=Çekme İşlemi Zaman Aşımı @@ -3363,7 +3398,7 @@ monitor.queue.settings.maxnumberworkers=En fazla çalışan Sayısı monitor.queue.settings.maxnumberworkers.placeholder=Şu anda %[1]d monitor.queue.settings.maxnumberworkers.error=En fazla çalışan sayısı bir sayı olmalıdır monitor.queue.settings.submit=Ayarları Güncelle -monitor.queue.settings.changed=Ayarlar Güncellendi +monitor.queue.settings.changed=Ayarlar güncellendi monitor.queue.settings.remove_all_items=Tümünü kaldır monitor.queue.settings.remove_all_items_done=Kuyruktaki tüm öğeler kaldırıldı. @@ -3771,23 +3806,23 @@ submodule=Alt modül [search] -project_kind = Projeleri ara... +project_kind = Projeleri ara… org_kind = Organizasyonları ara… team_kind = Takımları ara… search = Ara… code_kind = Kod ara… type_tooltip = Arama türü -repo_kind = Depoları ara... +repo_kind = Depoları ara… user_kind = Kullanıcıları ara… milestone_kind = Kilometre taşlarını ara... -branch_kind = Dalları ara... -package_kind = Paketleri ara... -commit_kind = Katkıları ara... -runner_kind = Çalıştırıcıları ara... +branch_kind = Dalları ara… +package_kind = Paketleri ara… +commit_kind = Katkıları ara… +runner_kind = Çalıştırıcıları ara… no_results = Eşleşen sonuç bulunamadı. code_search_unavailable = Kod araması şu anda kullanıma açık değildir. Lütfen site yöneticisi ile iletişime geçin. -issue_kind = Sorunları ara... -pull_kind = Birleştirme isteklerini ara... +issue_kind = Sorunları ara… +pull_kind = Birleştirme isteklerini ara… code_search_by_git_grep = Anlık kod araması sonuçları "git grep" komutu tarafından sağlanmaktadır. Site yöneticisinin kod endekslemesini açması durumunda daha iyi sonuçlar verilmesi mümkün olabilir. keyword_search_unavailable = Anahtar kelime ile arama şu anda kullanıma açık değildir. Lütfen site yöneticisi ile iletişime geçin. fuzzy_tooltip = Arama terimine yakın olan eşleşmeleri dahil et @@ -3795,3 +3830,15 @@ union_tooltip = Boşlukla ayrılmış anahtar kelime eşleşmelerini dahil et exact_tooltip = Sadece arama terimiyle tam uyuşan sonuçları dahit et. fuzzy = Bulanık exact = Tam +union = Anahtar sözcük +regexp = Düzenliİfade +regexp_tooltip = Arama terimini düzenli ifade olarak yorumla + +[munits.data] +b = B +kib = KiB +mib = MiB +gib = GiB +tib = TiB +pib = PiB +eib = EiB diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 11954dd625..d85a3b13e7 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -149,7 +149,7 @@ filter.not_archived = Не архівовано filter.public = Загальнодоступні filter.private = Приватні more_items = Більше пунктів -remove_label_str = Видалити об'єкт «%s» +remove_label_str = Видалити елемент «%s» new_repo.title = Новий репозиторій new_migrate.title = Нова міграція new_org.title = Нова організація @@ -195,8 +195,8 @@ buttons.list.task.tooltip = Додати список завдань buttons.heading.tooltip = Додати заголовок buttons.switch_to_legacy.tooltip = Використовувати застарілий редактор замість поточного buttons.disable_monospace_font = Вимкнути моноширинний шрифт -buttons.indent.tooltip = Вкласти предмет на один рівень -buttons.unindent.tooltip = Викласти об'єкт на один рівень +buttons.indent.tooltip = Вкласти елемент на один рівень +buttons.unindent.tooltip = Викласти елемент на один рівень buttons.mention.tooltip = Згадати користувача чи команду buttons.ref.tooltip = Послатися на задачу чи на запит на злиття buttons.enable_monospace_font = Увімкнути моноширинний шрифт @@ -348,7 +348,7 @@ app_slogan = Гасло екземпляра app_slogan_helper = Уведіть гасло вашого екземпляра тут. Залиште порожнім, аби вимкнути. run_user_helper = Імʼя користувача операційної системи, від якого запущено Forgejo. Зауважте, що цей користувач повинен мати доступ до кореневої теки репозиторію. smtp_from_invalid = Адреса з «Відправляти email від імені» недійсна -allow_dots_in_usernames = Дозволити користувачам використовувати крапки у своїх іменах. Не впливає на облікові записи, що вже існують. +allow_dots_in_usernames = Дозволити використання крапки в іменах користувачів. Не впливає на облікові записи, що вже існують. invalid_password_algorithm = Недійсний варіант алгоритму хешування паролів enable_update_checker_helper_forgejo = Наявність нових версій Forgejo періодично перевірятиметься через перевірку запису TXT DNS на release.forgejo.org. @@ -392,7 +392,7 @@ user_no_results=Відповідних користувачів не знайд org_no_results=Відповідних організацій не знайдено. code_no_results=Відповідний пошуковому запитанню код не знайдено. code_last_indexed_at=Останні індексовані %s -relevant_repositories = Відображаються лише релевантні репозиторії, переглянути результати без фільтру. +relevant_repositories = Показано лише релевантні репозиторії, переглянути результати без фільтру. relevant_repositories_tooltip = Приховано форки, а також репозиторії без теми, значка й опису. go_to = Перейти до stars_one = %d зірка @@ -469,7 +469,7 @@ invalid_code_forgot_password = Ваш код підтвердження неді reset_password_wrong_user = Ви ввійшли як %s, але посилання на відновлення було передбачене для %s back_to_sign_in = Назад до входу sign_in_openid = Продовжити з OpenID -openid_signin_desc = Введіть ваше посилання OpenID. Наприклад: alice.openid.example.org чи https://openid.example.org/alice. +openid_signin_desc = Уведіть свій OpenID URI. Наприклад: alice.openid.example.org чи https://openid.example.org/alice. invalid_password = Ваш пароль не відповідає тому, що був заданий при створенні облікового запису. hint_login = Вже маєте обліковий запис? Увійдіть зараз! hint_register = Потрібен обліковий запис? Зареєструйтеся зараз. @@ -813,9 +813,9 @@ manage_ssh_keys=Керування ключами SSH manage_ssh_principals=Управління SSH сертифікатами користувачів manage_gpg_keys=Керування ключами GPG add_key=Додати ключ -ssh_desc=Ці відкриті ключі SSH повʼязані з вашим обліковим записом. Відповідні приватні ключі дозволяють отримати повний доступ до ваших репозиторіїв. Підтверджені ключі можна використати для підтвердження комітів Git, підписані з SSH. +ssh_desc=Ці відкриті ключі SSH повʼязані з вашим обліковим записом. Відповідні приватні ключі дозволяють отримати повний доступ до ваших репозиторіїв. Підтверджені ключі можна використати для підтвердження комітів Git, підписаних із SSH. principal_desc=Ці настройки SSH сертифікатів вказані у вашому обліковому записі та надають повний доступ до ваших репозиторіїв. -gpg_desc=Ці публічні ключі GPG пов'язані з вашим обліковим записом. Тримайте свої приватні ключі в безпеці, оскільки вони дозволяють здійснювати перевірку комітів. +gpg_desc=Ці публічні ключі GPG пов'язані з вашим обліковим записом і використовуються для підтвердження комітів. Тримайте свої приватні ключі в безпеці, оскільки вони дозволяють підписувати коміти вашим особистим підписом. ssh_helper=Потрібна допомога? Дивіться гід на GitHub з генерації ключів SSH або виправлення типових неполадок SSH. gpg_helper= Потрібна допомога? Перегляньте посібник GitHub про GPG . add_new_key=Додати SSH ключ @@ -893,7 +893,7 @@ manage_oauth2_applications=Керування програмами OAuth2 edit_oauth2_application=Редагувати програму OAuth2 oauth2_applications_desc=Програми OAuth2 дають можливість вашим стороннім програмам надійно аутентифікувати користувачів у цьому екземплярі Forgejo. remove_oauth2_application=Видалити програму OAuth2 -remove_oauth2_application_desc=Видалення програми OAuth2 скасовує доступ до всіх підписаних маркерів доступу. Продовжити? +remove_oauth2_application_desc=Видалення програми OAuth2 скасує доступ до всіх підписаних токенів доступу. Продовжити? remove_oauth2_application_success=Програму видалено. create_oauth2_application=Створити новий додаток OAuth2 create_oauth2_application_button=Створити програму @@ -1077,6 +1077,9 @@ regenerate_token = Згенерувати знову access_token_regeneration = Згенерувати новий токен доступу quota.sizes.assets.all = Ресурси +access_token_regeneration_desc = Регенерація токена скасує доступ програм, які використовують цей токен, до вашого облікового запису. Це незворотна дія. Продовжити? +regenerate_token_success = Токен згенеровано наново. Програми, які його використовують, більше не мають доступу до вашого облікового запису; ви повинні відновити доступ за допомогою нового токена. + [repo] owner=Власник owner_helper=Деякі організації можуть не відображатися у випадаючому списку через максимальну кількість репозиторііїв. @@ -1143,7 +1146,7 @@ forks=Форки reactions_more=додати %d більше unit_disabled=Адміністратор сайту вимкнув цей розділ репозиторію. language_other=Інші -adopt_search=Введіть ім'я користувач_ки для пошуку неприйнятих репозиторіїв… (залиште порожнім, щоб знайти всі) +adopt_search=Уведіть ім'я користувач_ки для пошуку неприйнятих репозиторіїв… (залиште порожнім, щоб знайти всі) adopt_preexisting_label=Прийняті файли adopt_preexisting=Прийняти вже існуючі файли adopt_preexisting_content=Створити репозиторій з %s @@ -1168,7 +1171,7 @@ desc.archived=Архівний template.items=Елементи шаблону template.git_content=Вміст Git (типова гілка) -template.git_hooks=Перехоплювачі Git +template.git_hooks=Git-хуки template.webhooks=Webhook'и template.topics=Теми template.avatar=Аватар @@ -1285,7 +1288,7 @@ video_not_supported_in_browser=Ваш браузер не підтримує т audio_not_supported_in_browser=Ваш браузер не підтримує тег HTML5 «audio». stored_lfs=Збережено з Git LFS symbolic_link=Символічне посилання -commit_graph=Графік комітів +commit_graph=Граф комітів commit_graph.select=Виберіть гілки commit_graph.hide_pr_refs=Приховати запити на злиття commit_graph.monochrome=Монохром @@ -1402,9 +1405,9 @@ issues.new.open_projects=Відкриті проєкти issues.new.closed_projects=Закриті проєкти issues.new.no_items=Немає елементів issues.new.milestone=Етап -issues.new.no_milestone=Етап відсутній +issues.new.no_milestone=Немає етапу issues.new.clear_milestone=Очистити етап -issues.new.open_milestone=Активні етапи +issues.new.open_milestone=Відкриті етапи issues.new.closed_milestone=Закриті етапи issues.new.assignees=Виконавці issues.new.clear_assignees=Прибрати виконавців @@ -1504,7 +1507,7 @@ issues.closed_at=`закриває цю задачу %s` issues.reopened_at=`повторно відкриває цю задачу %s` issues.commit_ref_at=`посилається на цю задачу в коміті %s` issues.ref_issue_from=`посилається на цю задачу %[3]s %[1]s` -issues.ref_pull_from=`посилається на цей запит злиття %[3]s %[1]s` +issues.ref_pull_from=`посилається на цей запит на злиття %[3]s %[1]s` issues.ref_closing_from=`посилається в запиті на злиття %[3]s, який закриє цю задачу, %[1]s` issues.ref_reopening_from=`посилається в запиті на злиття %[3]s, який повторно відкриє цю задачу, %[1]s` issues.ref_closed_from=`закрив цю задачу %[4]s %[2]s` @@ -1799,7 +1802,7 @@ wiki.delete_page_button=Видалити сторінку wiki.page_already_exists=Вікі-сторінка з таким самим ім'ям вже існує. wiki.pages=Сторінки wiki.last_updated=Останні оновлення %s -wiki.page_name_desc=Введіть назву вікі-сторінки. Деякі зі спеціальних імен: «Home», «_Sidebar» та «_Footer». +wiki.page_name_desc=Уведіть назву вікі-сторінки. Деякі зі спеціальних імен: «Home», «_Sidebar» та «_Footer». activity=Активність activity.period.filter_label=Період: @@ -1844,7 +1847,7 @@ activity.unresolved_conv_label=Відкрити activity.title.releases_1=%d випуск activity.title.releases_n=%d випусків activity.title.releases_published_by=%s опубліковано %s -activity.published_release_label=Опубліковано +activity.published_release_label=Випуск activity.no_git_activity=У цей період не було здійснено жодних дій. activity.git_stats_exclude_merges=Не враховуючи злиття, activity.git_stats_author_1=%d автор @@ -1886,7 +1889,7 @@ settings.collaboration.read=Читати settings.collaboration.owner=Власник settings.collaboration.undefined=Не визначено settings.hooks=Веб-хуки -settings.githooks=Git хуки +settings.githooks=Git-хуки settings.basic_settings=Основні налаштування settings.mirror_settings=Налаштування дзеркала settings.mirror_settings.mirrored_repository=Віддзеркалений репозиторій @@ -1896,7 +1899,7 @@ settings.mirror_settings.direction.push=Push settings.mirror_settings.last_update=Останнє оновлення settings.mirror_settings.push_mirror.none=Не налаштовано дзеркало push settings.mirror_settings.push_mirror.remote_url=URL віддаленого репозиторію Git -settings.mirror_settings.push_mirror.add=Додати Push дзеркало +settings.mirror_settings.push_mirror.add=Додати push-дзеркало settings.sync_mirror=Синхронізувати зараз settings.site=Веб-сайт @@ -1927,9 +1930,9 @@ settings.pulls_desc=Увімкнути запити на злиття в реп settings.pulls.ignore_whitespace=Ігнорувати пробіл у конфліктах settings.pulls.enable_autodetect_manual_merge=Увімкнути автовизначення ручного злиття (Примітка: у деяких особливий випадках можуть виникнуть помилки) settings.pulls.default_delete_branch_after_merge=Видаляти гілку запиту злиття, коли його прийнято -settings.projects_desc=Увімкнути проєкти у репозиторії +settings.projects_desc=Увімкнути проєкти в репозиторії settings.admin_settings=Налаштування адміністратора -settings.admin_enable_health_check=Включити перевірки працездатності репозиторію (git fsck) +settings.admin_enable_health_check=Увімкнути перевірки стану репозиторію (git fsck) settings.admin_enable_close_issues_via_commit_in_any_branch=Закрити задачу за допомогою коміта, зробленого не в головній гілці settings.danger_zone=Небезпечна зона settings.new_owner_has_same_repo=Новий власник вже має репозиторій з такою назвою. Будь ласка, виберіть інше ім'я. @@ -2075,7 +2078,7 @@ settings.event_pull_request_review_desc=Запит на злиття схвал settings.event_pull_request_sync=Синхронізовано settings.event_pull_request_sync_desc=Гілку автоматично оновлено цільовою гілкою. settings.branch_filter=Фільтр гілок -settings.branch_filter_desc=Білий список гілок для push, створення гілок та видалення гілок, визначається як шаблон glob. Якщо він порожній або містить *, то реєструються події для всіх гілок. Дивіться синтаксис у документації на %[2]s. Наприклад: master, {master,release*}. +settings.branch_filter_desc=Білий список гілок для push, створення гілок та видалення гілок, визначається як шаблон glob. Якщо він порожній або містить *, то реєструються події для всіх гілок. Дивіться синтаксис у документації %[2]s. Приклади: master, {master,release*}. settings.active=Активний settings.active_helper=Інформацію про викликані події буде надіслано за цією веб-хук URL-адресою. settings.add_hook_success=Веб-хук було додано. @@ -2154,7 +2157,7 @@ settings.edit_protected_branch=Редагувати settings.protected_branch_required_approvals_min=Число необхідних схвалень не може бути від'ємним. settings.tags=Теги settings.tags.protection=Захист тегу -settings.tags.protection.pattern=Шаблон тега +settings.tags.protection.pattern=Шаблон тегів settings.tags.protection.allowed=Дозволено settings.tags.protection.allowed.users=Дозволені користувачі settings.tags.protection.allowed.teams=Дозволені команди @@ -2263,7 +2266,7 @@ release.detail=Деталі релізу release.tags=Теги release.new_release=Новий випуск release.draft=Чернетка -release.prerelease=Пре-реліз +release.prerelease=Попередній випуск release.stable=Стабільний release.compare=Порівняти release.edit=Редагувати @@ -2275,15 +2278,15 @@ release.edit_subheader=Публікація релізів допоможе ва release.tag_name=Назва тегу release.target=Ціль release.tag_helper=Виберіть існуючий тег або створіть новий. -release.prerelease_desc=Позначити як пре-реліз +release.prerelease_desc=Позначити як попередній випуск release.prerelease_helper=Позначте цей випуск непридатним для ПРОД використання. release.cancel=Відмінити -release.publish=Опублікувати реліз +release.publish=Опублікувати випуск release.save_draft=Зберегти чернетку -release.edit_release=Оновити реліз -release.delete_release=Видалити реліз +release.edit_release=Оновити випуск +release.delete_release=Видалити випуск release.delete_tag=Видалити тег -release.deletion=Видалити реліз +release.deletion=Видалити випуск release.deletion_success=Реліз, було видалено. release.deletion_tag_desc=Буде видалено цей тег із репозиторію. Вміст репозиторія та історія залишаться незмінними. Продовжити? release.deletion_tag_success=Тег видалено. @@ -2446,7 +2449,7 @@ settings.event_package = Пакунок settings.event_package_desc = Пакунок у репозиторії створено або видалено. settings.new_owner_blocked_doer = Новий власник заблокував вас. settings.transfer_quota_exceeded = Новий власник (%s) перевищив квоту. Репозиторій не передано. -release.title_empty = Заголовок не може бути порожнім. +release.title_empty = Назва не може бути порожньою. issues.role.member_helper = Цей користувач є членом організації, що володіє цим репозиторієм. wiki.page_content = Вміст сторінки wiki.page_title = Заголовок сторінки @@ -2530,7 +2533,7 @@ settings.add_web_hook_desc = Інтегрувати Увійдіть, щоб створити новий запит на злиття. @@ -2541,8 +2544,8 @@ auto_init_description = Почніть історію Git з README і за ба new_from_template_description = Можете вибрати наявний шаблон репозиторію на цьому екземплярі і застосувати його налаштування. form.string_too_long = Довжина введеного рядка більша за %d символів. form.name_reserved = Назву репозиторію «%s» зарезервовано. -form.name_pattern_not_allowed = Шаблон «%s» не допускається у назві репозиторію. -settings.wiki_rename_branch_main_desc = Перейменувати внутрішню гілку, яка використовується у вікі, на «%s». Ця зміна є остаточною і її неможливо скасувати. +form.name_pattern_not_allowed = Вираз «%s» не може бути частиною назви репозиторію. +settings.wiki_rename_branch_main_desc = Перейменувати внутрішню гілку, яка використовується для вікі, на «%s». Ця зміна є остаточною і її неможливо скасувати. wiki.reserved_page = Назву вікі-сторінки «%s» зарезервовано. stars = Зірки mirror_public_key = Відкритий SSH-ключ @@ -2696,6 +2699,84 @@ settings.sourcehut_builds.secrets_helper = Надати завданню дос settings.remove_protected_branch_failed = Не вдалося видалити правило захисту гілок «%s». release.summary_card_alt = Підсумкова картка випуску «%s» в репозиторії %s +view_git_blame = Переглянути git blame +vendored = Сторонній +editor.file_editing_no_longer_exists = Файл «%s», який ви редагуєте, більше не існує у цьому репозиторії. +editor.file_deleting_no_longer_exists = Файл «%s», який ви видаляєте, більше не існує у цьому репозиторії. +editor.file_already_exists = Файл із назвою «%s» вже є у цьому репозиторії. +editor.push_rejected_no_message = Зміну відхилено сервером без повідомлення. Будь ласка, перевірте Git-хуки. +editor.push_rejected = Зміну відхилено сервером. Будь ласка, перевірте Git-хуки. +editor.unable_to_upload_files = Не вдалося завантажити файли в «%s» через помилку: %v +editor.upload_files_to_dir = Завантажити файли в «%s» +editor.cannot_commit_to_protected_branch = Неможливо здійснити коміт до захищеної гілки «%s». +commits.renamed_from = Перейменовано з %s +commits.ssh_key_fingerprint = Відбиток ключа SSH +commits.view_path = Переглянути на цьому етапі історії +issues.filter_sort.relevance = За відповідністю +issues.action_check = Поставити/зняти позначку +issues.action_check_all = Поставити/зняти позначку з усіх елементів +issues.closed_by = від %[3]s закрито %[1]s +issues.closed_by_fake = від %[2]s закрито %[1]s +issues.label_archived_filter = Показати архівовані мітки +pulls.allow_edits_from_maintainers_err = Не вдалося оновити +pulls.has_viewed_file = Переглянуто +pulls.viewed_files_label = %[1]d з %[2]d файлів переглянуто +pulls.status_checks_hide_all = Приховати всі перевірки +milestones.new_subheader = Етапи допомагають організувати задачі та відстежувати прогрес їх виконання. +milestones.filter_sort.name = За назвою +wiki.delete_page_notice_1 = Видалення вікі-сторінки «%s» неможливо скасувати. Продовжити? +activity.published_prerelease_label = Пре-реліз +settings.mirror_settings.docs.doc_link_pull_section = розділ документації «Отримання з віддаленого репозиторію». +settings.mirror_settings.docs.pulling_remote_title = Отримання з віддаленого репозиторію +settings.mirror_settings.push_mirror.edit_sync_time = Змінити інтервал синхронізації дзеркала +settings.mirror_settings.push_mirror.none_ssh = Немає +settings.pull_mirror_sync_in_progress = Триває отримання змін з віддаленого репозиторію %s. +settings.pull_mirror_sync_quota_exceeded = Перевищено квоту, отримання змін неможливе. +settings.push_mirror_sync_in_progress = Триває надсилання змін до віддаленого репозиторію %s. +settings.pulls.allow_rebase_update = Увімкнути оновлення гілки запиту на злиття за допомогою перебазування +settings.releases_desc = Увімкнути випуски в репозиторії +settings.admin_code_indexer = Індексатор коду +settings.admin_stats_indexer = Індексатор статистики коду +settings.admin_indexer_commit_sha = Останній індексований коміт +settings.admin_indexer_unindexed = Не індексовано +settings.enter_repo_name = Уведіть ім'я власника і назву репозиторію, як показано: +settings.wiki_rename_branch_main = Нормалізувати назву вікі-гілки +settings.wiki_rename_branch_main_notices_1 = Цю операцію НЕМОЖЛИВО скасувати. +settings.wiki_rename_branch_main_notices_2 = Внутрішню вікі-гілку репозиторію %s буде назавжди перейменовано. Існуючі перевірки потрібно буде оновити. +settings.wiki_branch_rename_success = Назву вікі-гілки репозиторію успішно нормалізовано. +settings.wiki_branch_rename_failure = Не вдалося нормалізувати назву вікі-гілки репозиторію. +settings.add_webhook.invalid_path = Шлях не повинен містити частини «.» або «..» і не повинен бути порожнім. Він не може починатися або закінчуватися косою рискою. +settings.discord_icon_url.exceeds_max_length = URL-адреса значка не може бути довшою, ніж 2048 символи +settings.web_hook_name_telegram = Telegram +settings.sourcehut_builds.manifest_path = Шлях до маніфесту збірки +settings.sourcehut_builds.visibility = Видимість завдань +settings.sourcehut_builds.access_token_helper = Токен доступу, який має дозвіл JOBS:RW. Згенеруйте токен builds.sr.ht або токен builds.sr.ht з доступом до секретів на meta.sr.ht. +settings.protect_status_check_patterns_desc = Уведіть шаблони, щоб вказати, які перевірки стану повинні пройти гілки, перш ніж їх буде об'єднано у гілку, що відповідає цьому правилу. Кожен рядок визначає шаблон. Шаблони не можуть бути порожніми. +settings.protect_invalid_status_check_pattern = Недійсний шаблон перевірки стану: «%s». +settings.protect_no_valid_status_check_patterns = Немає дійсних шаблонів перевірки стану. +settings.protect_patterns = Шаблони +settings.protected_branch_duplicate_rule_name = Для цього набору гілок уже є правило +settings.thread_id = Thread ID +settings.matrix.access_token_helper = Рекомендується створити окремий обліковий запис Matrix. Токен доступу можна отримати у вебклієнті Element (у приватній/інкогніто вкладці): User menu (вгорі ліворуч) > All settings > Help & About > Advanced > Access Token (під URL-адресою Homeserver). Закрийте приватну вкладку (вихід із системи зробить токен недійсним). +settings.matrix.room_id_helper = ID кімнати можна отримати у вебклієнті Element: Room Settings > Advanced > Internal room ID. Приклад: %s. +settings.unarchive.header = Розархівувати цей репозиторій +settings.unarchive.text = Розархівування репозиторію відновить можливість надсилати до нього коміти і виконувати push, а також створювати задачі і запити на злиття. +settings.unarchive.success = Репозиторій успішно розархівовано. +settings.unarchive.error = Сталася помилка при спробі розархівувати репозиторій. Докладнішу інформацію див. у журналі. +diff.git-notes.remove-body = Цю примітку буде видалено. +diff.has_escaped = У цьому рядку є приховані символи Юнікоду +diff.show_file_tree = Показати дерево файлів +diff.hide_file_tree = Приховати дерево файлів +tag.ahead.target = до %s після цього тегу +release.title = Назва випуску +release.deletion_desc = Видалення випуску видаляє його лише з Forgejo. При цьому тег Git, вміст репозиторію чи його історію не буде змінено. Продовжити? +release.hide_archive_links = Приховати автоматично генеровані архіви +release.hide_archive_links_helper = Приховати для цього випуску архіви вихідного коду, що генеруються автоматично. Наприклад, якщо ви завантажуєте свої архіви. +release.system_generated = Це вкладення згенеровано автоматично. +branch.delete_desc = Видалення гілки є остаточним. Хоча видалена гілка може існувати ще деякий час до того, як її буде видалено, цю дію НЕМОЖЛИВО скасувати в більшості випадків. Продовжити? +branch.branch_name_conflict = Назва гілки «%s» конфліктує з наявною гілкою «%s». +branch.tag_collision = Неможливо створити гілку «%s», оскільки у репозиторії вже є тег із такою назвою. + [graphs] contributors.what = внески component_loading_info = Це може зайняти деякий час… @@ -2825,6 +2906,9 @@ teams.write_access = Запис teams.invite.by = Вас запрошує %s teams.invite_team_member.list = Запрошення в очікуванні +form.name_pattern_not_allowed = Вираз «%s» не може бути частиною назви організації. +teams.add_nonexistent_repo = Репозиторій, який ви намагаєтеся додати, не існує. Спочатку створіть його. + [admin] dashboard=Панель управління users=Облікові записи користувачів @@ -2935,7 +3019,7 @@ users.is_activated=Обліковий запис користувача увім users.prohibit_login=Заблокований обліковий запис users.is_admin=Обліковий запис адміністратора users.is_restricted=Обмежений -users.allow_git_hook=Може створювати Git хуки +users.allow_git_hook=Може створювати Git-хуки users.allow_git_hook_tooltip=Git хуки виконуються від імені користувача OS сервісу Forgejo і мають однаковий рівень доступу до хоста. Як результат, користувачі з доступом до Git-хуків можуть отримати доступ і змінювати всі репозиторії Forgejo, а також базу даних, що використовуються в Forgejo. Отже, вони також здатні отримати права адміністратора Forgejo. users.allow_import_local=Може імпортувати локальні репозиторії users.allow_create_organization=Може створювати організації @@ -3077,7 +3161,7 @@ auths.sspi_default_language_helper=Типова мова для користув auths.tips=Поради auths.tips.oauth2.general=Автентифікація OAuth2 auths.tip.oauth2_provider=Постачальник OAuth2 -auths.tip.bitbucket=Створіть OAuth URI на сторінці %s +auths.tip.bitbucket=Зареєструйте нового споживача OAuth на %s і додайте дозвіл «Обліковий запис» — «Читання» auths.tip.nextcloud=`Зареєструйте нового споживача OAuth у вашому екземплярі за допомогою наступного меню "Налаштування -> Безпека -> клієнт OAuth 2.0"` auths.tip.dropbox=Створіть новий додаток на %s auths.tip.facebook=Зареєструйте новий додаток на %s і додайте модуль «Facebook Login» @@ -3085,7 +3169,7 @@ auths.tip.github=Зареєструйте новий додаток OAuth на % auths.tip.gitlab=Додайте новий додаток на https://gitlab.com/profile/applications auths.tip.google_plus=Отримайте облікові дані клієнта OAuth2 в консолі Google API на сторінці %s auths.tip.openid_connect=Використовуйте OpenID Connect Discovery URL (/.well-known/openid-configuration) для автоматичної настройки входу OAuth -auths.tip.twitter=Перейдіть на %s, створіть програму і переконайтеся, що включена опція «Дозволити цю програму для входу в систему за допомогою Twitter» +auths.tip.twitter=Перейдіть на %s, створіть програму і переконайтеся, що ввімкнено опцію «Дозволити використання цієї програми для входу через Twitter» auths.tip.discord=Зареєструйте новий додаток на %s auths.tip.yandex=Створіть новий додаток на %s. У розділі «Yandex.Passport API» виберіть такі дозволи: «Доступ до адреси електронної пошти», «Доступ до аватара» і «Доступ до імені користувача, імені та прізвища, статі» auths.tip.mastodon=Введіть URL спеціального екземпляра для екземпляра mastodon, який ви хочете автентифікувати за допомогою (або використовувати за замовчуванням) @@ -3282,7 +3366,7 @@ users.purge_help = Примусово видалити користувача і dashboard.cleanup_packages = Очистити непридатні пакунки monitor.last_execution_result = Результат repos.lfs_size = Розмір LFS -config.allow_dots_in_usernames = Дозволити використання крапки в іменах користувачів. Не впливає на існуючі облікові записи. +config.allow_dots_in_usernames = Дозволити використання крапки в іменах користувачів. Не впливає на облікові записи, що вже існують. config.mailer_enable_helo = Увімкнути HELO users.organization_creation.description = Дозволити створення нових організацій. users.cannot_delete_self = Ви не можете видалити себе @@ -3341,6 +3425,12 @@ config.access_log_template = Шаблон журналу доступу config.set_setting_failed = Не вдалося встановити параметр %s monitor.download_diagnosis_report = Завантажити діагностичний звіт +dashboard.update_checker = Перевірка оновлень +auths.map_group_to_team_removal = Видаляти користувачів із синхронізованих команд, якщо користувачі не належать до відповідної групи LDAP +auths.enable_ldap_groups = Увімкнути групи LDAP +auths.oauth2_map_group_to_team_removal = Видаляти користувачів із синхронізованих команд, якщо користувачі не належать до відповідної групи. +config.mailer_smtp_addr = Адреса SMTP + [action] create_repo=створив(ла) репозиторій %s rename_repo=репозиторій перейменовано з %[1]s на %[3]s @@ -3443,7 +3533,7 @@ settings.delete.notice = Ви збираєтеся видалити %s (%s). Ц details.author = Автор title = Пакунки arch.version.backup = Резервне копіювання -arch.version.conflicts = Суперечки +arch.version.conflicts = Конфлікти arch.version.replaces = Заміни arch.version.provides = Надає arch.version.groups = Група @@ -3563,6 +3653,13 @@ owner.settings.chef.keypair.description = Запити до реєстру Chef nuget.dependency.framework = Цільовий фреймворк owner.settings.cleanuprules.preview.overview = Заплановано видалити %d пакунків. +arch.pacman.repo.multi = %s має одну й ту саму версію в різних дистрибутивах. +maven.install2 = Запустити з командного рядка: +maven.download = Щоб завантажити залежність, запустіть із командного рядка: +npm.dependencies.bundle = Пакетні залежності +npm.dependencies.peer = Однорангові залежності +owner.settings.cleanuprules.pattern_full_match = Застосувати шаблон до повної назви пакунка + [secrets] deletion = Видалити секрет creation.success = Секрет «%s» додано. diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index d87ad53676..fd6e625b5e 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -70,7 +70,7 @@ your_starred=点赞 your_settings=设置 all=所有 -sources=来源 +sources=原创 mirrors=镜像 collaborative=协作 forks=派生 @@ -1062,7 +1062,7 @@ language.description = 此语言将保存到您的账号中,并在您登录后 language.localization_project = 帮助我们将 Forgejo 翻译成您的语言!了解更多。 user_block_yourself = 您不能屏蔽自己。 pronouns_custom_label = 自定义代词 -change_username_redirect_prompt.with_cooldown.one = 旧用户名将在 %[1]d 天的保护期后对所有人可用,您仍可以在此期间重新认领旧用户名。 +change_username_redirect_prompt.with_cooldown.one = 旧用户名将在 %[1]d 天的保护期后对所有人可用。您仍可以在此期间重新认领旧用户名。 change_username_redirect_prompt.with_cooldown.few = 旧用户名将在 %[1]d 天的保护期后对所有人可用,您仍可以在此期间重新认领旧用户名。 keep_pronouns_private = 仅向已认证用户显示代词 keep_pronouns_private.description = 这将对未登录的访问者隐藏您的代词。 diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index fba51a391e..ddc31730d7 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -1062,7 +1062,7 @@ language.localization_project = 幫助我們翻譯 Forgejo 至您的語言!公開活動只有你和站點管理員可見。 quota.rule.exceeded = 已超出 diff --git a/options/locale_next/locale_ar.json b/options/locale_next/locale_ar.json index 3d87c7ee95..a0fc1de24b 100644 --- a/options/locale_next/locale_ar.json +++ b/options/locale_next/locale_ar.json @@ -3,5 +3,7 @@ "home.welcome.no_activity": "لا يوجد نشاط", "home.explore_repos": "اكتشف المستودعات", "home.explore_users": "اكتشف المستخدمين", - "home.explore_orgs": "اكتشف المنظمات" + "home.explore_orgs": "اكتشف المنظمات", + "moderation.abuse_category.malware": "برمجية خبيثة", + "moderation.abuse_category.illegal_content": "المحتوى غير المشروع" } diff --git a/options/locale_next/locale_be.json b/options/locale_next/locale_be.json index 0967ef424b..40dfec0b41 100644 --- a/options/locale_next/locale_be.json +++ b/options/locale_next/locale_be.json @@ -1 +1,3 @@ -{} +{ + "moderation.abuse_category.malware": "Шкодная праграма" +} diff --git a/options/locale_next/locale_bn.json b/options/locale_next/locale_bn.json index 0967ef424b..56a6e6dae4 100644 --- a/options/locale_next/locale_bn.json +++ b/options/locale_next/locale_bn.json @@ -1 +1,3 @@ -{} +{ + "moderation.abuse_category.malware": "ম্যালওয়্যার" +} diff --git a/options/locale_next/locale_ca.json b/options/locale_next/locale_ca.json index 8eefc65a1a..606ab99173 100644 --- a/options/locale_next/locale_ca.json +++ b/options/locale_next/locale_ca.json @@ -1,3 +1,4 @@ { - "search.milestone_kind": "Cerca fites..." + "search.milestone_kind": "Cerca fites...", + "moderation.abuse_category.malware": "Programari maliciós" } diff --git a/options/locale_next/locale_cs-CZ.json b/options/locale_next/locale_cs-CZ.json index 3a32d3a95a..7fb22a0d33 100644 --- a/options/locale_next/locale_cs-CZ.json +++ b/options/locale_next/locale_cs-CZ.json @@ -110,5 +110,6 @@ "profile.edit.link": "Upravit profil", "feed.atom.link": "Zdroj Atom", "keys.ssh.link": "Klíče SSH", - "keys.gpg.link": "Klíče GPG" + "keys.gpg.link": "Klíče GPG", + "mail.actions.run_info_sha": "Revize: %[1]s" } diff --git a/options/locale_next/locale_da.json b/options/locale_next/locale_da.json index 8315e06bcc..c43a7e3d37 100644 --- a/options/locale_next/locale_da.json +++ b/options/locale_next/locale_da.json @@ -97,5 +97,10 @@ "settings.visibility.description": "Profilsynlighed påvirker andres adgang til dine ikke-private depoter. Læs mere", "avatar.constraints_hint": "Brugerdefineret avatar må ikke overstige %[1]s i størrelse eller være større end %[2]dx%[3]d pixels", "repo.diff.commit.next-short": "Næste", - "repo.diff.commit.previous-short": "Forrige" + "repo.diff.commit.previous-short": "Forrige", + "profile.actions.tooltip": "Flere handlinger", + "profile.edit.link": "Redigere profil", + "feed.atom.link": "Atom feed", + "keys.ssh.link": "SSH Nøgler", + "keys.gpg.link": "GPG Nøgler" } diff --git a/options/locale_next/locale_de-DE.json b/options/locale_next/locale_de-DE.json index 3847de2b43..a582efdc27 100644 --- a/options/locale_next/locale_de-DE.json +++ b/options/locale_next/locale_de-DE.json @@ -102,5 +102,6 @@ "feed.atom.link": "Atom-Feed", "keys.ssh.link": "SSH-Schlüssel", "keys.gpg.link": "GPG-Schlüssel", - "profile.actions.tooltip": "Mehr Aktionen" + "profile.actions.tooltip": "Mehr Aktionen", + "mail.actions.run_info_sha": "Commit: %[1]s" } diff --git a/options/locale_next/locale_es-ES.json b/options/locale_next/locale_es-ES.json index 37edef9211..82fbcfb4b6 100644 --- a/options/locale_next/locale_es-ES.json +++ b/options/locale_next/locale_es-ES.json @@ -30,5 +30,6 @@ "relativetime.future": "en el futuro", "home.explore_repos": "Explorar repositorios", "home.explore_users": "Explorar usuarios", - "home.explore_orgs": "Explorar organizaciones" + "home.explore_orgs": "Explorar organizaciones", + "moderation.abuse_category.malware": "Malware" } diff --git a/options/locale_next/locale_fi-FI.json b/options/locale_next/locale_fi-FI.json index cb26d76e66..14481acf6f 100644 --- a/options/locale_next/locale_fi-FI.json +++ b/options/locale_next/locale_fi-FI.json @@ -64,5 +64,6 @@ "mail.actions.run_info_cur_status": "Tämän juoksun tila: %[1]s (juuri päivitetty %[2]s:sta)", "mail.actions.run_info_previous_status": "Edellisen ajon tila: %[1]s", "mail.actions.run_info_ref": "Haara: %[1]s (%[2]s)", - "mail.actions.run_info_trigger": "Laukaistui, koska: %[1]s, tekijänä: %[2]s" + "mail.actions.run_info_trigger": "Laukaistui, koska: %[1]s, tekijänä: %[2]s", + "moderation.abuse_category.malware": "Haittaohjelma" } diff --git a/options/locale_next/locale_hu-HU.json b/options/locale_next/locale_hu-HU.json index 9d52509102..1c02002e6e 100644 --- a/options/locale_next/locale_hu-HU.json +++ b/options/locale_next/locale_hu-HU.json @@ -1,5 +1,6 @@ { "repo.pulls.merged_title_desc": "egyesítve %[1]d változás(ok) a %[2]s-ból %[3]s-ba %[4]s", "repo.pulls.title_desc": "egyesíteni szeretné %[1]d változás(oka)t a(z) %[2]s-ból %[3]s-ba", - "search.milestone_kind": "Mérföldkövek keresése..." + "search.milestone_kind": "Mérföldkövek keresése...", + "moderation.abuse_category.malware": "Malware" } diff --git a/options/locale_next/locale_id-ID.json b/options/locale_next/locale_id-ID.json index f2dac8114f..0cf7ea4799 100644 --- a/options/locale_next/locale_id-ID.json +++ b/options/locale_next/locale_id-ID.json @@ -1,8 +1,9 @@ { - "repo.pulls.merged_title_desc": { - "other": "commit %[1]d telah digabungkan dari %[2]s menjadi %[3]s %[4]s" - }, - "repo.pulls.title_desc": { - "other": "ingin menggabungkan komit %[1]d dari %[2]s menuju %[3]s" - } + "repo.pulls.merged_title_desc": { + "other": "commit %[1]d telah digabungkan dari %[2]s menjadi %[3]s %[4]s" + }, + "repo.pulls.title_desc": { + "other": "ingin menggabungkan komit %[1]d dari %[2]s menuju %[3]s" + }, + "moderation.abuse_category.malware": "Perangkat pembahaya" } diff --git a/options/locale_next/locale_ja-JP.json b/options/locale_next/locale_ja-JP.json index 40edf8cb90..c4b3a0a2e0 100644 --- a/options/locale_next/locale_ja-JP.json +++ b/options/locale_next/locale_ja-JP.json @@ -1,5 +1,6 @@ { "repo.pulls.merged_title_desc": "が %[1]d 個のコミットを %[2]s から %[3]s へマージ %[4]s", "repo.pulls.title_desc": "が %[2]s から %[3]s への %[1]d コミットのマージを希望しています", - "search.milestone_kind": "マイルストーンを検索..." + "search.milestone_kind": "マイルストーンを検索...", + "moderation.abuse_category.malware": "悪意のコード" } diff --git a/options/locale_next/locale_ko-KR.json b/options/locale_next/locale_ko-KR.json index 98c949d517..2e51144cb7 100644 --- a/options/locale_next/locale_ko-KR.json +++ b/options/locale_next/locale_ko-KR.json @@ -1,5 +1,6 @@ { "repo.pulls.merged_title_desc": "님이 %[2]s 에서 %[3]s 로 %[1]d 커밋을 %[4]s 병합함", "repo.pulls.title_desc": "%[2]s 에서 %[3]s 로 %[1]d개의 커밋들을 병합하려함", - "home.welcome.no_activity": "활동 없음" + "home.welcome.no_activity": "활동 없음", + "moderation.abuse_category.malware": "악성 소프트웨어" } diff --git a/options/locale_next/locale_lv-LV.json b/options/locale_next/locale_lv-LV.json index 242c22bbf3..75835bc89c 100644 --- a/options/locale_next/locale_lv-LV.json +++ b/options/locale_next/locale_lv-LV.json @@ -110,5 +110,6 @@ "profile.edit.link": "Labot profilu", "feed.atom.link": "Atom barotne", "keys.ssh.link": "SSH atslēgas", - "keys.gpg.link": "GPG atslēgas" + "keys.gpg.link": "GPG atslēgas", + "mail.actions.run_info_sha": "Iesūtījums: %[1]s" } diff --git a/options/locale_next/locale_nds.json b/options/locale_next/locale_nds.json index 24268e2082..c1769e55e6 100644 --- a/options/locale_next/locale_nds.json +++ b/options/locale_next/locale_nds.json @@ -102,5 +102,6 @@ "keys.ssh.link": "SSH-Slötels", "keys.gpg.link": "GPG-Slötels", "profile.actions.tooltip": "Mehr Aktioonen", - "profile.edit.link": "Profil bewarken" + "profile.edit.link": "Profil bewarken", + "mail.actions.run_info_sha": "Kommitteren: %[1]s" } diff --git a/options/locale_next/locale_nl-NL.json b/options/locale_next/locale_nl-NL.json index 690a522b80..5c9c8a9b07 100644 --- a/options/locale_next/locale_nl-NL.json +++ b/options/locale_next/locale_nl-NL.json @@ -102,5 +102,6 @@ "repo.diff.commit.previous-short": "Vorige", "admin.dashboard.cleanup_offline_runners": "Offline runners opruimen", "settings.visibility.description": "Profielzichtbaarheid beïnvloedt de mogelijkheid van anderen om toegang te krijgen tot je niet-privé repositories. Lees meer", - "avatar.constraints_hint": "Eigen avatars mogen niet groter zijn dan %[1]s in grootte of groter zijn dan %[2]dx%[3]d pixels" + "avatar.constraints_hint": "Eigen avatars mogen niet groter zijn dan %[1]s in grootte of groter zijn dan %[2]dx%[3]d pixels", + "mail.actions.run_info_sha": "Commit: %[1]s" } diff --git a/options/locale_next/locale_pt-BR.json b/options/locale_next/locale_pt-BR.json index acff9ff364..0fc65a7dd6 100644 --- a/options/locale_next/locale_pt-BR.json +++ b/options/locale_next/locale_pt-BR.json @@ -83,7 +83,7 @@ "moderation.abuse_category": "Categoria", "moderation.abuse_category.placeholder": "Selecione uma categoria", "moderation.abuse_category.spam": "Spam", - "moderation.abuse_category.malware": "Malware", + "moderation.abuse_category.malware": "Software malicioso", "moderation.abuse_category.illegal_content": "Conteúdo ilegal", "moderation.abuse_category.other_violations": "Outras violações de regras da plataforma", "moderation.report_remarks": "Observações", @@ -110,5 +110,6 @@ "profile.edit.link": "Editar perfil", "feed.atom.link": "Feed Atom", "keys.ssh.link": "Chaves SSH", - "keys.gpg.link": "Chaves GPG" + "keys.gpg.link": "Chaves GPG", + "mail.actions.run_info_sha": "Commit: %[1]s" } diff --git a/options/locale_next/locale_ru-RU.json b/options/locale_next/locale_ru-RU.json index 922e2612af..2b743ad8a5 100644 --- a/options/locale_next/locale_ru-RU.json +++ b/options/locale_next/locale_ru-RU.json @@ -110,5 +110,6 @@ "feed.atom.link": "Atom-лента", "keys.ssh.link": "Ключи SSH", "keys.gpg.link": "Ключи GPG", - "profile.edit.link": "Изменить профиль" + "profile.edit.link": "Изменить профиль", + "mail.actions.run_info_sha": "Коммит: %[1]s" } diff --git a/options/locale_next/locale_sr-SP.json b/options/locale_next/locale_sr-SP.json index 0967ef424b..611f997b3e 100644 --- a/options/locale_next/locale_sr-SP.json +++ b/options/locale_next/locale_sr-SP.json @@ -1 +1,3 @@ -{} +{ + "moderation.abuse_category.malware": "Малвер" +} diff --git a/options/locale_next/locale_tr-TR.json b/options/locale_next/locale_tr-TR.json index b0e34e677f..fa71cb8e7d 100644 --- a/options/locale_next/locale_tr-TR.json +++ b/options/locale_next/locale_tr-TR.json @@ -1,5 +1,6 @@ { "repo.pulls.merged_title_desc": "%[4]s %[2]s içindeki %[1]d işlemeyi %[3]s ile birleştirdi", "repo.pulls.title_desc": "%[2]s içindeki %[1]d işlemeyi %[3]s ile birleştirmek istiyor", - "search.milestone_kind": "Kilometre taşlarını ara..." + "search.milestone_kind": "Kilometre taşlarını ara...", + "moderation.abuse_category.malware": "Malware" } diff --git a/options/locale_next/locale_uk-UA.json b/options/locale_next/locale_uk-UA.json index 33cb5a41a3..81b69ec859 100644 --- a/options/locale_next/locale_uk-UA.json +++ b/options/locale_next/locale_uk-UA.json @@ -110,5 +110,6 @@ "keys.gpg.link": "Ключі GPG", "profile.edit.link": "Редагувати профіль", "feed.atom.link": "Стрічка Atom", - "profile.actions.tooltip": "Більше дій" + "profile.actions.tooltip": "Більше дій", + "mail.actions.run_info_sha": "Коміт: %[1]s" } diff --git a/options/locale_next/locale_vi.json b/options/locale_next/locale_vi.json index 0967ef424b..7ae64113b6 100644 --- a/options/locale_next/locale_vi.json +++ b/options/locale_next/locale_vi.json @@ -1 +1,3 @@ -{} +{ + "moderation.abuse_category.malware": "Phần mềm ác ý" +} diff --git a/options/locale_next/locale_zh-CN.json b/options/locale_next/locale_zh-CN.json index 0f408997bf..9fc38dae15 100644 --- a/options/locale_next/locale_zh-CN.json +++ b/options/locale_next/locale_zh-CN.json @@ -71,12 +71,12 @@ "editor.textarea.shift_tab_hint": "此行无缩进。再次按 Shift + Tab 或按 Escape 退出编辑器。", "admin.dashboard.cleanup_offline_runners": "清理离线运行器", "settings.visibility.description": "个人资料可见性设置会影响他人对您的非私有仓库的访问。了解更多", - "avatar.constraints_hint": "自定义头像大小不得超过 %[1]s,或大于 %[2]d×%[3]d 像素", + "avatar.constraints_hint": "自定义头像大小不得超过 %[1]s,且分辨率不得大于 %[2]d×%[3]d 像素", "keys.ssh.link": "SSH 密钥", "keys.gpg.link": "GPG 密钥", "profile.actions.tooltip": "更多操作", - "repo.diff.commit.next-short": "下个", - "repo.diff.commit.previous-short": "上个", + "repo.diff.commit.next-short": "下一个", + "repo.diff.commit.previous-short": "上一个", "feed.atom.link": "Atom 订阅源", "profile.edit.link": "编辑个人资料" } diff --git a/options/locale_next/locale_zh-HK.json b/options/locale_next/locale_zh-HK.json index 6baf89e022..7d624f24df 100644 --- a/options/locale_next/locale_zh-HK.json +++ b/options/locale_next/locale_zh-HK.json @@ -1,5 +1,6 @@ { - "repo.pulls.merged_title_desc": { - "other": "於 %[4]s 將 %[1]d 次代碼提交從 %[2]s合併至 %[3]s" - } + "repo.pulls.merged_title_desc": { + "other": "於 %[4]s 將 %[1]d 次代碼提交從 %[2]s合併至 %[3]s" + }, + "moderation.abuse_category.malware": "惡意程式" } From 592f1494418ac6764c112d4803797caeff141814 Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Wed, 16 Jul 2025 19:33:28 +0200 Subject: [PATCH 162/495] [v12.0/forgejo] fix(packages): skip another stack frame from logging (#8532) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/8530 Log the right stack frame line. We currently always show the `apiError` method call. related to #8529 Co-authored-by: Michael Kriese Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8532 Reviewed-by: Gusted Co-authored-by: forgejo-backport-action Co-committed-by: forgejo-backport-action --- routers/api/packages/helper/helper.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/routers/api/packages/helper/helper.go b/routers/api/packages/helper/helper.go index f9b91d9a09..47d1f18623 100644 --- a/routers/api/packages/helper/helper.go +++ b/routers/api/packages/helper/helper.go @@ -25,7 +25,8 @@ func LogAndProcessError(ctx *context.Context, status int, obj any, cb func(strin message = fmt.Sprintf("%s", obj) } if status == http.StatusInternalServerError { - log.ErrorWithSkip(1, message) + // LogAndProcessError is always wrapped in a `apiError` call, so we need to skip two frames + log.ErrorWithSkip(2, message) if setting.IsProd && (ctx.Doer == nil || !ctx.Doer.IsAdmin) { message = "" From 034af02ed0191c439804142aabc54904220653b2 Mon Sep 17 00:00:00 2001 From: 0ko <0ko@noreply.codeberg.org> Date: Wed, 16 Jul 2025 22:49:59 +0500 Subject: [PATCH 163/495] [v12.0/forgejo] i18n: update of translations from Codeberg Translate Translation updates that were relevant to v12 branch were picked from this commit: 8efb6c09db70de54aa153f05b41a33ff7dbb4989 (#8490) Changes to strings that are only present in the v13 branch were not picked. Below is a list of co-authors of the ported commit. It may contain co-authors who's changes were not picked due to only being relevant to v13. Co-authored-by: 0ko <0ko@noreply.codeberg.org> Co-authored-by: Benedikt Straub Co-authored-by: Codeberg Translate Co-authored-by: Edgarsons Co-authored-by: Fjuro Co-authored-by: Fjuro Co-authored-by: Gusted Co-authored-by: Juno Takano Co-authored-by: SomeTr Co-authored-by: Vyxie Co-authored-by: Wuzzy Co-authored-by: adf19 Co-authored-by: amv-bamboo Co-authored-by: justbispo Co-authored-by: oatbiscuits Co-authored-by: pixelcode Co-authored-by: xtex --- options/locale/locale_ar.ini | 168 ++++++++++++++----- options/locale/locale_de-DE.ini | 224 +++++++++++++------------- options/locale/locale_uk-UA.ini | 96 +++++++++-- options/locale_next/locale_ar.json | 67 +++++++- options/locale_next/locale_be.json | 7 +- options/locale_next/locale_de-DE.json | 8 +- options/locale_next/locale_fil.json | 7 +- options/locale_next/locale_pt-PT.json | 5 +- options/locale_next/locale_ru-RU.json | 2 +- options/locale_next/locale_zh-CN.json | 3 +- 10 files changed, 409 insertions(+), 178 deletions(-) diff --git a/options/locale/locale_ar.ini b/options/locale/locale_ar.ini index 956f9a302a..ca74a477ce 100644 --- a/options/locale/locale_ar.ini +++ b/options/locale/locale_ar.ini @@ -50,7 +50,7 @@ concept_user_organization = المنظمة link_account = ربط الحساب rerun_all = أعِد تشغيل جميع الوظائف your_profile = الملف الشخصي -sign_out = سجل الخروج +sign_out = سجّل الخروج settings = الإعدادات locked = مقفول error = خطأ @@ -87,7 +87,7 @@ add_all = أضف الكل new_fork = اشتقاق جديد لمستودع new_project_column = عمود جديد add = أضف -active_stopwatch = تتبع وقت الإنجاز +active_stopwatch = متتبِّع وقت النشاط organization = منظمة new_migrate = ترحيل جديد save = احفظ @@ -114,7 +114,7 @@ twofa_scratch = الرمز الاحتياطي للمصادقة بعاملين home = الرئيسية email = عنوان البريد الإلكتروني issues = المسائل -error404 = الصفحة التي تحاول الوصول لها إما لا توجد أو أنت لست مأذون لك بعرضها. +error404 = الصفحة التي تحاول الوصول لها إما غير موجودو أو أنك غير مصرح لك بعرضها. powered_by = مدعوم بواسطة %s retry = أعد المحاولة tracked_time_summary = ملخص للتتبع الزمني وفقًا لنتائج تصفية قائمة المسائل @@ -127,8 +127,8 @@ toggle_menu = تبديل القائمة more_items = عناصر اضافية copy_generic = نسخ إلى الحافظة invalid_data = بيانات غير صالحة: %v -filter.clear = مسح المرشحات -filter = مرشح +filter.clear = مسح عوامل التصفية +filter = عامل تصفية filter.is_archived = مؤرشف filter.is_template = قوالب filter.not_mirror = ليست مرايا @@ -137,7 +137,7 @@ filter.is_mirror = مرايا filter.is_fork = الاشتقاقات filter.not_fork = ليست اشتقاقات filter.not_archived = ليس مؤرشف -filter.public = علني +filter.public = عام filter.private = خاص new_repo.title = مستودع جديد new_migrate.title = انتقال جديد @@ -145,6 +145,11 @@ new_org.title = منظمة جديدة new_repo.link = مستودع جديد new_migrate.link = انتقال جديد +new_org.link = منظمة جديدة +test = اختبار +copy_path = نسخ المسار +error413 = لقد استنفدت حصتك. + [install] db_name = اسم قاعدة البيانات user = اسم المستخدم @@ -170,7 +175,7 @@ reinstall_confirm_check_2 = وقد يلزم إعادة تزامن المستود run_user = شغّل عبر مستخدم err_admin_name_is_invalid = اسم مستخدم المدير غير صالح reinstall_confirm_check_3 = أنتِ تؤكد أنكِ متأكد تماماً من أن فورجيو يعمل مع مسار app.ini الصحيح وأنك متأكد من أنه يجب عليك إعادة تثبيته. أنت تُؤكّدُ بأنّك تُقرّ بالمخاطر السالفة الذكر. -repo_path = المسار الجذري للمستودع +repo_path = المسار الجذر للمستودع err_empty_admin_email = عنوان بريد المدير لا يمكن أن يكون فارغ. no_admin_and_disable_registration = لا يمكنك تعطيل التسجيل الذاتي للمستخدمين بدون إنشاء حساب إداري. err_admin_name_pattern_not_allowed = اسم مستخدم المدير غير صالح، هذا الأسم يطابق نمطا محجوز @@ -179,10 +184,10 @@ repo_path_helper = ستُحفظ كلّ مستودعات جِت البعيدة ف general_title = الإعدادات العامة lfs_path_helper = الملفات التي تم تعقبها بواسطة Git LFS ستُخزن في هذا الدليل. اتركه فارغًا لتعطيله. err_empty_db_path = طريق قاعدة بيانات SQLite3 لا يمكن أن يكون فارغا. -lfs_path = مسار جذر جِت LFS -app_name_helper = يمكنك إدخال اسم شركتك هنا. +lfs_path = مسار جذر Git LFS +app_name_helper = أدخل اسم المثيل هنا. سيظهر هذا الاسم في كل الصفحات. err_admin_name_is_reserved = اسم مستخدم المدير غير صالح، هذا الأسم محجوز -app_name = عنوان الموقع +app_name = عنوان المثيل log_root_path = مسار السجل log_root_path_helper = ستُكتب ملفات السجل في هذا الدليل. smtp_addr = مضيف SMTP @@ -190,7 +195,7 @@ smtp_port = منفذ SMTP mailer_password = كلمة مرور SMTP app_url_helper = العنوان الأساسي لاستنساخ عناوين URL HTTP(S) وإشعارات البريد الإلكتروني. mailer_user = اسم مستخدم SMTP -disable_gravatar.description = عطل جرافاتار والجهات الخارجية للصور الرمزية. ستُستخدم صورة رمزية مبدئية حتى يرفع المستخدم صورة. +disable_gravatar.description = عطل Gravatar والجهات الخارجية للصور الرمزية. ستُستخدم صورة رمزية مبدئية حتى يرفع المستخدم صورة. offline_mode.description = عطل خدمات توصيل المحتوى من الجهات الخارجية، واخدم كل المحتوى محلياً. run_user_helper = اسم مستخدم نظام التشغيل الذي يشغل فورجيو. ملاحظة: هذا المستخدم يجب أن يكون له حق الوصول إلى المسار الجذري للمستودع. domain = نطاق الخادم @@ -199,28 +204,28 @@ smtp_from = أرسل البريد الإلكتروني كـ federated_avatar_lookup = تفعيل الصور الرمزية الاتحادية optional_title = إعدادات اختيارية domain_helper = نطاق أو عنوان المضيف لخادمك. -mail_notify = فعّل التنبيه عبر البريد الإلكتروني -app_url = الرابط الأساس لفورجيو +mail_notify = فعّل التنبيهات عبر البريد الإلكتروني +app_url = الرابط الأساس smtp_from_helper = عنوان البريد الإلكتروني الذي سيستخدمه فورجيو. أدخل عنوان بريد إلكتروني عادي أو استخدم صيغة"Name" . ssh_port_helper = رقم المنفذ الذي يستمع له خادم SSH. اتركه فارغاً لتعطيله. -http_port_helper = المنفذ الذي سيستمع إليه خادم الويب لفورجيو. -http_port = منفذ استماع HTTP لفورجيو +http_port_helper = المنفذ الذي سيستمع إليه خادم ويب Forgejo. +http_port = منفذ استماع HTTP ssh_port = منفذ خادم SSH email_title = إعدادات البريد الإلكتروني offline_mode = فعل الوضع المحلي server_service_title = إعدادات الخادم وخدمات الجهات الخارجية register_confirm = الزم تأكيد البريد الإلكتروني للتسجيل -allow_only_external_registration.description = لا يسمح بالتسجيل إلا من خلال الخدمات الخارجية +allow_only_external_registration.description = لن يتمكن المستخدمون من إنشاء حسابات جديدة إلا باستخدام خدمات خارجية مهيأة. disable_registration = عطّل التسجيل الذاتي -federated_avatar_lookup.description = تفعيل الصور الرمزية الاتحادية باستخدام ليبرافاتار. +federated_avatar_lookup.description = تفعيل الصور الرمزية الاتحادية باستخدام Libravatar. openid_signup = فعّل التسجيل الذاتي عبر OpenID -disable_registration.description = عطل التسجيل الذاتي. المديرون فقط سيكونون قادرين على إنشاء حسابات جديدة للمستخدمين. +disable_registration.description = سيتمكن مسؤولو المثيل فقط من إنشاء حسابات مستخدمين جديدة. يوصى بشدة بإبقاء التسجيل معطلاً إلا إذا كنت تنوي استضافة مثيل عام للجميع ومستعد للتعامل مع كميات كبيرة من الحسابات غير المرغوب بها. openid_signin = فعّل تسجيل الدخول عبر OpenID openid_signin.description = فعّل تسجيل دخول المستخدمين عبر OpenID. enable_captcha = فعّل كابتشا التسجيل -enable_captcha.description = الزم وجود كابتشا للتسجيل الذاتي للمستخدمين. +enable_captcha.description = مطالبة المستخدمين باجتياز اختبار CAPTCHA من أجل إنشاء حسابات. openid_signup.description = فعّل التسجيل الذاتي للمستخدمين عبر OpenID. -require_sign_in_view = الزم تسجيل الدخول لعرض الصفحات +require_sign_in_view = يتطلب تسجيل الدخول لعرض محتوى المثيل require_sign_in_view.description = مكّن وصول الصفحات للمستخدمين فقط. لن يرى الزائرون سوى صفحات التسجيل والتسجيل. admin_setting.description = إنشاء حساب إداري هو اختياري. أول مستخدم مُسجل سيصبح تلقائيا مديرا. admin_password = كلمة المرور @@ -233,7 +238,7 @@ test_git_failed = يتعذر اختبار أمر جِت: %v confirm_password = أكّد كلمة المرور invalid_admin_setting = إعداد حساب المدير غير صالح: %v invalid_log_root_path = مسار السجل غير صالح: %v -default_enable_timetracking = فعّل تتبع الوقت مبدئيا +default_enable_timetracking = فعّل التتبع الزمني افتراضيًا env_config_keys_prompt = ستطبق المتغيرات البيئية التالية أيضاً على ملف الإعدادات: admin_title = إعدادات حساب المدير no_reply_address_helper = النطاق للمستخدمين بعنوان بريد إلكتروني مخفي. مثلاً، اسم المستخدم "sarah" سوف يسجل في جِت كـ"sarah@noreply.example.org" لو كان نطاق البريد الإلكتروني الخفي مدخل كـ"noreply.example.org". @@ -242,9 +247,9 @@ default_enable_timetracking.description = فعل تتبع الوقت للمست run_user_not_match = مستخدم التشغيل غير مطابق لأسم المستخدم الحالي: %s -> %s invalid_db_setting = إعدادات قاعدة البيانات غير صالحة: %v invalid_db_table = جدول قاعدة البيانات "%s" غير صالح: %v -default_keep_email_private.description = أخفِ عناوين البريد الإلكتروني للحسابات الجديدة مبدئيا. +default_keep_email_private.description = قم بتمكين إخفاء عنوان البريد الإلكتروني للمستخدمين الجدد افتراضيًا حتى لا يتم تسريب هذه المعلومات فور التسجيل. env_config_keys = إعدادات بيئية -default_allow_create_organization = اسمح بإنشاء المنظمات مبدئيا +default_allow_create_organization = اسمح بإنشاء المنظمات بشكل افتراضي invalid_app_data_path = مسار بيانات التطبيق غير صالح: %v enable_update_checker_helper = يفحص لإيجاد اصدارات جديدة عن طريق الإتصال بسيرفرات فورجيو. invalid_repo_path = المسار الجزري للمستودع غير صالح: %v @@ -252,11 +257,17 @@ internal_token_failed = فشل توليد الرمز الداخلي: %v no_reply_address = نطاقات البريد الإلكتروني المخفية default_keep_email_private = أخفِ عناوين البريد الإلكتروني مبدئيا admin_name = اسم مستخدم المدير -default_allow_create_organization.description = اسمح بحسابات المستخدمين الجديدة بإنشاء المنظمات مبدئيا. +default_allow_create_organization.description = السماح للمستخدمين الجدد بإنشاء منتديات المجموعة بشكل افتراضي. عند تعطيل هذا الخيار، سيتعين على المسؤول منح إذن لإنشاء منتديات المجموعة للمستخدمين الجدد. password_algorithm = خوارزمية تجزئة كلمة المرور invalid_password_algorithm = خوارزمية بصمة كلمة المرور غير صالحة password_algorithm_helper = اختر خوارزمية بصمة كلمة المرور. تختلف الخوارزميات في متطلباتها وقوتها. خوارزمية argon2 آمنة لكن تتطلب الكثير من الذاكرة ولذلك قد تكون غير ملائمة للأنظمة الصغيرة. +app_slogan = شعار المثيل +app_slogan_helper = أدخل شعار المثيل الخاص بك هنا. اتركه فارغاً لتعطيله. +smtp_from_invalid = عنوان "،بريد الإرسال كـ" غير صالح +allow_only_external_registration = السماح بالتسجيل عبر الخدمات الخارجية فقط +config_location_hint = سيتم حفظ خيارات التهيئة هذه في: + [editor] buttons.list.ordered.tooltip = أضف قائمة مرقمة buttons.bold.tooltip = أضف نصًا عريضًا @@ -273,9 +284,22 @@ buttons.italic.tooltip = أضف نصًا مائلًا buttons.link.tooltip = اضف رابط buttons.disable_monospace_font = عطّل الخط الثابت العرض +buttons.indent.tooltip = تداخل العناصر بنفس المستوى +buttons.unindent.tooltip = ‪عناصر غير متساوية من نفس المستوى +buttons.new_table.tooltip = إضافة جدول +table_modal.header = إضافة جدول +table_modal.placeholder.header = الترويسة +table_modal.placeholder.content = المحتوى +table_modal.label.rows = الصفوف +table_modal.label.columns = الأعمدة +link_modal.header = إضافة رابط +link_modal.url = Url +link_modal.description = الوصف +link_modal.paste_reminder = تلميح: باستخدام عنوان URL في حافظتك، يمكنك اللصق مباشرةً في المحرر لإنشاء رابط. + [aria] navbar = شريط التنقل -footer.software = عن البرمجية +footer.software = عن هذه البرمجية footer.links = روابط footer = الذيل @@ -1388,6 +1412,22 @@ issue.action.ready_for_review = @%[1]s علّم هذا الطلب للس issue_assigned.pull = @%[1]s عيّنك إلى طلب سحب %[2]s في مستودع %[3]s. issue.action.review_dismissed = @%[1]s أستبعد آخر مراجعة من %[2]s لهذا الطلب للسحب. +password_change.subject = تم تغيير كلمة مرورك +password_change.text_1 = تم تغيير كلمة مرور حسابك للتو. +primary_mail_change.subject = تم تغيير البريد الأساسي الخاص بك +primary_mail_change.text_1 = تم تغيير البريد الإلكتروني الأساسي لحسابك إلى %[1]s. هذا يعني أن عنوان البريد الإلكتروني هذا لن يتلقى إشعارات البريد لحسابك بعد الآن. +totp_disabled.subject = تم تعطيل TOTP +totp_disabled.text_1 = تم تعطيل كلمة المرور لمرة واحدة المستندة إلى الوقت (TOTP) على حسابك للتو. +totp_disabled.no_2fa = لم تعد هناك طرق أُخرى للمصادقة الثنائية (2FA) قيد التهيئة عد الآن ، أي أنه لم يعد من الضروري تسجيل الدخول إلى حسابك باستخدام المصادقة الثنائية (2FA). +removed_security_key.subject = تمت إزالة مفتاح الأمان +removed_security_key.text_1 = تم إزالة مفتاح الأمان ”%[1] s“ للتو من حسابك. +removed_security_key.no_2fa = لم تعد هناك طرق أخرى للمصادقة الثنائية (2FA) قيد التهيئة بعد الآن، أي لم يعد من الضروري تسجيل الدخول إلى حسابك باستخدام المصادقة الثنائية (2FA). +account_security_caution.text_1 = إذا كان هذا أنت، فيمكنك تجاهل هذا البريد بأمان. +account_security_caution.text_2 = إذا لم تكن أنت، فهذا يعني أن حسابك مخترق. يرجى الاتصال بمسؤولي هذا الموقع. +totp_enrolled.subject = لقد قمت بتشيط TOTP كطريقة 2FA +totp_enrolled.text_1.no_webauthn = لقد قمت للتو بتمكين TOTP لحسابك. هذا يعني أنه بالنسبة لجميع عمليات تسجيل الدخول المستقبلية إلى حسابك، يجب عليك استخدام TOTP كطريقة للمصادقة الثنائية. +totp_enrolled.text_1.has_webauthn = لقد قمت للتو بتمكين TOTP لحسابك. هذا يعني أنه بالنسبة لجميع عمليات تسجيل الدخول المستقبلية إلى حسابك، يمكنك استخدام TOTP كطريقة للمصادقة الثنائية ، أو استخدام أي من مفاتيح الأمان الخاصة بك. + [error] not_found = تعذر العثور على الهدف. report_message = إن كنت متيقِّنًا أن هذه علة في فورجيو، رجاءً ابحث في كودبيرج أو افتح مسأله جديدة إذا لزم الأمر. @@ -1422,7 +1462,7 @@ joined_on = انضم في %s user_bio = السيرة الذاتية repositories = المستودعات activity = النشاط العام -projects = مشاريع +projects = المشاريع unfollow = إلغِ المتابعة settings = إعدادات المستخدم following_few = %d يتابع @@ -1430,7 +1470,7 @@ follow = تابع followers_few = %d متابعين form.name_reserved = اسم المستخدم "%s" محجوز. email_visibility.limited = عنوان بريدك الإلكتروني ظاهر لكل المستخدمين المُستَوثَقين -code = البرمجية +code = الكود overview = نظرة عامة watched = المستودعات المشاهدة disabled_public_activity = هذا المستخدم عطّل الظهور العام للنشاط. @@ -1440,6 +1480,18 @@ starred = المستودعات المميّزة بنجمة form.name_chars_not_allowed = اسم المستخدم "%s" يحتوي على رموز غير صالحة. form.name_pattern_not_allowed = النمط "s%" غير مسموح به في إسم المستخدم. +followers.title.one = متابِع +followers.title.few = متابعين +following.title.one = متابعة +following.title.few = متابعة +followers_one = %d متابِع +following_one = %d يُتابع +public_activity.visibility_hint.self_public = نشاطك مرئي للجميع، باستثناء التفاعلات في المساحات الخاصة. اضبط الإعدادات. +public_activity.visibility_hint.admin_public = هذا النشاط مرئي للجميع، ولكن بصفتك مسؤولاً يمكنك أيضًا رؤية التفاعلات في المساحات الخاصة. +public_activity.visibility_hint.self_private = نشاطك مرئي لك ولسُعاة المثيل فقط. تعديل الإعدادات. +public_activity.visibility_hint.admin_private = هذا النشاط مرئي لك لأنك مسؤول، ولكن المستخدم يريد أن يظل خاصاً. +public_activity.visibility_hint.self_private_profile = نشاطك مرئي لك ولسُعاة المثيل فقط لأن ملفك الشخصي خاص. تعديل الإعدادات. + [auth] change_unconfirmed_email_error = تعذر تغيير البريد الإلكتروني: %v change_unconfirmed_email_summary = تغيير البريد الإلكتروني الذي يُرسل التفعيل له. @@ -1459,11 +1511,11 @@ active_your_account = فعّل حسابك register_helper_msg = هل لديك حساب بالفعل؟ سجل الدخول! manual_activation_only = تواصل مع مدير موقعك لإكمال التفعيل. must_change_password = حدّث كلمة المرور الخاصة بك -send_reset_mail = أرسل رسالة استعادة حساب +send_reset_mail = أرسل بريد الاستعادة resend_mail = اضغط هنا لإعادة إرسالة رسالة تفعيل حسابك has_unconfirmed_mail = أهلا يا %s، لديك عنوان بريد إلكتروني غير مؤكَّد (%s). إن لم تستلم رسالة تأكيد أو تريد إرسال واحدة جديدة، فنرجو الضغط على الزر الذي بالأسفل. email_not_associate = عنوان البريد هذا غير مرتبط بأي حساب. -reset_password = استعادة حساب +reset_password = استعادة الحساب oauth_signin_tab = أربط بحساب موجود invalid_password = كلمة المرور الخاصة بك لا تطابق كلمة المرور التي استخدمت لتسجيل الحساب. oauth_signin_title = سجّل الدخول لتأذن للحساب المربوط @@ -1484,13 +1536,13 @@ reset_password_wrong_user = أنت مُسجل كـ %s، لكن رابط أعاد openid_connect_title = اتصل بحساب موجود confirmation_mail_sent_prompt = تم إرسال بريد تأكيد جديد إلى %s. يرجى التأكد من صندوق بريدك في خلال %s حتى تكتمل عملية التسجيل. إذا كان عنوان البريد خاطئ، يمكنك تسجيل الدخول وطلب بريد تأكيد جديد يُرسل إلى عنوان آخر. scratch_code = رمز الخدش -invalid_code_forgot_password = رمز تأكيدك غير صحيح أو انتهى اضغط هنا للإعادة. +invalid_code_forgot_password = رمز تأكيدك غير صحيح أو انتهت صلاحيته. اضغط هنا للإعادة. openid_register_title = أنشئ حسابًا جديدًا verify = تحقق twofa_scratch_used = لقد استخدمت رمز الخدش الخاص بك. لقد تم إعادة توجيهك إلى إعدادات المصادقة الثنائية حتى يمكنك إزالة تسجيل جهازك أو توليد رمز خدش جديد. oauth_signup_submit = أكمل الحساب oauth.signin.error = كان هناك خطأ في تجهيز طلب الإذن إذا استمر هذا الخطأ، يرجى الاتصال بالمدير. -invalid_code = رمز تأكيدك غير صحيح أو انتهى. +invalid_code = رمز تأكيدك غير صحيح أو انتهت صلاحيته. oauth_signup_title = أكمل حساب جديد resent_limit_prompt = لقد طلبت بالفعل بريداً إلكترونياً للتفعيل مؤخراً من فضلك انتظر 3 دقائق وحاول مرة أخرى. reset_password_mail_sent_prompt = تم إرسال بريد تأكيد جديد إلى %s. يرجى التأكد من صندوق بريدك في خلال %s حتى تكتمل عملية استعادة الحساب. @@ -1515,6 +1567,14 @@ remember_me = تذكر هذا الجهاز remember_me.compromised = رمز الاحتفاظ بتسجيل الدخول لم يعد صالحا، مما قد يعني اختراق الحساب. نرجو مراجعة حسابك لرؤية أي نشاط غير مألوف. authorization_failed_desc = فشل التفويض لأننا اكتشفنا طلبًا غير صالح. يرجى الاتصال بمشرف التطبيق الذي حاولت ترخيصه. +hint_login = لديك حساب بالفعل؟ سجّل الدخول الآن! +hint_register = يلزمك حساب ؟ سجِّل الآن. +sign_up_button = سجِّل الآن. +unauthorized_credentials = بيانات الاعتماد غير صحيحة أو انتهت صلاحيتها. أعد محاولة تنفيذ الأمر أو راجع %s لمزيد من المعلومات +use_onetime_code = استخدم رمزًا لمرة واحدة +back_to_sign_in = العودة إلى تسجيل الدخول +sign_in_openid = المتابعة باستخدام OpenID + [packages] rpm.repository.multiple_groups = هذه الحزمة متوفرة في مجموعات متعددة. rpm.repository.architectures = بنيات @@ -1558,6 +1618,10 @@ number_of_contributions_in_the_last_12_months = %s مساهم في آخر 12 ش contributions_zero = بلا مساهمات more = أكثر +contributions_format = {contributions} مساهمة في {day} {month} {year} +contributions_one = المساهمة +contributions_few = المساهمات + [admin] self_check.database_fix_mysql = لمستخدمين ميسكول/ماريا دي بي، يمكنك استخدام أمر "forgejo doctor convert" لإصلاح مشاكل التجمّع، أو يمكنك أيضاً إصلاح المشكلة عن طريق تعديل السيكول يدوياً. self_check.database_collation_mismatch = توقع قاعدة البيانات لتستعمل تجميع: %s @@ -1708,7 +1772,7 @@ enterred_invalid_org_name = اسم المنظمة التي أدخلته خطأ. lang_select_error = اختر لغة من القائمة. alpha_dash_error = ` لا يجب أن يحتوي إلا على الحروف الإنجليزية والأرقام والشرطة ("-") والشرطة السفلية ("_").` alpha_dash_dot_error = ` لا يجب أن يحتوي إلا على الحروف الإنجليزية والأرقام والشرطة ("-") والشرطة السفلية ("_") والنقطة (".").` -repo_name_been_taken = اسم المستودع مستعمل بالفعل. +repo_name_been_taken = اسم المستودع مستخدم بالفعل. Email = البريد الإلكتروني auth_failed = فشل الاستيثاق: %v email_error = ` ليس عنوان بريد إلكتروني صالح.` @@ -1728,10 +1792,10 @@ still_has_org = "حسابك عضو في منظمة أو أكثر؛ غادرهم repository_files_already_exist.adopt_or_delete = الملفات موجودة بالفعل لهذا المستودع. إما اعتمادها أو حذفها. repository_files_already_exist.delete = الملفات موجودة بالفعل لهذا المستودع. يجب عليك حذفها. repository_files_already_exist.adopt = الملفات موجودة بالفعل لهذا المستودع ويمكن اعتمادها فقط. -repository_files_already_exist = الملفات موجودة بالفعل لهذا المستودع. تواصل مع مدير النظام. +repository_files_already_exist = الملفات موجودة بالفعل لهذا المستودع. اتصل بمدير النظام. TeamName = اسم الفريق username_has_not_been_changed = لم يتم تغيير اسم المستخدم -username_change_not_local_user = المستخدمين غير المحليين غير مسموح لهم بتغيير أسماؤهم. +username_change_not_local_user = المستخدمين غير المحليين غير مسموح لهم بتغيير أسمائهم. captcha_incorrect = الكابتشا خاطئة. AdminEmail = عنوان البريد الإلكتروني للمدير team_no_units_error = اسمح بالوصول إلى قسم واحد على الأقل في المستودعات. @@ -1759,6 +1823,24 @@ CommitChoice = إختيار الإداع regex_pattern_error = ` نمط التعبير النمطي غير صالح: %s.` username_error = ` يُمكنه أن يحتوي على حروف إنجليزية وأرقام وشرطة ("-") وشرطة سفلية ("_") و نقطة (".") فقط. ويمكنه ان يبدأ وينتهي بحرف او برقم.` +FullName = الاسم الكامل +Description = الوصف +Pronouns = الضمائر +Biography = النبذة +Website = موقع الويب +Location = الموقع +To = اسم الفرع +AccessToken = رمز الوصول +invalid_group_team_map_error = ` التعيين غير صالح: %s ` +username_claiming_cooldown = لا يمكن المطالبة باسم المستخدم، لأن فترة تباطؤه لم تنتهِ بعد. يمكن المطالبة به عند %[1]s. +repository_force_private = وضع الخاص الإجباري مفعّل: لا يمكن تحويل المستودعات الخاصة إلى عامة. +visit_rate_limit = تناولت الزيارة عن بُعد الحد من معدلها. +email_domain_is_not_allowed = نطاق البريد الإلكتروني للمستخدم %s يتعارض مع قائمة النطاقات المسموحة ، أو الممنوعة. يرجى التأكد من إدخال عنوان البريد الإلكتروني بشكل صحيح. +unset_password = المستخدم المسجل لم يقم بتعيين كلمة مرور. +unsupported_login_type = نوع تسجيل الدخول غير مدعوم لحذف الحساب. +invalid_ssh_principal = أصل غير صالح: %s +required_prefix = المُدخل يجب أن يبدأ مع "%s" + [home] filter = تصفيات أخرى show_archived = مؤرشف @@ -1805,6 +1887,11 @@ relevant_repositories_tooltip = تم أخفاء المستودعات التي ه relevant_repositories = يتم اظهار المستودعات المتعلقة فقط. أظهر النتائج غير المصفاة. code_last_indexed_at = فُهرس آخر مرة %s +stars_one = %d نجمة +stars_few = %d نجوم +forks_one = %d نسخة +forks_few = %d نُسَخ + [actions] variables.none = لا توجد متغيرات بعد. variables.deletion = أزل المتغير @@ -1977,7 +2064,7 @@ component_failed_to_load = حدث خطأ غير متوقع. [search] org_kind = بحث في المنظمات… code_search_unavailable = البحث في الكود غير متوفر حاليًا. يرجى الاتصال بمدير الموقع. -search = ابحث... +search = البحث… type_tooltip = نوع البحث fuzzy = أجعد fuzzy_tooltip = قم بتضمين النتائج التي تتطابق أيضًا مع مصطلح البحث بشكل وثيق @@ -1986,10 +2073,19 @@ match_tooltip = قم بتضمين النتائج التي تطابق مصطلح repo_kind = بحث في المستودعات… user_kind = بحث عن المستخدمين… team_kind = بحث عن الفرق… -code_kind = بحث في الكود… +code_kind = بحث ضمن الكود… project_kind = البحث ضمن المشاريع… branch_kind = البحث ضمن الفروع… no_results = لا توجد نتائج مطابقة. issue_kind = البحث ضمن الأعطال… pull_kind = البحث ضمن طلبات السحب… keyword_search_unavailable = البحث من خلال الكلمات المفتاحية ليس متوفر حالياً. رجاءاً تواصل مع مشرف الموقع. +union = مطابقة عامة +union_tooltip = عرض النتائج التي تطابق أي من الكلمات المفتاحية المفصولة بمسافات +exact = مطابق +exact_tooltip = عرض النتائج التي تطابق مصطلح البحث بالضبط فقط +regexp = RegExp +regexp_tooltip = تعامل مع عبارة البحث على أنها تعبير نمطي +package_kind = البحث ضمن الحزم… +commit_kind = البحث ضمن الإيداعات… +runner_kind = البحث ضمن المشغِّلات… diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 35d1dfddaf..9f55f79fe9 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -251,12 +251,12 @@ db_schema_helper=Leer lassen, um den Datenbank-Standardwert („public“) zu ve ssl_mode=SSL path=Pfad sqlite_helper=Dateipfad zur SQLite3-Datenbank.
Gib einen absoluten Pfad an, wenn Forgejo als Service gestartet wird. -reinstall_error=Du versuchst, in eine bereits existierende Forgejo Datenbank zu installieren +reinstall_error=Du versuchst, in eine bereits existierende Forgejo-Datenbank zu installieren reinstall_confirm_message=Eine Neuinstallation mit einer bestehenden Forgejo-Datenbank kann mehrere Probleme verursachen. In den meisten Fällen solltest du deine vorhandene „app.ini“ verwenden, um Forgejo auszuführen. Wenn du weißt, was du tust, bestätige die folgenden Angaben: reinstall_confirm_check_1=Die von der SECRET_KEY in app.ini verschlüsselten Daten können verloren gehen: Benutzer können sich unter Umständen nicht mit 2FA/OTP einloggen und Spiegel könnten nicht mehr richtig funktionieren. Mit der Ankreuzung dieses Kästchens bestätigst du, dass die aktuelle app.ini-Datei den korrekten SECRET_KEY enthält. reinstall_confirm_check_2=Die Repositorys und Einstellungen müssen eventuell neu synchronisiert werden. Durch das Ankreuzen dieses Kästchens bestätigst du, dass du die Hooks für die Repositorys und die authorized_keys-Datei manuell neu synchronisierst. Du bestätigst, dass du sicherstellst, dass die Repository- und Spiegeleinstellungen korrekt sind. reinstall_confirm_check_3=Du bestätigst, dass du absolut sicher bist, dass diese Forgejo mit der richtigen app.ini läuft, und du sicher bist, dass du neu installieren musst. Du bestätigst, dass du die oben genannten Risiken anerkennst. -err_empty_db_path=Der SQLite3 Datenbankpfad darf nicht leer sein. +err_empty_db_path=Der SQLite3-Datenbankpfad darf nicht leer sein. no_admin_and_disable_registration=Du kannst Selbst-Registrierungen nicht deaktivieren, ohne ein Administratorkonto zu erstellen. err_empty_admin_password=Das Administrator-Passwort darf nicht leer sein. err_empty_admin_email=Die Administrator-E-Mail darf nicht leer sein. @@ -463,7 +463,7 @@ openid_register_title=Neues Konto einrichten openid_register_desc=Die gewählte OpenID-URI ist unbekannt. Ordne sie hier einem neuen Account zu. openid_signin_desc=Gib deine OpenID-URI ein, zum Beispiel alice.openid.example.org oder https://openid.example.org/alice. disable_forgot_password_mail=Die Kontowiederherstellung ist deaktiviert, da keine E-Mail eingerichtet ist. Bitte kontaktiere den zuständigen Administrator. -disable_forgot_password_mail_admin=Die Kontowiederherstellung ist nur verfügbar, wenn eine E-Mail eingerichtet wurde. Bitte richte eine E-Mail Adresse ein, um die Kontowiederherstellung freizuschalten. +disable_forgot_password_mail_admin=Die Kontowiederherstellung ist nur verfügbar, wenn eine E-Mail eingerichtet wurde. Bitte richte eine E-Mail-Adresse ein, um die Kontowiederherstellung freizuschalten. email_domain_blacklisted=Du kannst dich nicht mit deiner E-Mail-Adresse registrieren. authorize_application=Anwendung autorisieren authorize_redirect_notice=Du wirst zu %s weitergeleitet, wenn du diese Anwendung autorisierst. @@ -530,8 +530,8 @@ issue.action.merge=@%[1]s hat #%[2]d in %[3]s zusammengeführt. issue.action.approve=@%[1]s hat diesen Pull-Request genehmigt. issue.action.reject=@%[1]s hat Änderungen auf diesem Pull-Request angefordert. issue.action.review=@%[1]s hat diesen Pull-Request kommentiert. -issue.action.review_dismissed=@%[1]s hat das letzte Review von %[2]s für diesen Pull-Request verworfen. -issue.action.ready_for_review=@%[1]s hat diesen Pull-Request zum Review freigegeben. +issue.action.review_dismissed=@%[1]s hat die letzte Sichtung von %[2]s für diesen Pull-Request verworfen. +issue.action.ready_for_review=@%[1]s hat diesen Pull-Request für die Sichtung freigegeben. issue.action.new=@%[1]s hat #%[2]d geöffnet. issue.in_tree_path=In %s: @@ -540,8 +540,8 @@ release.new.text=@%[1]s hat %[2]s in %[3]s released release.title=Titel: %s release.note=Anmerkung: release.downloads=Downloads: -release.download.zip=Quellcode (ZIP Datei) -release.download.targz=Quellcode (TAR.GZ Datei) +release.download.zip=Quellcode (ZIP) +release.download.targz=Quellcode (TAR.GZ) repo.transfer.subject_to=%s möchte „%s“ an %s übertragen repo.transfer.subject_to_you=%s möchte dir „%s“ übertragen @@ -787,7 +787,7 @@ comment_type_group_time_tracking=Zeiterfassung comment_type_group_deadline=Frist comment_type_group_dependency=Abhängigkeit comment_type_group_lock=Sperrstatus -comment_type_group_review_request=Angeforderte Reviews +comment_type_group_review_request=Angeforderte Sichtungen comment_type_group_pull_request_push=Hinzugefügte Commits comment_type_group_project=Projekt comment_type_group_issue_ref=Issue-Referenz @@ -873,7 +873,7 @@ gpg_key_matched_identities_long=Die eingebetteten Identitäten in diesem Schlüs gpg_key_verified=Verifizierter Schlüssel gpg_key_verified_long=Der Schlüssel wurde mit einem Token verifiziert. Er kann verwendet werden, um Commits zu verifizieren, die mit irgendeiner für diesen Nutzer aktivierten E-Mail-Adresse und irgendeiner Identität dieses Schlüssels übereinstimmen. gpg_key_verify=Verifizieren -gpg_invalid_token_signature=Der GPG-Key, die Signatur, und das Token stimmen nicht überein, oder das Token ist veraltet. +gpg_invalid_token_signature=Der GPG-Key, die Signatur und das Token stimmen nicht überein, oder das Token ist veraltet. gpg_token_required=Du musst eine Signatur für das folgende Token angeben gpg_token=Token gpg_token_help=Du kannst eine Signatur wie folgt generieren: @@ -902,10 +902,10 @@ add_principal_success=Die SSH-Zertifikatsidentität „%s“ wurde hinzugefügt. delete_key=Entfernen ssh_key_deletion=SSH-Schlüssel entfernen gpg_key_deletion=GPG-Schlüssel entfernen -ssh_principal_deletion=SSH-Zertifik-Identität entfernen +ssh_principal_deletion=SSH-Zertifikats-Principal entfernen ssh_key_deletion_desc=Wenn du einen SSH-Key entfernst, hast du mit diesem Key keinen Zugriff mehr. Fortfahren? gpg_key_deletion_desc=Wenn du einen GPG-Schlüssel entfernst, können damit unterschriebene Commits nicht mehr verifiziert werden. Fortfahren? -ssh_principal_deletion_desc=Das Entfernen einer SSH-Zertifikat-Identität entzieht den Zugriff auf dein Konto. Fortfahren? +ssh_principal_deletion_desc=Das Entfernen eines SSH-Zertifikats-Principals entzieht den Zugriff auf dein Konto. Fortfahren? ssh_key_deletion_success=Der SSH-Schlüssel wurde entfernt. gpg_key_deletion_success=Der GPG-Schlüssel wurde entfernt. ssh_principal_deletion_success=Die Identität wurde entfernt. @@ -931,7 +931,7 @@ unbind_success=Das soziale Konto wurde erfolgreich entfernt. manage_access_token=Zugriffstokens generate_new_token=Neuen Token erzeugen -tokens_desc=Diese Tokens gewähren vollen Zugriff auf dein Konto via die Forgejo-API. +tokens_desc=Diese Tokens gewähren vollen Zugriff auf dein Konto mit der Forgejo-API. token_name=Token-Name generate_token=Token generieren generate_token_success=Ein neuer Token wurde generiert. Kopiere diesen jetzt, da er nicht erneut angezeigt wird. @@ -970,8 +970,8 @@ save_application=Speichern oauth2_client_id=Client-ID oauth2_client_secret=Client-Geheimnis oauth2_regenerate_secret=Geheimnis neu generieren -oauth2_regenerate_secret_hint=Secret verloren? -oauth2_client_secret_hint=Das Secret wird nach dem Verlassen oder Aktualisieren dieser Seite nicht mehr angezeigt. Bitte stelle sicher, dass du es gespeichert hast. +oauth2_regenerate_secret_hint=Geheimnis verloren? +oauth2_client_secret_hint=Das Geheimnis wird nach dem Verlassen oder Aktualisieren dieser Seite nicht mehr angezeigt. Bitte stelle sicher, dass du es gespeichert hast. oauth2_application_edit=Bearbeiten oauth2_application_create_description=OAuth2-Anwendungen geben deiner Drittanwendung Zugriff auf Benutzeraccounts dieser Forgejo-Instanz. oauth2_application_remove_description=Das Entfernen einer OAuth2-Anwendung hat zur Folge, dass diese nicht mehr auf autorisierte Benutzeraccounts auf dieser Instanz zugreifen kann. Möchtest Du fortfahren? @@ -996,11 +996,11 @@ twofa_disable_desc=Wenn du die Zwei-Faktor-Authentifizierung deaktivierst, wird regenerate_scratch_token_desc=Wenn du deinen Wiederherstellungsschlüssel verlegst oder es bereits benutzt hast, kannst du es hier zurücksetzen. twofa_disabled=Zwei-Faktor-Authentifizierung wurde deaktiviert. scan_this_image=Scanne diese Grafik mit deiner Authentifizierungs-App: -or_enter_secret=Oder gib das Secret ein: %s +or_enter_secret=Oder gib das Geheimnis ein: %s then_enter_passcode=Und gib dann die angezeigte PIN der Anwendung ein: passcode_invalid=Die PIN ist falsch. Probiere es erneut. twofa_enrolled=Die Zwei-Faktor-Authentifizierung wurde für dein Konto aktiviert. Bewahre deinen einmalig verwendbaren Wiederherstellungsschlüssel (%s) an einem sicheren Ort auf, da er nicht wieder angezeigt werden wird. -twofa_failed_get_secret=Fehler beim Abrufen des Secrets. +twofa_failed_get_secret=Fehler beim Abrufen des Geheimnisses. webauthn_desc=Sicherheitsschlüssel sind Geräte, die kryptografische Schlüssel beeinhalten. Diese können für die Zwei-Faktor-Authentifizierung verwendet werden. Der Sicherheitsschlüssel muss den Standard „WebAuthn“ unterstützen. webauthn_register_key=Sicherheitsschlüssel hinzufügen @@ -1185,9 +1185,9 @@ blame.ignore_revs=Revisionen in .git-blame-ignore-revs werden i blame.ignore_revs.failed=Fehler beim Ignorieren der Revisionen in .git-blame-ignore-revs. author_search_tooltip=Zeigt maximal 30 Benutzer -tree_path_not_found_commit=Pfad %[1]s existiert nicht in Commit%[2]s -tree_path_not_found_branch=Pfad %[1]s existiert nicht in Branch %[2]s -tree_path_not_found_tag=Pfad %[1]s existiert nicht in Tag %[2]s +tree_path_not_found_commit=Pfad %[1]s existiert nicht im Commit %[2]s +tree_path_not_found_branch=Pfad %[1]s existiert nicht im Branch %[2]s +tree_path_not_found_tag=Pfad %[1]s existiert nicht im Tag %[2]s transfer.accept=Übertragung akzeptieren transfer.accept_desc=Übertragung nach „%s“ @@ -1248,7 +1248,7 @@ migrate.clone_local_path=oder ein lokaler Serverpfad migrate.permission_denied=Du hast keine Berechtigung zum Importieren lokaler Repositorys. migrate.permission_denied_blocked=Du kannst von keinen nicht erlaubten Hosts importieren. Bitte fragen deinen Administrator, die Einstellungen ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS zu überprüfen. migrate.invalid_local_path=Der lokale Pfad ist ungültig. Er existiert nicht oder ist kein Verzeichnis. -migrate.invalid_lfs_endpoint=Ungültiger LFS Endpunkt. +migrate.invalid_lfs_endpoint=Der LFS-Endpunkt ist nicht gültig. migrate.failed=Fehler bei der Migration: %v migrate.migrate_items_options=Zugangs-Token wird benötigt, um zusätzliche Elemente zu migrieren migrated_from=Migriert von %[2]s @@ -1324,7 +1324,7 @@ commit=Commit release=Release releases=Releases tag=Tag -released_this=hat released +released_this=hat releast tagged_this=hat getaggt file.title=%s an %s file_raw=Originalformat @@ -1448,7 +1448,7 @@ commits.older=Älter commits.newer=Neuer commits.signed_by=Signiert von commits.signed_by_untrusted_user=Signiert von nicht vertrauenswürdigen Benutzern -commits.signed_by_untrusted_user_unmatched=Signiert von nicht vertrauenswürdigen Benutzern, der nicht mit dem Committer übereinstimmt +commits.signed_by_untrusted_user_unmatched=Von einem nicht vertrauenswürdigen Benutzer, der nicht auf den Committer passt, signiert commits.gpg_key_id=GPG-Schlüssel-ID commits.ssh_key_fingerprint=SSH-Schlüssel-Fingerabdruck commits.view_path=An diesem Punkt im Verlauf anzeigen @@ -1459,7 +1459,7 @@ commit.revert-header=Setze zurück: %s commit.revert-content=Branch auswählen, der zurückgesetzt werden soll: commit.cherry-pick=Cherry-Pick commit.cherry-pick-header=Cherry-Picke: %s -commit.cherry-pick-content=Branch auswählen, auf dem Cherry-Picked werden soll: +commit.cherry-pick-content=Branch auswählen, zu dem das Ergebnis des Cherry-Picks angewendet werden soll: commitstatus.error=Fehler commitstatus.failure=Fehler @@ -1515,7 +1515,7 @@ issues.filter_assignees=Verantwortliche filtern issues.filter_milestones=Meilenstein filtern issues.filter_projects=Projekt filtern issues.filter_labels=Label filtern -issues.filter_reviewers=Reviewer filtern +issues.filter_reviewers=Sichter filtern issues.new=Neues Issue issues.new.title_empty=Der Titel kann nicht leer sein issues.new.labels=Labels @@ -1535,7 +1535,7 @@ issues.new.closed_milestone=Geschlossene Meilensteine issues.new.assignees=Zuständige issues.new.clear_assignees=Zuständige entfernen issues.new.no_assignees=Niemand zuständig -issues.new.no_reviewers=Keine Reviewer +issues.new.no_reviewers=Keine Sichter issues.choose.get_started=Los geht's issues.choose.open_external_link=Öffnen issues.choose.blank=Standard @@ -1598,8 +1598,8 @@ issues.filter_type.all_issues=Alle Issues issues.filter_type.assigned_to_you=Dir zugewiesen issues.filter_type.created_by_you=Von dir erstellt issues.filter_type.mentioning_you=Hat dich erwähnt -issues.filter_type.review_requested=Review angefordert -issues.filter_type.reviewed_by_you=Von dir gereviewt +issues.filter_type.review_requested=Sichtung angefordert +issues.filter_type.reviewed_by_you=Von dir gesichtet issues.filter_sort=Sortieren issues.filter_sort.latest=Neueste issues.filter_sort.oldest=Älteste @@ -1621,8 +1621,8 @@ issues.action_milestone=Meilenstein issues.action_milestone_no_select=Kein Meilenstein issues.action_assignee=Zuständig issues.action_assignee_no_select=Niemand zuständig -issues.action_check=Auswählen/Auswahl aufheben -issues.action_check_all=Alles auswählen/Auswahl aufheben +issues.action_check=Auswählen / Auswahl aufheben +issues.action_check_all=Alles auswählen / Auswahl aufheben issues.opened_by=%[1]s von %[3]s geöffnet pulls.merged_by=von %[3]s wurde %[1]s zusammengeführt pulls.merged_by_fake=von %[2]s %[1]s zusammengeführt @@ -1673,12 +1673,12 @@ issues.role.first_time_contributor=Erstmaliger Mitwirkender issues.role.first_time_contributor_helper=Dies ist der erste Beitrag dieses Benutzers zum Repository. issues.role.contributor=Mitwirkender issues.role.contributor_helper=Dieser Benutzer hat schon zuvor zu dem Repository beigetragen. -issues.re_request_review=Review erneut anfordern -issues.is_stale=Seit diesem Review gab es Änderungen an diesem PR -issues.remove_request_review=Review-Anfrage entfernen -issues.remove_request_review_block=Review-Anfrage kann nicht entfernt werden -issues.dismiss_review=Review verwerfen -issues.dismiss_review_warning=Bist du dir sicher, dass du dieses Review verwerfen willst? +issues.re_request_review=Sichtung erneut anfordern +issues.is_stale=Seit dieser Sichtung gab es Änderungen an diesem PR +issues.remove_request_review=Sichtungsanfrage entfernen +issues.remove_request_review_block=Sichtungsanfrage kann nicht entfernt werden +issues.dismiss_review=Sichtung verwerfen +issues.dismiss_review_warning=Bist du dir sicher, dass du diese Sichtung verwerfen willst? issues.sign_in_require_desc=Anmelden, um an der Diskussion teilzunehmen. issues.edit=Bearbeiten issues.cancel=Abbrechen @@ -1809,20 +1809,20 @@ issues.dependency.add_error_dep_not_same_repo=Beide Issues müssen sich im selbe issues.review.self.approval=Du kannst nicht dein eigenen Pull-Request genehmigen. issues.review.self.rejection=Du kannst keine Änderungen an deinem eigenen Pull-Request anfragen. issues.review.approve=hat die Änderungen %s genehmigt -issues.review.comment=hat %s gereviewt +issues.review.comment=hat %s gesichtet issues.review.dismissed=verwarf %ss Review %s issues.review.dismissed_label=Verworfen issues.review.left_comment=hat einen Kommentar hinterlassen issues.review.content.empty=Du musst einen Kommentar hinterlassen, der die gewünschte(n) Änderung(en) beschreibt. issues.review.reject=hat %s Änderungen angefragt -issues.review.wait=wurde für ein Review %s angefragt -issues.review.add_review_request=hat ein Review von %[1]s %[2]s angefragt -issues.review.remove_review_request=hat die Aufforderung zum Review an %[1]s %[2]s entfernt -issues.review.remove_review_request_self=hat das Review verweigert %s +issues.review.wait=wurde für eine Sichtung von %s angefragt +issues.review.add_review_request=hat eine Sichtung von %[1]s %[2]s angefragt +issues.review.remove_review_request=hat die Sichtungsanfrage an %[1]s %[2]s entfernt +issues.review.remove_review_request_self=hat die Sichtung %s verweigert issues.review.pending=Ausstehend issues.review.pending.tooltip=Dieser Kommentar ist derzeit nicht für andere Benutzer sichtbar. Um deine ausstehenden Kommentare einzureichen, wähle „%s“ -> „%s/%s/%s“ oben auf der Seite. issues.review.review=Review -issues.review.reviewers=Reviewer +issues.review.reviewers=Sichter issues.review.outdated=Veraltet issues.review.outdated_description=Der Inhalt hat sich geändert, seit dieser Kommentar abgegeben wurde issues.review.option.show_outdated_comments=Veraltete Kommentare anzeigen @@ -1833,7 +1833,7 @@ issues.review.show_resolved=Erledigte anzeigen issues.review.hide_resolved=Erledigte ausblenden issues.review.resolve_conversation=Diskussion als „erledigt“ markieren issues.review.un_resolve_conversation=Diskussion als „nicht erledigt“ markieren -issues.review.resolved_by=markierte diese Unterhaltung als gelöst +issues.review.resolved_by=markierte diese Unterhaltung als „erledigt“ issues.assignee.error=Aufgrund eines unerwarteten Fehlers konnten nicht alle Zuständigen hinzugefügt werden. issues.reference_issue.body=Beschreibung issues.content_history.deleted=gelöscht @@ -1847,7 +1847,7 @@ issues.reference_link=Referenz: %s compare.compare_base=Basis compare.compare_head=vergleichen -pulls.desc=Pull-Requests und Code-Reviews aktivieren. +pulls.desc=Pull-Requests und Code-Sichtungen aktivieren. pulls.new=Neuer Pull-Request pulls.view=Pull-Request ansehen pulls.compare_changes=Neuer Pull-Request @@ -1856,7 +1856,7 @@ pulls.allow_edits_from_maintainers_desc=Nutzer mit Schreibzugriff auf den Basisb pulls.allow_edits_from_maintainers_err=Aktualisieren fehlgeschlagen pulls.compare_changes_desc=Wähle den Zielbranch, in das zusammengeführt werden soll, und den Quellbranch, von dem gepullt werden soll, aus. pulls.has_viewed_file=Gesehen -pulls.has_changed_since_last_review=Seit deinem letzten Review geändert +pulls.has_changed_since_last_review=Seit deiner letzten Sichtung geändert pulls.viewed_files_label=%[1]d / %[2]d Dateien betrachtet pulls.expand_files=Alle Dateien ausklappen pulls.collapse_files=Alle Dateien einklappen @@ -1867,11 +1867,11 @@ pulls.switch_head_and_base=Head und Base vertauschen pulls.filter_branch=Branch filtern pulls.no_results=Keine Ergebnisse verfügbar. pulls.show_all_commits=Alle Commits anzeigen -pulls.show_changes_since_your_last_review=Zeige Änderungen seit deinem letzten Review +pulls.show_changes_since_your_last_review=Zeige Änderungen seit deiner letzten Sichtung pulls.showing_only_single_commit=Nur Änderungen aus Commit %[1]s werden angezeigt pulls.showing_specified_commit_range=Zeige nur die Änderungen zwischen %[1]s..%[2]s pulls.select_commit_hold_shift_for_range=Commit auswählen. Halte Shift + klicke, um eine Reihe auszuwählen -pulls.review_only_possible_for_full_diff=Ein Review ist nur möglich, wenn das vollständige Diff angezeigt wird +pulls.review_only_possible_for_full_diff=Eine Sichtung ist nur möglich, wenn der vollständige Diff angezeigt wird pulls.filter_changes_by_commit=Nach Commit filtern pulls.nothing_to_compare=Diese Branches sind identisch. Es muss kein Pull-Request erstellt werden. pulls.nothing_to_compare_and_allow_empty_pr=Diese Branches sind gleich. Der Pull-Request wird leer sein. @@ -1905,8 +1905,8 @@ pulls.required_status_check_failed=Einige erforderliche Prüfungen waren nicht e pulls.required_status_check_missing=Einige erforderliche Prüfungen fehlen. pulls.required_status_check_administrator=Als Administrator kannst du diesen Pull-Request weiterhin zusammenführen. pulls.blocked_by_approvals=Dieser Pull-Request hat noch nicht genügend Genehmigungen. %d von %d Genehmigungen erteilt. -pulls.blocked_by_rejection=Dieser Pull-Request hat Änderungen, die von einem offiziellen Reviewer angefragt wurden. -pulls.blocked_by_official_review_requests=Dieser Pull-Request ist blockiert, weil ihm die Genehmigung von einem oder mehreren offiziellen Reviewern fehlt. +pulls.blocked_by_rejection=Dieser Pull-Request hat Änderungen, die von einem offiziellen Sichter angefragt wurden. +pulls.blocked_by_official_review_requests=Dieser Pull-Request ist blockiert, weil ihm die Genehmigung von einem oder mehreren offiziellen Sichtern fehlt. pulls.blocked_by_outdated_branch=Dieser Pull-Request ist blockiert, da er veraltet ist. pulls.blocked_by_changed_protected_files_1=Dieser Pull-Request ist blockiert, weil er eine geschützte Datei ändert: pulls.blocked_by_changed_protected_files_n=Dieser Pull-Request ist blockiert, weil er geschützte Dateien ändert: @@ -1919,14 +1919,14 @@ pulls.approve_count_1=%d Genehmigung pulls.approve_count_n=%d Genehmigungen pulls.reject_count_1=%d Änderungsanfrage pulls.reject_count_n=%d Änderungsanfragen -pulls.waiting_count_1=%d wartendes Review -pulls.waiting_count_n=%d wartende Reviews +pulls.waiting_count_1=%d wartende Sichtung +pulls.waiting_count_n=%d wartende Sichtungen pulls.wrong_commit_id=die Commit-ID muss eine Commit-ID auf dem Zielbranch sein pulls.no_merge_desc=Dieser Pull-Request kann nicht zusammengeführt werden, da alle Repository-Merge-Optionen deaktiviert sind. pulls.no_merge_helper=Aktiviere Mergeoptionen in den Repositoryeinstellungen oder führe den Pull-Request manuell zusammen. pulls.no_merge_wip=Dieser Pull-Request kann nicht zusammengeführt werden, da er als „Work in Progress“ (in Bearbeitung) markiert ist. -pulls.no_merge_not_ready=Dieser Pull-Request kann nicht zusammengeführt werden, überprüfe den Reviewstatus und die Statusprüfungen. +pulls.no_merge_not_ready=Dieser Pull-Request kann nicht zusammengeführt werden, überprüfe den Sichtungsstatus und die Statusprüfungen. pulls.no_merge_access=Du bist nicht berechtigt, diesen Pull-Request zusammenzuführen. pulls.merge_pull_request=Merge-Commit erstellen pulls.rebase_merge_pull_request=Rebasen und dann fast-forwarden @@ -2202,7 +2202,7 @@ settings.tracker_issue_style.numeric=Numerisch settings.tracker_issue_style.alphanumeric=Alphanumerisch settings.tracker_issue_style.regexp=Regulärer Ausdruck settings.tracker_issue_style.regexp_pattern=Regulärer Ausdruck -settings.tracker_issue_style.regexp_pattern_desc=Die erste gecapturte Gruppe wird statt {index} verwendet. +settings.tracker_issue_style.regexp_pattern_desc=Die erste gefundene Gruppe wird statt {index} verwendet. settings.tracker_url_format_desc=Du kannst die Platzhalter {user}, {repo}, {index} für den Benutzernamen, den Namen des Repositorys und die Issue-Nummer verwenden. settings.enable_timetracker=Zeiterfassung aktivieren settings.allow_only_contributors_to_track_time=Nur Mitarbeitern erlauben, die Zeiterfassung zu nutzen @@ -2261,14 +2261,14 @@ settings.trust_model.collaborator=Mitarbeiter settings.trust_model.collaborator.long=Mitarbeiter: Vertraue Signaturen von Mitarbeitern settings.trust_model.collaborator.desc=Gültige Signaturen von Mitarbeitern dieses Projekts werden als „vertrauenswürdig“ markiert (egal, ob sie mit dem Committer übereinstimmen oder nicht). Andernfalls werden gültige Signaturen als „nicht vertrauenswürdig“ markiert, falls die Signatur zum Committer passt, ansonsten werden sie als „nicht übereinstimmend“ markiert. settings.trust_model.committer=Committer -settings.trust_model.committer.long=Committer: Vertraue Signaturen, die zu Committern passen (Dies stimmt mit GitHub überein und zwingt signierte Commits von Forgejo dazu, Forgejo als Committer zu haben) +settings.trust_model.committer.long=Committer: Vertraue Signaturen, die zu Committern passen (dies stimmt mit GitHub überein und zwingt signierte Commits von Forgejo dazu, Forgejo als Committer zu haben) settings.trust_model.committer.desc=Gültige Signaturen werden nur dann als „vertrauenswürdig“ gekennzeichnet, wenn sie mit ihrem Committer übereinstimmen. Ansonsten werden sie als „nicht übereinstimmend“ markiert. Das führt dazu, dass Forgejo auf signierten Commits, bei denen der echte Committer als „Co-authored-by:“ oder „Co-committed-by:“ in der Beschreibung eingetragen wurde, als Committer gilt. Der Forgejo-Standard-Key muss zu einem Benutzer in der Datenbank passen. settings.trust_model.collaboratorcommitter=Mitarbeiter+Committer settings.trust_model.collaboratorcommitter.long=Mitarbeiter+Committer: Signaturen der Mitarbeiter vertrauen die mit dem Committer übereinstimmen settings.trust_model.collaboratorcommitter.desc=Gültige Signaturen von Mitarbeitern dieses Projekts werden als „vertrauenswürdig“ markiert, wenn sie mit dem Committer übereinstimmen. Andernfalls werden gültige Signaturen als „nicht vertrauenswürdig“ markiert, wenn die Signatur mit dem Committer übereinstimmt. Ansonsten werden sie als „nicht übereinstimmend“ markiert. Dies zwingt Forgejo, als Committer bei signierten Commits mit dem echten Committer als „Co-Authored-By:“ und „Co-Committed-By:“ im Commit zu markieren. Der Standard-Forgejo-Schlüssel muss mit einem Benutzer in der Datenbank übereinstimmen. settings.wiki_delete=Wiki-Daten löschen settings.wiki_delete_desc=Das Löschen von Wiki-Daten kann nicht rückgängig gemacht werden. Bitte sei vorsichtig. -settings.wiki_delete_notices_1=– Dies löscht und deaktiviert das Wiki für %s. +settings.wiki_delete_notices_1=– Dies wird das Repository-Wiki für %s dauerhaft löschen und deaktivieren. settings.confirm_wiki_delete=Wiki-Daten löschen settings.wiki_deletion_success=Repository-Wiki-Daten wurden gelöscht. settings.delete=Dieses Repository löschen @@ -2327,7 +2327,7 @@ settings.add_webhook_desc=Forgejo sendet eine POST-Anfrage mit fest settings.payload_url=Ziel-URL settings.http_method=HTTP-Methode settings.content_type=POST-Content-Type -settings.secret=Secret +settings.secret=Geheimnis settings.slack_username=Benutzername settings.slack_icon_url=Icon-URL settings.slack_color=Farbe @@ -2374,12 +2374,12 @@ settings.event_pull_request_milestone=Meilensteine settings.event_pull_request_milestone_desc=Meilenstein hinzugefügt, entfernt oder bearbeitet. settings.event_pull_request_comment=Kommentare settings.event_pull_request_comment_desc=Pull-Request-Kommentar angelegt, geändert oder gelöscht. -settings.event_pull_request_review=Reviews -settings.event_pull_request_review_desc=Pull-Request genehmigt, abgelehnt oder Review-Kommentare hinterlassen. +settings.event_pull_request_review=Sichtungen +settings.event_pull_request_review_desc=Pull-Request genehmigt, abgelehnt oder Sichtungskommentare hinterlassen. settings.event_pull_request_sync=Synchronisiert settings.event_pull_request_sync_desc=Branch automatisch mit Zielbranch aktualisiert. -settings.event_pull_request_review_request=Review-Anfragen -settings.event_pull_request_review_request_desc=Überprüfung des Pull-Requests angefragt oder die Anfrage entfernt. +settings.event_pull_request_review_request=Sichtungsanfragen +settings.event_pull_request_review_request_desc=Pull-Request-Sichtung angefragt oder Sichtungsanfrage entfernt. settings.event_pull_request_approvals=Genehmigungen zum Pull-Request settings.event_pull_request_merge=Pull-Request-Merge settings.event_package=Paket @@ -2467,11 +2467,11 @@ settings.protect_status_check_matched=Übereinstimmung settings.protect_invalid_status_check_pattern=Ungültiges Statusprüfungspattern: „%s“. settings.protect_no_valid_status_check_patterns=Keine gültigen Statuscheck-Muster. settings.protect_required_approvals=Erforderliche Genehmigungen -settings.protect_required_approvals_desc=Erlaube das Zusammenführen des Pull-Requests nur mit genügend positiven Reviews. +settings.protect_required_approvals_desc=Erlaube das Zusammenführen des Pull-Requests nur mit genügend positiven Sichtungen. settings.protect_approvals_whitelist_enabled=Genehmigungen auf Benutzer oder Teams auf der Positivliste beschränken -settings.protect_approvals_whitelist_enabled_desc=Nur Reviews von Benutzern oder Teams auf der Positivliste zählen zu den erforderlichen Genehmigungen. Existiert keine Positivliste, so zählen Reviews von jedem mit Schreibzugriff zu den erforderlichen Genehmigungen. -settings.protect_approvals_whitelist_users=Nutzer, die reviewen dürfen -settings.protect_approvals_whitelist_teams=Teams, die reviewen dürfen +settings.protect_approvals_whitelist_enabled_desc=Nur Sichtungen von Benutzern oder Teams auf der Positivliste zählen zu den erforderlichen Genehmigungen. Existiert keine Positivliste, so zählen Sichtungen von jedem mit Schreibzugriff zu den erforderlichen Genehmigungen. +settings.protect_approvals_whitelist_users=Nutzer, die sichten dürfen +settings.protect_approvals_whitelist_teams=Teams, die sichten dürfen settings.dismiss_stale_approvals=Entferne alte Genehmigungen settings.dismiss_stale_approvals_desc=Wenn neue Commits gepusht werden, die den Inhalt des Pull-Requests ändern, werden alte Genehmigungen entfernt. settings.require_signed_commits=Signierte Commits erforderlich @@ -2489,10 +2489,10 @@ settings.remove_protected_branch_success=Branchschutzregel „%s“ wurde entfer settings.remove_protected_branch_failed=Entfernen der Branchschutzregel „%s“ fehlgeschlagen. settings.protected_branch_deletion=Branch-Schutz löschen settings.protected_branch_deletion_desc=Wenn du den Branch-Schutz deaktivierst, können alle Nutzer mit Schreibrechten auf den Branch pushen. Fortfahren? -settings.block_rejected_reviews=Zusammenführung bei abgelehnten Reviews blockieren -settings.block_rejected_reviews_desc=Merge ist nicht möglich, wenn Änderungen durch offizielle Reviewer angefragt werden, auch wenn genügend Genehmigungen existieren. -settings.block_on_official_review_requests=Merge bei offiziellen Review-Anfragen blockieren -settings.block_on_official_review_requests_desc=Merge ist nicht möglich, wenn offizielle Review-Anfrangen vorliegen, selbst wenn genügend Genehmigungen existieren. +settings.block_rejected_reviews=Zusammenführung bei abgelehnten Sichtungen blockieren +settings.block_rejected_reviews_desc=Merge ist nicht möglich, wenn Änderungen durch offizielle Sichter angefragt werden, auch wenn genügend Genehmigungen existieren. +settings.block_on_official_review_requests=Merge bei offiziellen Sichtungsanfragen blockieren +settings.block_on_official_review_requests_desc=Merge ist nicht möglich, wenn offizielle Sichtungsanfrangen vorliegen, selbst wenn genügend Genehmigungen existieren. settings.block_outdated_branch=Merge blockieren, wenn der Pull-Request veraltet ist settings.block_outdated_branch_desc=Merge ist nicht möglich, wenn der Head-Branch hinter dem Basis-Branch ist. settings.default_branch_desc=Wähle einen Standardbranch für Pull-Requests und Code-Commits: @@ -2539,7 +2539,7 @@ settings.lfs_filelist=LFS-Dateien, die in diesem Repository gespeichert sind settings.lfs_no_lfs_files=In diesem Repository sind keine LFS-Dateien gespeichert settings.lfs_findcommits=Commits finden settings.lfs_lfs_file_no_commits=Keine Commits für diese LFS-Datei gefunden -settings.lfs_noattribute=Dieser Pfad hat nicht das sperrbare Attribut im Standard-Branch +settings.lfs_noattribute=Dieser Pfad hat nicht das „lockable“-Attribut im Standard-Branch settings.lfs_delete=LFS-Datei mit OID %s löschen settings.lfs_delete_warning=Das Löschen einer LFS-Datei kann dazu führen, dass „Objekt existiert nicht“-Fehler beim Checkout auftreten. Bist du sicher? settings.lfs_findpointerfiles=Pointer-Dateien finden @@ -2580,8 +2580,8 @@ diff.show_unified_view=Gesamtansicht diff.whitespace_button=Leerzeichen diff.whitespace_show_everything=Alle Änderungen anzeigen diff.whitespace_ignore_all_whitespace=Ignoriere Leerzeichen beim Zeilen vergleichen -diff.whitespace_ignore_amount_changes=Ignoriere whitespace-Änderungen -diff.whitespace_ignore_at_eol=Ignoriere EOL-whitespace-Änderungen +diff.whitespace_ignore_amount_changes=Änderungen in der Anzahl der Leerzeichen und ähnlichen Zeichen ignorieren +diff.whitespace_ignore_at_eol=Änderungen an den Leerzeichen und ähnlichen Zeichen am Zeilenende ignorieren diff.stats_desc= %d geänderte Dateien mit %d neuen und %d gelöschten Zeilen diff.stats_desc_file=%d Änderungen: %d Ergänzungen und %d Löschungen diff.bin=BIN @@ -2604,11 +2604,11 @@ diff.comment.placeholder=Kommentieren diff.comment.markdown_info=Styling mit Markdown wird unterstützt. diff.comment.add_single_comment=Einzelnen Kommentar hinzufügen diff.comment.add_review_comment=Kommentar hinzufügen -diff.comment.start_review=Review starten +diff.comment.start_review=Sichtung starten diff.comment.reply=Antworten -diff.review=Review abschließen -diff.review.header=Review einreichen -diff.review.placeholder=Kommentar zum Review +diff.review=Sichtung abschließen +diff.review.header=Sichtung einreichen +diff.review.placeholder=Kommentar zur Sichtung diff.review.comment=Kommentieren diff.review.approve=Genehmigen diff.review.self_reject=Pull-Request-Autoren können keine Änderungen an ihren eigenen Pull-Request anfordern @@ -2656,7 +2656,7 @@ release.edit_release=Release aktualisieren release.delete_release=Release löschen release.delete_tag=Tag löschen release.deletion=Release löschen -release.deletion_desc=Beim Entfernen wird ein Release nur von Forgejo gelöscht. Es betrifft weder den Git-Tag, noch den Inhalt des Repos oder seinen Änderungsverlauf. Fortfahren? +release.deletion_desc=Beim Entfernen wird ein Release nur von Forgejo gelöscht. Es betrifft weder den Git-Tag noch den Inhalt des Repos oder seinen Änderungsverlauf. Fortfahren? release.deletion_success=Das Release wurde gelöscht. release.deletion_tag_desc=Löscht dieses Tag aus dem Projektarchiv. Repository-Inhalt und Verlauf bleiben unverändert. Fortfahren? release.deletion_tag_success=Der Tag wurde gelöscht. @@ -2666,7 +2666,7 @@ release.tag_name_protected=Der Tag-Name ist geschützt. release.tag_already_exist=Dieser Tag-Name existiert bereits. release.downloads=Downloads release.download_count=Downloads: %s -release.add_tag_msg=Titel und Beschreibung des Releases als Tag Nachricht verwenden. +release.add_tag_msg=Titel und Beschreibung des Releases als Tag-Nachricht verwenden. release.add_tag=Tag erstellen release.releases_for=Releases für %s release.tags_for=Tags für %s @@ -2766,7 +2766,7 @@ wiki.cancel = Abbrechen settings.wiki_globally_editable = Allen erlauben, das Wiki zu bearbeiten settings.protect_branch_name_pattern_desc = Geschützte Branch-Namens-Patterns. Siehe die Dokumentation für Pattern-Syntax. Beispiele: main, release/** settings.ignore_stale_approvals = Abgestandene Genehmigungen ignorieren -settings.ignore_stale_approvals_desc = Genehmigungen, welche für ältere Commits gemacht wurden (abgestandene Reviews), nicht in die Gesamtzahl der Genehmigung des PRs mitzählen. Irrelevant, falls abgestandene Reviews bereits verworfen werden. +settings.ignore_stale_approvals_desc = Genehmigungen, welche für ältere Commits gemacht wurden (abgestandene Sichtungen), nicht in die Gesamtzahl der Genehmigung des PRs mitzählen. Irrelevant, falls abgestandene Sichtungen bereits verworfen werden. pulls.commit_ref_at = `referenzierte diesen Pull-Request aus einem Commit %s` pulls.fast_forward_only_merge_pull_request = Nur Fast-forward pulls.cmd_instruction_checkout_desc = Checke einen neuen Branch aus deinem Projekt-Repository aus und teste die Änderungen. @@ -2782,7 +2782,7 @@ activity.navbar.contributors = Mitwirkende contributors.contribution_type.deletions = Löschungen contributors.contribution_type.additions = Einfügungen contributors.contribution_type.filter_label = Art des Beitrags: -vendored = Vendored +vendored = Gevendort activity.navbar.pulse = Puls pulls.made_using_agit = AGit settings.confirmation_string = Bestätigungsstring @@ -2795,7 +2795,7 @@ pulls.merged_title_desc_one = hat %[1]d Commit von %[2]s nach %[2]s nach %[3]s zusammenführen open_with_editor = Öffnen mit %s commits.search_branch = Dieser Branch -pulls.ready_for_review = Bereit zum Review? +pulls.ready_for_review = Bereit zur Sichtung? settings.rename_branch_failed_protected = Branch %s kann nicht umbenannt werden, weil er ein geschützter Branch ist. editor.commit_id_not_matching = Die Datei wurde geändert, während du sie bearbeitet hast. Committe in einen neuen Branch, dann führe einen Merge durch. editor.push_out_of_date = Der Push scheint veraltet zu sein. @@ -2824,7 +2824,7 @@ settings.sourcehut_builds.secrets_helper = Dem Job zugriff auf die Build-Geheimn settings.web_hook_name_sourcehut_builds = SourceHut-Builds settings.graphql_url = GraphQL-URL settings.matrix.room_id_helper = Die Raum-ID kann über den Element-Webclient ermittelt werden: Raumeinstellungen > erweitert > interne Raum-ID. Beispielsweise %s. -settings.sourcehut_builds.access_token_helper = Zugangstoken, der die JOBS:RW-Freigabe hat. Generiere auf meta.sr.ht einen builds.sr.ht-Token oder einen builds.sr.ht-Token mit Zugriff auf die Secrets. +settings.sourcehut_builds.access_token_helper = Zugangstoken, der die JOBS:RW-Freigabe hat. Generiere auf meta.sr.ht einen builds.sr.ht-Token oder einen builds.sr.ht-Token mit Zugriff auf die Geheimnisse. settings.matrix.access_token_helper = Es wird empfohlen, hierfür ein dediziertes Matrix-Konto anzulegen. Der Zugangstoken kann in einem Inkognito-Tab über den Element-Webclient geholt werden: Benutzermenü (oben links) > alle Einstellungen > Hilfe & Info > erweitert > Zugriffstoken (direkt unter der Heim-Server-URL). Schließe dann den Inkognito-Tab (Abmelden würde den Token ungültig machen). release.hide_archive_links = Automatisch generierte Archive verstecken release.hide_archive_links_helper = Verstecke automatisch generierte Quellcodearchive für diesen Release. Zum Beispiel, wenn du deine eigenen hochlädst. @@ -2873,9 +2873,9 @@ mirror_use_ssh.not_available = SSH-Authentifizierung ist nicht verfügbar. issues.new.assign_to_me = Mir selbst zuweisen issues.all_title = Alle settings.discord_icon_url.exceeds_max_length = Die Icon-URL darf eine Länge von 2048 Zeichen nicht überschreiten -issues.review.add_review_requests = hat Reviews von %[1]s %[2]s angefragt -issues.review.remove_review_requests = hat Aufforderungen zum Review an %[1]s %[2]s entfernt -issues.review.add_remove_review_requests = hat Reviews von %[1]s angefragt und hat die Aufforderungen zum Review an %[2]s %[3]s entfernt +issues.review.add_review_requests = hat Sichtungen von %[1]s %[2]s angefragt +issues.review.remove_review_requests = hat die Sichtungsanfragen an %[1]s %[2]s entfernt +issues.review.add_remove_review_requests = hat Sichtungen von %[1]s angefragt und die Sichtungsanfragen an %[2]s %[3]s entfernt pulls.delete_after_merge.head_branch.is_default = Der Head-Branch, den du löschen willst, ist der Standardbranch und kann nicht gelöscht werden. pulls.delete_after_merge.head_branch.is_protected = Der Head-Branch, den du löschen willst, ist ein geschützter Branch und kann nicht gelöscht werden. pulls.delete_after_merge.head_branch.insufficient_branch = Du hast keine Erlaubnis, den Head-Branch zu löschen. @@ -2883,9 +2883,9 @@ issues.filter_sort.relevance = Relevanz diff.git-notes.add = Anmerkung hinzufügen diff.git-notes.remove-header = Anmerkung entfernen diff.git-notes.remove-body = Diese Anmerkung wird entfernt. -issues.num_reviews_one = %d Review +issues.num_reviews_one = %d Sichtung issues.summary_card_alt = Zusammenfassung eines Issues mit dem Titel „%s“ im Repository %s -issues.num_reviews_few = %d Reviews +issues.num_reviews_few = %d Sichtungen editor.add_tmpl.filename = Dateiname settings.default_update_style_desc = Standard-Aktualisierungsart um Pull-Requests zu aktualisieren, die hinter dem Base-Branch sind. new_advanced = Erweiterte Einstellungen @@ -2902,7 +2902,7 @@ issues.reaction.alt_add = Füge %[1]s Reaktion zum Kommentar hinzu. issues.reaction.alt_remove = Entferne %[1]s Reaktion von diesem Kommentar. summary_card_alt = Zusammenfassungskarte des Repositorys %s release.summary_card_alt = Übersichtskarte eines Releases mit dem Titel „%s“ im Repository %s -archive.pull.noreview = Dieses Repository ist archiviert. Pull-Requests können nicht gereviewt werden. +archive.pull.noreview = Dieses Repository ist archiviert. Pull-Requests können nicht gesichtet werden. editor.commit_email = Commit-E-Mail commits.view_single_diff = Änderungen an dieser Datei, die in diesem Commit eingeführt wurden, betrachten pulls.editable = Bearbeitbar @@ -2922,7 +2922,7 @@ settings.event_action_success_desc = Action-Run war erfolgreich. settings.event_action_failure = Fehlschlag settings.event_action_success = Erfolg settings.event_header_action = Action-Run-Ereignisse -settings.event_action_recover_desc = Action-Run war erfolgreich, nachdem der letzte Action-Run im selben Arbeitsablauf fehlgeschlagen ist. +settings.event_action_recover_desc = Action-Run war erfolgreich, nachdem der letzte Action-Run im selben Workflow fehlgeschlagen ist. settings.event_action_recover = Wiederherstellen issues.filter_type.all_pull_requests = Alle Pull-Requests @@ -3116,7 +3116,7 @@ dashboard.repo_health_check=Healthchecks für alle Repositorys ausführen dashboard.check_repo_stats=Überprüfe alle Repository-Statistiken dashboard.archive_cleanup=Alte Repository-Archive löschen dashboard.deleted_branches_cleanup=Gelöschte Branches bereinigen -dashboard.update_migration_poster_id=Migration Poster-IDs updaten +dashboard.update_migration_poster_id=Migrations-Poster-IDs aktualisieren dashboard.git_gc_repos=Garbage-Collection für alle Repositorys ausführen dashboard.resync_all_sshkeys=Die Datei „.ssh/authorized_keys“ mit Forgejo-SSH-Schlüsseln aktualisieren. dashboard.resync_all_sshprincipals=Aktualisiere die Datei „.ssh/authorized_principals“ mit Forgejo-SSH-Principals. @@ -3159,7 +3159,7 @@ dashboard.delete_old_actions=Alle alten Aktivitäten aus der Datenbank löschen dashboard.delete_old_actions.started=Löschen aller alten Aktivitäten aus der Datenbank gestartet. dashboard.update_checker=Update-Checker dashboard.delete_old_system_notices=Alle alten Systemmeldungen aus der Datenbank löschen -dashboard.gc_lfs=Garbage-Collection für LFS Meta-Objekte ausführen +dashboard.gc_lfs=Garbage-Collection für LFS-Meta-Objekte ausführen dashboard.stop_zombie_tasks=Zombie-Actions-Aufgaben stoppen dashboard.stop_endless_tasks=Endlose Actions-Aufgaben stoppen dashboard.cancel_abandoned_jobs=Aufgegebene Actions-Jobs abbrechen @@ -3335,7 +3335,7 @@ auths.pam_email_domain=PAM-E-Mail-Domain (optional) auths.oauth2_provider=OAuth2-Anbieter auths.oauth2_icon_url=Symbol-URL auths.oauth2_clientID=Client-ID (Schlüssel) -auths.oauth2_clientSecret=Client-Secret +auths.oauth2_clientSecret=Client-Geheimnis auths.openIdConnectAutoDiscoveryURL=OpenID-Connect-Auto-Discovery-URL auths.oauth2_use_custom_url=Benutzerdefinierte URLs anstelle von Standard-URLs verwenden auths.oauth2_tokenURL=Token-URL @@ -3343,14 +3343,14 @@ auths.oauth2_authURL=Authorisierungs-URL auths.oauth2_profileURL=Profil-URL auths.oauth2_emailURL=E-Mail-URL auths.skip_local_two_fa=Lokale 2FA überspringen -auths.skip_local_two_fa_helper=Leer lassen bedeutet, dass lokale User die 2FA immer noch bestehen müssen, um sich anzumelden +auths.skip_local_two_fa_helper=Das Leerlassen bedeutet, dass lokale User die 2FA immer noch bestehen müssen, um sich anzumelden auths.oauth2_tenant=Inhaber auths.oauth2_scopes=Zusätzliche Bereiche auths.oauth2_required_claim_name=Benötigter Claim-Name auths.oauth2_required_claim_name_helper=Setze diesen Namen, damit Nutzer aus dieser Quelle sich nur anmelden dürfen, wenn sie einen Claim mit diesem Namen besitzen auths.oauth2_required_claim_value=Benötigter Claim-Wert auths.oauth2_required_claim_value_helper=Setze diesen Wert, damit Nutzer aus dieser Quelle sich nur anmelden dürfen, wenn sie einen Claim mit diesem Namen und Wert besitzen -auths.oauth2_group_claim_name=Claim-Name, der Gruppennamen für diese Quelle angibt. (Optional) +auths.oauth2_group_claim_name=Claim-Name, der Gruppennamen für diese Quelle angibt (optional). auths.oauth2_admin_group=Gruppen-Claim-Wert für Administratoren (optional – erfordert Claim-Namen oben). auths.oauth2_restricted_group=Gruppen-Claim-Wert für eingeschränkte User. (Optional – erfordert Claim-Namen oben) auths.oauth2_map_group_to_team=Gruppen aus OAuth-Claims den Organisationsteams zuordnen (optional – oben muss der Name des Claims angegeben werden). @@ -3395,7 +3395,7 @@ auths.still_in_used=Diese Authentifizierungsquelle wird noch verwendet. Bearbeit auths.deletion_success=Die Authentifizierungsquelle „%s“ wurde gelöscht. auths.login_source_exist=Die Authentifizierungsquelle „%s“ existiert bereits. auths.login_source_of_type_exist=Eine Authentifizierungart dieses Typs existiert bereits. -auths.unable_to_initialize_openid=OpenID Connect Provider konnte nicht initialisiert werden: %s +auths.unable_to_initialize_openid=Provider für OpenID Connect konnte nicht initialisiert werden: %s auths.invalid_openIdConnectAutoDiscoveryURL=Ungültige Auto-Discovery-URL (dies muss eine gültige URL sein, die mit http:// oder https:// beginnt) config.server_config=Serverkonfiguration @@ -3526,7 +3526,7 @@ config.git_pull_timeout=Zeitlimit für Pull config.git_gc_timeout=Zeitlimit für GC config.log_config=Protokollierungs-Konfiguration -config.logger_name_fmt=Logger: %s +config.logger_name_fmt=Protokollierer: %s config.disabled_logger=Deaktiviert config.access_log_mode=Zugriffsprotokoll-Modus config.access_log_template=Zugriffsprotokoll-Vorlage @@ -3650,7 +3650,7 @@ mirror_sync_delete=hat die Referenz des Spiegels %[2]s in %[3]s#%[2]s genehmigt` reject_pull_request=`schlug Änderungen für %[3]s#%[2]s vor` publish_release=`veröffentlichte Release %[4]s in %[3]s` -review_dismissed=`verwarf das Review von %[4]s in %[3]s#%[2]s` +review_dismissed=`verwarf die Sichtung von %[4]s in %[3]s#%[2]s` review_dismissed_reason=Grund: create_branch=legte den Branch %[3]s in %[4]s an starred_repo=favorisierte %[2]s @@ -3765,9 +3765,9 @@ conda.registry=Richte diese Registry als Conda-Repository in deiner .conda conda.install=Um das Paket mit Conda zu installieren, führe den folgenden Befehl aus: container.details.type=Abbildtyp container.details.platform=Plattform -container.pull=Downloade das Container-Image aus der Kommandozeile: +container.pull=Lade das Container-Image von der Kommandozeile aus herunter: container.digest=Prüfsumme -container.multi_arch=Betriebsystem / Architektur +container.multi_arch=Betriebsystem/Architektur container.layers=Abbildebenen container.labels=Labels container.labels.key=Schlüssel @@ -3781,7 +3781,7 @@ debian.repository=Repository-Informationen debian.repository.distributions=Distributionen debian.repository.components=Komponenten debian.repository.architectures=Architekturen -generic.download=Downloade das Paket aus der Kommandozeile: +generic.download=Lade das Paket mit der Kommandozeile herunter: go.install=Installiere das Paket über die Kommandozeile: helm.registry=Diese Paketverwaltung über die Kommandozeile einrichten: helm.install=Nutze folgenden Befehl, um das Paket zu installieren: @@ -3813,10 +3813,10 @@ rubygems.install=Um das Paket mit gem zu installieren, führe den folgenden Befe rubygems.install2=oder füg es zum Gemfile hinzu: rubygems.dependencies.runtime=Laufzeitabhängigkeiten rubygems.dependencies.development=Entwicklungsabhängigkeiten -rubygems.required.ruby=Benötigt Ruby Version -rubygems.required.rubygems=Benötigt RubyGem Version +rubygems.required.ruby=Benötigt Ruby-Version +rubygems.required.rubygems=Benötigt RubyGem-Version swift.registry=Diese Registry über die Kommandozeile einrichten: -swift.install=Füge das Paket deiner Package.swift Datei hinzu: +swift.install=Füge das Paket deiner Package.swift-Datei hinzu: swift.install2=und führe den folgenden Befehl aus: vagrant.install=Um eine Vagrant-Box hinzuzufügen, führe den folgenden Befehl aus: settings.link=Dieses Paket einem Repository zuweisen @@ -3892,19 +3892,19 @@ alt.repository.architectures = Architekturen alt.repository.multiple_groups = Dieses Paket ist in verschiedenen Gruppen verfügbar. [secrets] -secrets=Secrets -description=Secrets werden an bestimmte Aktionen weitergegeben und können nicht anderweitig ausgelesen werden. -none=Noch keine Secrets vorhanden. -creation=Secret hinzufügen +secrets=Geheimnisse +description=Geheimnisse werden an bestimmte Aktionen weitergegeben und können nicht anderweitig ausgelesen werden. +none=Noch keine Geheimnisse vorhanden. +creation=Geheimnis hinzufügen creation.name_placeholder=Groß-/Kleinschreibung wird ignoriert, nur alphanumerische Zeichen oder Unterstriche, darf nicht mit GITEA_ oder GITHUB_ beginnen creation.value_placeholder=Beliebigen Inhalt eingeben. Leerzeichen am Anfang und Ende werden weggelassen. -creation.success=Das Secret „%s“ wurde hinzugefügt. -creation.failed=Secret konnte nicht hinzugefügt werden. -deletion=Secret entfernen -deletion.description=Das Entfernen eines Secrets kann nicht rückgängig gemacht werden. Fortfahren? -deletion.success=Das Secret wurde entfernt. -deletion.failed=Secret konnte nicht entfernt werden. -management=Secrets verwalten +creation.success=Das Geheimnis „%s“ wurde hinzugefügt. +creation.failed=Geheimnis konnte nicht hinzugefügt werden. +deletion=Geheimnis entfernen +deletion.description=Das Entfernen eines Geheimnisses kann nicht rückgängig gemacht werden. Fortfahren? +deletion.success=Das Geheimnis wurde entfernt. +deletion.failed=Geheimnis konnte nicht entfernt werden. +management=Geheimnisse verwalten [actions] actions=Actions diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index d85a3b13e7..2e0928bb1f 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -29,7 +29,7 @@ password=Пароль access_token=Токен доступу re_type=Підтвердження пароля captcha=CAPTCHA -twofa=Двофакторна авторизація +twofa=Двофакторна автентифікація twofa_scratch=Двофакторний одноразовий пароль passcode=Код доступу @@ -112,7 +112,7 @@ webauthn_error_unknown = Сталася невідома помилка. Буд webauthn_error_unable_to_process = Сервер не зміг обробити запит. webauthn_error_duplicated = Запит із наданим ключем безпеки відхилено. Впевніться, що цього ключа ще не зареєстровано. webauthn_error_empty = Ключ слід якось назвати. -new_project_column = Нова колонка +new_project_column = Новий стовпчик retry = Повторити rerun = Перезапустити rerun_all = Перезапустити всі завдання @@ -201,7 +201,7 @@ buttons.mention.tooltip = Згадати користувача чи коман buttons.ref.tooltip = Послатися на задачу чи на запит на злиття buttons.enable_monospace_font = Увімкнути моноширинний шрифт buttons.new_table.tooltip = Додати таблицю -table_modal.label.columns = Стовпці +table_modal.label.columns = Стовпчики table_modal.header = Додати таблицю table_modal.placeholder.header = Заголовок table_modal.placeholder.content = Вміст @@ -343,13 +343,13 @@ enable_update_checker = Увімкнути перевірку оновлень require_db_desc = Forgejo вимагає MySQL, PostgreSQL, SQLite3 чи TiDB (протокол MySQL). allow_only_external_registration = Дозволити реєстрацію тільки через зовнішні сервіси require_sign_in_view.description = Обмежити доступ до контенту лише користувачам, що увійшли. Гості зможуть лише відвідувати сторінки автентифікації. -password_algorithm_helper = Встановити алгоритм хешування паролів. Алгоритми мають різні вимоги та силу. Алгоритм argon2 є досить безпечним, проте споживає багато памʼяті та є недоречним для малих систем. +password_algorithm_helper = Установіть алгоритм хешування паролів. Алгоритми мають різні вимоги і стійкість. Алгоритм argon2 є досить безпечним, проте споживає багато памʼяті та є недоречним для малих систем. app_slogan = Гасло екземпляра app_slogan_helper = Уведіть гасло вашого екземпляра тут. Залиште порожнім, аби вимкнути. run_user_helper = Імʼя користувача операційної системи, від якого запущено Forgejo. Зауважте, що цей користувач повинен мати доступ до кореневої теки репозиторію. smtp_from_invalid = Адреса з «Відправляти email від імені» недійсна allow_dots_in_usernames = Дозволити використання крапки в іменах користувачів. Не впливає на облікові записи, що вже існують. -invalid_password_algorithm = Недійсний варіант алгоритму хешування паролів +invalid_password_algorithm = Недійсний алгоритм хешування паролів enable_update_checker_helper_forgejo = Наявність нових версій Forgejo періодично перевірятиметься через перевірку запису TXT DNS на release.forgejo.org. [home] @@ -734,7 +734,7 @@ applications=Додатки orgs=Організації repos=Репозиторії delete=Видалити обліковий запис -twofa=Двофакторна авторизація (TOTP) +twofa=Двофакторна автентифікація (TOTP) account_link=Прив'язані облікові записи organization=Організації @@ -1710,7 +1710,7 @@ pulls.reject_count_1=%d запит на зміну pulls.reject_count_n=%d запити на зміну pulls.waiting_count_1=очікується %d рецензія pulls.waiting_count_n=очікується %d рецензії(й) -pulls.wrong_commit_id=ID коміта повинен бути ID коміта в цільовій гілці +pulls.wrong_commit_id=ID коміту повинен бути ID коміту в цільовій гілці pulls.no_merge_desc=Цей запити на злиття неможливо злити, оскільки всі параметри об'єднання репозиторія вимкнено. pulls.no_merge_helper=Увімкніть параметри злиття в налаштуваннях репозиторія або злийте запити на злиття вручну. @@ -1728,7 +1728,7 @@ 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=Не вдалося об'єднати: виник конфлікт під час перебазування коміту: %[1]s. Підказка: спробуйте іншу стратегію pulls.rebase_conflict_summary=Повідомлення про помилку pulls.unrelated_histories=Не вдалося об'єднати: head та base злиття не мають спільної історії. Підказка: спробуйте іншу стратегію pulls.merge_out_of_date=Не вдалося об'єднати: base було оновлено, поки відбувалося об'єднання. Підказка: спробуйте знову. @@ -1897,7 +1897,7 @@ settings.mirror_settings.direction=Напрямок settings.mirror_settings.direction.pull=Pull settings.mirror_settings.direction.push=Push settings.mirror_settings.last_update=Останнє оновлення -settings.mirror_settings.push_mirror.none=Не налаштовано дзеркало push +settings.mirror_settings.push_mirror.none=Push-дзеркала не налаштовано settings.mirror_settings.push_mirror.remote_url=URL віддаленого репозиторію Git settings.mirror_settings.push_mirror.add=Додати push-дзеркало @@ -2344,7 +2344,7 @@ issues.author = Автор issues.author_helper = Цей користувач - автор. issues.close = Закрити задачу issues.role.owner_helper = Цей користувач є власником цього репозиторію. -settings.mirror_settings.docs.more_information_if_disabled = Докладніше про push та pull дзеркала можна дізнатися тут: +settings.mirror_settings.docs.more_information_if_disabled = Докладніше про push- та pull-дзеркала можна дізнатися тут: issues.comment.blocked_by_user = Ви не можете коментувати цю задачу, оскільки вас заблокував власник репозиторію або автор цієї задачі. editor.add_file = Додати файл from_comment = (коментар) @@ -2432,7 +2432,7 @@ pulls.is_ancestor = Цю гілку вже включено в цільову г pulls.has_merged = Помилка: запит на злиття вже об'єднано, неможливо об'єднати знову чи змінити цільову гілку. pulls.head_out_of_date = Не вдалося об'єднати: head було оновлено, поки відбувалося об'єднання. Підказка: спробуйте знову. no_eol.tooltip = У цьому файлі відсутній символ закінчення рядка (EOL) у кінці. -settings.trust_model.committer.desc = Допустимі підписи будуть позначатися як «довірені», тільки якщо вони відповідають автору коміта, в іншому випадку вони позначатимуться як «невідповідні». Це змусить Forgejo бути автором підписаних комітів, а фактичного автора зазначати в трейлерах «Co-authored-by» і «Co-committed-by» в описі коміта. Типовий ключ Forgejo повинен відповідати користувачу в базі даних. +settings.trust_model.committer.desc = Допустимі підписи будуть позначатися як «довірені», тільки якщо вони відповідають авторові коміту, в іншому випадку вони позначатимуться як «невідповідні». Це змусить Forgejo бути автором підписаних комітів, а фактичного автора зазначати в трейлерах «Co-authored-by» і «Co-committed-by» в описі коміту. Типовий ключ Forgejo повинен відповідати користувачу в базі даних. pulls.clear_merge_message_hint = Очищення повідомлення про об'єднання видалить лише вміст повідомлення коміту і збереже згенеровані git-трейлери, такі як «Co-Authored-By…». branch.delete_branch_has_new_commits = Гілку «%s» не можна видалити, оскільки після об'єднання було додано нові коміти. settings.graphql_url = Посилання GraphQL @@ -2515,7 +2515,7 @@ projects.column.set_default = Установити за замовчування settings.federation_following_repos = URL-адреси відстежуваних репозиторіїв. Через «;», без пробілів. settings.federation_not_enabled = Федерацію вимкнено у вашому екземплярі. settings.federation_settings = Налаштування федерації -signing.wont_sign.nokey = Цей екземпляр не має ключа для підписання цього коміта. +signing.wont_sign.nokey = Цей екземпляр не має ключа для підписання цього коміту. settings.federation_apapiurl = URL федерації цього репозиторію. Скопіюйте її та вставте в налаштування федерації іншого репозиторію як URL-адресу відстежуваного репозиторію. fork_branch = Гілка, яку буде клоновано у форк already_forked = Ви вже створили форк %s @@ -2555,7 +2555,7 @@ activity.navbar.pulse = Пульс open_with_editor = Відкрити в %s commits.view_single_diff = Переглянути зміни до цього файлу, внесені у цьому коміті pulls.editable = Редаговане -pulls.editable_explanation = Цей запит на злиття дозволяє редагування від розробників. Ви можете зробити свій внесок безпосередньо до нього. +pulls.editable_explanation = Цей запит на злиття дозволено редагувати супроводжувачам. Ви можете зробити свій внесок безпосередньо до нього. admin.failed_to_replace_flags = Не вдалося замінити прапорці репозиторія admin.enabled_flags = Для репозиторія ввімкнено прапорці: admin.flags_replaced = Прапорці репозиторія замінено @@ -2777,6 +2777,59 @@ branch.delete_desc = Видалення гілки є остаточним. Хо branch.branch_name_conflict = Назва гілки «%s» конфліктує з наявною гілкою «%s». branch.tag_collision = Неможливо створити гілку «%s», оскільки у репозиторії вже є тег із такою назвою. +blame.ignore_revs = Зміни в .git-blame-ignore-revs ігноруються. Натисніть тут, щоб обійти це і переглянути авторство у звичайному вигляді. +blame.ignore_revs.failed = Не вдалося проігнорувати зміни в .git-blame-ignore-revs. +template.git_hooks_tooltip = Наразі ви не можете змінювати або видаляти додані Git-хуки. Вибирайте лише якщо ви довіряєте репозиторію шаблону. +migrate.github_token_desc = Ви можете ввести тут один або кілька токенів через кому, щоб пришвидшити міграцію в обхід обмеження частоти звернень до API GitHub. ОБЕРЕЖНО: зловживання цією функцією може порушити політику постачальника послуг і призвести до блокування облікового запису. +migrate.github.description = Перенесіть дані з github.com або сервера GitHub Enterprise. +migrate.cancel_migrating_confirm = Бажаєте скасувати перенесення? +editor.new_branch_name = Укажіть назву нової гілки для цього коміту +projects.column.edit = Редагувати стовпчик +projects.column.new_submit = Створити стовпчик +projects.column.new = Новий стовпчик +projects.column.set_default_desc = Призначити цей стовпчик за замовчуванням для задач і запитів на злиття без категорії +projects.column.delete = Видалити стовпчик +projects.column.deletion_desc = Видалення стовпчика проєкту призведе до переміщення всіх пов'язаних із ним задач до стовпчика за замовчуванням. Продовжити? +issues.edit.already_changed = Не вдається зберегти зміни. Схоже, що хтось інший уже змінив вміст задачі. Оновіть сторінку і спробуйте відредагувати ще раз, щоб уникнути перезапису чужих змін +issues.label_templates.fail_to_load_file = Не вдалося завантажити файл шаблону міток «%s»: %v +issues.reaction.add = Додати реакцію +issues.reaction.alt_many = %[1]s і ще %[2]d реагують %[3]s. +issues.reaction.alt_remove = Прибрати реакцію %[1] з коментаря. +issues.reaction.alt_add = Додати реакцію %[1]s до коментаря. +issues.archived_label_description = (Архівна) %s +issues.delete.text = Ви дійсно хочете видалити цю задачу? (Весь її вміст буде остаточно видалено. Можливо, варто її закрити і зберегти в архіві) +pulls.edit.already_changed = Не вдається зберегти зміни. Схоже, що хтось інший уже змінив вміст запиту на злиття. Оновіть сторінку і спробуйте відредагувати ще раз, щоб уникнути перезапису чужих змін +pulls.allow_edits_from_maintainers = Дозволити редагування від супроводжувачів +pulls.showing_only_single_commit = Показано тільки зміни коміту %[1]s +pulls.showing_specified_commit_range = Показано тільки зміни між %[1]s..%[2]s +pulls.blocked_by_approvals = Цей запит на злиття ще не має достатньої кількості схвалень. Отримано %d з %d схвалень. +pulls.blocked_by_rejection = Цей запит на злиття містить зміни, запропоновані офіційним рецензентом. +pulls.blocked_by_official_review_requests = Цей запит на злиття заблоковано, оскільки йому бракує схвалення від одного або кількох офіційних рецензентів. +pulls.blocked_by_outdated_branch = Цей запит на злиття заблоковано, оскільки він застарів. +pulls.blocked_by_changed_protected_files_1 = Цей запит на злиття заблоковано, оскільки він змінює захищений файл: +pulls.blocked_by_changed_protected_files_n = Цей запит на злиття заблоковано, оскільки він змінює захищені файли: +pulls.auto_merge_newly_scheduled = Заплановано об'єднати запит на злиття після успішного завершення всіх перевірок. +pulls.auto_merge_has_pending_schedule = %[1]s планує автоматично об'єднати цей запит на злиття після успішного завершення всіх перевірок %[2]s. +pulls.auto_merge_newly_scheduled_comment = `планує автоматично об'єднати цей запит на злиття після успішного завершення всіх перевірок %[1]s` +pulls.auto_merge_canceled_schedule_comment = `скасовує автоматичне об'єднання цього запиту на злиття після успішного завершення всіх перевірок %[1]s` +pulls.delete.text = Ви дійсно хочете видалити цей запит на злиття? (Весь його вміст буде остаточно видалено. Можливо, варто його закрити і зберегти в архіві) +comments.edit.already_changed = Не вдається зберегти зміни. Схоже, що хтось інший уже змінив вміст коментаря. Оновіть сторінку і спробуйте відредагувати ще раз, щоб уникнути перезапису чужих змін +signing.wont_sign.pubkey = Коміт не буде підписано, оскільки у вас немає публічного ключа, пов'язаного з вашим обліковим записом. +signing.wont_sign.twofa = Щоб підписувати коміти, у вас повинна бути ввімкнена двофакторна автентифікація. +signing.wont_sign.parentsigned = Цей коміт не буде підписано, оскільки не підписано батьківський коміт. +signing.wont_sign.basesigned = Злиття не буде підписано, оскільки не підписано базовий коміт. +signing.wont_sign.headsigned = Злиття не буде підписано, оскільки не підписано головний коміт. +signing.wont_sign.commitssigned = Злиття не буде підписано, оскільки всі пов'язані з ним коміти не підписані. +signing.wont_sign.approved = Злиття не буде підписано, оскільки запит на злиття не схвалено. +settings.mirror_settings.docs = Налаштуйте свій репозиторій на автоматичну синхронізацію комітів, тегів і гілок з іншим репозиторієм. +settings.mirror_settings.docs.disabled_pull_mirror.instructions = Налаштуйте свій проєкт на автоматичне надсилання комітів, тегів і гілок до іншого репозиторію. Pull-дзеркала вимкнено адміністратором сайту. +settings.mirror_settings.docs.disabled_push_mirror.instructions = Налаштуйте свій проєкт на автоматичне отримання комітів, тегів і гілок з іншого репозиторію. +settings.mirror_settings.docs.disabled_push_mirror.info = Push-дзеркала вимкнено адміністратором сайту. +settings.pulls.default_allow_edits_from_maintainers = За замовчуванням дозволити редагування від супроводжувачів +settings.authorization_header = Заголовок авторизації +settings.authorization_header_desc = За наявності буде включено як заголовок авторизації для запитів. Приклади: %s. +settings.ignore_stale_approvals = Ігнорувати застарілі схвалення + [graphs] contributors.what = внески component_loading_info = Це може зайняти деякий час… @@ -3020,7 +3073,7 @@ users.prohibit_login=Заблокований обліковий запис users.is_admin=Обліковий запис адміністратора users.is_restricted=Обмежений users.allow_git_hook=Може створювати Git-хуки -users.allow_git_hook_tooltip=Git хуки виконуються від імені користувача OS сервісу Forgejo і мають однаковий рівень доступу до хоста. Як результат, користувачі з доступом до Git-хуків можуть отримати доступ і змінювати всі репозиторії Forgejo, а також базу даних, що використовуються в Forgejo. Отже, вони також здатні отримати права адміністратора Forgejo. +users.allow_git_hook_tooltip=Git-хуки виконуються від імені користувача ОС, від якого запущено Forgejo, і мають той самий рівень доступу до хоста. Таким чином, користувачі зі спеціальними правами Git-хуків можуть отримати доступ і змінювати всі репозиторії Forgejo, а також базу даних Forgejo. Вони також здатні отримати права адміністратора Forgejo. users.allow_import_local=Може імпортувати локальні репозиторії users.allow_create_organization=Може створювати організації users.update_profile=Оновити обліковий запис @@ -3174,7 +3227,7 @@ auths.tip.discord=Зареєструйте новий додаток на %s auths.tip.yandex=Створіть новий додаток на %s. У розділі «Yandex.Passport API» виберіть такі дозволи: «Доступ до адреси електронної пошти», «Доступ до аватара» і «Доступ до імені користувача, імені та прізвища, статі» auths.tip.mastodon=Введіть URL спеціального екземпляра для екземпляра mastodon, який ви хочете автентифікувати за допомогою (або використовувати за замовчуванням) auths.edit=Редагувати джерело автентифікації -auths.activated=Це джерело авторизації активоване +auths.activated=Це джерело автентифікація активоване auths.update_success=Параметри аутентифікації оновлені. auths.update=Оновити джерело автентифікації auths.delete=Видалити джерело автентифікації @@ -3200,7 +3253,7 @@ config.repo_root_path=Шлях до кореня репозиторію config.lfs_root_path=Кореневий шлях LFS config.log_file_root_path=Шлях до лог файлу config.script_type=Тип скрипта -config.reverse_auth_user=Ім'я користувача для авторизації на reverse proxy +config.reverse_auth_user=Користувач для авторизації на зворотному проксі config.ssh_config=Конфігурація SSH config.ssh_enabled=Увімкнено @@ -3431,6 +3484,13 @@ auths.enable_ldap_groups = Увімкнути групи LDAP auths.oauth2_map_group_to_team_removal = Видаляти користувачів із синхронізованих команд, якщо користувачі не належать до відповідної групи. config.mailer_smtp_addr = Адреса SMTP +auths.new_success = Метод автентифікації «%s» додано. +auths.unable_to_initialize_openid = Не вдалося ініціалізувати постачальника OpenID Connect: %s +config.cache_test = Перевірити кеш +config.cache_test_failed = Не вдалося перевірити кеш: %v. +config.cache_test_slow = Перевірку кешу завершено успішно, але відповідь повільна: %s. +config.cache_test_succeeded = Перевірку кешу завершено успішно, відповідь отримано через %s. + [action] create_repo=створив(ла) репозиторій %s rename_repo=репозиторій перейменовано з %[1]s на %[3]s @@ -3712,7 +3772,7 @@ variables.management = Керування змінними variables.id_not_exist = Змінної з ідентифікатором %d не існує. variables.edit = Редагувати змінну runs.expire_log_message = Журнали очищено, тому що вони були занадто старі. -runs.empty_commit_message = (порожнє повідомлення коміта) +runs.empty_commit_message = (порожнє повідомлення коміту) runners.status.unspecified = Невідомо runs.status_no_select = Усі стани runs.status = Стан @@ -3836,6 +3896,8 @@ issues.read = Читати: дивитись і створювати за wiki.read = Читати: переглядати вбудовану вікі та її історію. actions.write = Писати: вручну запускати, перезапускати, скасовувати або схвалювати конвеєри CI/CD в очікуванні. +projects.write = Писати: створювати проєкти і стовпчики та редагувати їх. + [munits.data] pib = ПіБ eib = ЕіБ diff --git a/options/locale_next/locale_ar.json b/options/locale_next/locale_ar.json index a0fc1de24b..1574d3eb7c 100644 --- a/options/locale_next/locale_ar.json +++ b/options/locale_next/locale_ar.json @@ -5,5 +5,70 @@ "home.explore_users": "اكتشف المستخدمين", "home.explore_orgs": "اكتشف المنظمات", "moderation.abuse_category.malware": "برمجية خبيثة", - "moderation.abuse_category.illegal_content": "المحتوى غير المشروع" + "moderation.abuse_category.illegal_content": "محتوى غير مشروع", + "stars.list.none": "لم يقم أحد بتمييز هذا المستودع بنجمة.", + "watch.list.none": "لا أحد يشاهد هذا المستودع.", + "followers.incoming.list.self.none": "لا أحد يتابع ملفك الشخصي.", + "followers.incoming.list.none": "لا أحد يتابع هذا المستخدم.", + "followers.outgoing.list.self.none": "أنت لا تتبع أي شخص.", + "followers.outgoing.list.none": "لا يتابع %s أي شخص.", + "relativetime.now": "الآن", + "relativetime.future": "في المستقبل", + "relativetime.1day": "الأمس", + "relativetime.2days": "منذ يومين", + "relativetime.1week": "أخر أسبوع", + "relativetime.2weeks": "منذ أسبوعين", + "relativetime.1month": "الشهر الفائت", + "relativetime.2months": "منذ شهرين", + "relativetime.1year": "السنة الفائتة", + "relativetime.2years": "منذ سنتين", + "repo.form.cannot_create": "بلغت جميع المساحات التي يمكنك إنشاء مستودعات بها حدها.", + "repo.issue_indexer.title": "مفهرس الإبلاغات", + "search.milestone_kind": "معالم البحث…", + "incorrect_root_url": "تم تكوين هذه النسخة من Forgejo لتعمل على العنوان \"%s\". أنت تقوم حاليًا بتصفّح Forgejo عبر رابط مختلف، مما قد يتسبب في تعطل بعض أجزاء التطبيق. يتم تحديد الرابط الرسمي (canonical URL) من قِبل مسؤولي Forgejo من خلال إعداد `ROOT_URL` في ملف `app.ini`.", + "themes.names.forgejo-auto": "فورجيو (اتبع سمة النظام)", + "themes.names.forgejo-light": "فورجيجو المضيء", + "themes.names.forgejo-dark": "فورجيجو الداكن", + "error.not_found.title": "الصفحة غير موجودة", + "alert.asset_load_failed": "تعذّر تحميل ملفات الأصول من {path}. تأكد من أن الملفات متاحة للوصول.", + "alert.range_error": " يجب أن يكون رقمًا بين %[1]s و %[2]s.", + "install.invalid_lfs_path": "غير قادر على إنشاء جذر LFS في المسار المحدد: %[1]s", + "profile.actions.tooltip": "إجراءات إضافية", + "profile.edit.link": "عدِّل ملف التعريف", + "feed.atom.link": "موجز Atom", + "keys.ssh.link": "مفاتيح SSH", + "keys.gpg.link": "مفاتيح GPG", + "admin.config.moderation_config": "تهيئة الإشراف", + "moderation.report_abuse": "الإبلاغ عن إساءة الاستخدام", + "moderation.report_content": "محتوى التقارير", + "moderation.report_abuse_form.header": "الإبلاغ عن الإساءة إلى المسؤول", + "moderation.report_abuse_form.details": "يتعين استخدام هذا النموذج للإبلاغ عن المستخدمين الذين ينشئون ملفات تعريف ، أو مستودعات ، أو إبلاغات ، أو تعليقات ، أو يتصرفون بشكل غير لائق.", + "moderation.report_abuse_form.invalid": "معاملا غير صالحة", + "moderation.report_abuse_form.already_reported": "‍لقد قمت بالفعل بالإبلاغ عن هذا المحتوى", + "moderation.abuse_category": "الفئة", + "moderation.abuse_category.placeholder": "حدد الفئة", + "moderation.abuse_category.spam": "غير مرغوب به", + "moderation.abuse_category.other_violations": "انتهاكات أخرى لقواعد المنصة", + "moderation.report_remarks": "الملاحظات", + "moderation.report_remarks.placeholder": "يُرجى تقديم بعض التفاصيل المتعلقة بالإساءة التي أبلغت عنها.", + "moderation.submit_report": "إرسال التقرير", + "moderation.reporting_failed": "تعذر إرسال تقرير إساءة الاستخدام الجديد: %v", + "moderation.reported_thank_you": "شكراُ لك على تقريرك. وقد تم إبلاغ الإدارة به.", + "mail.actions.successful_run_after_failure_subject": "تم استعادة سير العمل %[1]s في المستودع %[2]s", + "mail.actions.not_successful_run_subject": "سير العمل %[1]s فشل في المستودت %[2]s", + "mail.actions.successful_run_after_failure": "تم استعادة سير العمل %[1]s في المستودع %[2]s", + "mail.actions.not_successful_run": "فشل سير العمل %[1]s في المستودع %[2]s", + "mail.actions.run_info_cur_status": "حالة هذا التشغيل: %[1]s (تم تحديثها من %[2]s للتو)", + "mail.actions.run_info_previous_status": "حالة التشغيل السابقة: %[1]s", + "mail.actions.run_info_sha": "إيداع: %[1]s", + "mail.actions.run_info_trigger": "تم تشغيله بسبب: %[1]s عبر: %[2]s", + "repo.diff.commit.next-short": "التالي", + "repo.diff.commit.previous-short": "السابق", + "discussion.locked": "تم إغلاق هذه المناقشة. يقتصر التعليق على المساهمين فقط.", + "editor.textarea.tab_hint": "السطر مُزاح بالفعل. اضغط Tab مرة أخرى أو Escape لمغادرة المحرر.", + "editor.textarea.shift_tab_hint": "لا توجد مسافة بادئة في هذا السطر. اضغط Shift + Tab مرة أخرى أو Escape لمغادرة المحرر.", + "admin.dashboard.cleanup_offline_runners": "تنظيف وحدات التشغيل غير المتصلة", + "settings.visibility.description": "رؤية ملفك الشخصي تؤثر في قدرة الآخرين على الوصول إلى مستودعاتك غير الخاصة. اعرف المزيد", + "avatar.constraints_hint": "لا يمكن أن يتجاوز حجم الصورة الشخصية المخصصة %[1]s، ولا أبعادها عن %[2]d×%[3]d بكسل", + "meta.last_line": "شكرًا لك على ترجمة Forgejo! هذا السطر لا يراه المستخدمون ولكنه يخدم أغراضًا أخرى في إدارة الترجمة. يمكنك وضع حقيقة ممتعة في الترجمة بدلاً من ترجمتها." } diff --git a/options/locale_next/locale_be.json b/options/locale_next/locale_be.json index 40dfec0b41..c8ff00bd87 100644 --- a/options/locale_next/locale_be.json +++ b/options/locale_next/locale_be.json @@ -1,3 +1,8 @@ { - "moderation.abuse_category.malware": "Шкодная праграма" + "moderation.abuse_category.malware": "Шкодная праграма", + "home.welcome.no_activity": "Няма падзей", + "home.welcome.activity_hint": "У вашай стужцы пакуль што нічога няма. Вашыя дзеяньні ды падзеі з рэпазыторыяў зьявяцца тут.", + "home.explore_repos": "Агляд рэпазыторыяў", + "home.explore_users": "Агляд карыстальнікаў", + "home.explore_orgs": "Агляд арганізацый" } diff --git a/options/locale_next/locale_de-DE.json b/options/locale_next/locale_de-DE.json index a582efdc27..c64e25b242 100644 --- a/options/locale_next/locale_de-DE.json +++ b/options/locale_next/locale_de-DE.json @@ -91,11 +91,11 @@ "followers.outgoing.list.none": "%s folgt niemanden.", "stars.list.none": "Niemand hat dieses Repo favorisiert.", "followers.incoming.list.none": "Niemand folgt diesem Benutzer.", - "editor.textarea.tab_hint": "Zeile bereits eingerückt. Drücke nochmals Tab oder Escape um den Editor zu verlassen.", - "editor.textarea.shift_tab_hint": "Keine Einrückung auf dieser Zeile. Drücke nochmals Shift + Tab oder Escape um den Editor zu verlassen.", - "admin.dashboard.cleanup_offline_runners": "Aufräumen der offline Runner", + "editor.textarea.tab_hint": "Zeile bereits eingerückt. Drücke nochmals Tab oder Escape, um den Editor zu verlassen.", + "editor.textarea.shift_tab_hint": "Keine Einrückung auf dieser Zeile. Drücke nochmals Shift + Tab oder Escape, um den Editor zu verlassen.", + "admin.dashboard.cleanup_offline_runners": "Aufräumen der Offline-Runner", "settings.visibility.description": "Die Profilsichtbarkeit beeinflusst die Möglichkeit anderer, auf deine nicht-privaten Repositorys zuzugreifen. Erfahre mehr", - "avatar.constraints_hint": "Individuelles Profilbild darf %[1]s in der Größe nicht überschreiten, und nicht größer als %[2]dx%[3]d Pixel sein", + "avatar.constraints_hint": "Individuelles Profilbild darf %[1]s in der Größe nicht überschreiten, und nicht größer als %[2]d×%[3]d Pixel sein", "repo.diff.commit.next-short": "Nächste", "repo.diff.commit.previous-short": "Vorherige", "profile.edit.link": "Profil bearbeiten", diff --git a/options/locale_next/locale_fil.json b/options/locale_next/locale_fil.json index 884a7b44eb..20b35b8edb 100644 --- a/options/locale_next/locale_fil.json +++ b/options/locale_next/locale_fil.json @@ -1,6 +1,6 @@ { "repo.pulls.merged_title_desc": { - "one": "isinali ang %[1]d commit mula%[2]s patungong %[3]s %[4]s", + "one": "isinali ang %[1]d commit mula %[2]s patungong %[3]s %[4]s", "other": "isinali ang %[1]d mga commit mula sa %[2]s patungong %[3]s %[4]s" }, "repo.pulls.title_desc": { @@ -21,7 +21,7 @@ "alert.asset_load_failed": "Nabigong i-load ang mga asset file mula sa {path}. Siguraduhin na maa-access ang mga asset file.", "install.invalid_lfs_path": "Nabigong gawin ang LFS root sa tinakdang path: %[1]s", "alert.range_error": " dapat ay numero sa pagitan ng %[1]s at %[2]s.", - "meta.last_line": "Every day, I imagine a future where I can be with you. In my hand is a pen that will write a poem of me and you. The ink flows down into a dark puddle... Just move your hand, write the way into his heart. But in this world of infinite choices. What will it take just to find that special day? Have I found everybody a fun assignment to do today? When you're here, everything that we do is fun for them anyway... When I can't even read my own feelings. What good are words when a smile says it all? And if this world won't write me an ending... What will it take just for me to have it all? Does my pen only write bitter words for those who are dear to me? Is it love if I take you, or is it love if I set you free? The ink flows down into a dark puddle... How can I write love into reality? If I can't hear the sound of your heartbeat What do you call love in your reality? And in your reality, if I don't know how to love you... I'll leave you be.", + "meta.last_line": "Every day, I imagine a future where I can be with you. In my hand is a pen that will write a poem of me and you. The ink flows down into a dark puddle... Just move your hand, write the way into his heart. But in this world of infinite choices, what will it take just to find that special day? Have I found everybody a fun assignment to do today? When you're here, everything that we do is fun for them anyway... When I can't even read my own feelings, what good are words when a smile says it all? And if this world won't write me an ending, what will it take just for me to have it all? Does my pen only write bitter words for those who are dear to me? Is it love if I take you, or is it love if I set you free? The ink flows down into a dark puddle... How can I write love into reality? If I can't hear the sound of your heartbeat, what do you call love in your reality? And in your reality, if I don't know how to love you... I'll leave you be.", "mail.actions.successful_run_after_failure": "Na-recover ang workflow na %[1]s sa repositoryong %[2]s", "mail.actions.not_successful_run": "Nabigo ang workflow na %[1]s sa repositoryong %[2]s", "mail.actions.run_info_previous_status": "Nakaraang Status ng Run: %[1]s", @@ -102,5 +102,6 @@ "feed.atom.link": "Atom feed", "keys.ssh.link": "Mga SSH key", "keys.gpg.link": "Mga GPG key", - "profile.actions.tooltip": "Higit pang mga aksyon" + "profile.actions.tooltip": "Higit pang mga aksyon", + "mail.actions.run_info_sha": "Commit: %[1]s" } diff --git a/options/locale_next/locale_pt-PT.json b/options/locale_next/locale_pt-PT.json index 8697bbaec0..5d68db624b 100644 --- a/options/locale_next/locale_pt-PT.json +++ b/options/locale_next/locale_pt-PT.json @@ -84,7 +84,7 @@ "moderation.abuse_category": "Categoria", "moderation.abuse_category.placeholder": "Escolha uma categoria", "moderation.abuse_category.spam": "Spam", - "moderation.abuse_category.malware": "Malware", + "moderation.abuse_category.malware": "Software malicioso", "moderation.abuse_category.illegal_content": "Conteúdo ilegal", "moderation.abuse_category.other_violations": "Outras violações das regras da plataforma", "moderation.report_remarks": "Observações", @@ -110,5 +110,6 @@ "keys.ssh.link": "Chaves SSH", "keys.gpg.link": "Chaves GPG", "repo.diff.commit.next-short": "Seg.", - "repo.diff.commit.previous-short": "Ant." + "repo.diff.commit.previous-short": "Ant.", + "mail.actions.run_info_sha": "Cometimento: %[1]s" } diff --git a/options/locale_next/locale_ru-RU.json b/options/locale_next/locale_ru-RU.json index 2b743ad8a5..e49eb79ca2 100644 --- a/options/locale_next/locale_ru-RU.json +++ b/options/locale_next/locale_ru-RU.json @@ -23,7 +23,7 @@ "alert.asset_load_failed": "Не удалось получить ресурсы из {path}. Убедитесь, что файлы ресурсов доступны.", "install.invalid_lfs_path": "Не удалось расположить корень LFS по указанному пути: %[1]s", "alert.range_error": " - число должно быть в диапазоне от %[1]s-%[2]s.", - "meta.last_line": "Unskip..", + "meta.last_line": "...ъъ", "mail.actions.not_successful_run_subject": "Провал раб. потока %[1]s в репозитории %[2]s", "mail.actions.successful_run_after_failure_subject": "Возобновление раб. потока %[1]s в репозитории %[2]s", "mail.actions.run_info_ref": "Ветвь: %[1]s (%[2]s)", diff --git a/options/locale_next/locale_zh-CN.json b/options/locale_next/locale_zh-CN.json index 9fc38dae15..743cced8c1 100644 --- a/options/locale_next/locale_zh-CN.json +++ b/options/locale_next/locale_zh-CN.json @@ -78,5 +78,6 @@ "repo.diff.commit.next-short": "下一个", "repo.diff.commit.previous-short": "上一个", "feed.atom.link": "Atom 订阅源", - "profile.edit.link": "编辑个人资料" + "profile.edit.link": "编辑个人资料", + "mail.actions.run_info_sha": "提交:%[1]s" } From dd3f24deef1da119c5030750e1a508d7d389fb4a Mon Sep 17 00:00:00 2001 From: oliverpool Date: Thu, 17 Jul 2025 12:31:38 +0200 Subject: [PATCH 164/495] fix: storage(minio): prevent io.Reader close (#8541) Fixes #8529, reverts #8527. I was able to reproduce the problem in a test: - it triggered only when the reader was an io.Reader - and the size was provided (-1 takes another code path in minio) https://codeberg.org/oliverpool/forgejo/commit/287b1f21e1e5fc3513fcca4eb21ee4607520813c should fail when running: ``` docker run --rm -e MINIO_DOMAIN=minio -e MINIO_ROOT_USER=123456 -e MINIO_ROOT_PASSWORD=12345678 -p 9000:9000 data.forgejo.org/oci/bitnami/minio:2024.8.17 ``` and ``` TEST_MINIO_ENDPOINT=localhost:9000 go test -v -run ^TestMinioStorageIterator$ ./modules/storage ``` ### Tests - I added test coverage for Go changes... - [x] in their respective `*_test.go` for unit tests. - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server. ### Documentation - [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [x] I do not want this change to show in the release notes. - [ ] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/.md` to be be used for the release notes instead of the title. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8541 Reviewed-by: Michael Kriese Reviewed-by: Earl Warren Co-authored-by: oliverpool Co-committed-by: oliverpool --- modules/storage/minio.go | 2 +- modules/storage/storage_test.go | 36 +++++++++++++++------ routers/api/packages/container/container.go | 16 ++++++--- 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/modules/storage/minio.go b/modules/storage/minio.go index bf51a1642a..424000a0d8 100644 --- a/modules/storage/minio.go +++ b/modules/storage/minio.go @@ -209,7 +209,7 @@ func (m *MinioStorage) Save(path string, r io.Reader, size int64) (int64, error) m.ctx, m.bucket, m.buildMinioPath(path), - r, + io.NopCloser(r), // prevent minio from closing the reader size, minio.PutObjectOptions{ ContentType: "application/octet-stream", diff --git a/modules/storage/storage_test.go b/modules/storage/storage_test.go index af3dd9520e..76589d941a 100644 --- a/modules/storage/storage_test.go +++ b/modules/storage/storage_test.go @@ -5,6 +5,7 @@ package storage import ( "bytes" + "io" "testing" "forgejo.org/modules/setting" @@ -13,22 +14,39 @@ import ( "github.com/stretchr/testify/require" ) +type spyCloser struct { + io.Reader + closed int +} + +func (s *spyCloser) Close() error { + s.closed++ + return nil +} + +var _ io.ReadCloser = &spyCloser{} + func testStorageIterator(t *testing.T, typStr Type, cfg *setting.Storage) { l, err := NewStorage(typStr, cfg) require.NoError(t, err) - testFiles := [][]string{ - {"a/1.txt", "a1"}, - {"/a/1.txt", "aa1"}, // same as above, but with leading slash that will be trim - {"ab/1.txt", "ab1"}, - {"b/1.txt", "b1"}, - {"b/2.txt", "b2"}, - {"b/3.txt", "b3"}, - {"b/x 4.txt", "bx4"}, + testFiles := []struct { + path, content string + size int64 + }{ + {"a/1.txt", "a1", -1}, + {"/a/1.txt", "aa1", -1}, // same as above, but with leading slash that will be trim + {"ab/1.txt", "ab1", 3}, + {"b/1.txt", "b1", 2}, // minio closes when the size is set + {"b/2.txt", "b2", -1}, + {"b/3.txt", "b3", -1}, + {"b/x 4.txt", "bx4", -1}, } for _, f := range testFiles { - _, err = l.Save(f[0], bytes.NewBufferString(f[1]), -1) + sc := &spyCloser{bytes.NewBufferString(f.content), 0} + _, err = l.Save(f.path, sc, f.size) require.NoError(t, err) + assert.Equal(t, 0, sc.closed) } expectedList := map[string][]string{ diff --git a/routers/api/packages/container/container.go b/routers/api/packages/container/container.go index 9a7fd03aa8..117fc6ab88 100644 --- a/routers/api/packages/container/container.go +++ b/routers/api/packages/container/container.go @@ -399,7 +399,12 @@ func EndUploadBlob(ctx *context.Context) { } return } - defer uploader.Close() + doClose := true + defer func() { + if doClose { + uploader.Close() + } + }() if ctx.Req.Body != nil { if err := uploader.Append(ctx, ctx.Req.Body); err != nil { @@ -432,10 +437,11 @@ func EndUploadBlob(ctx *context.Context) { return } - // There was a strange bug: the "Close" fails with error "close .../tmp/package-upload/....: file already closed" - // AFAIK there should be no other "Close" call to the uploader between NewBlobUploader and this line. - // At least it's safe to call Close twice, so ignore the error. - _ = uploader.Close() + doClose = false + if err := uploader.Close(); err != nil { + apiError(ctx, http.StatusInternalServerError, err) + return + } if err := container_service.RemoveBlobUploadByID(ctx, uploader.ID); err != nil { apiError(ctx, http.StatusInternalServerError, err) From 5645456cac9860036579ba0f242ba42a5cfdfcca Mon Sep 17 00:00:00 2001 From: forgejo-release-manager Date: Thu, 17 Jul 2025 16:25:09 +0200 Subject: [PATCH 165/495] chore(release-notes): Forgejo v12.0.0 (#8540) https://codeberg.org/forgejo/forgejo/milestone/12836 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8540 Reviewed-by: 0ko <0ko@noreply.codeberg.org> Co-authored-by: forgejo-release-manager Co-committed-by: forgejo-release-manager --- release-notes-published/12.0.0.md | 476 ++++++++++++++++++++++++++++++ 1 file changed, 476 insertions(+) diff --git a/release-notes-published/12.0.0.md b/release-notes-published/12.0.0.md index e69de29bb2..6d83eef3c5 100644 --- a/release-notes-published/12.0.0.md +++ b/release-notes-published/12.0.0.md @@ -0,0 +1,476 @@ + + + + +## Release notes + +- Breaking security features + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7924): remove API authentication methods that uses the URL query. They are disabled by default and this only has an impact if `[security].DISABLE_QUERY_AUTH_TOKEN=false` is explicitly set. [Read more in the v12.0 companion blog post](https://forgejo.org/2025-07-release-v12-0/#removing-deprecated-api-authentication-methods). +- Security features + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7829): relax email requirements. [Read more in the v12.0 companion blog post](https://forgejo.org/2025-07-release-v12-0/#relaxing-the-requirements-on-email-addresses). + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7693): consider WebAuthn & SSH for instance signing. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/6897): add SSH signing support for instances. [Read more in the v12.0 companion blog post](https://forgejo.org/2025-07-release-v12-0/#instance-signing-with-ssh). +- Breaking features + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8035): The `forgejo docs` command is deprecated and CLI errors are now displayed on stderr instead of stdout. These breaking changes happened because the package used to parse the command line arguments was [upgraded from v2 to v3](https://cli.urfave.org/migrate-v2-to-v3/). A [separate project was initiated](https://github.com/urfave/cli-docs) to re-implement the `docs` command, but it is not yet production ready. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7745): remove the legacy `TEST_CONFLICTING_PATCHES_WITH_GIT_APPLY` setting +- Breaking bug fixes + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8139): fail if `sha` is not provided to the `POST /repos/{owner}/{repo}/contents` API endpoint. Although it was documented to be required, it was not enforced and clients that do not set the `sha` will no longer succeed. +- User Interface features + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8185): transform fediverse handles (ex. @forgejo@floss.social and !forgejo@programming.dev) into links to https://fedirect.toolforge.org. [Read more in the v12.0 companion blog post](https://forgejo.org/2025-07-release-v12-0/#redirecting-fediverse-handles). + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8121): add user visibility description in the settings page. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8111): add model viewer for `.glb` (GLTF) model in file view. [Read more in the v12.0 companion blog post](https://forgejo.org/2025-07-release-v12-0/#gltf-viewer). + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7998): show size constraints of custom avatar. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7992): add links to milestones and projects in issue comments. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7958): global styling for the kbd tag. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7947): hints in empty usercards lists. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7906): the user profile has been redesigned. The most notable change is that actions have been moved to a dropdown and several new actions were added. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7531): improve the description in the packages settings. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7516): inline public ssh key in verification command. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7481): use switch element for markdown editor modes. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7388): make JS asset load error message translatable. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7385): improve performances by using `git switch -c` instead of `git checkout -b`. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7377): clarify the desired autocompletion type for the clone address in migrations. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7373): improve the clarity of the migration description textarea. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7361): automatically refresh workflows in the "Actions" list. [Read more in the v12.0 companion blog post](https://forgejo.org/2025-07-release-v12-0/#automatically-refreshing-workflows). + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7274): improve error pages. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7155): improve the user experience to review individual commits in a pull request. [Read more in the v12.0 companion blog post](https://forgejo.org/2025-07-release-v12-0/#improved-ux-for-per-commit-reviews). + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7128): use the available screen width when displaying Forgejo Actions logs. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/6933): show if a commit is verified in the activity feed of a user or an organization. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/6813): reimplemented editor Tab key handling with accessibility safeguards. Balance having the editor work as expected by developers (with Tab key affecting indentation) while also not impeding keyboard navigation. [Read more in the v12.0 companion blog post](https://forgejo.org/2025-07-release-v12-0/#tabs-indentations-in-the-comment-editor) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/6795): redesign the migration selection page. +- User Interface bug fixes + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8417) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8514)): multiple ComboMarkdownEditors on one page interfere with each other. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7749) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8362)): pasting images into the comment editor will now show that image in the ‘dropzone’. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8296) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8317)): add missing trust status to pull review commits. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8246) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8282)): add missing lazy load attribute to images. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8067): retain sort type when viewing issue or pull requests. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7893): include enough activity for the entire heatmap. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7726): show warning in locked issue discussion. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7492): ensure consistent switch position in the markdown editor. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7420): display user-friendly message for range error. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7402): make limits clearer in the create repository form. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7307): don't put trailing slash in autogenerated name in the migration form. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7245): allow user with actions write permission to run a workflow from the web UI. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/6799): ensure usercards in grid have the same width. +- Localization + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8238) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8294)): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8178): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8077): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7969): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7895): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7819): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7742): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7637): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7572): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7507): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7438): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7363): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7275): i18n: update of translations from Codeberg Translate +- Features + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8179): new `GET /repos/{owner}/{repo}/git/blobs` API endpoint to retrieve multiple blobs at once. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8177): always publish the link to the commit status. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8143): improve the performances of the generation of bundled assets. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8115): enable `mlkem768x25519-sha256` by default for builtin ssh. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8070): support artifact uploads for OCI container packages. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8047): add `admin user reset-mfa` CLI command. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7988): update the list of ambigious characters. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7986): make Forgejo Actions server logs less noisy. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7968): allow searching issues by number, prioritize title matches when sorted by relevance. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7953): replace go-rpmutils library with our own. [Read more in the v12.0 companion blog post](https://forgejo.org/2025-07-release-v12-0/#forgejo-build-time-optimization). + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7902): configurable default units for mirrors. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7896): a repository administrator has control over reindexing the issues. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7803): auto cleanup of offline runners. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7727): improved performances when checking for conflicts on pull requests. [Read more in the v12.0 companion blog post](https://forgejo.org/2025-07-release-v12-0/#faster-conflict-checking). + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7716): allow access to publicly available `/api/v1/packages/{username}` without a token. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7699): implement the `GET /repos/{owner}/{repo}/actions/runs` and `GET /repos/{owner}/{repo}/actions/runs/{run_id}` API endpoints. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7527): use git-replay for rebasing for better performances. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7509): send mail on failed or recovered Forgejo Actions run. [Read more in the v12.0 companion blog post](https://forgejo.org/2025-07-release-v12-0/#forgejo-actions-email-notifications-on-failure). + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7508): Forgejo Actions failure, success, recover webhooks. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7418): add `last_commit_when` to API contents responses. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7387): include a default robots.txt to reduce the impact of crawlers. [Read more in the v12.0 companion blog post](https://forgejo.org/2025-07-release-v12-0/#default-robotstxt). + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7212): use XORM EngineGroup instead of single Engine connection. [Read more in the v12.0 companion blog post](https://forgejo.org/2025-07-release-v12-0/#xorm-enginegroup-connections-for-optimized-database-query-routing-and-load-balancing). + - [PR](https://codeberg.org/forgejo/forgejo/pulls/2364): sync forks. [Read more in the v12.0 companion blog post](https://forgejo.org/2025-07-release-v12-0/#keeping-forks-in-sync). +- Bug fixes + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8511) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8516)): pull requests were not blocked by review request for a whitelisted team. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8475) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8480)): several fixes of the ALT RPM package registry. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8391) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8459)): allow lowercase as well as uppercase token keyword in the auth header. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8450) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8454)): correctly mark reviews as stale for AGit pull requests. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8367) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8386)): user activation failed when an email address contained uppercase letters. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8330) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8349)): fix: load OldMilestone based on OldMilestoneID, not MilestoneID + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8037): omit Content-Length on 307 redirects when serving direct manifest for containers. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8034): fix a bug causing the PASCAL-modifier to return camel-case. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8028): remove the trailing slash from the issuer in OAuth claims. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8025): return the correct AGit type in ssh_info. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7932): fix url validation in the webhook add/edit API. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7930): add error reporting to pull requests with invalid Forgejo Actions workflow files. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7644): allow instance API URLs in release assets. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7604): improve the dashboard loading performances. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7454): fix a border case where it was not possible to cancel a pull request review. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7409): fix acme renewal. + - [PR](https://codeberg.org/forgejo/forgejo/pulls/6352): migrate Maven packages to "groupId:artifactId" name concatenation, regenerate metadata and fix missing groupId. +- Included for completeness but not worth a release note + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8534): i18n: update of translations from Codeberg Translate + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8530) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8532)): fix(packages): skip another stack frame from logging + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8527) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8528)): fix: ignore "Close" error when uploading container blob + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8524) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8526)): chore: failed authentication attempts are not errors and are displayed at the log info level + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8519) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8523)): fix: expanding exactly 20 lines between diff sections leaves visual artifact + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8301) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8518)): chore: use eventually for mysql collation test + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8492) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8498)): fix(code-search): HighlightSearchResultCode should count the number of bytes and not the number of runes + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8464) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8474)): fix: use parent context for new transactions + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8460) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8466)): chore: disable mismatched root URL e2e test for safari + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8461) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8463)): chore: do not navigate to same URL in E2E test + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8448) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8455)): fix(email): actions notification template confuses branch with PR + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8258) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8439)): fix: corrupted wiki unit default permission (#8234 follow-up) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8366) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8404)): fix: cancelled or skipped runs are not failures for notifications + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8400) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8402)): chore: improve reliability of webauthn e2e test + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8261) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8398)): fix: skip empty tokens in SearchOptions.Tokens() + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8374) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8390)): fix: disable Forgejo Actions email notifications on recovery + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8326) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8331)): fix: make API /repos/{owner}/{repo}/compare/{basehead} work with forks + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8320) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8321)): chore: sort blocked users list for determistic results + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8267) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8319)): fix: abuse reports string data types + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8304) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8318)): fix: pass doer's ID for CRUD instance signing + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8002) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8290)): fix(ui): release: name is overridden with tag name on edit + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8286) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8288)): Revert "fix(api): document `is_system_webhook` field (#7784)" + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8271) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8277)): CI debug: testSleep: show actual times on failures + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8268): chore: update security option in issue templates + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8260): Token.ParseIssueReference crashing on empty string + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8256): Update renovate to v41.1.4 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8253): Update renovate to v41 (forgejo) (major) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8252): add an index to the ActionRun.stopped column + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8250): bug: unify RepoActionRun and ActionRun structs + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8248): Update module github.com/go-chi/chi/v5 to v5.2.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8245): Downgrade playwright temporarily and allow running all e2e tests + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8243): git/blob use NewTruncatedReader for profile and codeowners + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8242): bug: Forgejo Actions email notifications are opt-in + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8236): prevent 500 message on invalid username + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8227): only send Forgejo Actions notifications to one user + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8226): chore: sort mailer messages in test assertion + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8224): chore(release-notes): Forgejo v11.0.2 + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8223): blob: GetBlobContent: reduce allocations + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8220): fix(tests): TestInitInstructions must use forEachObjectFormat + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8219): Update module code.forgejo.org/forgejo/act to v1.28.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8218): Update data.forgejo.org/oci/alpine Docker tag to v3.22 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8217): Update module github.com/minio/minio-go/v7 to v7.0.94 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8216): chore: migrate to `@stylistic/eslint-plugin` + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8215): Update dependency eslint-plugin-wc to v3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8214): fix(ui): issue comment anchor on time stamp + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8209): git_model.CommitStatusesHideActionsURL is obsolete + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8207): Remove 1ms delay before inserting list prefix, fix race condition in tests + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8205): chore: remove gopls in Makefile + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8202): do not check for `object_format_name` field + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8199): feat(ui): use kbd in label selector hint, remove enter + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8198): [gitea] week 2025-22 cherry pick (gitea/main -> forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8197): Fix sentence structure mentioning cooldown period + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8195): Lock file maintenance (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8194): Update renovate to v40.57.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8190): Update dependency chart.js to v4.5.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8188): make test suite run on older git version + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8186): Update module github.com/go-sql-driver/mysql to v1.9.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8183): Update environment-to-ini README + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8181): Update https://data.forgejo.org/forgejo/forgejo-build-publish action to v5.3.5 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8176): Dockerfile should re-use bindata files when possible + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8174): Update dependency minimatch to v10.0.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8172): use zstd.WithLowerEncoderMem for generate-bindata + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8168): do not mix urfave v2 with urfave v3 + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8166): chore(ci): skip tests if TEST_{MINIO_ENDPOINT,ELASTICSEARCH_URL} is not set + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8163): Update module gitlab.com/gitlab-org/api/client-go to v0.130.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8162): Update module github.com/minio/minio-go/v7 to v7.0.93 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8160): Update dependency postcss to v8.5.5 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8159): Update dependency minimatch to v10.0.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8157): chore(ci): use code.forgejo.org/forgejo/migration-test for migration tests + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8150): Update dependency happy-dom to v18 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8149): Update dependency typescript-eslint to v8.34.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8148): Update dependency @playwright/test to v1.53.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8147): Update ghcr.io/devcontainers/features/git-lfs Docker tag to v1.2.4 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8146): Update dependency postcss-nesting to v13.0.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8145): Update dependency @vitest/eslint-plugin to v1.2.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8144): chore: fix tests for old git versions + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8140): chore(ci): run additional tests in integration + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8137): Remove shebang from bash autocompletion + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8134): Make relative-time a self-maintaining custom element + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8129): create shell.nix; update flake.* + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8128): Update module connectrpc.com/connect to v1.18.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8127): Update dependency markdownlint-cli to v0.45.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8126): Update dependency eslint-plugin-regexp to v2.9.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8125): Update vitest monorepo to v3.2.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8118): Lock file maintenance (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8117): Update renovate to v40.48.4 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8112): remove download attribute from external assets + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8108): always render detailed team permissions table in sidebar + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8103): Update x/tools to v0.34.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8102): Update vitest monorepo to v3.2.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8101): Update module github.com/editorconfig-checker/editorconfig-checker/v3/cmd/editorconfig-checker to v3.3.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8099): Update linters (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8098): Update dependency happy-dom to v17.6.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8097): Update dependency @vitejs/plugin-vue to v5.2.4 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8096): Update dependency @axe-core/playwright to v4.10.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8094): show membership of limited orgs + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8091): Update module golang.org/x/crypto to v0.39.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8090): Update module github.com/sergi/go-diff to v1.4.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8086): Update dependency go to v1.24.4 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8078): Federated user activity following: Isolated model changes + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8066): rename api.{List,}ActionRun to api.{List,}RepoActionRun + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8065): Update module go.uber.org/mock/mockgen to v0.5.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8064): Update module github.com/blevesearch/bleve/v2 to v2.5.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8063): Update dependency vue to v3.5.16 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8062): Update dependency postcss to v8.5.4 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8061): chore: extract commit header template + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8058): chore: drop unused `misspell` + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8056): Update module code.forgejo.org/f3/gof3/v3 to v3.11.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8055): chore(renovate): disable indirect digest updates for stable + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8054): chore: drop unused `@typescript-eslint/parser` package + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8052): Update linters (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8051): Update dependency happy-dom to v17.6.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8050): chore(renovate): bump to v40.40.0 and disable v7 + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8049): CLI is forgejo not Forgejo + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8044): add missing bottom margin for verification-button in release view + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8041): [gitea] Always use an empty line to separate the commit message and trailer + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8040): [gitea] week 2025-21 cherry pick (gitea/main -> forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8038): Add a GNU Guix manifest + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8021): chore(cleanup): suppress non actionable XORM warnings + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8019): migrate repository.topics column for SQLite + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7994): chore(cleanup): replaces unnecessary calls to formatting functions by non-formatting equivalents + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7987): aggregate deleted team as ghost team + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7981): add validating user password as trace region + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7978): chore(cleanup): fix and simplify API comparison helper + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7975): fix(i18n): use correct base capitalization style + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7961): Lock file maintenance (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7959): Update renovate to v40.31.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7954): Update forgejo go-chi packages (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7952): Update module github.com/ProtonMail/go-crypto to v1.3.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7950): fix(ui): relative time elements were reset on htmx swap + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7945): `overflow-wrap` strategy in `.markup` CSS class + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7944): fix(ui): change escaping button bg on selected lines + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7933): do not unconditionally append $(GITEA_COMPATIBILITY) in version + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7925): fix(ui): center footer links + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7922): Update go-openapi packages (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7920): unify repository topics field by replacing JSON null with empty array + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7919): Update dependency webpack to v5.99.9 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7918): Update dependency sharp to v0.34.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7917): chore: QoL improvements to tests + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7914): chore(renovate): disable indirect major updates for stable branches + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7910): Update dependency clippie to v4.1.7 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7908): Lock file maintenance (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7907): Update renovate to v40.26.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7901): Update module github.com/yuin/goldmark to v1.7.12 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7898): chore(ui): cleanup unused color CSS + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7894): fix(ui): fix force-push compare line layout + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7890): Update module github.com/alecthomas/chroma/v2 to v2.18.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7884): parse `change-id` in the git commit header + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7881): Update module github.com/blevesearch/bleve/v2 to v2.5.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7879): Update dependency vue to v3.5.14 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7877): Migrate renovate config + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7872): fix(ui): disable autocapitalization/autocorrect for username inputs + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7868): fix(ui): disable spellcheck on TOTP form fields + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7866): chore: remove unused update-locales.sh + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7857): Update module github.com/msteinert/pam/v2 to v2.1.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7856): Update module code.forgejo.org/forgejo/act to v1.26.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7852): Fix TestSSHPushMirror/Normal/Check_mirrored_content test + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7849): Update github.com/golang-jwt/jwt/v4 (indirect) to v4.5.2 [SECURITY] (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7848): ci(renovate): only fail on error + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7847): Update module github.com/niklasfasching/go-org to v1.8.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7840): Lock file maintenance (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7835): remove redundant permission check in RemoveLabel + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7833): test(ui-e2e): fix flaky repo wiki test + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7830): Update module github.com/go-webauthn/webauthn to v0.13.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7822): chore(ui): clean up hashbox CSS, small design changes + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7817): replace ß with ss in normalizeUserName + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7814): Update dependency globals to v16.1.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7809): Update module golang.org/x/oauth2 to v0.30.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7807): Update dependency go to v1.24.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7799): add missing loadbalancing policies for EngineGroup connections + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7798): Update module golang.org/x/net to v0.40.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7797): Update module golang.org/x/image to v0.27.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7792): [skip ci] chore: remove backport script + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7789): Update module github.com/golangci/golangci-lint/v2/cmd/golangci-lint to v2.1.6 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7785): [SKIP CI] chore: update CODEOWNERS + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7784): fix(api): document `is_system_webhook` field + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7778): Lock file maintenance (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7777): Update renovate to v40 (forgejo) (major) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7776): Update renovate to v39.264.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7773): remove artificial delay for PR update + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7772): chore: Fix outdated usage of unittest.OverrideFixtures + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7770): Update module github.com/42wim/httpsig to v1.2.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7769): Update dependency @github/relative-time-element to v4.4.6 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7768): Update github.com/42wim/sshsig digest to 5100632 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7765): chore(release-notes): Forgejo v7.0.15 + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7764): chore(release-notes): Forgejo v11.0.1 + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7762): document that /repos/{owner}/{repo}/pulls may contain nulls + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7760): Update dependency forgejo/release-notes-assistant to v1.2.5 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7759): chore(renovate): use `gitea-releases` datasource for rna + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7758): chore(renovate): allow updating release notes assistant + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7746): fix(ui): improve force-push compare line layout + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7744): Update dependency eslint-plugin-unicorn to v59 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7740): fix(ui): multiple fixes of sync fork UI + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7739): Update module github.com/redis/go-redis/v9 to v9.8.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7738): Update module github.com/alecthomas/chroma/v2 to v2.17.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7736): Update linters (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7735): Update dependency happy-dom to v17.4.6 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7732): ci: add clarification regarding test label + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7731): chore: fix test to avoid data race + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7728): refactor & enhance AP elements used + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7720): chore(release): next-digest moved to invisible.forgejo.org + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7715): chore: replace `github.com/go-testfixtures/testfixtures` + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7714): enhance validateable interface + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7713): [gitea] week 2025-17 cherry pick (gitea/main -> forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7707): do not set GOPROXY=direct in Dockerfile* + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7705): chore(ui): remove unused fomantic font size classes + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7697): better comments and variable names for ActionRunNowDone + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7696): Lock file maintenance (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7695): Update renovate to v39.261.4 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7690): fix various typos + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7689): Update module github.com/yuin/goldmark to v1.7.11 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7687): chore: tune down remote user promotion debug message shown as error + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7685): use `linguist-generated` for language stats + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7683): set default restricted for OAuth2 user + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7682): chore: simplify `GetDiff` + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7680): chore: remove unused linters + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7678): add label for avatar settings + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7667): i18n(en): fix typo in archive notice + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7665): Update linters (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7663): Update dependency @playwright/test to v1.52.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7662): Update module github.com/PuerkitoBio/goquery to v1.10.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7661): Update module github.com/golangci/golangci-lint/v2/cmd/golangci-lint to v2.1.5 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7659): Update dependency webpack to v5.99.7 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7648): chore: merge tests.AddFixtures and unittest.OverrideFixtures + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7640): Remove "create branch" button on mirrored repos + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7616): fix(ui): make pagination labels always visible to screenreader + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7613): Update module mvdan.cc/gofumpt to v0.8.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7612): Update linters (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7611): Update vitest monorepo to v3.1.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7610): Update dependency @vitest/eslint-plugin to v1.1.43 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7607): Update module github.com/alecthomas/chroma/v2 to v2.17.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7606): Update module github.com/minio/minio-go/v7 to v7.0.91 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7602): [gitea] week 2025-16 cherry pick (gitea/main -> forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7597): delay-write trace.dat for forgejo diagnosis + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7588): Lock file maintenance (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7587): Update renovate to v39.252.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7580): feat(ui): enlarge metadata line gaps in issue list and refactor + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7579): i18n(en): add positional hints to sync_fork placeholders + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7578): fix(ui): overflow tabular menu CSS fixes + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7577): feat(ui): make fork related banners more consistent + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7575): fix(ui): use correct branch name in branch tag selector + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7573): Update dependency webpack to v5.99.6 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7571): fix(ui): show commit icon in branch dropdown button when viewing a commit + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7565): grammar in a release API error message + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7561): Update module github.com/caddyserver/certmagic to v0.23.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7560): Update module github.com/mattn/go-sqlite3 to v1.14.28 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7558): fix(ui): make tag dropdown clickable again + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7557): Update dependency python to v3.13.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7555): chore(release): v10.0 is EOL [skip ci] + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7554): chore(renovate): fix package name matching for go majors [skip ci] + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7552): Update module github.com/golangci/golangci-lint/v2/cmd/golangci-lint to v2.1.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7551): Update https://data.forgejo.org/actions/git-backporting action to v4.8.5 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7550): Update dependency chart.js to v4.4.9 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7545): Update Node.js to v22 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7543): match PackageBlob.HashBlake2b definition and migration + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7539): fix(UI): i18n: improve naming + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7538): [gitea] week 2025-15 cherry pick (gitea/main -> forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7534): Lock file maintenance (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7532): Update renovate to v39.240.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7528): Update module github.com/golangci/golangci-lint/v2/cmd/golangci-lint to v2.1.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7520): package_blob.has_blake2b may be null + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7512): chore: use `sharp` to generate images + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7510): chore: refactor for Actions Done Notification + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7505): Update module golang.org/x/tools/cmd/deadcode to v0.32.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7504): Update module golang.org/x/net to v0.39.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7503): Update dependency katex to v0.16.22 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7499): chore(i18n): update contributing documentation with JSON format + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7497): Update module golang.org/x/image to v0.26.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7495): Update module github.com/minio/minio-go/v7 to v7.0.90 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7494): Update dependency webpack to v5.99.5 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7491): Actions Done Notification + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7490): Update dependency webpack to v5.99.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7488): Update module go.uber.org/mock to v0.5.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7486): [gitea] week 2025-14 cherry pick (gitea/main -> forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7485): Update module golang.org/x/crypto to v0.37.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7484): Update renovate to v39.233.5 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7479): Minor grammatical fix to runner deletion message + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7475): Update module golang.org/x/oauth2 to v0.29.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7473): Update module github.com/fsnotify/fsnotify to v1.9.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7472): Update dependency clippie to v4.1.6 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7471): fix(ui): ensure dimmer always covers whole page + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7470): fix(ui): only run auth_name code on new and edit page + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7469): chore(release-notes): Forgejo v11.0.0 + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7468): Update module github.com/blevesearch/bleve/v2 to v2.5.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7467): Update dependency typescript to v5.8.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7465): Update dependency ansi_up to v6.0.5 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7463): chore: always enable webpack progress + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7462): chore(i18n): add a meta line to the base json translation + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7459): Update module github.com/alecthomas/chroma/v2 to v2.16.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7458): Update module code.gitea.io/sdk/gitea to v0.21.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7456): Update dependency ansi_up to v6.0.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7455): Makefile & BSDmakefile changes + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7453): chore(sec): unify usage of `crypto/rand.Read` + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7452): make installing Forgejo work again + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7451): chore(i18n): cleanup `settings.adopt` string + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7434): Update module github.com/mattn/go-sqlite3 to v1.14.27 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7433): feat(build): run lint-locale-usage w/o --allow-missing-msgids + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7431): make repo clone https/ssh listener conditional + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7429): feat(build): uniform ini parsing + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7425): feat(locale Iter): properly support trPluralString + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7424): Update module github.com/mattn/go-sqlite3 to v1.14.25 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7423): Update module github.com/go-webauthn/webauthn to v0.12.3 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7422): fix(i18n): fix several usages of i18n + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7421): fix(migrations): transfer PR flow information + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7419): chore: add empty `action_variable` fixture + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7417): Update dependency go to v1.24.2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7416): chore(ui): remove fomantic's dimmer module + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7414): chore(ui): remove ineffective class small in inline code preview + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7408): chore: enable several no-jquery rules + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7407): Update vitest monorepo to v3.1.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7406): Update linters to v8.29.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7400): Lock file maintenance (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7399): Update renovate to v39.222.1 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7397): [gitea] week 2025-13 cherry pick (gitea/main -> forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7396): chore: use dynamic id + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7394): use correct init instruction for sha256 + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7392): Lock file maintenance (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7391): Update github.com/google/pprof digest to a4b03ec (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7390): Accessibility: fix unreadable captcha with dark themes + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7384): Update linters (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7383): Update dependency yamllint to v1.37.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7382): Update vitest monorepo to v3.0.9 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7381): Update dependency @vitest/eslint-plugin to v1.1.38 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7379): prepend AppSubURL to visibility hint URLs + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7378): chore: improve repo migrate e2e test + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7376): chore(tests): fix testing failure caused by dep update + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7374): chore(tests): refactor migration form test + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7372): Update dependency eslint-plugin-unicorn to v58 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7371): chore: use correct import + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7367): Update module github.com/golangci/golangci-lint/cmd/golangci-lint to v2 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7366): Update https://data.forgejo.org/tj-actions/changed-files action to v46 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7362): Update module golang.org/x/net to v0.38.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7356): fix(ui): improve vertical alignment of icons with text in the overflow menu (#7314) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7355): 4108-empty-slice-encoded-to-null + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7350): refactor(cli): improve dump's temporary file handling + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7348): introduce gitNeeded bool in setup + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7344): fix(ui): Do not check for `vertical-align` + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7339): Update dependency mermaid to v11.6.0 (forgejo) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7337): chore: branding import path + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7314): fix(ui): improve vertical alignment of icons with text in the overflow menu + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7278): feat(build): lint-locale-usage should detect more Tr functions + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7271): feat(ui): improve button gap consistency, make it variable, larger on touchscreens + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7261): redirect to submodule instead of throwing 500 error when viewing submodule entry + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7203): add port and schema to federation host + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7092): feat(repo,locale): merge PR/issues cases for some repo/issue strings + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7035): enable HTTP signatures on all ActivityPub endpoints + - [PR](https://codeberg.org/forgejo/forgejo/pulls/6977): feat!: Abusive content reporting + - [PR](https://codeberg.org/forgejo/forgejo/pulls/6154): Replace the 'relative-time' element scripting with custom, translatable rewrite +- Already announced in the release notes of an older stable release + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8234): collaborator can edit wiki with write access + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8189): do not ignore automerge while a PR is checking for conflicts + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8170): erroneous list continuation on Cmd+Enter (#8153) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8155): do not fail when release or wiki is set in `/repos/migrate` API + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7979): pull request cross references + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7976): ignore expired artifacts for quota calculation + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7883): quote reply in Chromium + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7775): make hash pattern more strict + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7755): fix(sec): add tests for OAuth2 signup + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7752): fix(sec): only degrade permission check for git push + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7650): display the list of tasks in the runner edit page + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7594): fix(i18n): prevent incorrect logging on strings missing in JSON locales + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7584): fix(ui/pr): use eye icon for reviews + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7581): fix(ui): use gap in switch items + - [PR](https://codeberg.org/forgejo/forgejo/pulls/7395): validate input for default_{merge,update}_style + From 27e853454da6b9f2dc510a22a890924dbb7045ac Mon Sep 17 00:00:00 2001 From: Gusted Date: Thu, 17 Jul 2025 20:40:09 +0200 Subject: [PATCH 166/495] fix: use correct ACME default (#8550) - The `ACME_URL` setting is documented to default to Let's encrypt production server if left empty, so do precisely that. - Use a HTTP proxy to communicate with ACME if Forgejo is configured to use that. - Regression of forgejo/forgejo#7409 (previously certmagic took care of setting these defaults). - Resolves forgejo/forgejo#8548 ## Testing 1. Configure Forgejo's root URL to a public facing domain (that can pass a ACME challenge) 2. Configure Forgejo to use ACME by setting `[server].ENABLE_ACME = true` and `[server].ACME_ACCEPTTOS = true`. 3. Start Forgejo. 4. Observe that it's available via https. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8550 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- cmd/web_acme.go | 7 +++++++ modules/setting/server.go | 4 +++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/cmd/web_acme.go b/cmd/web_acme.go index 03b3b9f0da..be6314addb 100644 --- a/cmd/web_acme.go +++ b/cmd/web_acme.go @@ -15,6 +15,7 @@ import ( "forgejo.org/modules/graceful" "forgejo.org/modules/log" "forgejo.org/modules/process" + "forgejo.org/modules/proxy" "forgejo.org/modules/setting" "github.com/caddyserver/certmagic" @@ -76,6 +77,12 @@ func runACME(listenAddr string, m http.Handler) error { ListenHost: setting.HTTPAddr, AltTLSALPNPort: altTLSALPNPort, AltHTTPPort: altHTTPPort, + HTTPProxy: proxy.Proxy(), + } + + // Preserve behavior to use Let's encrypt test CA when Let's encrypt is CA. + if certmagic.DefaultACME.CA == certmagic.LetsEncryptProductionCA { + certmagic.DefaultACME.TestCA = certmagic.LetsEncryptStagingCA } magic := certmagic.NewDefault() diff --git a/modules/setting/server.go b/modules/setting/server.go index bff51f787d..3ff91d2cde 100644 --- a/modules/setting/server.go +++ b/modules/setting/server.go @@ -16,6 +16,8 @@ import ( "forgejo.org/modules/json" "forgejo.org/modules/log" "forgejo.org/modules/util" + + "github.com/caddyserver/certmagic" ) // Scheme describes protocol types @@ -206,7 +208,7 @@ func loadServerFrom(rootCfg ConfigProvider) { EnableAcme = sec.Key("ENABLE_LETSENCRYPT").MustBool(false) } if EnableAcme { - AcmeURL = sec.Key("ACME_URL").MustString("") + AcmeURL = sec.Key("ACME_URL").MustString(certmagic.LetsEncryptProductionCA) AcmeCARoot = sec.Key("ACME_CA_ROOT").MustString("") if sec.HasKey("ACME_ACCEPTTOS") { From c9949fbc6408907c426a3e8db5fd1e5460cf18fd Mon Sep 17 00:00:00 2001 From: Kumi Date: Fri, 18 Jul 2025 07:19:15 +0200 Subject: [PATCH 167/495] chore: improve the wording of the "not worth a release note" category (#8542) Hi all, I believe that open source projects in general are under-appreciated. And no matter how big or small, every contribution matters, whether it's the implementation of a shiny new feature or just taking the time to make sure that a dependency is updated to its latest patch release. I don't usually contribute to Forgejo, but we run an instance, and highly appreciate all of the work everyone involved is doing. As such, it kinda pains me to see the "Included for completeness but __not worth__ a release note" line (emphasis mine) in the release notes every time. More often than not, when clicking on one of those PRs, you'll see that people actually do put some thought into the changes hidden down there, there may even be more or less heated discussions about them, and even though these changes may not directly influence the user experience, they are an important part of running a project like this. As such, I propose changing that line to "Included for completeness but not user facing (chores, etc.)" (courtesy of @earl-warren on Matrix). It's a really really small change, but I think it matters. ## Checklist The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org). ### Tests Not applicable since there are no Go or JavaScript changes. - I added test coverage for Go changes... - [ ] in their respective `*_test.go` for unit tests. - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server. - I added test coverage for JavaScript changes... - [ ] in `web_src/js/*.test.js` if it can be unit tested. - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)). ### Documentation Since this is only a change to the wording of the release notes, no user documentation is required for this. - [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes This PR is certainly not worthy. - [x] I do not want this change to show in the release notes. - [ ] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/.md` to be be used for the release notes instead of the title. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8542 Reviewed-by: Earl Warren Co-authored-by: Kumi Co-committed-by: Kumi --- release-notes-assistant.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/release-notes-assistant.sh b/release-notes-assistant.sh index 89fd0833f5..4963edf286 100755 --- a/release-notes-assistant.sh +++ b/release-notes-assistant.sh @@ -64,7 +64,7 @@ function test_main() { test "$(categorize)" = 'ZE Other changes without a feature or bug label' test_payload_labels - test "$(categorize)" = 'ZF Included for completeness but not worth a release note' + test "$(categorize)" = 'ZF Included for completeness but not user-facing (chores, etc.)' test_payload_draft "fix(security)!: breaking security bug fix" test "$(categorize)" = 'AA Breaking security bug fixes' @@ -117,11 +117,12 @@ function categorize() { # # If there was no release-notes/N.md file and it is not - # worth a release note, just forget about it. + # directly user-facing, we include it in a separate section + # for completeness. # if test -z "$(jq --raw-output .Draft <$payload)"; then if ! $worth; then - echo -n ZF Included for completeness but not worth a release note + echo -n ZF Included for completeness but not user-facing \(chores, etc.\) exit 0 fi fi From 6e9b97e3776dc8fc73ffdeca879b95c46ed8be85 Mon Sep 17 00:00:00 2001 From: 0ko <0ko@noreply.codeberg.org> Date: Fri, 18 Jul 2025 13:13:45 +0200 Subject: [PATCH 168/495] fix(ui): prevent render failure on faulty org settings post (#8553) Fix regression of https://codeberg.org/forgejo/forgejo/pulls/7998 Same as https://codeberg.org/forgejo/forgejo/pulls/8236 but for orgs Amended existing tests to verify which error messages show up and not show up. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8553 Reviewed-by: Earl Warren Co-authored-by: 0ko <0ko@noreply.codeberg.org> Co-committed-by: 0ko <0ko@noreply.codeberg.org> --- routers/web/org/setting.go | 3 +++ tests/integration/org_settings_test.go | 14 +++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/routers/web/org/setting.go b/routers/web/org/setting.go index c83242754b..9b4e01597b 100644 --- a/routers/web/org/setting.go +++ b/routers/web/org/setting.go @@ -71,6 +71,9 @@ func SettingsPost(ctx *context.Context) { ctx.Data["PageIsSettingsOptions"] = true ctx.Data["CurrentVisibility"] = ctx.Org.Organization.Visibility ctx.Data["CooldownPeriod"] = setting.Service.UsernameCooldownPeriod + ctx.Data["MaxAvatarFileSize"] = setting.Avatar.MaxFileSize + ctx.Data["MaxAvatarWidth"] = setting.Avatar.MaxWidth + ctx.Data["MaxAvatarHeight"] = setting.Avatar.MaxHeight if ctx.HasError() { ctx.HTML(http.StatusOK, tplSettingsOptions) diff --git a/tests/integration/org_settings_test.go b/tests/integration/org_settings_test.go index fde57e2e26..3ea6f10bf6 100644 --- a/tests/integration/org_settings_test.go +++ b/tests/integration/org_settings_test.go @@ -57,7 +57,9 @@ func TestOrgSettingsChangeEmail(t *testing.T) { settings := getOrgSettingsFormData(t, session, orgName) settings["email"] = "invalid" - session.MakeRequest(t, NewRequestWithValues(t, "POST", settingsURL, settings), http.StatusOK) + doc := NewHTMLParser(t, session.MakeRequest(t, NewRequestWithValues(t, "POST", settingsURL, settings), http.StatusOK).Body) + doc.AssertElement(t, ".status-page-500", false) + doc.AssertElement(t, ".flash-error", true) org := getOrgSettings(t, token, orgName) assert.Equal(t, "org3@example.com", org.Email) @@ -69,7 +71,10 @@ func TestOrgSettingsChangeEmail(t *testing.T) { settings := getOrgSettingsFormData(t, session, orgName) settings["email"] = "example@example.com" - session.MakeRequest(t, NewRequestWithValues(t, "POST", settingsURL, settings), http.StatusSeeOther) + doc := NewHTMLParser(t, session.MakeRequest(t, NewRequestWithValues(t, "POST", settingsURL, settings), http.StatusSeeOther).Body) + doc.AssertElement(t, "body", true) + doc.AssertElement(t, ".status-page-500", false) + doc.AssertElement(t, ".flash-error", false) org := getOrgSettings(t, token, orgName) assert.Equal(t, "example@example.com", org.Email) @@ -81,7 +86,10 @@ func TestOrgSettingsChangeEmail(t *testing.T) { settings := getOrgSettingsFormData(t, session, orgName) settings["email"] = "" - session.MakeRequest(t, NewRequestWithValues(t, "POST", settingsURL, settings), http.StatusSeeOther) + doc := NewHTMLParser(t, session.MakeRequest(t, NewRequestWithValues(t, "POST", settingsURL, settings), http.StatusSeeOther).Body) + doc.AssertElement(t, "body", true) + doc.AssertElement(t, ".status-page-500", false) + doc.AssertElement(t, ".flash-error", false) org := getOrgSettings(t, token, orgName) assert.Empty(t, org.Email) From 88c3b6deada7debbb7557f66fa83dd826161ec83 Mon Sep 17 00:00:00 2001 From: 0ko <0ko@noreply.codeberg.org> Date: Fri, 18 Jul 2025 14:11:14 +0200 Subject: [PATCH 169/495] chore(release notes): squash repeating localization updates (#8547) Followup to https://codeberg.org/forgejo/forgejo/pulls/8540 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8547 Reviewed-by: Beowulf Reviewed-by: Gusted --- release-notes-published/12.0.0.md | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/release-notes-published/12.0.0.md b/release-notes-published/12.0.0.md index 6d83eef3c5..f52480cc88 100644 --- a/release-notes-published/12.0.0.md +++ b/release-notes-published/12.0.0.md @@ -53,19 +53,7 @@ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7245): allow user with actions write permission to run a workflow from the web UI. - [PR](https://codeberg.org/forgejo/forgejo/pulls/6799): ensure usercards in grid have the same width. - Localization - - [PR](https://codeberg.org/forgejo/forgejo/pulls/8238) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8294)): i18n: update of translations from Codeberg Translate - - [PR](https://codeberg.org/forgejo/forgejo/pulls/8178): i18n: update of translations from Codeberg Translate - - [PR](https://codeberg.org/forgejo/forgejo/pulls/8077): i18n: update of translations from Codeberg Translate - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7969): i18n: update of translations from Codeberg Translate - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7895): i18n: update of translations from Codeberg Translate - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7819): i18n: update of translations from Codeberg Translate - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7742): i18n: update of translations from Codeberg Translate - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7637): i18n: update of translations from Codeberg Translate - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7572): i18n: update of translations from Codeberg Translate - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7507): i18n: update of translations from Codeberg Translate - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7438): i18n: update of translations from Codeberg Translate - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7363): i18n: update of translations from Codeberg Translate - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7275): i18n: update of translations from Codeberg Translate + - Updates from Codeberg Translate: [#7275](https://codeberg.org/forgejo/forgejo/pulls/7275), [#7363](https://codeberg.org/forgejo/forgejo/pulls/7363), [#7438](https://codeberg.org/forgejo/forgejo/pulls/7438), [#7507](https://codeberg.org/forgejo/forgejo/pulls/7507), [#7572](https://codeberg.org/forgejo/forgejo/pulls/7572), [#7637](https://codeberg.org/forgejo/forgejo/pulls/7637), [#7742](https://codeberg.org/forgejo/forgejo/pulls/7742), [#7819](https://codeberg.org/forgejo/forgejo/pulls/7819), [#7895](https://codeberg.org/forgejo/forgejo/pulls/7895), [#7969](https://codeberg.org/forgejo/forgejo/pulls/7969), [#8077](https://codeberg.org/forgejo/forgejo/pulls/8077), [#8178](https://codeberg.org/forgejo/forgejo/pulls/8178), [#8294](https://codeberg.org/forgejo/forgejo/pulls/8294) (backport of [#8238](https://codeberg.org/forgejo/forgejo/pulls/8238)), [#8534](https://codeberg.org/forgejo/forgejo/pulls/8534) (backport of [#8295](https://codeberg.org/forgejo/forgejo/issues/8295), [#8410](https://codeberg.org/forgejo/forgejo/issues/8410), [#8490](https://codeberg.org/forgejo/forgejo/issues/8490)) - Features - [PR](https://codeberg.org/forgejo/forgejo/pulls/8179): new `GET /repos/{owner}/{repo}/git/blobs` API endpoint to retrieve multiple blobs at once. - [PR](https://codeberg.org/forgejo/forgejo/pulls/8177): always publish the link to the commit status. From eaea89b7f04f433b0c631d30f45cfe0277d7eeff Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Fri, 18 Jul 2025 16:09:25 +0200 Subject: [PATCH 170/495] chore(ci): cache release-notes-assistant working directory [skip ci] (#8556) to reduce the number of requests to the API to obtain each pull request to the minimum. - cache the working directory - upgrade to [v1.3.0](https://code.forgejo.org/forgejo/release-notes-assistant/releases/tag/v1.3.0) to get optimizations - use the oci:1 image to reduce the network load re-installing every time ## Testing - Pushed to https://codeberg.org/forgejo/forgejo/src/branch/wip-rna so that it gets access to the secrets - Manually triggered [to populate the cache](https://codeberg.org/forgejo/forgejo/actions/runs/89735) cutting the run time from ~2h to ~45min - Manually triggered [to verify the cache is reused](https://codeberg.org/forgejo/forgejo/actions/runs/89759) cutting the run time from ~45min to ~15min ![image](/attachments/3ae48d6d-0d38-4559-8544-f0bc71eb2040) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8556 Reviewed-by: Gusted Co-authored-by: Earl Warren Co-committed-by: Earl Warren --- .../release-notes-assistant-milestones.yml | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/.forgejo/workflows/release-notes-assistant-milestones.yml b/.forgejo/workflows/release-notes-assistant-milestones.yml index 7f77098357..0b8a416a02 100644 --- a/.forgejo/workflows/release-notes-assistant-milestones.yml +++ b/.forgejo/workflows/release-notes-assistant-milestones.yml @@ -5,32 +5,34 @@ on: - cron: '@daily' env: - RNA_VERSION: v1.2.5 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org + RNA_WORKDIR: /srv/rna + RNA_VERSION: v1.3.0 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org jobs: release-notes: if: vars.ROLE == 'forgejo-coding' runs-on: docker container: - image: 'data.forgejo.org/oci/node:22-bookworm' + image: 'data.forgejo.org/oci/ci:1' steps: - uses: https://data.forgejo.org/actions/checkout@v4 - - uses: https://data.forgejo.org/actions/setup-go@v5 + - uses: https://data.forgejo.org/actions/cache@v4 with: - go-version-file: "go.mod" - cache: false + key: rna-${{ env.RNA_VERSION }} + path: ${{ env.RNA_WORKDIR }} - - name: apt install jq + - name: install release-notes-assistant run: | - export DEBIAN_FRONTEND=noninteractive - apt-get update -qq - apt-get -q install -y -qq jq + set -x + wget -O /usr/local/bin/rna https://code.forgejo.org/forgejo/release-notes-assistant/releases/download/${{ env.RNA_VERSION}}/release-notes-assistant + chmod +x /usr/local/bin/rna - name: update open milestones run: | set -x - curl -sS $GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/milestones?state=open | jq -r '.[] | .title' | while read forgejo version ; do + mkdir -p ${{ env.RNA_WORKDIR }} + curl -sS $FORGEJO_SERVER_URL/api/v1/repos/$FORGEJO_REPOSITORY/milestones?state=open | jq -r '.[] | .title' | while read forgejo version ; do milestone="$forgejo $version" - go run code.forgejo.org/forgejo/release-notes-assistant@$RNA_VERSION --config .release-notes-assistant.yaml --storage milestone --storage-location "$milestone" --forgejo-url $GITHUB_SERVER_URL --repository $GITHUB_REPOSITORY --token ${{ secrets.RELEASE_NOTES_ASSISTANT_TOKEN }} release $version + rna --workdir ${{ env.RNA_WORKDIR }} --config .release-notes-assistant.yaml --storage milestone --storage-location "$milestone" --forgejo-url $FORGEJO_SERVER_URL --repository $FORGEJO_REPOSITORY --token ${{ secrets.RELEASE_NOTES_ASSISTANT_TOKEN }} release $version done From f27b46436cad293c7d03f64c71fdc88bd3a51ba3 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 18 Jul 2025 17:25:58 +0200 Subject: [PATCH 171/495] Update module github.com/golangci/golangci-lint/v2/cmd/golangci-lint to v2.2.2 (forgejo) (#8557) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 1db44e6f26..df23ec6fd2 100644 --- a/Makefile +++ b/Makefile @@ -39,7 +39,7 @@ XGO_VERSION := go-1.21.x AIR_PACKAGE ?= github.com/air-verse/air@v1 # renovate: datasource=go EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-checker/v3/cmd/editorconfig-checker@v3.3.0 # renovate: datasource=go GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.8.0 # renovate: datasource=go -GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.2.1 # renovate: datasource=go +GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.2.2 # renovate: datasource=go GXZ_PACKAGE ?= github.com/ulikunitz/xz/cmd/gxz@v0.5.11 # renovate: datasource=go SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.31.0 # renovate: datasource=go XGO_PACKAGE ?= src.techknowlogick.com/xgo@latest From fe6ba0c7c9da7ae295d3c87b38b4363084e9a928 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 18 Jul 2025 17:28:16 +0200 Subject: [PATCH 172/495] Update dependency vite-string-plugin to v1.4.6 (forgejo) (#8559) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index c41b1f6b7e..b379db27c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -99,7 +99,7 @@ "svgo": "4.0.0", "typescript": "5.8.3", "typescript-eslint": "8.35.1", - "vite-string-plugin": "1.3.4", + "vite-string-plugin": "1.4.6", "vitest": "3.2.4" }, "engines": { @@ -15255,9 +15255,9 @@ } }, "node_modules/vite-string-plugin": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/vite-string-plugin/-/vite-string-plugin-1.3.4.tgz", - "integrity": "sha512-mHvcooHgZ0nVbHtj9o+c5dzD2/nclr/SOG023EFYF/zRnO8bxB63bV9WUA9X+njlgLpOwCJ3LI2IdihKoi0gZQ==", + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/vite-string-plugin/-/vite-string-plugin-1.4.6.tgz", + "integrity": "sha512-Csjtny8/uVIynzlaRRj4RpHrPAakNwlH9jw6kgQ8tQhc2f0zzA6bCbAgWD0y84EgB8aLNrz7pZFUqSt3LOtk+w==", "dev": true, "license": "BSD-2-Clause" }, diff --git a/package.json b/package.json index f6e998a570..0b65f75026 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "svgo": "4.0.0", "typescript": "5.8.3", "typescript-eslint": "8.35.1", - "vite-string-plugin": "1.3.4", + "vite-string-plugin": "1.4.6", "vitest": "3.2.4" }, "browserslist": [ From bc4c1d64cbb31611752cc855cb9905d324287c7f Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 18 Jul 2025 17:41:12 +0200 Subject: [PATCH 173/495] Update x/tools to v0.35.0 (forgejo) (#8561) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- Makefile | 2 +- go.mod | 4 ++-- go.sum | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index df23ec6fd2..213d7f4b0b 100644 --- a/Makefile +++ b/Makefile @@ -45,7 +45,7 @@ SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.31.0 # renova XGO_PACKAGE ?= src.techknowlogick.com/xgo@latest GO_LICENSES_PACKAGE ?= github.com/google/go-licenses@v1.6.0 # renovate: datasource=go GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1 # renovate: datasource=go -DEADCODE_PACKAGE ?= golang.org/x/tools/cmd/deadcode@v0.34.0 # renovate: datasource=go +DEADCODE_PACKAGE ?= golang.org/x/tools/cmd/deadcode@v0.35.0 # renovate: datasource=go GOMOCK_PACKAGE ?= go.uber.org/mock/mockgen@v0.5.2 # renovate: datasource=go RENOVATE_NPM_PACKAGE ?= renovate@41.32.1 # renovate: datasource=docker packageName=data.forgejo.org/renovate/renovate diff --git a/go.mod b/go.mod index 1421f503fe..9e0f47f968 100644 --- a/go.mod +++ b/go.mod @@ -235,9 +235,9 @@ require ( go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect go.uber.org/zap/exp v0.3.0 // indirect - golang.org/x/mod v0.25.0 // indirect + golang.org/x/mod v0.26.0 // indirect golang.org/x/time v0.11.0 // indirect - golang.org/x/tools v0.34.0 // indirect + golang.org/x/tools v0.35.0 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/warnings.v0 v0.1.2 // indirect ) diff --git a/go.sum b/go.sum index cf10843262..db2a186d2c 100644 --- a/go.sum +++ b/go.sum @@ -597,8 +597,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= -golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= +golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -688,8 +688,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= -golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= +golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= +golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From fce430c6ba02f241a9b63b9fe4c91ab9ed921b03 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 18 Jul 2025 23:20:15 +0200 Subject: [PATCH 174/495] Update dependency @playwright/test to v1.54.1 (forgejo) (#8558) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8558 Reviewed-by: Otto Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 24 ++++++++++++------------ package.json | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index b379db27c7..fdcc21c71a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,7 +63,7 @@ "devDependencies": { "@axe-core/playwright": "4.10.2", "@eslint-community/eslint-plugin-eslint-comments": "4.5.0", - "@playwright/test": "1.53.2", + "@playwright/test": "1.54.1", "@stoplight/spectral-cli": "6.15.0", "@stylistic/eslint-plugin": "5.1.0", "@stylistic/stylelint-plugin": "3.1.3", @@ -2213,13 +2213,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.53.2", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.53.2.tgz", - "integrity": "sha512-tEB2U5z74ebBeyfGNZ3Jfg29AnW+5HlWhvHtb/Mqco9pFdZU1ZLNdVb2UtB5CvmiilNr2ZfVH/qMmAROG/XTzw==", + "version": "1.54.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.54.1.tgz", + "integrity": "sha512-FS8hQ12acieG2dYSksmLOF7BNxnVf2afRJdCuM1eMSxj6QTSE6G4InGF7oApGgDb65MX7AwMVlIkpru0yZA4Xw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.53.2" + "playwright": "1.54.1" }, "bin": { "playwright": "cli.js" @@ -12002,13 +12002,13 @@ } }, "node_modules/playwright": { - "version": "1.53.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz", - "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==", + "version": "1.54.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.1.tgz", + "integrity": "sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.53.2" + "playwright-core": "1.54.1" }, "bin": { "playwright": "cli.js" @@ -12021,9 +12021,9 @@ } }, "node_modules/playwright-core": { - "version": "1.53.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.2.tgz", - "integrity": "sha512-ox/OytMy+2w1jcYEYlOo1Hhp8hZkLCximMTUTMBXjGUA1KoFfiSZ+DU+3a739jsPY0yoKH2TFy9S2fsJas8yAw==", + "version": "1.54.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.1.tgz", + "integrity": "sha512-Nbjs2zjj0htNhzgiy5wu+3w09YetDx5pkrpI/kZotDlDUaYk0HVA5xrBVPdow4SAUIlhgKcJeJg4GRKW6xHusA==", "dev": true, "license": "Apache-2.0", "bin": { diff --git a/package.json b/package.json index 0b65f75026..b0ce447b2b 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "devDependencies": { "@axe-core/playwright": "4.10.2", "@eslint-community/eslint-plugin-eslint-comments": "4.5.0", - "@playwright/test": "1.53.2", + "@playwright/test": "1.54.1", "@stoplight/spectral-cli": "6.15.0", "@stylistic/eslint-plugin": "5.1.0", "@stylistic/stylelint-plugin": "3.1.3", From b705cfcdd8041e2d38c6b4a2d95043029ec3c97d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 19 Jul 2025 02:03:07 +0200 Subject: [PATCH 175/495] Update linters (forgejo) (#8560) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 185 ++++++++++++++++++++++------------------------ package.json | 8 +- 2 files changed, 91 insertions(+), 102 deletions(-) diff --git a/package-lock.json b/package-lock.json index fdcc21c71a..dbf23af045 100644 --- a/package-lock.json +++ b/package-lock.json @@ -65,13 +65,13 @@ "@eslint-community/eslint-plugin-eslint-comments": "4.5.0", "@playwright/test": "1.54.1", "@stoplight/spectral-cli": "6.15.0", - "@stylistic/eslint-plugin": "5.1.0", + "@stylistic/eslint-plugin": "5.2.0", "@stylistic/stylelint-plugin": "3.1.3", "@vitejs/plugin-vue": "6.0.0", "@vitest/coverage-v8": "3.2.4", "@vitest/eslint-plugin": "1.3.4", "@vue/test-utils": "2.4.6", - "eslint": "9.30.1", + "eslint": "9.31.0", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-array-func": "5.0.2", "eslint-plugin-import-x": "4.16.1", @@ -92,13 +92,13 @@ "markdownlint-cli": "0.45.0", "postcss-html": "1.8.0", "sharp": "0.34.3", - "stylelint": "16.21.1", + "stylelint": "16.22.0", "stylelint-declaration-block-no-ignored-properties": "2.8.0", "stylelint-declaration-strict-value": "1.10.11", "stylelint-value-no-unknown-custom-properties": "6.0.1", "svgo": "4.0.0", "typescript": "5.8.3", - "typescript-eslint": "8.35.1", + "typescript-eslint": "8.37.0", "vite-string-plugin": "1.4.6", "vitest": "3.2.4" }, @@ -1075,9 +1075,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", - "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", + "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1162,9 +1162,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.30.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.30.1.tgz", - "integrity": "sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==", + "version": "9.31.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.31.0.tgz", + "integrity": "sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==", "dev": true, "license": "MIT", "engines": { @@ -1198,19 +1198,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", - "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/@github/combobox-nav": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/@github/combobox-nav/-/combobox-nav-2.3.1.tgz", @@ -3089,18 +3076,18 @@ } }, "node_modules/@stylistic/eslint-plugin": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.1.0.tgz", - "integrity": "sha512-TJRJul4u/lmry5N/kyCU+7RWWOk0wyXN+BncRlDYBqpLFnzXkd7QGVfN7KewarFIXv0IX0jSF/Ksu7aHWEDeuw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.2.0.tgz", + "integrity": "sha512-RCEdbREv9EBiToUBQTlRhVYKG093I6ZnnQ990j08eJ6uRZh71DXkOnoxtTLfDQ6utVCVQzrhZFHZP0zfrfOIjA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/types": "^8.34.1", + "@typescript-eslint/types": "^8.37.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "estraverse": "^5.3.0", - "picomatch": "^4.0.2" + "picomatch": "^4.0.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3110,9 +3097,9 @@ } }, "node_modules/@stylistic/eslint-plugin/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -3585,17 +3572,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz", - "integrity": "sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.37.0.tgz", + "integrity": "sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.35.1", - "@typescript-eslint/type-utils": "8.35.1", - "@typescript-eslint/utils": "8.35.1", - "@typescript-eslint/visitor-keys": "8.35.1", + "@typescript-eslint/scope-manager": "8.37.0", + "@typescript-eslint/type-utils": "8.37.0", + "@typescript-eslint/utils": "8.37.0", + "@typescript-eslint/visitor-keys": "8.37.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -3609,7 +3596,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.35.1", + "@typescript-eslint/parser": "^8.37.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } @@ -3625,16 +3612,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.1.tgz", - "integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.37.0.tgz", + "integrity": "sha512-kVIaQE9vrN9RLCQMQ3iyRlVJpTiDUY6woHGb30JDkfJErqrQEmtdWH3gV0PBAfGZgQXoqzXOO0T3K6ioApbbAA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.35.1", - "@typescript-eslint/types": "8.35.1", - "@typescript-eslint/typescript-estree": "8.35.1", - "@typescript-eslint/visitor-keys": "8.35.1", + "@typescript-eslint/scope-manager": "8.37.0", + "@typescript-eslint/types": "8.37.0", + "@typescript-eslint/typescript-estree": "8.37.0", + "@typescript-eslint/visitor-keys": "8.37.0", "debug": "^4.3.4" }, "engines": { @@ -3650,14 +3637,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz", - "integrity": "sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.37.0.tgz", + "integrity": "sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.35.1", - "@typescript-eslint/types": "^8.35.1", + "@typescript-eslint/tsconfig-utils": "^8.37.0", + "@typescript-eslint/types": "^8.37.0", "debug": "^4.3.4" }, "engines": { @@ -3672,14 +3659,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz", - "integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.37.0.tgz", + "integrity": "sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.35.1", - "@typescript-eslint/visitor-keys": "8.35.1" + "@typescript-eslint/types": "8.37.0", + "@typescript-eslint/visitor-keys": "8.37.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3690,9 +3677,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz", - "integrity": "sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.37.0.tgz", + "integrity": "sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==", "dev": true, "license": "MIT", "engines": { @@ -3707,14 +3694,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz", - "integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.37.0.tgz", + "integrity": "sha512-SPkXWIkVZxhgwSwVq9rqj/4VFo7MnWwVaRNznfQDc/xPYHjXnPfLWn+4L6FF1cAz6e7dsqBeMawgl7QjUMj4Ow==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.35.1", - "@typescript-eslint/utils": "8.35.1", + "@typescript-eslint/types": "8.37.0", + "@typescript-eslint/typescript-estree": "8.37.0", + "@typescript-eslint/utils": "8.37.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -3731,9 +3719,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz", - "integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.37.0.tgz", + "integrity": "sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==", "dev": true, "license": "MIT", "engines": { @@ -3745,16 +3733,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz", - "integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.37.0.tgz", + "integrity": "sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.35.1", - "@typescript-eslint/tsconfig-utils": "8.35.1", - "@typescript-eslint/types": "8.35.1", - "@typescript-eslint/visitor-keys": "8.35.1", + "@typescript-eslint/project-service": "8.37.0", + "@typescript-eslint/tsconfig-utils": "8.37.0", + "@typescript-eslint/types": "8.37.0", + "@typescript-eslint/visitor-keys": "8.37.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3807,16 +3795,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz", - "integrity": "sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.37.0.tgz", + "integrity": "sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.35.1", - "@typescript-eslint/types": "8.35.1", - "@typescript-eslint/typescript-estree": "8.35.1" + "@typescript-eslint/scope-manager": "8.37.0", + "@typescript-eslint/types": "8.37.0", + "@typescript-eslint/typescript-estree": "8.37.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3831,13 +3819,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz", - "integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.37.0.tgz", + "integrity": "sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/types": "8.37.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -7302,9 +7290,9 @@ } }, "node_modules/eslint": { - "version": "9.30.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.30.1.tgz", - "integrity": "sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==", + "version": "9.31.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.31.0.tgz", + "integrity": "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7312,9 +7300,9 @@ "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.3.0", - "@eslint/core": "^0.14.0", + "@eslint/core": "^0.15.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.30.1", + "@eslint/js": "9.31.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -13850,9 +13838,9 @@ "license": "ISC" }, "node_modules/stylelint": { - "version": "16.21.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.21.1.tgz", - "integrity": "sha512-WCXdXnYK2tpCbebgMF0Bme3YZH/Rh/UXerj75twYo4uLULlcrLwFVdZTvTEF8idFnAcW21YUDJFyKOfaf6xJRw==", + "version": "16.22.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.22.0.tgz", + "integrity": "sha512-SVEMTdjKNV4ollUrIY9ordZ36zHv2/PHzPjfPMau370MlL2VYXeLgSNMMiEbLGRO8RmD2R8/BVUeF2DfnfkC0w==", "dev": true, "funding": [ { @@ -14936,15 +14924,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.35.1.tgz", - "integrity": "sha512-xslJjFzhOmHYQzSB/QTeASAHbjmxOGEP6Coh93TXmUBFQoJ1VU35UHIDmG06Jd6taf3wqqC1ntBnCMeymy5Ovw==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.37.0.tgz", + "integrity": "sha512-TnbEjzkE9EmcO0Q2zM+GE8NQLItNAJpMmED1BdgoBMYNdqMhzlbqfdSwiRlAzEK2pA9UzVW0gzaaIzXWg2BjfA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.35.1", - "@typescript-eslint/parser": "8.35.1", - "@typescript-eslint/utils": "8.35.1" + "@typescript-eslint/eslint-plugin": "8.37.0", + "@typescript-eslint/parser": "8.37.0", + "@typescript-eslint/typescript-estree": "8.37.0", + "@typescript-eslint/utils": "8.37.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" diff --git a/package.json b/package.json index b0ce447b2b..4f4f9d48b8 100644 --- a/package.json +++ b/package.json @@ -64,13 +64,13 @@ "@eslint-community/eslint-plugin-eslint-comments": "4.5.0", "@playwright/test": "1.54.1", "@stoplight/spectral-cli": "6.15.0", - "@stylistic/eslint-plugin": "5.1.0", + "@stylistic/eslint-plugin": "5.2.0", "@stylistic/stylelint-plugin": "3.1.3", "@vitejs/plugin-vue": "6.0.0", "@vitest/coverage-v8": "3.2.4", "@vitest/eslint-plugin": "1.3.4", "@vue/test-utils": "2.4.6", - "eslint": "9.30.1", + "eslint": "9.31.0", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-array-func": "5.0.2", "eslint-plugin-import-x": "4.16.1", @@ -91,13 +91,13 @@ "markdownlint-cli": "0.45.0", "postcss-html": "1.8.0", "sharp": "0.34.3", - "stylelint": "16.21.1", + "stylelint": "16.22.0", "stylelint-declaration-block-no-ignored-properties": "2.8.0", "stylelint-declaration-strict-value": "1.10.11", "stylelint-value-no-unknown-custom-properties": "6.0.1", "svgo": "4.0.0", "typescript": "5.8.3", - "typescript-eslint": "8.35.1", + "typescript-eslint": "8.37.0", "vite-string-plugin": "1.4.6", "vitest": "3.2.4" }, From 8c8d6460994a9897c9df3cbfacc61c623c55e714 Mon Sep 17 00:00:00 2001 From: Gusted Date: Sat, 19 Jul 2025 15:03:10 +0200 Subject: [PATCH 176/495] fix: correct image source for quoted reply (#8565) - Since v10 replies are generated on the fly to handle quoted reply (forgejo/forgejo#5677), this means that we have to do some work to construct markdown that is equivalent to the HTML of the comment. - Images are slightly strange in the context of issues and pull requests, as Forgejo will render them in the context of the repository and as such links such as `/attachments` become `/user/repo/attachments`, the quoted reply did not take into account and would use `/user/repo/attachments` as link which means it gets transformed to `/user/repo//user/repo/attachments`. - Instead of fixing this on the backend (and maybe break some existing links), teach the quoted reply about this context and remove it from the image source before generating the markdown. Reported-by: mrwusel (via Matrix) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8565 Reviewed-by: 0ko <0ko@noreply.codeberg.org> Reviewed-by: Beowulf Co-authored-by: Gusted Co-committed-by: Gusted --- .../repo/issue/view_content/context_menu.tmpl | 2 +- tests/e2e/fixtures/comment.yml | 4 +- tests/e2e/issue-comment.test.e2e.ts | 6 ++- web_src/js/features/repo-legacy.js | 53 +++++++++++-------- 4 files changed, 38 insertions(+), 27 deletions(-) diff --git a/templates/repo/issue/view_content/context_menu.tmpl b/templates/repo/issue/view_content/context_menu.tmpl index 6f43f768b3..8cd4a056f0 100644 --- a/templates/repo/issue/view_content/context_menu.tmpl +++ b/templates/repo/issue/view_content/context_menu.tmpl @@ -11,7 +11,7 @@ {{end}}
{{ctx.Locale.Tr "repo.issues.context.copy_link"}}
{{if and .ctxData.IsSigned (not .ctxData.Repository.IsArchived)}} -
{{ctx.Locale.Tr "repo.issues.context.quote_reply"}}
+
{{ctx.Locale.Tr "repo.issues.context.quote_reply"}}
{{if not .ctxData.UnitIssuesGlobalDisabled}}
{{ctx.Locale.Tr "repo.issues.context.reference_issue"}}
{{end}} diff --git a/tests/e2e/fixtures/comment.yml b/tests/e2e/fixtures/comment.yml index f3f8a2d8e8..ae7c850036 100644 --- a/tests/e2e/fixtures/comment.yml +++ b/tests/e2e/fixtures/comment.yml @@ -3,7 +3,7 @@ type: 0 # comment poster_id: 2 issue_id: 1 # in repo_id 1 - content: "## Lorem Ipsum\nI would like to say that **I am not appealed** that it took _so long_ for this `feature` to be [created](https://example.com) $e^{\\pi i} + 1 = 0$\n$$e^{\\pi i} + 1 = 0$$\n#1\n```js\nconsole.log('evil')\nalert('evil')\n```\n:+1: :100:" + content: "## Lorem Ipsum\nI would like to say that **I am not appealed** that it took _so long_ for this `feature` to be [created](https://example.com) $e^{\\pi i} + 1 = 0$\n$$e^{\\pi i} + 1 = 0$$\n#1\n```js\nconsole.log('evil')\nalert('evil')\n```\n:+1: :100:\n![hi there](/attachments/3f4f4016-877b-46b3-b79f-ad24519a9cf2)\n\nsomething something" created_unix: 946684811 updated_unix: 946684811 content_version: 1 @@ -13,7 +13,7 @@ type: 21 # code comment poster_id: 2 issue_id: 19 - content: "## Lorem Ipsum\nI would like to say that **I am not appealed** that it took _so long_ for this `feature` to be [created](https://example.com) $e^{\\pi i} + 1 = 0$\n$$e^{\\pi i} + 1 = 0$$\n#1\n```js\nconsole.log('evil')\nalert('evil')\n```\n:+1: :100:" + content: "## Lorem Ipsum\nI would like to say that **I am not appealed** that it took _so long_ for this `feature` to be [created](https://example.com) $e^{\\pi i} + 1 = 0$\n$$e^{\\pi i} + 1 = 0$$\n#1\n```js\nconsole.log('evil')\nalert('evil')\n```\n:+1: :100:\n![hi there](/attachments/3f4f4016-877b-46b3-b79f-ad24519a9cf2)\n\nsomething something" review_id: 1001 line: 1 tree_path: "test1.txt" diff --git a/tests/e2e/issue-comment.test.e2e.ts b/tests/e2e/issue-comment.test.e2e.ts index d2dbafafd0..2017e4563e 100644 --- a/tests/e2e/issue-comment.test.e2e.ts +++ b/tests/e2e/issue-comment.test.e2e.ts @@ -123,7 +123,8 @@ test('Quote reply', async ({page}, workerInfo) => { "> alert('evil')\n" + '> ```\n' + '> \n' + - '> :+1: :100:\n\n'); + '> :+1: :100: [![hi there](/attachments/3f4f4016-877b-46b3-b79f-ad24519a9cf2)](/user2/repo1/attachments/3f4f4016-877b-46b3-b79f-ad24519a9cf2)\n' + + '> something something\n\n'); await editorTextarea.fill(''); @@ -197,7 +198,8 @@ test('Pull quote reply', async ({page}, workerInfo) => { "> alert('evil')\n" + '> ```\n' + '> \n' + - '> :+1: :100:\n\n'); + '> :+1: :100: [![hi there](/attachments/3f4f4016-877b-46b3-b79f-ad24519a9cf2)](/user2/commitsonpr/attachments/3f4f4016-877b-46b3-b79f-ad24519a9cf2)\n' + + '> something something\n\n'); await editorTextarea.fill(''); }); diff --git a/web_src/js/features/repo-legacy.js b/web_src/js/features/repo-legacy.js index e6af4cbf04..66ee945d02 100644 --- a/web_src/js/features/repo-legacy.js +++ b/web_src/js/features/repo-legacy.js @@ -531,6 +531,13 @@ const filters = { } return el; }, + IMG(el, context) { + const src = el.getAttribute('src'); + if (src?.startsWith(context)) { + el.src = src.slice(context.length); + } + return el; + }, }; function hasContent(node) { @@ -538,32 +545,34 @@ function hasContent(node) { } // This code matches that of what is done by @github/quote-selection -function preprocessFragment(fragment) { - const nodeIterator = document.createNodeIterator(fragment, NodeFilter.SHOW_ELEMENT, { - acceptNode(node) { - if (node.nodeName in filters && hasContent(node)) { - return NodeFilter.FILTER_ACCEPT; +function preprocessFragment(context) { + return function(fragment) { + const nodeIterator = document.createNodeIterator(fragment, NodeFilter.SHOW_ELEMENT, { + acceptNode(node) { + if (node.nodeName in filters && hasContent(node)) { + return NodeFilter.FILTER_ACCEPT; + } + + return NodeFilter.FILTER_SKIP; + }, + }); + const results = []; + let node = nodeIterator.nextNode(); + + while (node) { + if (node instanceof HTMLElement) { + results.push(node); } - - return NodeFilter.FILTER_SKIP; - }, - }); - const results = []; - let node = nodeIterator.nextNode(); - - while (node) { - if (node instanceof HTMLElement) { - results.push(node); + node = nodeIterator.nextNode(); } - node = nodeIterator.nextNode(); - } // process deepest matches first - results.reverse(); + results.reverse(); - for (const el of results) { - el.replaceWith(filters[el.nodeName](el)); - } + for (const el of results) { + el.replaceWith(filters[el.nodeName](el, context)); + } + }; } function initRepoIssueCommentEdit() { @@ -573,7 +582,7 @@ function initRepoIssueCommentEdit() { // Quote reply $(document).on('click', '.quote-reply', async (event) => { event.preventDefault(); - const quote = new MarkdownQuote('', preprocessFragment); + const quote = new MarkdownQuote('', preprocessFragment(event.target.getAttribute('data-context'))); let editorTextArea; if (event.target.classList.contains('quote-reply-diff')) { From 1b217198978746a5e5d625cb6aaab43af1702930 Mon Sep 17 00:00:00 2001 From: 0ko <0ko@noreply.codeberg.org> Date: Sat, 19 Jul 2025 15:49:48 +0200 Subject: [PATCH 177/495] fix(ui): remove unused rule with unused class .tight (#8573) There's no usage of `tight` across the codebase. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8573 Reviewed-by: Gusted --- web_src/css/base.css | 5 ----- 1 file changed, 5 deletions(-) diff --git a/web_src/css/base.css b/web_src/css/base.css index cbb21951b4..af23ecf2c2 100644 --- a/web_src/css/base.css +++ b/web_src/css/base.css @@ -546,11 +546,6 @@ a.label, background: var(--color-active); } -.ui.secondary.menu.tight .item { - padding-left: 0.85714286em; - padding-right: 0.85714286em; -} - /* remove the menu clearfix so that it won't add undesired gaps when using "gap" */ .ui.menu::after { content: normal; From a5f7acdd2e83f4e62369c71009483f9f71a0c564 Mon Sep 17 00:00:00 2001 From: Gusted Date: Sat, 19 Jul 2025 16:34:21 +0200 Subject: [PATCH 178/495] fix: allow for tracked time to be removed again (#8575) - `getElementById` requires a id to be passed and not a query selector, change it to `querySelector`. - Regression of forgejo/forgejo#7408 - Resolves forgejo/forgejo#8571 - Add E2E tests for adding manual tracked time and removing it. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8575 Reviewed-by: Otto Reviewed-by: 0ko <0ko@noreply.codeberg.org> Co-authored-by: Gusted Co-committed-by: Gusted --- tests/e2e/issue-timetracking.test.e2e.ts | 48 ++++++++++++++++++++++++ web_src/js/features/repo-issue.js | 2 +- 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 tests/e2e/issue-timetracking.test.e2e.ts diff --git a/tests/e2e/issue-timetracking.test.e2e.ts b/tests/e2e/issue-timetracking.test.e2e.ts new file mode 100644 index 0000000000..901cbe793f --- /dev/null +++ b/tests/e2e/issue-timetracking.test.e2e.ts @@ -0,0 +1,48 @@ +// @watch start +// web_src/js/features/comp/** +// web_src/js/features/repo-** +// templates/repo/issue/view_content/* +// @watch end + +import {expect} from '@playwright/test'; +import {test, save_visual} from './utils_e2e.ts'; + +test.use({user: 'user2'}); + +test('Issue timetracking', async ({page}) => { + await page.goto('/user2/repo1/issues/new'); + + // Create temporary issue. + await page.getByPlaceholder('Title').fill('Just a title'); + await page.getByPlaceholder('Leave a comment').fill('Hi, have you considered using a rotating fish as logo?'); + await page.getByRole('button', {name: 'Create issue'}).click(); + await expect(page).toHaveURL(/\/user2\/repo1\/issues\/\d+$/); + + // Manually add time to the time tracker. + await page.getByRole('button', {name: 'Add time'}).click(); + await page.getByPlaceholder('Hours').fill('5'); + await page.getByPlaceholder('Minutes').fill('32'); + await page.getByRole('button', {name: 'Add time', exact: true}).click(); + + // Verify this was added in the timeline. + await expect(page.locator('.ui.timeline')).toContainText('added spent time'); + await expect(page.locator('.ui.timeline')).toContainText('5 hours 32 minutes'); + + // Verify it is shown in the issue sidebar + await expect(page.locator('.issue-content-right .comments')).toContainText('Total time spent: 5 hours 32 minutes'); + + await save_visual(page); + + // Delete the added time. + await page.getByRole('button', {name: 'Delete this time log'}).click(); + await page.getByRole('button', {name: 'Yes'}).click(); + + // Verify this was removed in the timeline. + await expect(page.locator('.ui.timeline')).toContainText('deleted spent time'); + await expect(page.locator('.ui.timeline')).toContainText('- 5 hours 32 minutes'); + + // Delete the issue. + await page.getByRole('button', {name: 'Delete'}).click(); + await page.getByRole('button', {name: 'Yes'}).click(); + await expect(page).toHaveURL('/user2/repo1/issues'); +}); diff --git a/web_src/js/features/repo-issue.js b/web_src/js/features/repo-issue.js index d678d9195b..84b8e42a61 100644 --- a/web_src/js/features/repo-issue.js +++ b/web_src/js/features/repo-issue.js @@ -57,7 +57,7 @@ export function initRepoIssueTimeTracking() { $(sel).modal({ duration: 200, onApprove() { - document.getElementById(`${sel} form`).requestSubmit(); + document.querySelector(`${sel} form`).requestSubmit(); }, }).modal('show'); }); From a16204d99f7498f7a85a9fd7bcdc8f7986a5ca67 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 19 Jul 2025 23:01:40 +0200 Subject: [PATCH 179/495] Update https://data.forgejo.org/actions/setup-forgejo action to v3 (forgejo) (#8562) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [https://data.forgejo.org/actions/setup-forgejo](https://code.forgejo.org/actions/setup-forgejo) | action | major | `v2.0.4` -> `v3.0.1` | --- ### Release Notes
actions/setup-forgejo (https://data.forgejo.org/actions/setup-forgejo) ### [`v3.0.1`](https://code.forgejo.org/actions/setup-forgejo/compare/v3.0.0...v3.0.1) [Compare Source](https://code.forgejo.org/actions/setup-forgejo/compare/v3.0.0...v3.0.1) ### [`v3.0.0`](https://code.forgejo.org/actions/setup-forgejo/compare/v2.0.13...v3.0.0) [Compare Source](https://code.forgejo.org/actions/setup-forgejo/compare/v2.0.13...v3.0.0) ### [`v2.0.13`](https://code.forgejo.org/actions/setup-forgejo/compare/v2.0.12...v2.0.13) [Compare Source](https://code.forgejo.org/actions/setup-forgejo/compare/v2.0.12...v2.0.13) ### [`v2.0.12`](https://code.forgejo.org/actions/setup-forgejo/compare/v2.0.11...v2.0.12) [Compare Source](https://code.forgejo.org/actions/setup-forgejo/compare/v2.0.11...v2.0.12) ### [`v2.0.11`](https://code.forgejo.org/actions/setup-forgejo/compare/v2.0.10...v2.0.11) [Compare Source](https://code.forgejo.org/actions/setup-forgejo/compare/v2.0.10...v2.0.11) ### [`v2.0.10`](https://code.forgejo.org/actions/setup-forgejo/compare/v2.0.9...v2.0.10) [Compare Source](https://code.forgejo.org/actions/setup-forgejo/compare/v2.0.9...v2.0.10) ### [`v2.0.9`](https://code.forgejo.org/actions/setup-forgejo/compare/v2.0.8...v2.0.9) [Compare Source](https://code.forgejo.org/actions/setup-forgejo/compare/v2.0.8...v2.0.9) ### [`v2.0.8`](https://code.forgejo.org/actions/setup-forgejo/compare/v2.0.7...v2.0.8) [Compare Source](https://code.forgejo.org/actions/setup-forgejo/compare/v2.0.7...v2.0.8) ### [`v2.0.7`](https://code.forgejo.org/actions/setup-forgejo/compare/v2.0.6...v2.0.7) [Compare Source](https://code.forgejo.org/actions/setup-forgejo/compare/v2.0.6...v2.0.7) ### [`v2.0.6`](https://code.forgejo.org/actions/setup-forgejo/compare/v2.0.5...v2.0.6) [Compare Source](https://code.forgejo.org/actions/setup-forgejo/compare/v2.0.5...v2.0.6) ### [`v2.0.5`](https://code.forgejo.org/actions/setup-forgejo/compare/v2.0.4...v2.0.5) [Compare Source](https://code.forgejo.org/actions/setup-forgejo/compare/v2.0.4...v2.0.5)
--- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8562 Reviewed-by: Earl Warren Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- .forgejo/workflows/build-release-integration.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/build-release-integration.yml b/.forgejo/workflows/build-release-integration.yml index 1af6d567dd..a5f9991d45 100644 --- a/.forgejo/workflows/build-release-integration.yml +++ b/.forgejo/workflows/build-release-integration.yml @@ -28,7 +28,7 @@ jobs: - uses: https://data.forgejo.org/actions/checkout@v4 - id: forgejo - uses: https://data.forgejo.org/actions/setup-forgejo@v2.0.4 + uses: https://data.forgejo.org/actions/setup-forgejo@v3.0.1 with: user: root password: admin1234 From 4c34615e4eeb2e46e021c87d5f93bd7d6ce6de29 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 19 Jul 2025 23:08:04 +0200 Subject: [PATCH 180/495] Update dependency forgejo/release-notes-assistant to v1.3.1 (forgejo) (#8568) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Update | Change | |---|---|---| | [forgejo/release-notes-assistant](https://code.forgejo.org/forgejo/release-notes-assistant) | minor | `v1.2.5` -> `v1.3.1` | | [forgejo/release-notes-assistant](https://code.forgejo.org/forgejo/release-notes-assistant) | patch | `v1.3.0` -> `v1.3.1` | --- ### Release Notes
forgejo/release-notes-assistant (forgejo/release-notes-assistant) ### [`v1.3.1`](https://code.forgejo.org/forgejo/release-notes-assistant/releases/tag/v1.3.1) [Compare Source](https://code.forgejo.org/forgejo/release-notes-assistant/compare/v1.3.0...v1.3.1) - bug fixes - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/91): fix: pull requests need sort=recentupdate not just in debug output ### [`v1.3.0`](https://code.forgejo.org/forgejo/release-notes-assistant/releases/tag/v1.3.0) [Compare Source](https://code.forgejo.org/forgejo/release-notes-assistant/compare/v1.2.5...v1.3.0) - features including breaking changes - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/86): feat!: remove maximum-age option - features - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/89): feat: get pull requests modified since the last cache update - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/88): feat: add last update time to the pull request cache - other - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/90): chore: improve verbosity when obtaining pull requests - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/87): chore(cleanup): pull request handler no longer needs a bool return value - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/85): Update module golang.org/x/tools/cmd/deadcode to v0.35.0 - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/84): Update module github.com/golangci/golangci-lint/v2/cmd/golangci-lint to v2.2.2 - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/83): chore: s/GITHUB\_*/FORGEJO\_*/ & s/github./forge./ - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/82): Update dependency go to v1.24.5 - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/81): Update module mvdan.cc/sh/v3/cmd/shfmt to v3.12.0 - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/80): Update module github.com/golangci/golangci-lint/v2/cmd/golangci-lint to v2.2.1 - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/79): Update module github.com/urfave/cli/v2 to v2.27.7 - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/78): Update module golang.org/x/tools/cmd/deadcode to v0.34.0 - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/77): Update dependency go to v1.24.4 - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/76): Update module mvdan.cc/sh/v3/cmd/shfmt to v3.11.0 - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/75): Update module mvdan.cc/gofumpt to v0.8.0 - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/74): Update module golang.org/x/tools/cmd/deadcode to v0.33.0 - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/73): Update module github.com/golangci/misspell/cmd/misspell to v0.7.0 - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/72): Update dependency go to v1.23 - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/70): Update module github.com/stretchr/testify to v1.10.0 - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/69): Update module github.com/go-resty/resty/v2 to v2.16.5 - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/68): Update https://code.forgejo.org/actions/forgejo-release action to v2.6.0 - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/67): Update module github.com/urfave/cli/v2 to v2.27.6 - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/66): ci: use `data.forgejo.org` - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/65): Update Node.js to v22 - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/64): Update https://code.forgejo.org/actions/checkout action to v4 - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/61): Configure Renovate
--- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8568 Reviewed-by: Earl Warren Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- .forgejo/workflows/release-notes-assistant-milestones.yml | 2 +- .forgejo/workflows/release-notes-assistant.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/release-notes-assistant-milestones.yml b/.forgejo/workflows/release-notes-assistant-milestones.yml index 0b8a416a02..2c278c7eb5 100644 --- a/.forgejo/workflows/release-notes-assistant-milestones.yml +++ b/.forgejo/workflows/release-notes-assistant-milestones.yml @@ -6,7 +6,7 @@ on: env: RNA_WORKDIR: /srv/rna - RNA_VERSION: v1.3.0 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org + RNA_VERSION: v1.3.1 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org jobs: release-notes: diff --git a/.forgejo/workflows/release-notes-assistant.yml b/.forgejo/workflows/release-notes-assistant.yml index cdcd2e6fe4..b5eb9cd2b0 100644 --- a/.forgejo/workflows/release-notes-assistant.yml +++ b/.forgejo/workflows/release-notes-assistant.yml @@ -8,7 +8,7 @@ on: - labeled env: - RNA_VERSION: v1.2.5 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org + RNA_VERSION: v1.3.1 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org jobs: release-notes: From b83a55492117ed108e9421b92d94133b9b26d1f1 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 20 Jul 2025 02:48:29 +0200 Subject: [PATCH 181/495] Update module github.com/niklasfasching/go-org to v1.9.1 (forgejo) (#8579) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8579 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 9e0f47f968..3dab99daf8 100644 --- a/go.mod +++ b/go.mod @@ -78,7 +78,7 @@ require ( github.com/minio/minio-go/v7 v7.0.94 github.com/msteinert/pam/v2 v2.1.0 github.com/nektos/act v0.2.52 - github.com/niklasfasching/go-org v1.9.0 + github.com/niklasfasching/go-org v1.9.1 github.com/olivere/elastic/v7 v7.0.32 github.com/opencontainers/go-digest v1.0.0 github.com/opencontainers/image-spec v1.1.1 diff --git a/go.sum b/go.sum index db2a186d2c..243dd6154d 100644 --- a/go.sum +++ b/go.sum @@ -426,8 +426,8 @@ github.com/msteinert/pam/v2 v2.1.0 h1:er5F9TKV5nGFuTt12ubtqPHEUdeBwReP7vd3wovidG github.com/msteinert/pam/v2 v2.1.0/go.mod h1:KT28NNIcDFf3PcBmNI2mIGO4zZJ+9RSs/At2PB3IDVc= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/niklasfasching/go-org v1.9.0 h1:4/Sr68Qx06hjC9MVDB/4etGP67JionLHGscLMOClpnk= -github.com/niklasfasching/go-org v1.9.0/go.mod h1:ZAGFFkWvUQcpazmi/8nHqwvARpr1xpb+Es67oUGX/48= +github.com/niklasfasching/go-org v1.9.1 h1:/3s4uTPOF06pImGa2Yvlp24yKXZoTYM+nsIlMzfpg/0= +github.com/niklasfasching/go-org v1.9.1/go.mod h1:ZAGFFkWvUQcpazmi/8nHqwvARpr1xpb+Es67oUGX/48= github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc= github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= From 95e8bbd5f0434c5c377666524a9a496ac06f783f Mon Sep 17 00:00:00 2001 From: floss4good Date: Sun, 20 Jul 2025 23:52:58 +0200 Subject: [PATCH 182/495] fix: make sure to use unaltered fields when saving a shadow copy for updated profiles or comments (#8533) Follow-up of !6977 ### Manual testing - User **S** creates an organization **O** and posts a comment **C** (on a random issue); - User **R** report as abuse the comment **C**, the organization **O** as well as the user **S**; - User **S** changes the content of comment **C** and the description of organization **O** as well as the description of their own profile; - Check (within DB) that shadow copies are being created (and linked to corresponding abuse reports) for comment **C**, organization **O** and user **S** and the content is the one from the moment when the reports were submitted (therefore before the updates made by **S**). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8533 Reviewed-by: Gusted Co-authored-by: floss4good Co-committed-by: floss4good --- .../ModerationFeatures/abuse_report.yml | 21 +++++++ .../fixtures/ModerationFeatures/comment.yml | 7 +++ models/fixtures/ModerationFeatures/user.yml | 22 ++++++++ models/issues/comment.go | 4 +- models/issues/moderation.go | 8 ++- models/user/moderation.go | 19 +++++-- models/user/user.go | 4 +- services/issue/comments_test.go | 39 +++++++++++++ services/user/delete.go | 2 +- services/user/email.go | 2 +- services/user/user_test.go | 56 +++++++++++++++++++ 11 files changed, 173 insertions(+), 11 deletions(-) create mode 100644 models/fixtures/ModerationFeatures/abuse_report.yml create mode 100644 models/fixtures/ModerationFeatures/comment.yml create mode 100644 models/fixtures/ModerationFeatures/user.yml diff --git a/models/fixtures/ModerationFeatures/abuse_report.yml b/models/fixtures/ModerationFeatures/abuse_report.yml new file mode 100644 index 0000000000..f2e371ee35 --- /dev/null +++ b/models/fixtures/ModerationFeatures/abuse_report.yml @@ -0,0 +1,21 @@ +- + id: 1 + status: 1 + reporter_id: 2 # @user2 + content_type: 4 # Comment + content_id: 18 # user2/repo2/issues/2#issuecomment-18 + category: 2 # Spam + remarks: The comment I'm reporting is pure SPAM. + shadow_copy_id: null + created_unix: 1752697980 # 2025-07-16 20:33:00 + +- + id: 2 + status: 1 # Open + reporter_id: 2 # @user2 + content_type: 1 # User (users or organizations) + content_id: 1002 # @alexsmith + category: 2 # Spam + remarks: This user just posted a spammy comment on my issue. + shadow_copy_id: null + created_unix: 1752698010 # 2025-07-16 20:33:30 diff --git a/models/fixtures/ModerationFeatures/comment.yml b/models/fixtures/ModerationFeatures/comment.yml new file mode 100644 index 0000000000..a4d41ad997 --- /dev/null +++ b/models/fixtures/ModerationFeatures/comment.yml @@ -0,0 +1,7 @@ +- # This is a spam comment (abusive content), created for testing moderation functionalities. + id: 18 + type: 0 # Standard comment + poster_id: 1002 # @alexsmith + issue_id: 7 # user2/repo2#2 + content: If anyone needs help for promoting their business online using SEO, just contact me (check my profile page). + created_unix: 1752697860 # 2025-07-16 20:31:00 diff --git a/models/fixtures/ModerationFeatures/user.yml b/models/fixtures/ModerationFeatures/user.yml new file mode 100644 index 0000000000..662c61a3e9 --- /dev/null +++ b/models/fixtures/ModerationFeatures/user.yml @@ -0,0 +1,22 @@ +- # This user is a spammer and will create abusive content (for testing moderation functionalities). + id: 1002 + lower_name: alexsmith + name: alexsmith + full_name: Alex Smith + email: alexsmith@example.org + keep_email_private: false + passwd: passwdSalt:password + passwd_hash_algo: dummy + type: 0 + location: '@master@seo.net' + website: http://promote-your-business.biz + pronouns: SEO + salt: passwdSalt + description: I can help you promote your business online using SEO. + created_unix: 1752697800 # 2025-07-16 20:30:00 + is_active: true + is_admin: false + is_restricted: false + avatar: avatar-hash-1002 + avatar_email: alexsmith@example.org + use_custom_avatar: false diff --git a/models/issues/comment.go b/models/issues/comment.go index a81221caf4..523a6ba9b9 100644 --- a/models/issues/comment.go +++ b/models/issues/comment.go @@ -1156,7 +1156,7 @@ func UpdateComment(ctx context.Context, c *Comment, contentVersion int, doer *us defer committer.Close() // If the comment was reported as abusive, a shadow copy should be created before first update. - if err := IfNeededCreateShadowCopyForComment(ctx, c); err != nil { + if err := IfNeededCreateShadowCopyForComment(ctx, c, true); err != nil { return err } @@ -1197,7 +1197,7 @@ func DeleteComment(ctx context.Context, comment *Comment) error { e := db.GetEngine(ctx) // If the comment was reported as abusive, a shadow copy should be created before deletion. - if err := IfNeededCreateShadowCopyForComment(ctx, comment); err != nil { + if err := IfNeededCreateShadowCopyForComment(ctx, comment, false); err != nil { return err } diff --git a/models/issues/moderation.go b/models/issues/moderation.go index 635d295db0..921f770d4d 100644 --- a/models/issues/moderation.go +++ b/models/issues/moderation.go @@ -87,13 +87,19 @@ func IfNeededCreateShadowCopyForIssue(ctx context.Context, issue *Issue) error { // IfNeededCreateShadowCopyForComment checks if for the given comment there are any reports of abusive content submitted // and if found a shadow copy of relevant comment fields will be stored into DB and linked to the above report(s). // This function should be called before a comment is deleted or updated. -func IfNeededCreateShadowCopyForComment(ctx context.Context, comment *Comment) error { +func IfNeededCreateShadowCopyForComment(ctx context.Context, comment *Comment, forUpdates bool) error { shadowCopyNeeded, err := moderation.IsShadowCopyNeeded(ctx, moderation.ReportedContentTypeComment, comment.ID) if err != nil { return err } if shadowCopyNeeded { + if forUpdates { + // get the unaltered comment fields (for updates the provided variable is already altered but not yet saved) + if comment, err = GetCommentByID(ctx, comment.ID); err != nil { + return err + } + } commentData := newCommentData(comment) content, err := json.Marshal(commentData) if err != nil { diff --git a/models/user/moderation.go b/models/user/moderation.go index afda497f02..f9c16a17b3 100644 --- a/models/user/moderation.go +++ b/models/user/moderation.go @@ -73,16 +73,20 @@ var userDataColumnNames = sync.OnceValue(func() []string { // and if found a shadow copy of relevant user fields will be stored into DB and linked to the above report(s). // This function should be called before a user is deleted or updated. // +// In case the User object was already altered before calling this method, just provide the userID and +// nil for unalteredUser; when it is decided that a shadow copy should be created and unalteredUser is nil, +// the user will be retrieved from DB based on the provided userID. +// // For deletions alteredCols argument must be omitted. // // In case of updates it will first checks whether any of the columns being updated (alteredCols argument) // is relevant for moderation purposes (i.e. included in the UserData struct). -func IfNeededCreateShadowCopyForUser(ctx context.Context, user *User, alteredCols ...string) error { +func IfNeededCreateShadowCopyForUser(ctx context.Context, userID int64, unalteredUser *User, alteredCols ...string) error { // TODO: this can be triggered quite often (e.g. by routers/web/repo/middlewares.go SetDiffViewStyle()) shouldCheckIfNeeded := len(alteredCols) == 0 // no columns being updated, therefore a deletion if !shouldCheckIfNeeded { - // for updates we need to go further only if certain column are being changed + // for updates we need to go further only if certain columns are being changed for _, colName := range userDataColumnNames() { if shouldCheckIfNeeded = slices.Contains(alteredCols, colName); shouldCheckIfNeeded { break @@ -94,18 +98,23 @@ func IfNeededCreateShadowCopyForUser(ctx context.Context, user *User, alteredCol return nil } - shadowCopyNeeded, err := moderation.IsShadowCopyNeeded(ctx, moderation.ReportedContentTypeUser, user.ID) + shadowCopyNeeded, err := moderation.IsShadowCopyNeeded(ctx, moderation.ReportedContentTypeUser, userID) if err != nil { return err } if shadowCopyNeeded { - userData := newUserData(user) + if unalteredUser == nil { + if unalteredUser, err = GetUserByID(ctx, userID); err != nil { + return err + } + } + userData := newUserData(unalteredUser) content, err := json.Marshal(userData) if err != nil { return err } - return moderation.CreateShadowCopyForUser(ctx, user.ID, string(content)) + return moderation.CreateShadowCopyForUser(ctx, userID, string(content)) } return nil diff --git a/models/user/user.go b/models/user/user.go index b124572bb6..6b54776adf 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -927,7 +927,9 @@ func UpdateUserCols(ctx context.Context, u *User, cols ...string) error { // If the user was reported as abusive and any of the columns being updated is relevant // for moderation purposes a shadow copy should be created before first update. - if err := IfNeededCreateShadowCopyForUser(ctx, u, cols...); err != nil { + // Since u is already altered at this point we are sending nil instead as an argument + // so that the unaltered version will be retrieved from DB. + if err := IfNeededCreateShadowCopyForUser(ctx, u.ID, nil, cols...); err != nil { return err } diff --git a/services/issue/comments_test.go b/services/issue/comments_test.go index 8fa410c0f0..fcf06d9ec8 100644 --- a/services/issue/comments_test.go +++ b/services/issue/comments_test.go @@ -8,9 +8,11 @@ import ( "forgejo.org/models/db" issues_model "forgejo.org/models/issues" + "forgejo.org/models/moderation" "forgejo.org/models/unittest" user_model "forgejo.org/models/user" webhook_model "forgejo.org/models/webhook" + "forgejo.org/modules/json" "forgejo.org/modules/setting" "forgejo.org/modules/test" issue_service "forgejo.org/services/issue" @@ -148,3 +150,40 @@ func TestUpdateComment(t *testing.T) { unittest.AssertNotExistsBean(t, &issues_model.ContentHistory{CommentID: comment.ID}) }) } + +func TestCreateShadowCopyOnCommentUpdate(t *testing.T) { + defer unittest.OverrideFixtures("models/fixtures/ModerationFeatures")() + require.NoError(t, unittest.PrepareTestDatabase()) + + userAlexSmithID := int64(1002) + spamCommentID := int64(18) // posted by @alexsmith + abuseReportID := int64(1) // submitted for above comment + newCommentContent := "If anyone needs help, just contact me." + + // Retrieve the abusive user (@alexsmith), their SPAM comment and the abuse report already created for this comment. + poster := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: userAlexSmithID}) + comment := unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: spamCommentID, PosterID: poster.ID}) + report := unittest.AssertExistsAndLoadBean(t, &moderation.AbuseReport{ + ID: abuseReportID, + ContentType: moderation.ReportedContentTypeComment, + ContentID: comment.ID, + }) + // The report should not already have a shadow copy linked. + assert.False(t, report.ShadowCopyID.Valid) + + // The abusive user is updating their comment. + oldContent := comment.Content + comment.Content = newCommentContent + require.NoError(t, issue_service.UpdateComment(t.Context(), comment, 0, poster, oldContent)) + + // Reload the report. + report = unittest.AssertExistsAndLoadBean(t, &moderation.AbuseReport{ID: report.ID}) + // A shadow copy should have been created and linked to our report. + assert.True(t, report.ShadowCopyID.Valid) + // Retrieve the newly created shadow copy and unmarshal the stored JSON so that we can check the values. + shadowCopy := unittest.AssertExistsAndLoadBean(t, &moderation.AbuseReportShadowCopy{ID: report.ShadowCopyID.Int64}) + shadowCopyCommentData := new(issues_model.CommentData) + require.NoError(t, json.Unmarshal([]byte(shadowCopy.RawValue), &shadowCopyCommentData)) + // Check to see if the initial content of the comment was stored within the shadow copy. + assert.Equal(t, oldContent, shadowCopyCommentData.Content) +} diff --git a/services/user/delete.go b/services/user/delete.go index 9caa24c373..bed7abde07 100644 --- a/services/user/delete.go +++ b/services/user/delete.go @@ -218,7 +218,7 @@ func deleteUser(ctx context.Context, u *user_model.User, purge bool) (err error) // ***** END: ExternalLoginUser ***** // If the user was reported as abusive, a shadow copy should be created before deletion. - if err = user_model.IfNeededCreateShadowCopyForUser(ctx, u); err != nil { + if err = user_model.IfNeededCreateShadowCopyForUser(ctx, u.ID, u); err != nil { return err } diff --git a/services/user/email.go b/services/user/email.go index 7a01fa77b3..36a1145aec 100644 --- a/services/user/email.go +++ b/services/user/email.go @@ -205,7 +205,7 @@ func MakeEmailAddressPrimary(ctx context.Context, u *user_model.User, newPrimary oldPrimaryEmail := u.Email // If the user was reported as abusive, a shadow copy should be created before first update (of certain columns). - if err = user_model.IfNeededCreateShadowCopyForUser(ctx, u, "email"); err != nil { + if err = user_model.IfNeededCreateShadowCopyForUser(ctx, u.ID, u, "email"); err != nil { return err } diff --git a/services/user/user_test.go b/services/user/user_test.go index 4678d3bc9a..36f2776ad8 100644 --- a/services/user/user_test.go +++ b/services/user/user_test.go @@ -15,10 +15,13 @@ import ( asymkey_model "forgejo.org/models/asymkey" "forgejo.org/models/auth" "forgejo.org/models/db" + "forgejo.org/models/moderation" "forgejo.org/models/organization" repo_model "forgejo.org/models/repo" "forgejo.org/models/unittest" user_model "forgejo.org/models/user" + "forgejo.org/modules/json" + "forgejo.org/modules/optional" "forgejo.org/modules/setting" "forgejo.org/modules/test" "forgejo.org/modules/timeutil" @@ -277,3 +280,56 @@ func TestDeleteInactiveUsers(t *testing.T) { unittest.AssertExistsIf(t, true, newUser) unittest.AssertExistsIf(t, true, newEmail) } + +func TestCreateShadowCopyOnUserUpdate(t *testing.T) { + defer unittest.OverrideFixtures("models/fixtures/ModerationFeatures")() + require.NoError(t, unittest.PrepareTestDatabase()) + + userAlexSmithID := int64(1002) + abuseReportID := int64(2) // submitted for @alexsmith + newDummyValue := "[REDACTED]" // used for updating profile text fields + + // Retrieve the abusive user (@alexsmith) and the abuse report already created for this user. + abuser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: userAlexSmithID}) + report := unittest.AssertExistsAndLoadBean(t, &moderation.AbuseReport{ + ID: abuseReportID, + ContentType: moderation.ReportedContentTypeUser, + ContentID: abuser.ID, + }) + // The report should not already have a shadow copy linked. + assert.False(t, report.ShadowCopyID.Valid) + + // Keep a copy of old field values before updating them. + oldUserData := user_model.UserData{ + FullName: abuser.FullName, + Location: abuser.Location, + Website: abuser.Website, + Pronouns: abuser.Pronouns, + Description: abuser.Description, + } + + // The abusive user is updating their profile. + opts := &UpdateOptions{ + FullName: optional.Some(newDummyValue), + Location: optional.Some(newDummyValue), + Website: optional.Some(newDummyValue), + Pronouns: optional.Some(newDummyValue), + Description: optional.Some(newDummyValue), + } + require.NoError(t, UpdateUser(t.Context(), abuser, opts)) + + // Reload the report. + report = unittest.AssertExistsAndLoadBean(t, &moderation.AbuseReport{ID: report.ID}) + // A shadow copy should have been created and linked to our report. + assert.True(t, report.ShadowCopyID.Valid) + // Retrieve the newly created shadow copy and unmarshal the stored JSON so that we can check the values. + shadowCopy := unittest.AssertExistsAndLoadBean(t, &moderation.AbuseReportShadowCopy{ID: report.ShadowCopyID.Int64}) + shadowCopyUserData := new(user_model.UserData) + require.NoError(t, json.Unmarshal([]byte(shadowCopy.RawValue), &shadowCopyUserData)) + // Check to see if the initial field values of the user were stored within the shadow copy. + assert.Equal(t, oldUserData.FullName, shadowCopyUserData.FullName) + assert.Equal(t, oldUserData.Location, shadowCopyUserData.Location) + assert.Equal(t, oldUserData.Website, shadowCopyUserData.Website) + assert.Equal(t, oldUserData.Pronouns, shadowCopyUserData.Pronouns) + assert.Equal(t, oldUserData.Description, shadowCopyUserData.Description) +} From 9b470d27096a912ca09a3b57d322231abf7ad355 Mon Sep 17 00:00:00 2001 From: 0ko <0ko@noreply.codeberg.org> Date: Mon, 21 Jul 2025 09:20:24 +0200 Subject: [PATCH 183/495] feat(ui): use simplified visibility label in dashboard orgs list (#8582) Followup to https://codeberg.org/forgejo/forgejo/pulls/6201 Label height making entry height inconsistent isn't a concern because this change makes them 2px shorter. _And they are already inconsistent._ Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8582 Reviewed-by: Gusted Reviewed-by: Otto Co-authored-by: 0ko <0ko@noreply.codeberg.org> Co-committed-by: 0ko <0ko@noreply.codeberg.org> --- web_src/js/components/DashboardRepoList.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web_src/js/components/DashboardRepoList.vue b/web_src/js/components/DashboardRepoList.vue index 35f1082a93..e8c1b76a7f 100644 --- a/web_src/js/components/DashboardRepoList.vue +++ b/web_src/js/components/DashboardRepoList.vue @@ -457,7 +457,7 @@ export default sfc; // activate the IDE's Vue plugin
{{ org.name }}
- + {{ org.org_visibility === 'limited' ? textOrgVisibilityLimited: textOrgVisibilityPrivate }}
From 6ee4dd753a717e9acd145b8b846798f820755c5d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 21 Jul 2025 09:32:04 +0200 Subject: [PATCH 184/495] Update renovate to v41.40.0 (forgejo) (#8585) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- .forgejo/workflows/renovate.yml | 2 +- Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/renovate.yml b/.forgejo/workflows/renovate.yml index c127dd2eba..1be3cc0b17 100644 --- a/.forgejo/workflows/renovate.yml +++ b/.forgejo/workflows/renovate.yml @@ -28,7 +28,7 @@ jobs: runs-on: docker container: - image: data.forgejo.org/renovate/renovate:41.32.1 + image: data.forgejo.org/renovate/renovate:41.40.0 steps: - name: Load renovate repo cache diff --git a/Makefile b/Makefile index 213d7f4b0b..ea8ba4b192 100644 --- a/Makefile +++ b/Makefile @@ -47,7 +47,7 @@ GO_LICENSES_PACKAGE ?= github.com/google/go-licenses@v1.6.0 # renovate: datasour GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1 # renovate: datasource=go DEADCODE_PACKAGE ?= golang.org/x/tools/cmd/deadcode@v0.35.0 # renovate: datasource=go GOMOCK_PACKAGE ?= go.uber.org/mock/mockgen@v0.5.2 # renovate: datasource=go -RENOVATE_NPM_PACKAGE ?= renovate@41.32.1 # renovate: datasource=docker packageName=data.forgejo.org/renovate/renovate +RENOVATE_NPM_PACKAGE ?= renovate@41.40.0 # renovate: datasource=docker packageName=data.forgejo.org/renovate/renovate # https://github.com/disposable-email-domains/disposable-email-domains/commits/main/ DISPOSABLE_EMAILS_SHA ?= 0c27e671231d27cf66370034d7f6818037416989 # renovate: ... From 8fc7295869e911fa83b7efae64efd78b510c441a Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 21 Jul 2025 09:40:20 +0200 Subject: [PATCH 185/495] Update https://data.forgejo.org/actions/cascading-pr action to v2.2.1 (forgejo) (#8586) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [https://data.forgejo.org/actions/cascading-pr](https://code.forgejo.org/actions/cascading-pr) | action | patch | `v2.2.0` -> `v2.2.1` | --- ### Release Notes
actions/cascading-pr (https://data.forgejo.org/actions/cascading-pr) ### [`v2.2.1`](https://code.forgejo.org/actions/cascading-pr/compare/v2.2.0...v2.2.1) [Compare Source](https://code.forgejo.org/actions/cascading-pr/compare/v2.2.0...v2.2.1)
--- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8586 Reviewed-by: Earl Warren Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- .forgejo/workflows/build-release.yml | 2 +- .forgejo/workflows/cascade-setup-end-to-end.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/build-release.yml b/.forgejo/workflows/build-release.yml index 3ab63b0589..944fd68fb7 100644 --- a/.forgejo/workflows/build-release.yml +++ b/.forgejo/workflows/build-release.yml @@ -201,7 +201,7 @@ jobs: - name: end-to-end tests if: ${{ secrets.TOKEN != '' && vars.ROLE == 'forgejo-integration' && vars.SKIP_END_TO_END != 'true' }} - uses: https://data.forgejo.org/actions/cascading-pr@v2.2.0 + uses: https://data.forgejo.org/actions/cascading-pr@v2.2.1 with: origin-url: ${{ env.GITHUB_SERVER_URL }} origin-repo: ${{ github.repository }} diff --git a/.forgejo/workflows/cascade-setup-end-to-end.yml b/.forgejo/workflows/cascade-setup-end-to-end.yml index 7c8c56de13..9d613189a4 100644 --- a/.forgejo/workflows/cascade-setup-end-to-end.yml +++ b/.forgejo/workflows/cascade-setup-end-to-end.yml @@ -41,7 +41,7 @@ jobs: with: fetch-depth: '0' show-progress: 'false' - - uses: https://data.forgejo.org/actions/cascading-pr@v2.2.0 + - uses: https://data.forgejo.org/actions/cascading-pr@v2.2.1 with: origin-url: ${{ env.GITHUB_SERVER_URL }} origin-repo: ${{ github.repository }} From 199d9cf65cbcaee8eb17afdbc0d45212e1d4b309 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 21 Jul 2025 12:32:49 +0200 Subject: [PATCH 186/495] Migrate renovate config (#8588) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8588 Reviewed-by: Michael Kriese Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- renovate.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/renovate.json b/renovate.json index 135df58c07..e0d7bd5456 100644 --- a/renovate.json +++ b/renovate.json @@ -6,7 +6,7 @@ "docker:pinDigests", "helpers:pinGitHubActionDigests" ], - "baseBranches": [ + "baseBranchPatterns": [ "$default", "/^v11\\.\\d+/forgejo$/", "/^v12\\.\\d+/forgejo$/" From 8e4f50a909b74157cfc4dc81144ecd68ee5a224f Mon Sep 17 00:00:00 2001 From: Gusted Date: Mon, 21 Jul 2025 22:33:17 +0200 Subject: [PATCH 187/495] feat: remove fomantic's tab module (#8587) In similar vein of forgejo/forgejo#7416 - Fomantic's tab module is responsible for showing the right content when a tab is clicked upon. Most notably the Write/Preview tabs on the comment editor. - Remove it and replace the javascript with our own function that is able to provide everything Forgejo needs. - Replace the CSS with our own bare minimum CSS. - No functionality or visual is affected by this replacement. - E2E test added. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8587 Reviewed-by: Otto Reviewed-by: 0ko <0ko@noreply.codeberg.org> Co-authored-by: Gusted Co-committed-by: Gusted --- tests/e2e/image-diff.test.e2e.ts | 66 ++ tests/e2e/markdown-editor.test.e2e.ts | 2 + web_src/css/index.css | 1 + web_src/css/modules/tab.css | 7 + web_src/fomantic/build/semantic.css | 82 -- web_src/fomantic/build/semantic.js | 1002 ----------------- web_src/fomantic/semantic.json | 3 +- web_src/js/features/common-global.js | 5 +- .../js/features/comp/ComboMarkdownEditor.js | 6 +- web_src/js/features/repo-editor.js | 3 +- web_src/js/modules/fomantic.js | 3 - web_src/js/modules/tab.ts | 36 + 12 files changed, 123 insertions(+), 1093 deletions(-) create mode 100644 tests/e2e/image-diff.test.e2e.ts create mode 100644 web_src/css/modules/tab.css create mode 100644 web_src/js/modules/tab.ts diff --git a/tests/e2e/image-diff.test.e2e.ts b/tests/e2e/image-diff.test.e2e.ts new file mode 100644 index 0000000000..f7d4f7bd69 --- /dev/null +++ b/tests/e2e/image-diff.test.e2e.ts @@ -0,0 +1,66 @@ +// @watch start +// templates/repo/diff/** +// web_src/css/features/imagediff.css +// web_src/css/modules/tab.css +// web_src/js/modules/tab.ts +// @watch end + +import {expect} from '@playwright/test'; +import {save_visual, test, dynamic_id} from './utils_e2e.ts'; + +test.use({user: 'user2'}); + +test('Repository image diff', async ({page}) => { + // Generate a temporary SVG and edit it. + let response = await page.goto('/user2/repo1/_new/master', {waitUntil: 'domcontentloaded'}); + expect(response?.status()).toBe(200); + + const filename = `${dynamic_id()}.svg`; + + await page.getByPlaceholder('Name your file…').fill(filename); + await page.locator('.monaco-editor').click(); + await page.keyboard.type('\n'); + + await page.locator('.quick-pull-choice input[value="direct"]').click(); + await page.getByRole('button', {name: 'Commit changes'}).click(); + + response = await page.goto(`/user2/repo1/_edit/master/${filename}`, {waitUntil: 'domcontentloaded'}); + expect(response?.status()).toBe(200); + + await page.locator('.monaco-editor').click(); + await page.keyboard.press('Meta+KeyA'); + await page.keyboard.type('\n'); + + await page.locator('.quick-pull-choice input[value="direct"]').click(); + await page.getByRole('button', {name: 'Commit changes'}).click(); + + // Go to the commit page, where a image diff is shown. + await page.locator('.commit-summary a.default-link').click(); + + // Exhaustively test tabs works as expected + await expect(page.locator('.item[data-tab="diff-side-by-side-1"]')).toContainClass('active'); + await expect(page.locator('.item[data-tab="diff-swipe-1"]')).not.toContainClass('active'); + await expect(page.locator('.item[data-tab="diff-overlay-1"]')).not.toContainClass('active'); + await expect(page.locator('.tab[data-tab="diff-side-by-side-1"]')).toBeVisible(); + await expect(page.locator('.tab[data-tab="diff-swipe-1"]')).toBeHidden(); + await expect(page.locator('.tab[data-tab="diff-overlay-1"]')).toBeHidden(); + await save_visual(page); + + await page.getByText('Swipe').click(); + await expect(page.locator('.item[data-tab="diff-side-by-side-1"]')).not.toContainClass('active'); + await expect(page.locator('.item[data-tab="diff-swipe-1"]')).toContainClass('active'); + await expect(page.locator('.item[data-tab="diff-overlay-1"]')).not.toContainClass('active'); + await expect(page.locator('.tab[data-tab="diff-side-by-side-1"]')).toBeHidden(); + await expect(page.locator('.tab[data-tab="diff-swipe-1"]')).toBeVisible(); + await expect(page.locator('.tab[data-tab="diff-overlay-1"]')).toBeHidden(); + await save_visual(page); + + await page.getByText('Overlay').click(); + await expect(page.locator('.item[data-tab="diff-side-by-side-1"]')).not.toContainClass('active'); + await expect(page.locator('.item[data-tab="diff-swipe-1"]')).not.toContainClass('active'); + await expect(page.locator('.item[data-tab="diff-overlay-1"]')).toContainClass('active'); + await expect(page.locator('.tab[data-tab="diff-side-by-side-1"]')).toBeHidden(); + await expect(page.locator('.tab[data-tab="diff-swipe-1"]')).toBeHidden(); + await expect(page.locator('.tab[data-tab="diff-overlay-1"]')).toBeVisible(); + await save_visual(page); +}); diff --git a/tests/e2e/markdown-editor.test.e2e.ts b/tests/e2e/markdown-editor.test.e2e.ts index 7983907343..d0ab88fe26 100644 --- a/tests/e2e/markdown-editor.test.e2e.ts +++ b/tests/e2e/markdown-editor.test.e2e.ts @@ -1,4 +1,6 @@ // @watch start +// web_src/js/modules/tab.ts +// web_src/css/modules/tab.css // web_src/js/features/comp/ComboMarkdownEditor.js // web_src/css/editor/combomarkdowneditor.css // templates/shared/combomarkdowneditor.tmpl diff --git a/web_src/css/index.css b/web_src/css/index.css index e7e5dda2d5..d86a784bcc 100644 --- a/web_src/css/index.css +++ b/web_src/css/index.css @@ -12,6 +12,7 @@ @import "./modules/segment.css"; @import "./modules/grid.css"; @import "./modules/message.css"; +@import "./modules/tab.css"; @import "./modules/table.css"; @import "./modules/card.css"; @import "./modules/checkbox.css"; diff --git a/web_src/css/modules/tab.css b/web_src/css/modules/tab.css new file mode 100644 index 0000000000..63c83179b2 --- /dev/null +++ b/web_src/css/modules/tab.css @@ -0,0 +1,7 @@ +.ui.tab { + display: none; +} + +.ui.tab.active { + display: block; +} diff --git a/web_src/fomantic/build/semantic.css b/web_src/fomantic/build/semantic.css index 6e9958faa8..bd1777db36 100644 --- a/web_src/fomantic/build/semantic.css +++ b/web_src/fomantic/build/semantic.css @@ -9277,86 +9277,4 @@ Floated Menu / Item /******************************* Site Overrides -*******************************/ -/*! - * # Fomantic-UI - Tab - * http://github.com/fomantic/Fomantic-UI/ - * - * - * Released under the MIT license - * http://opensource.org/licenses/MIT - * - */ - -/******************************* - UI Tabs -*******************************/ - -.ui.tab { - display: none; -} - -/******************************* - States -*******************************/ - -/*-------------------- - Active ----------------------*/ - -.ui.tab.active, -.ui.tab.open { - display: block; -} - -/*-------------------- - Loading - ---------------------*/ - -.ui.tab.loading { - position: relative; - overflow: hidden; - display: block; - min-height: 250px; -} - -.ui.tab.loading * { - position: relative !important; - left: -10000px !important; -} - -.ui.tab.loading:before, -.ui.tab.loading.segment:before { - position: absolute; - content: ''; - top: 50%; - left: 50%; - margin: -1.25em 0 0 -1.25em; - width: 2.5em; - height: 2.5em; - border-radius: 500rem; - border: 0.2em solid rgba(0, 0, 0, 0.1); -} - -.ui.tab.loading:after, -.ui.tab.loading.segment:after { - position: absolute; - content: ''; - top: 50%; - left: 50%; - margin: -1.25em 0 0 -1.25em; - width: 2.5em; - height: 2.5em; - animation: loader 0.6s infinite linear; - border: 0.2em solid #767676; - border-radius: 500rem; - box-shadow: 0 0 0 1px transparent; -} - -/******************************* - Tab Overrides -*******************************/ - -/******************************* - User Overrides *******************************/ \ No newline at end of file diff --git a/web_src/fomantic/build/semantic.js b/web_src/fomantic/build/semantic.js index 393d9d8142..80ddb88eda 100644 --- a/web_src/fomantic/build/semantic.js +++ b/web_src/fomantic/build/semantic.js @@ -10234,1005 +10234,3 @@ $.fn.search.settings = { }; })( jQuery, window, document ); - -/*! - * # Fomantic-UI - Tab - * http://github.com/fomantic/Fomantic-UI/ - * - * - * Released under the MIT license - * http://opensource.org/licenses/MIT - * - */ - -;(function ($, window, document, undefined) { - -'use strict'; - -$.isWindow = $.isWindow || function(obj) { - return obj != null && obj === obj.window; -}; -$.isFunction = $.isFunction || function(obj) { - return typeof obj === "function" && typeof obj.nodeType !== "number"; -}; - -window = (typeof window != 'undefined' && window.Math == Math) - ? window - : (typeof self != 'undefined' && self.Math == Math) - ? self - : Function('return this')() -; - -$.fn.tab = function(parameters) { - - var - // use window context if none specified - $allModules = $.isFunction(this) - ? $(window) - : $(this), - - moduleSelector = $allModules.selector || '', - time = new Date().getTime(), - performance = [], - - query = arguments[0], - methodInvoked = (typeof query == 'string'), - queryArguments = [].slice.call(arguments, 1), - - initializedHistory = false, - returnedValue - ; - - $allModules - .each(function() { - var - - settings = ( $.isPlainObject(parameters) ) - ? $.extend(true, {}, $.fn.tab.settings, parameters) - : $.extend({}, $.fn.tab.settings), - - className = settings.className, - metadata = settings.metadata, - selector = settings.selector, - error = settings.error, - regExp = settings.regExp, - - eventNamespace = '.' + settings.namespace, - moduleNamespace = 'module-' + settings.namespace, - - $module = $(this), - $context, - $tabs, - - cache = {}, - firstLoad = true, - recursionDepth = 0, - element = this, - instance = $module.data(moduleNamespace), - - activeTabPath, - parameterArray, - module, - - historyEvent - - ; - - module = { - - initialize: function() { - module.debug('Initializing tab menu item', $module); - module.fix.callbacks(); - module.determineTabs(); - - module.debug('Determining tabs', settings.context, $tabs); - // set up automatic routing - if(settings.auto) { - module.set.auto(); - } - module.bind.events(); - - if(settings.history && !initializedHistory) { - module.initializeHistory(); - initializedHistory = true; - } - - if(settings.autoTabActivation && instance === undefined && module.determine.activeTab() == null) { - module.debug('No active tab detected, setting first tab active', module.get.initialPath()); - module.changeTab(settings.autoTabActivation === true ? module.get.initialPath() : settings.autoTabActivation); - }; - - module.instantiate(); - }, - - instantiate: function () { - module.verbose('Storing instance of module', module); - instance = module; - $module - .data(moduleNamespace, module) - ; - }, - - destroy: function() { - module.debug('Destroying tabs', $module); - $module - .removeData(moduleNamespace) - .off(eventNamespace) - ; - }, - - bind: { - events: function() { - // if using $.tab don't add events - if( !$.isWindow( element ) ) { - module.debug('Attaching tab activation events to element', $module); - $module - .on('click' + eventNamespace, module.event.click) - ; - } - } - }, - - determineTabs: function() { - var - $reference - ; - - // determine tab context - if(settings.context === 'parent') { - if($module.closest(selector.ui).length > 0) { - $reference = $module.closest(selector.ui); - module.verbose('Using closest UI element as parent', $reference); - } - else { - $reference = $module; - } - $context = $reference.parent(); - module.verbose('Determined parent element for creating context', $context); - } - else if(settings.context) { - $context = $(settings.context); - module.verbose('Using selector for tab context', settings.context, $context); - } - else { - $context = $('body'); - } - // find tabs - if(settings.childrenOnly) { - $tabs = $context.children(selector.tabs); - module.debug('Searching tab context children for tabs', $context, $tabs); - } - else { - $tabs = $context.find(selector.tabs); - module.debug('Searching tab context for tabs', $context, $tabs); - } - }, - - fix: { - callbacks: function() { - if( $.isPlainObject(parameters) && (parameters.onTabLoad || parameters.onTabInit) ) { - if(parameters.onTabLoad) { - parameters.onLoad = parameters.onTabLoad; - delete parameters.onTabLoad; - module.error(error.legacyLoad, parameters.onLoad); - } - if(parameters.onTabInit) { - parameters.onFirstLoad = parameters.onTabInit; - delete parameters.onTabInit; - module.error(error.legacyInit, parameters.onFirstLoad); - } - settings = $.extend(true, {}, $.fn.tab.settings, parameters); - } - } - }, - - initializeHistory: function() { - module.debug('Initializing page state'); - if( $.address === undefined ) { - module.error(error.state); - return false; - } - else { - if(settings.historyType == 'state') { - module.debug('Using HTML5 to manage state'); - if(settings.path !== false) { - $.address - .history(true) - .state(settings.path) - ; - } - else { - module.error(error.path); - return false; - } - } - $.address - .bind('change', module.event.history.change) - ; - } - }, - - event: { - click: function(event) { - var - tabPath = $(this).data(metadata.tab) - ; - if(tabPath !== undefined) { - if(settings.history) { - module.verbose('Updating page state', event); - $.address.value(tabPath); - } - else { - module.verbose('Changing tab', event); - module.changeTab(tabPath); - } - event.preventDefault(); - } - else { - module.debug('No tab specified'); - } - }, - history: { - change: function(event) { - var - tabPath = event.pathNames.join('/') || module.get.initialPath(), - pageTitle = settings.templates.determineTitle(tabPath) || false - ; - module.performance.display(); - module.debug('History change event', tabPath, event); - historyEvent = event; - if(tabPath !== undefined) { - module.changeTab(tabPath); - } - if(pageTitle) { - $.address.title(pageTitle); - } - } - } - }, - - refresh: function() { - if(activeTabPath) { - module.debug('Refreshing tab', activeTabPath); - module.changeTab(activeTabPath); - } - }, - - cache: { - - read: function(cacheKey) { - return (cacheKey !== undefined) - ? cache[cacheKey] - : false - ; - }, - add: function(cacheKey, content) { - cacheKey = cacheKey || activeTabPath; - module.debug('Adding cached content for', cacheKey); - cache[cacheKey] = content; - }, - remove: function(cacheKey) { - cacheKey = cacheKey || activeTabPath; - module.debug('Removing cached content for', cacheKey); - delete cache[cacheKey]; - } - }, - - escape: { - string: function(text) { - text = String(text); - return text.replace(regExp.escape, '\\$&'); - } - }, - - set: { - auto: function() { - var - url = (typeof settings.path == 'string') - ? settings.path.replace(/\/$/, '') + '/{$tab}' - : '/{$tab}' - ; - module.verbose('Setting up automatic tab retrieval from server', url); - if($.isPlainObject(settings.apiSettings)) { - settings.apiSettings.url = url; - } - else { - settings.apiSettings = { - url: url - }; - } - }, - loading: function(tabPath) { - var - $tab = module.get.tabElement(tabPath), - isLoading = $tab.hasClass(className.loading) - ; - if(!isLoading) { - module.verbose('Setting loading state for', $tab); - $tab - .addClass(className.loading) - .siblings($tabs) - .removeClass(className.active + ' ' + className.loading) - ; - if($tab.length > 0) { - settings.onRequest.call($tab[0], tabPath); - } - } - }, - state: function(state) { - $.address.value(state); - } - }, - - changeTab: function(tabPath) { - var - pushStateAvailable = (window.history && window.history.pushState), - shouldIgnoreLoad = (pushStateAvailable && settings.ignoreFirstLoad && firstLoad), - remoteContent = (settings.auto || $.isPlainObject(settings.apiSettings) ), - // only add default path if not remote content - pathArray = (remoteContent && !shouldIgnoreLoad) - ? module.utilities.pathToArray(tabPath) - : module.get.defaultPathArray(tabPath) - ; - tabPath = module.utilities.arrayToPath(pathArray); - $.each(pathArray, function(index, tab) { - var - currentPathArray = pathArray.slice(0, index + 1), - currentPath = module.utilities.arrayToPath(currentPathArray), - - isTab = module.is.tab(currentPath), - isLastIndex = (index + 1 == pathArray.length), - - $tab = module.get.tabElement(currentPath), - $anchor, - nextPathArray, - nextPath, - isLastTab - ; - module.verbose('Looking for tab', tab); - if(isTab) { - module.verbose('Tab was found', tab); - // scope up - activeTabPath = currentPath; - parameterArray = module.utilities.filterArray(pathArray, currentPathArray); - - if(isLastIndex) { - isLastTab = true; - } - else { - nextPathArray = pathArray.slice(0, index + 2); - nextPath = module.utilities.arrayToPath(nextPathArray); - isLastTab = ( !module.is.tab(nextPath) ); - if(isLastTab) { - module.verbose('Tab parameters found', nextPathArray); - } - } - if(isLastTab && remoteContent) { - if(!shouldIgnoreLoad) { - module.activate.navigation(currentPath); - module.fetch.content(currentPath, tabPath); - } - else { - module.debug('Ignoring remote content on first tab load', currentPath); - firstLoad = false; - module.cache.add(tabPath, $tab.html()); - module.activate.all(currentPath); - settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent); - settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent); - } - return false; - } - else { - module.debug('Opened local tab', currentPath); - module.activate.all(currentPath); - if( !module.cache.read(currentPath) ) { - module.cache.add(currentPath, true); - module.debug('First time tab loaded calling tab init'); - settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent); - } - settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent); - } - - } - else if(tabPath.search('/') == -1 && tabPath !== '') { - // look for in page anchor - tabPath = module.escape.string(tabPath); - $anchor = $('#' + tabPath + ', a[name="' + tabPath + '"]'); - currentPath = $anchor.closest('[data-tab]').data(metadata.tab); - $tab = module.get.tabElement(currentPath); - // if anchor exists use parent tab - if($anchor && $anchor.length > 0 && currentPath) { - module.debug('Anchor link used, opening parent tab', $tab, $anchor); - if( !$tab.hasClass(className.active) ) { - setTimeout(function() { - module.scrollTo($anchor); - }, 0); - } - module.activate.all(currentPath); - if( !module.cache.read(currentPath) ) { - module.cache.add(currentPath, true); - module.debug('First time tab loaded calling tab init'); - settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent); - } - settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent); - return false; - } - } - else { - module.error(error.missingTab, $module, $context, currentPath); - return false; - } - }); - }, - - scrollTo: function($element) { - var - scrollOffset = ($element && $element.length > 0) - ? $element.offset().top - : false - ; - if(scrollOffset !== false) { - module.debug('Forcing scroll to an in-page link in a hidden tab', scrollOffset, $element); - $(document).scrollTop(scrollOffset); - } - }, - - update: { - content: function(tabPath, html, evaluateScripts) { - var - $tab = module.get.tabElement(tabPath), - tab = $tab[0] - ; - evaluateScripts = (evaluateScripts !== undefined) - ? evaluateScripts - : settings.evaluateScripts - ; - if(typeof settings.cacheType == 'string' && settings.cacheType.toLowerCase() == 'dom' && typeof html !== 'string') { - $tab - .empty() - .append($(html).clone(true)) - ; - } - else { - if(evaluateScripts) { - module.debug('Updating HTML and evaluating inline scripts', tabPath, html); - $tab.html(html); - } - else { - module.debug('Updating HTML', tabPath, html); - tab.innerHTML = html; - } - } - } - }, - - fetch: { - - content: function(tabPath, fullTabPath) { - var - $tab = module.get.tabElement(tabPath), - apiSettings = { - dataType : 'html', - encodeParameters : false, - on : 'now', - cache : settings.alwaysRefresh, - headers : { - 'X-Remote': true - }, - onSuccess : function(response) { - if(settings.cacheType == 'response') { - module.cache.add(fullTabPath, response); - } - module.update.content(tabPath, response); - if(tabPath == activeTabPath) { - module.debug('Content loaded', tabPath); - module.activate.tab(tabPath); - } - else { - module.debug('Content loaded in background', tabPath); - } - settings.onFirstLoad.call($tab[0], tabPath, parameterArray, historyEvent); - settings.onLoad.call($tab[0], tabPath, parameterArray, historyEvent); - - if(settings.loadOnce) { - module.cache.add(fullTabPath, true); - } - else if(typeof settings.cacheType == 'string' && settings.cacheType.toLowerCase() == 'dom' && $tab.children().length > 0) { - setTimeout(function() { - var - $clone = $tab.children().clone(true) - ; - $clone = $clone.not('script'); - module.cache.add(fullTabPath, $clone); - }, 0); - } - else { - module.cache.add(fullTabPath, $tab.html()); - } - }, - urlData: { - tab: fullTabPath - } - }, - request = $tab.api('get request') || false, - existingRequest = ( request && request.state() === 'pending' ), - requestSettings, - cachedContent - ; - - fullTabPath = fullTabPath || tabPath; - cachedContent = module.cache.read(fullTabPath); - - - if(settings.cache && cachedContent) { - module.activate.tab(tabPath); - module.debug('Adding cached content', fullTabPath); - if(!settings.loadOnce) { - if(settings.evaluateScripts == 'once') { - module.update.content(tabPath, cachedContent, false); - } - else { - module.update.content(tabPath, cachedContent); - } - } - settings.onLoad.call($tab[0], tabPath, parameterArray, historyEvent); - } - else if(existingRequest) { - module.set.loading(tabPath); - module.debug('Content is already loading', fullTabPath); - } - else if($.api !== undefined) { - requestSettings = $.extend(true, {}, settings.apiSettings, apiSettings); - module.debug('Retrieving remote content', fullTabPath, requestSettings); - module.set.loading(tabPath); - $tab.api(requestSettings); - } - else { - module.error(error.api); - } - } - }, - - activate: { - all: function(tabPath) { - module.activate.tab(tabPath); - module.activate.navigation(tabPath); - }, - tab: function(tabPath) { - var - $tab = module.get.tabElement(tabPath), - $deactiveTabs = (settings.deactivate == 'siblings') - ? $tab.siblings($tabs) - : $tabs.not($tab), - isActive = $tab.hasClass(className.active) - ; - module.verbose('Showing tab content for', $tab); - if(!isActive) { - $tab - .addClass(className.active) - ; - $deactiveTabs - .removeClass(className.active + ' ' + className.loading) - ; - if($tab.length > 0) { - settings.onVisible.call($tab[0], tabPath); - } - } - }, - navigation: function(tabPath) { - var - $navigation = module.get.navElement(tabPath), - $deactiveNavigation = (settings.deactivate == 'siblings') - ? $navigation.siblings($allModules) - : $allModules.not($navigation), - isActive = $navigation.hasClass(className.active) - ; - module.verbose('Activating tab navigation for', $navigation, tabPath); - if(!isActive) { - $navigation - .addClass(className.active) - ; - $deactiveNavigation - .removeClass(className.active + ' ' + className.loading) - ; - } - } - }, - - deactivate: { - all: function() { - module.deactivate.navigation(); - module.deactivate.tabs(); - }, - navigation: function() { - $allModules - .removeClass(className.active) - ; - }, - tabs: function() { - $tabs - .removeClass(className.active + ' ' + className.loading) - ; - } - }, - - is: { - tab: function(tabName) { - return (tabName !== undefined) - ? ( module.get.tabElement(tabName).length > 0 ) - : false - ; - } - }, - - get: { - initialPath: function() { - return $allModules.eq(0).data(metadata.tab) || $tabs.eq(0).data(metadata.tab); - }, - path: function() { - return $.address.value(); - }, - // adds default tabs to tab path - defaultPathArray: function(tabPath) { - return module.utilities.pathToArray( module.get.defaultPath(tabPath) ); - }, - defaultPath: function(tabPath) { - var - $defaultNav = $allModules.filter('[data-' + metadata.tab + '^="' + module.escape.string(tabPath) + '/"]').eq(0), - defaultTab = $defaultNav.data(metadata.tab) || false - ; - if( defaultTab ) { - module.debug('Found default tab', defaultTab); - if(recursionDepth < settings.maxDepth) { - recursionDepth++; - return module.get.defaultPath(defaultTab); - } - module.error(error.recursion); - } - else { - module.debug('No default tabs found for', tabPath, $tabs); - } - recursionDepth = 0; - return tabPath; - }, - navElement: function(tabPath) { - tabPath = tabPath || activeTabPath; - return $allModules.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]'); - }, - tabElement: function(tabPath) { - var - $fullPathTab, - $simplePathTab, - tabPathArray, - lastTab - ; - tabPath = tabPath || activeTabPath; - tabPathArray = module.utilities.pathToArray(tabPath); - lastTab = module.utilities.last(tabPathArray); - $fullPathTab = $tabs.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]'); - $simplePathTab = $tabs.filter('[data-' + metadata.tab + '="' + module.escape.string(lastTab) + '"]'); - return ($fullPathTab.length > 0) - ? $fullPathTab - : $simplePathTab - ; - }, - tab: function() { - return activeTabPath; - } - }, - - determine: { - activeTab: function() { - var activeTab = null; - - $tabs.each(function(_index, tab) { - var $tab = $(tab); - - if( $tab.hasClass(className.active) ) { - var - tabPath = $(this).data(metadata.tab), - $anchor = $allModules.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]') - ; - - if( $anchor.hasClass(className.active) ) { - activeTab = tabPath; - } - } - }); - - return activeTab; - } - }, - - utilities: { - filterArray: function(keepArray, removeArray) { - return $.grep(keepArray, function(keepValue) { - return ( $.inArray(keepValue, removeArray) == -1); - }); - }, - last: function(array) { - return Array.isArray(array) - ? array[ array.length - 1] - : false - ; - }, - pathToArray: function(pathName) { - if(pathName === undefined) { - pathName = activeTabPath; - } - return typeof pathName == 'string' - ? pathName.split('/') - : [pathName] - ; - }, - arrayToPath: function(pathArray) { - return Array.isArray(pathArray) - ? pathArray.join('/') - : false - ; - } - }, - - setting: function(name, value) { - module.debug('Changing setting', name, value); - if( $.isPlainObject(name) ) { - $.extend(true, settings, name); - } - else if(value !== undefined) { - if($.isPlainObject(settings[name])) { - $.extend(true, settings[name], value); - } - else { - settings[name] = value; - } - } - else { - return settings[name]; - } - }, - internal: function(name, value) { - if( $.isPlainObject(name) ) { - $.extend(true, module, name); - } - else if(value !== undefined) { - module[name] = value; - } - else { - return module[name]; - } - }, - debug: function() { - if(!settings.silent && settings.debug) { - if(settings.performance) { - module.performance.log(arguments); - } - else { - module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); - module.debug.apply(console, arguments); - } - } - }, - verbose: function() { - if(!settings.silent && settings.verbose && settings.debug) { - if(settings.performance) { - module.performance.log(arguments); - } - else { - module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); - module.verbose.apply(console, arguments); - } - } - }, - error: function() { - if(!settings.silent) { - module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); - module.error.apply(console, arguments); - } - }, - performance: { - log: function(message) { - var - currentTime, - executionTime, - previousTime - ; - if(settings.performance) { - currentTime = new Date().getTime(); - previousTime = time || currentTime; - executionTime = currentTime - previousTime; - time = currentTime; - performance.push({ - 'Name' : message[0], - 'Arguments' : [].slice.call(message, 1) || '', - 'Element' : element, - 'Execution Time' : executionTime - }); - } - clearTimeout(module.performance.timer); - module.performance.timer = setTimeout(module.performance.display, 500); - }, - display: function() { - var - title = settings.name + ':', - totalTime = 0 - ; - time = false; - clearTimeout(module.performance.timer); - $.each(performance, function(index, data) { - totalTime += data['Execution Time']; - }); - title += ' ' + totalTime + 'ms'; - if(moduleSelector) { - title += ' \'' + moduleSelector + '\''; - } - if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) { - console.groupCollapsed(title); - if(console.table) { - console.table(performance); - } - else { - $.each(performance, function(index, data) { - console.log(data['Name'] + ': ' + data['Execution Time']+'ms'); - }); - } - console.groupEnd(); - } - performance = []; - } - }, - invoke: function(query, passedArguments, context) { - var - object = instance, - maxDepth, - found, - response - ; - passedArguments = passedArguments || queryArguments; - context = element || context; - if(typeof query == 'string' && object !== undefined) { - query = query.split(/[\. ]/); - maxDepth = query.length - 1; - $.each(query, function(depth, value) { - var camelCaseValue = (depth != maxDepth) - ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) - : query - ; - if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) { - object = object[camelCaseValue]; - } - else if( object[camelCaseValue] !== undefined ) { - found = object[camelCaseValue]; - return false; - } - else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) { - object = object[value]; - } - else if( object[value] !== undefined ) { - found = object[value]; - return false; - } - else { - module.error(error.method, query); - return false; - } - }); - } - if ( $.isFunction( found ) ) { - response = found.apply(context, passedArguments); - } - else if(found !== undefined) { - response = found; - } - if(Array.isArray(returnedValue)) { - returnedValue.push(response); - } - else if(returnedValue !== undefined) { - returnedValue = [returnedValue, response]; - } - else if(response !== undefined) { - returnedValue = response; - } - return found; - } - }; - if(methodInvoked) { - if(instance === undefined) { - module.initialize(); - } - module.invoke(query); - } - else { - if(instance !== undefined) { - instance.invoke('destroy'); - } - module.initialize(); - } - }) - ; - return (returnedValue !== undefined) - ? returnedValue - : this - ; - -}; - -// shortcut for tabbed content with no defined navigation -$.tab = function() { - $(window).tab.apply(this, arguments); -}; - -$.fn.tab.settings = { - - name : 'Tab', - namespace : 'tab', - - silent : false, - debug : false, - verbose : false, - performance : true, - - auto : false, // uses pjax style endpoints fetching content from same url with remote-content headers - history : false, // use browser history - historyType : 'hash', // #/ or html5 state - path : false, // base path of url - - context : false, // specify a context that tabs must appear inside - childrenOnly : false, // use only tabs that are children of context - maxDepth : 25, // max depth a tab can be nested - - deactivate : 'siblings', // whether tabs should deactivate sibling menu elements or all elements initialized together - - alwaysRefresh : false, // load tab content new every tab click - cache : true, // cache the content requests to pull locally - loadOnce : false, // Whether tab data should only be loaded once when using remote content - cacheType : 'response', // Whether to cache exact response, or to html cache contents after scripts execute - ignoreFirstLoad : false, // don't load remote content on first load - - apiSettings : false, // settings for api call - evaluateScripts : 'once', // whether inline scripts should be parsed (true/false/once). Once will not re-evaluate on cached content - autoTabActivation: true, // whether a non existing active tab will auto activate the first available tab - - onFirstLoad : function(tabPath, parameterArray, historyEvent) {}, // called first time loaded - onLoad : function(tabPath, parameterArray, historyEvent) {}, // called on every load - onVisible : function(tabPath, parameterArray, historyEvent) {}, // called every time tab visible - onRequest : function(tabPath, parameterArray, historyEvent) {}, // called ever time a tab beings loading remote content - - templates : { - determineTitle: function(tabArray) {} // returns page title for path - }, - - error: { - api : 'You attempted to load content without API module', - method : 'The method you called is not defined', - missingTab : 'Activated tab cannot be found. Tabs are case-sensitive.', - noContent : 'The tab you specified is missing a content url.', - path : 'History enabled, but no path was specified', - recursion : 'Max recursive depth reached', - legacyInit : 'onTabInit has been renamed to onFirstLoad in 2.0, please adjust your code.', - legacyLoad : 'onTabLoad has been renamed to onLoad in 2.0. Please adjust your code', - state : 'History requires Asual\'s Address library ' - }, - - regExp : { - escape : /[-[\]{}()*+?.,\\^$|#\s:=@]/g - }, - - metadata : { - tab : 'tab', - loaded : 'loaded', - promise: 'promise' - }, - - className : { - loading : 'loading', - active : 'active' - }, - - selector : { - tabs : '.ui.tab', - ui : '.ui' - } - -}; - -})( jQuery, window, document ); diff --git a/web_src/fomantic/semantic.json b/web_src/fomantic/semantic.json index 69474b7539..14afba2193 100644 --- a/web_src/fomantic/semantic.json +++ b/web_src/fomantic/semantic.json @@ -27,7 +27,6 @@ "form", "menu", "modal", - "search", - "tab" + "search" ] } diff --git a/web_src/js/features/common-global.js b/web_src/js/features/common-global.js index 2102e995d8..a99af0ef25 100644 --- a/web_src/js/features/common-global.js +++ b/web_src/js/features/common-global.js @@ -12,6 +12,7 @@ import {confirmModal} from './comp/ConfirmModal.js'; import {showErrorToast} from '../modules/toast.js'; import {request, POST, GET} from '../modules/fetch.js'; import '../htmx.js'; +import {initTab} from '../modules/tab.ts'; const {appUrl, appSubUrl, csrfToken, i18n} = window.config; @@ -195,7 +196,9 @@ export function initGlobalCommon() { $uiDropdowns.filter('.upward').dropdown('setting', 'direction', 'upward'); $uiDropdowns.filter('.downward').dropdown('setting', 'direction', 'downward'); - $('.tabular.menu .item').tab(); + for (const el of document.querySelectorAll('.tabular.menu')) { + initTab(el); + } initSubmitEventPolyfill(); document.addEventListener('submit', formFetchAction); diff --git a/web_src/js/features/comp/ComboMarkdownEditor.js b/web_src/js/features/comp/ComboMarkdownEditor.js index 4edd13bfc2..d96628c644 100644 --- a/web_src/js/features/comp/ComboMarkdownEditor.js +++ b/web_src/js/features/comp/ComboMarkdownEditor.js @@ -10,6 +10,7 @@ import {easyMDEToolbarActions} from './EasyMDEToolbarActions.js'; import {initTextExpander} from './TextExpander.js'; import {showErrorToast, showHintToast} from '../../modules/toast.js'; import {POST} from '../../modules/fetch.js'; +import {initTab} from '../../modules/tab.ts'; /** * validate if the given textarea is non-empty. @@ -200,7 +201,8 @@ class ComboMarkdownEditor { setupTab() { const $container = $(this.container); - const tabs = $container[0].querySelectorAll('.switch > .item'); + const switchEl = $container[0].querySelector('.switch'); + const tabs = switchEl.querySelectorAll('.item'); // Fomantic Tab requires the "data-tab" to be globally unique. // So here it uses our defined "data-tab-for" and "data-tab-panel" to generate the "data-tab" attribute for Fomantic. @@ -221,7 +223,7 @@ class ComboMarkdownEditor { }); }); - $(tabs).tab(); + initTab(switchEl); this.previewUrl = tabPreviewer.getAttribute('data-preview-url'); this.previewContext = tabPreviewer.getAttribute('data-preview-context'); diff --git a/web_src/js/features/repo-editor.js b/web_src/js/features/repo-editor.js index d3f5f2f8a9..ac4fc8a75e 100644 --- a/web_src/js/features/repo-editor.js +++ b/web_src/js/features/repo-editor.js @@ -5,10 +5,11 @@ import {hideElem, showElem, createElementFromHTML} from '../utils/dom.js'; import {initMarkupContent} from '../markup/content.js'; import {attachRefIssueContextPopup} from './contextpopup.js'; import {POST} from '../modules/fetch.js'; +import {initTab} from '../modules/tab.ts'; function initEditPreviewTab($form) { const $tabMenu = $form.find('.tabular.menu'); - $tabMenu.find('.item').tab(); + initTab($tabMenu[0]); const $previewTab = $tabMenu.find( `.item[data-tab="${$tabMenu.data('preview')}"]`, ); diff --git a/web_src/js/modules/fomantic.js b/web_src/js/modules/fomantic.js index c736026c6c..9d27a9bb47 100644 --- a/web_src/js/modules/fomantic.js +++ b/web_src/js/modules/fomantic.js @@ -11,9 +11,6 @@ import {initDimmer} from './dimmer.ts'; export const fomanticMobileScreen = window.matchMedia('only screen and (max-width: 767.98px)'); export function initGiteaFomantic() { - // Silence fomantic's error logging when tabs are used without a target content element - $.fn.tab.settings.silent = true; - // By default, use "exact match" for full text search $.fn.dropdown.settings.fullTextSearch = 'exact'; // Do not use "cursor: pointer" for dropdown labels diff --git a/web_src/js/modules/tab.ts b/web_src/js/modules/tab.ts new file mode 100644 index 0000000000..a19281793f --- /dev/null +++ b/web_src/js/modules/tab.ts @@ -0,0 +1,36 @@ +export function initTab(parentEl: Element) { + if (!parentEl) { + return; + } + + // Keep track of which tab is active for this element. + let activeTabPath = parentEl.querySelector('.item.active')?.getAttribute('data-tab'); + if (!activeTabPath) { + return; + } + + for (const el of parentEl.querySelectorAll('.item')) { + el.addEventListener('click', (ev) => { + // There's no data-tab attribute we can't do anything, ignore. + const tabPath = el.getAttribute('data-tab'); + if (!tabPath) { + return; + } + + // The item is already active, ignore. + if (el.classList.contains('active')) { + return; + } + + // Make the current item active and the previous item inactive. + parentEl.querySelector('.item.active').classList.remove('active'); + document.querySelector(`.tab.active[data-tab=${activeTabPath}]`).classList.remove('active'); + el.classList.add('active'); + document.querySelector(`.tab[data-tab=${tabPath}]`).classList.add('active'); + activeTabPath = tabPath; + + // Not really sure if this is useful, it is kept from how Fomantic did it. + ev.preventDefault(); + }, {passive: false}); + } +} From ccc33dd2dfcd8e9d81c7e91f74acf92114a61ea0 Mon Sep 17 00:00:00 2001 From: Gusted Date: Mon, 21 Jul 2025 22:34:54 +0200 Subject: [PATCH 188/495] chore: tweak fomantic config (#8583) Disable many unneeded variants in fomantic's config. Reduces the amount of CSS is generated. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8583 Reviewed-by: 0ko <0ko@noreply.codeberg.org> Co-authored-by: Gusted Co-committed-by: Gusted --- Makefile | 1 + web_src/fomantic/_site/globals/site.variables | 20 + web_src/fomantic/build/semantic.css | 849 ------------------ 3 files changed, 21 insertions(+), 849 deletions(-) diff --git a/Makefile b/Makefile index ea8ba4b192..17ed23662e 100644 --- a/Makefile +++ b/Makefile @@ -940,6 +940,7 @@ fomantic: cd $(FOMANTIC_WORK_DIR) && npm install --no-save cp -f $(FOMANTIC_WORK_DIR)/theme.config.less $(FOMANTIC_WORK_DIR)/node_modules/fomantic-ui/src/theme.config cp -rf $(FOMANTIC_WORK_DIR)/_site $(FOMANTIC_WORK_DIR)/node_modules/fomantic-ui/src/ + rm -rf $(FOMANTIC_WORK_DIR)/node_modules/fomantic-ui/src/themes/default/modules/dropdown.overrides $(SED_INPLACE) -e 's/ overrideBrowserslist\r/ overrideBrowserslist: ["defaults"]\r/g' $(FOMANTIC_WORK_DIR)/node_modules/fomantic-ui/tasks/config/tasks.js cd $(FOMANTIC_WORK_DIR) && npx gulp -f node_modules/fomantic-ui/gulpfile.js build # fomantic uses "touchstart" as click event for some browsers, it's not ideal, so we force fomantic to always use "click" as click event diff --git a/web_src/fomantic/_site/globals/site.variables b/web_src/fomantic/_site/globals/site.variables index 283b9e18eb..19375cf047 100644 --- a/web_src/fomantic/_site/globals/site.variables +++ b/web_src/fomantic/_site/globals/site.variables @@ -14,9 +14,14 @@ @variationButtonAnimated: false; @variationButtonAnimatedFade: false; @variationButtonAttached: false; +@variationButtonCircular: false; +@variationButtonFloated: false; @variationButtonInverted: false; +@variationButtonToggle: false; @variationButtonSocial: false; @variationButtonTertiary: false; +@variationButtonOr: false; +@variationButtonSizes: mini, tiny, small; @variationCalendarInverted: false; @variationCardInverted: false; @variationCheckboxInverted: false; @@ -24,14 +29,18 @@ @variationDimmerInverted: false; @variationDividerInverted: false; @variationDropdownInverted: false; +@variationDropdownScrollhint: false; +@variationDropdownSimple: false; @variationFeedInverted: false; @variationFlyoutInverted: false; @variationFormInverted: false; @variationFormTransparent: false; +@variationFormSizes: false; @variationGridDoubling: false; @variationGridInverted: false; @variationHeaderInverted: false; @variationIconInverted: false; +@variationInputAction: false; @variationInputInverted: false; @variationItemInverted: false; @variationLabelCorner: false; @@ -40,14 +49,25 @@ @variationLabelRibbon: false; @variationLabelTag: false; @variationListInverted: false; +@variationMenuText: false; +@variationMenuFitted: false; +@variationMenuFixed: false; @variationMenuInverted: false; @variationMessageInverted: false; +@variationModalBasic: false; @variationModalInverted: false; +@variationModalLegacy: false; +@variationModalOverlay: false; +@variationModalSizes: mini, tiny, small; @variationNagInverted: false; @variationPlaceholderInverted: false; @variationPopupInverted: false; @variationPopupTooltip: false; @variationProgressInverted: false; +@variationSearchAligned: false; +@variationSearchCategory: false; +@variationSearchShort: false; +@variationSearchLong: false; @variationSegmentInverted: false; @variationSegmentPiled: false; @variationSegmentStacked: false; diff --git a/web_src/fomantic/build/semantic.css b/web_src/fomantic/build/semantic.css index bd1777db36..2212ed2dd5 100644 --- a/web_src/fomantic/build/semantic.css +++ b/web_src/fomantic/build/semantic.css @@ -287,24 +287,6 @@ Variations *******************************/ -/*------------------- - Floated - --------------------*/ - -.ui[class*="left floated"].buttons, -.ui[class*="left floated"].button { - float: left; - margin-left: 0; - margin-right: 0.25em; -} - -.ui[class*="right floated"].buttons, -.ui[class*="right floated"].button { - float: right; - margin-right: 0; - margin-left: 0.25em; -} - /*------------------- Compact --------------------*/ @@ -363,14 +345,6 @@ font-size: 0.92857143rem; } -.ui.large.buttons .dropdown, -.ui.large.buttons .dropdown .menu > .item, -.ui.large.buttons .button, -.ui.large.buttons .or, -.ui.ui.ui.ui.large.button { - font-size: 1.14285714rem; -} - /*-------------- Icon Only ---------------*/ @@ -571,85 +545,6 @@ animation: loader 2s linear infinite; } -/*-------------- - Toggle - ---------------*/ - -/* Toggle (Modifies active state to give affordances) */ - -.ui.toggle.buttons .active.button, -.ui.buttons .button.toggle.active, -.ui.button.toggle.active { - background-color: #21BA45; - box-shadow: none; - text-shadow: none; - color: #FFFFFF; -} - -.ui.button.toggle.active:hover { - background-color: #16ab39; - text-shadow: none; - color: #FFFFFF; -} - -/*-------------- - Circular - ---------------*/ - -.ui.circular.button { - border-radius: 10em; -} - -.ui.circular.button > .icon { - width: 1em; - vertical-align: baseline; -} - -/*------------------- - Or Buttons - --------------------*/ - -.ui.buttons .or { - position: relative; - width: 0.3em; - height: 2.57142857em; - z-index: 3; -} - -.ui.buttons .or:before { - position: absolute; - text-align: center; - border-radius: 500rem; - content: 'or'; - top: 50%; - left: 50%; - background-color: #FFFFFF; - text-shadow: none; - margin-top: -0.89285714em; - margin-left: -0.89285714em; - width: 1.78571429em; - height: 1.78571429em; - line-height: 1.78571429em; - color: rgba(0, 0, 0, 0.4); - font-style: normal; - font-weight: 500; - box-shadow: 0 0 0 1px transparent inset; -} - -.ui.buttons .or[data-text]:before { - content: attr(data-text); -} - -/* Fluid Or */ - -.ui.fluid.buttons .or { - width: 0 !important; -} - -.ui.fluid.buttons .or:after { - display: none; -} - /*------------------- Fluid --------------------*/ @@ -2944,45 +2839,6 @@ select.ui.dropdown { box-shadow: none !important; } -/* CSS specific to iOS devices or firefox mobile only */ - -@supports (-webkit-touch-callout: none) or (-webkit-overflow-scrolling: touch) or (-moz-appearance:none) { -@media (-moz-touch-enabled), (pointer: coarse) { - .ui.dropdown .scrollhint.menu:not(.hidden):before { - animation: scrollhint 2s ease 2; - content: ''; - z-index: 15; - display: block; - position: absolute; - opacity: 0; - right: 0.25em; - top: 0; - height: 100%; - border-right: 0.25em solid; - border-left: 0; - -o-border-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0)) 1 100%; - border-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0)) 1 100%; - } - - .ui.inverted.dropdown .scrollhint.menu:not(.hidden):before { - -o-border-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.75), rgba(255, 255, 255, 0)) 1 100%; - border-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.75), rgba(255, 255, 255, 0)) 1 100%; - } - -@keyframes scrollhint { - 0% { - opacity: 1; - top: 100%; - } - - 100% { - opacity: 0; - top: 0; - } -} -} -} - /*-------------- Searchable ---------------*/ @@ -3820,85 +3676,6 @@ select.ui.dropdown { width: 20%; } -/*-------------- - Simple - ---------------*/ - -/* Displays without javascript */ - -.ui.simple.dropdown .menu:before, -.ui.simple.dropdown .menu:after { - display: none; -} - -.ui.simple.dropdown .menu { - position: absolute; - /* IE hack to make dropdown icons appear inline */ - display: -ms-inline-flexbox !important; - display: block; - overflow: hidden; - top: -9999px; - opacity: 0; - width: 0; - height: 0; - transition: opacity 0.1s ease; - margin-top: 0 !important; -} - -.ui.simple.active.dropdown, -.ui.simple.dropdown:hover { - border-bottom-left-radius: 0 !important; - border-bottom-right-radius: 0 !important; -} - -.ui.simple.active.dropdown > .menu, -.ui.simple.dropdown:hover > .menu { - overflow: visible; - width: auto; - height: auto; - top: 100%; - opacity: 1; -} - -.ui.simple.dropdown > .menu > .item:active > .menu, -.ui.simple.dropdown .menu .item:hover > .menu { - overflow: visible; - width: auto; - height: auto; - top: 0 !important; - left: 100%; - opacity: 1; -} - -.ui.simple.dropdown > .menu > .item:active > .left.menu, -.ui.simple.dropdown .menu .item:hover > .left.menu, -.right.menu .ui.simple.dropdown > .menu > .item:active > .menu:not(.right), -.right.menu .ui.simple.dropdown > .menu .item:hover > .menu:not(.right) { - left: auto; - right: 100%; -} - -.ui.simple.disabled.dropdown:hover .menu { - display: none; - height: 0; - width: 0; - overflow: hidden; -} - -/* Visible */ - -.ui.simple.visible.dropdown > .menu { - display: block; -} - -/* Scrolling */ - -.ui.simple.scrolling.active.dropdown > .menu, -.ui.simple.scrolling.dropdown:hover > .menu { - overflow-x: hidden; - overflow-y: auto; -} - /*-------------- Fluid ---------------*/ @@ -4184,70 +3961,6 @@ select.ui.dropdown { font-size: 1.14285714rem; } -/******************************* - Theme Overrides -*******************************/ - -/* Dropdown Carets */ - -@font-face { - font-family: 'Dropdown'; - src: url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMggjB5AAAAC8AAAAYGNtYXAPfuIIAAABHAAAAExnYXNwAAAAEAAAAWgAAAAIZ2x5Zjo82LgAAAFwAAABVGhlYWQAQ88bAAACxAAAADZoaGVhAwcB6QAAAvwAAAAkaG10eAS4ABIAAAMgAAAAIGxvY2EBNgDeAAADQAAAABJtYXhwAAoAFgAAA1QAAAAgbmFtZVcZpu4AAAN0AAABRXBvc3QAAwAAAAAEvAAAACAAAwIAAZAABQAAAUwBZgAAAEcBTAFmAAAA9QAZAIQAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADw2gHg/+D/4AHgACAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIPDa//3//wAAAAAAIPDX//3//wAB/+MPLQADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAIABJQElABMAABM0NzY3BTYXFhUUDwEGJwYvASY1AAUGBwEACAUGBoAFCAcGgAUBEgcGBQEBAQcECQYHfwYBAQZ/BwYAAQAAAG4BJQESABMAADc0PwE2MzIfARYVFAcGIyEiJyY1AAWABgcIBYAGBgUI/wAHBgWABwaABQWABgcHBgUFBgcAAAABABIASQC3AW4AEwAANzQ/ATYXNhcWHQEUBwYnBi8BJjUSBoAFCAcFBgYFBwgFgAbbBwZ/BwEBBwQJ/wgEBwEBB38GBgAAAAABAAAASQClAW4AEwAANxE0NzYzMh8BFhUUDwEGIyInJjUABQYHCAWABgaABQgHBgVbAQAIBQYGgAUIBwWABgYFBwAAAAEAAAABAADZuaKOXw889QALAgAAAAAA0ABHWAAAAADQAEdYAAAAAAElAW4AAAAIAAIAAAAAAAAAAQAAAeD/4AAAAgAAAAAAASUAAQAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAABAAAAASUAAAElAAAAtwASALcAAAAAAAAACgAUAB4AQgBkAIgAqgAAAAEAAAAIABQAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAOAAAAAQAAAAAAAgAOAEcAAQAAAAAAAwAOACQAAQAAAAAABAAOAFUAAQAAAAAABQAWAA4AAQAAAAAABgAHADIAAQAAAAAACgA0AGMAAwABBAkAAQAOAAAAAwABBAkAAgAOAEcAAwABBAkAAwAOACQAAwABBAkABAAOAFUAAwABBAkABQAWAA4AAwABBAkABgAOADkAAwABBAkACgA0AGMAaQBjAG8AbQBvAG8AbgBWAGUAcgBzAGkAbwBuACAAMQAuADAAaQBjAG8AbQBvAG8Abmljb21vb24AaQBjAG8AbQBvAG8AbgBSAGUAZwB1AGwAYQByAGkAYwBvAG0AbwBvAG4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=) format('truetype'), url(data:application/font-woff;charset=utf-8;base64,d09GRk9UVE8AAAVwAAoAAAAABSgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABDRkYgAAAA9AAAAdkAAAHZLDXE/09TLzIAAALQAAAAYAAAAGAIIweQY21hcAAAAzAAAABMAAAATA9+4ghnYXNwAAADfAAAAAgAAAAIAAAAEGhlYWQAAAOEAAAANgAAADYAQ88baGhlYQAAA7wAAAAkAAAAJAMHAelobXR4AAAD4AAAACAAAAAgBLgAEm1heHAAAAQAAAAABgAAAAYACFAAbmFtZQAABAgAAAFFAAABRVcZpu5wb3N0AAAFUAAAACAAAAAgAAMAAAEABAQAAQEBCGljb21vb24AAQIAAQA6+BwC+BsD+BgEHgoAGVP/i4seCgAZU/+LiwwHi2v4lPh0BR0AAACIDx0AAACNER0AAAAJHQAAAdASAAkBAQgPERMWGyAlKmljb21vb25pY29tb29udTB1MXUyMHVGMEQ3dUYwRDh1RjBEOXVGMERBAAACAYkABgAIAgABAAQABwAKAA0AVgCfAOgBL/yUDvyUDvyUDvuUDvtvi/emFYuQjZCOjo+Pj42Qiwj3lIsFkIuQiY6Hj4iNhouGi4aJh4eHCPsU+xQFiIiGiYaLhouHjYeOCPsU9xQFiI+Jj4uQCA77b4v3FBWLkI2Pjo8I9xT3FAWPjo+NkIuQi5CJjogI9xT7FAWPh42Hi4aLhomHh4eIiIaJhosI+5SLBYaLh42HjoiPiY+LkAgO+92d928Vi5CNkI+OCPcU9xQFjo+QjZCLkIuPiY6Hj4iNhouGCIv7lAWLhomHh4iIh4eJhouGi4aNiI8I+xT3FAWHjomPi5AIDvvdi+YVi/eUBYuQjZCOjo+Pj42Qi5CLkImOhwj3FPsUBY+IjYaLhouGiYeHiAj7FPsUBYiHhomGi4aLh42Hj4iOiY+LkAgO+JQU+JQViwwKAAAAAAMCAAGQAAUAAAFMAWYAAABHAUwBZgAAAPUAGQCEAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA8NoB4P/g/+AB4AAgAAAAAQAAAAAAAAAAAAAAIAAAAAAAAgAAAAMAAAAUAAMAAQAAABQABAA4AAAACgAIAAIAAgABACDw2v/9//8AAAAAACDw1//9//8AAf/jDy0AAwABAAAAAAAAAAAAAAABAAH//wAPAAEAAAABAAA5emozXw889QALAgAAAAAA0ABHWAAAAADQAEdYAAAAAAElAW4AAAAIAAIAAAAAAAAAAQAAAeD/4AAAAgAAAAAAASUAAQAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAABAAAAASUAAAElAAAAtwASALcAAAAAUAAACAAAAAAADgCuAAEAAAAAAAEADgAAAAEAAAAAAAIADgBHAAEAAAAAAAMADgAkAAEAAAAAAAQADgBVAAEAAAAAAAUAFgAOAAEAAAAAAAYABwAyAAEAAAAAAAoANABjAAMAAQQJAAEADgAAAAMAAQQJAAIADgBHAAMAAQQJAAMADgAkAAMAAQQJAAQADgBVAAMAAQQJAAUAFgAOAAMAAQQJAAYADgA5AAMAAQQJAAoANABjAGkAYwBvAG0AbwBvAG4AVgBlAHIAcwBpAG8AbgAgADEALgAwAGkAYwBvAG0AbwBvAG5pY29tb29uAGkAYwBvAG0AbwBvAG4AUgBlAGcAdQBsAGEAcgBpAGMAbwBtAG8AbwBuAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('woff'); - font-weight: normal; - font-style: normal; -} - -.ui.dropdown > .dropdown.icon { - font-family: 'Dropdown'; - line-height: 1; - height: 1em; - width: 1.23em; - backface-visibility: hidden; - font-weight: normal; - font-style: normal; - text-align: center; -} - -.ui.dropdown > .dropdown.icon { - width: auto; -} - -.ui.dropdown > .dropdown.icon:before { - content: '\f0d7'; -} - -/* Sub Menu */ - -.ui.dropdown .menu .item .dropdown.icon:before { - content: '\f0da' ; -} - -.ui.dropdown .item .left.dropdown.icon:before, -.ui.dropdown .left.menu .item .dropdown.icon:before { - content: "\f0d9" ; -} - -/* Vertical Menu Dropdown */ - -.ui.vertical.menu .dropdown.item > .dropdown.icon:before { - content: "\f0da" ; -} - -/* Icons for Reference -.dropdown.down.icon { - content: "\f0d7"; -} -.dropdown.up.icon { - content: "\f0d8"; -} -.dropdown.left.icon { - content: "\f0d9"; -} -.dropdown.icon.icon { - content: "\f0da"; -} -*/ - /******************************* User Overrides *******************************/ @@ -4659,38 +4372,6 @@ select.ui.dropdown { box-shadow: 0 0 0 0 rgba(34, 36, 38, 0.35) inset; } -.ui.form .ui.action.input:not([class*="left action"]) input:not([type]):focus, -.ui.form .ui.action.input:not([class*="left action"]) input[type="date"]:focus, -.ui.form .ui.action.input:not([class*="left action"]) input[type="datetime-local"]:focus, -.ui.form .ui.action.input:not([class*="left action"]) input[type="email"]:focus, -.ui.form .ui.action.input:not([class*="left action"]) input[type="number"]:focus, -.ui.form .ui.action.input:not([class*="left action"]) input[type="password"]:focus, -.ui.form .ui.action.input:not([class*="left action"]) input[type="search"]:focus, -.ui.form .ui.action.input:not([class*="left action"]) input[type="tel"]:focus, -.ui.form .ui.action.input:not([class*="left action"]) input[type="time"]:focus, -.ui.form .ui.action.input:not([class*="left action"]) input[type="text"]:focus, -.ui.form .ui.action.input:not([class*="left action"]) input[type="file"]:focus, -.ui.form .ui.action.input:not([class*="left action"]) input[type="url"]:focus { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.ui.form .ui[class*="left action"].input input:not([type]), -.ui.form .ui[class*="left action"].input input[type="date"], -.ui.form .ui[class*="left action"].input input[type="datetime-local"], -.ui.form .ui[class*="left action"].input input[type="email"], -.ui.form .ui[class*="left action"].input input[type="number"], -.ui.form .ui[class*="left action"].input input[type="password"], -.ui.form .ui[class*="left action"].input input[type="search"], -.ui.form .ui[class*="left action"].input input[type="tel"], -.ui.form .ui[class*="left action"].input input[type="time"], -.ui.form .ui[class*="left action"].input input[type="text"], -.ui.form .ui[class*="left action"].input input[type="file"], -.ui.form .ui[class*="left action"].input input[type="url"] { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - .ui.form textarea:focus { color: rgba(0, 0, 0, 0.95); border-color: #85B7D9; @@ -6032,30 +5713,6 @@ select.ui.dropdown { font-size: 1rem; } -.ui.mini.form, -.ui.mini.form .field .dropdown, -.ui.mini.form .field .dropdown .menu > .item { - font-size: 0.78571429rem; -} - -.ui.tiny.form, -.ui.tiny.form .field .dropdown, -.ui.tiny.form .field .dropdown .menu > .item { - font-size: 0.85714286rem; -} - -.ui.small.form, -.ui.small.form .field .dropdown, -.ui.small.form .field .dropdown .menu > .item { - font-size: 0.92857143rem; -} - -.ui.large.form, -.ui.large.form .field .dropdown, -.ui.large.form .field .dropdown .menu > .item { - font-size: 1.14285714rem; -} - /******************************* Theme Overrides *******************************/ @@ -7147,139 +6804,6 @@ Floated Menu / Item border-color: currentColor; } -/*-------------- - Text Menu - ---------------*/ - -.ui.text.menu { - background: none transparent; - border-radius: 0; - box-shadow: none; - border: none; - margin: 1em -0.5em; -} - -.ui.text.menu .item { - border-radius: 0; - box-shadow: none; - align-self: center; - margin: 0 0; - padding: 0.35714286em 0.5em; - font-weight: normal; - color: rgba(0, 0, 0, 0.6); - transition: opacity 0.1s ease; -} - -/* Border */ - -.ui.text.menu .item:before, -.ui.text.menu .menu .item:before { - display: none !important; -} - -/* Header */ - -.ui.text.menu .header.item { - background-color: transparent; - opacity: 1; - color: rgba(0, 0, 0, 0.85); - font-size: 0.92857143em; - text-transform: uppercase; - font-weight: 500; -} - -/* Image */ - -.ui.text.menu .item > img:not(.ui) { - margin: 0; -} - -/*--- fluid text ---*/ - -.ui.text.item.menu .item { - margin: 0; -} - -/*--- vertical text ---*/ - -.ui.vertical.text.menu { - margin: 1em 0; -} - -.ui.vertical.text.menu:first-child { - margin-top: 0; -} - -.ui.vertical.text.menu:last-child { - margin-bottom: 0; -} - -.ui.vertical.text.menu .item { - margin: 0.57142857em 0; - padding-left: 0; - padding-right: 0; -} - -.ui.vertical.text.menu .item > i.icon { - float: none; - margin: 0 0.35714286em 0 0; -} - -.ui.vertical.text.menu .header.item { - margin: 0.57142857em 0 0.71428571em; -} - -/* Vertical Sub Menu */ - -.ui.vertical.text.menu .item:not(.dropdown) > .menu { - margin: 0; -} - -.ui.vertical.text.menu .item:not(.dropdown) > .menu > .item { - margin: 0; - padding: 0.5em 0; -} - -/*--- hover ---*/ - -.ui.text.menu .item:hover { - opacity: 1; - background-color: transparent; -} - -/*--- active ---*/ - -.ui.text.menu .active.item { - background-color: transparent; - border: none; - box-shadow: none; - font-weight: normal; - color: rgba(0, 0, 0, 0.95); -} - -/*--- active hover ---*/ - -.ui.text.menu .active.item:hover { - background-color: transparent; -} - -/* Disable Bariations */ - -.ui.text.pointing.menu .active.item:after { - box-shadow: none; -} - -.ui.text.attached.menu { - box-shadow: none; -} - -/* Fluid */ - -.ui.fluid.text.menu { - margin-left: 0; - margin-right: 0; -} - /*-------------- Icon Only ---------------*/ @@ -7523,30 +7047,6 @@ Floated Menu / Item margin: 0 0 0 0.5rem; } -/*-------------- - Fitted - ---------------*/ - -.ui.fitted.menu .item, -.ui.fitted.menu .item .menu .item, -.ui.menu .fitted.item { - padding: 0; -} - -.ui.horizontally.fitted.menu .item, -.ui.horizontally.fitted.menu .item .menu .item, -.ui.menu .horizontally.fitted.item { - padding-top: 0.92857143em; - padding-bottom: 0.92857143em; -} - -.ui.vertically.fitted.menu .item, -.ui.vertically.fitted.menu .item .menu .item, -.ui.menu .vertically.fitted.item { - padding-left: 1.14285714em; - padding-right: 1.14285714em; -} - /*-------------- Borderless ---------------*/ @@ -7665,77 +7165,6 @@ Floated Menu / Item width: 8.333%; } -/*-------------- - Fixed - ---------------*/ - -.ui.menu.fixed { - position: fixed; - z-index: 101; - margin: 0; - width: 100%; -} - -.ui.menu.fixed, -.ui.menu.fixed .item:first-child, -.ui.menu.fixed .item:last-child { - border-radius: 0 !important; -} - -.ui.fixed.menu, -.ui[class*="top fixed"].menu { - top: 0; - left: 0; - right: auto; - bottom: auto; -} - -.ui[class*="top fixed"].menu { - border-top: none; - border-left: none; - border-right: none; -} - -.ui[class*="right fixed"].menu { - border-top: none; - border-bottom: none; - border-right: none; - top: 0; - right: 0; - left: auto; - bottom: auto; - width: auto; - height: 100%; -} - -.ui[class*="bottom fixed"].menu { - border-bottom: none; - border-left: none; - border-right: none; - bottom: 0; - left: 0; - top: auto; - right: auto; -} - -.ui[class*="left fixed"].menu { - border-top: none; - border-bottom: none; - border-left: none; - top: 0; - left: 0; - right: auto; - bottom: auto; - width: auto; - height: 100%; -} - -/* Coupling with Grid */ - -.ui.fixed.menu + .ui.grid { - padding-top: 2.75rem; -} - /*------------------- Pointing --------------------*/ @@ -8358,62 +7787,6 @@ Floated Menu / Item Types *******************************/ -.ui.basic.modal { - background-color: transparent; - border: none; - border-radius: 0; - box-shadow: none !important; - color: #FFFFFF; -} - -.ui.basic.modal > .header, -.ui.basic.modal > .content, -.ui.basic.modal > .actions { - background-color: transparent; -} - -.ui.basic.modal > .header { - color: #FFFFFF; - border-bottom: none; -} - -.ui.basic.modal > .close { - top: 1rem; - right: 1.5rem; - color: #FFFFFF; -} - -.ui.inverted.dimmer > .basic.modal { - color: rgba(0, 0, 0, 0.87); -} - -.ui.inverted.dimmer > .ui.basic.modal > .header { - color: rgba(0, 0, 0, 0.85); -} - -/* Resort to margin positioning if legacy */ - -.ui.legacy.legacy.modal, -.ui.legacy.legacy.page.dimmer > .ui.modal { - left: 50% !important; -} - -.ui.legacy.legacy.modal:not(.aligned), -.ui.legacy.legacy.page.dimmer > .ui.modal:not(.aligned) { - top: 50%; -} - -.ui.legacy.legacy.page.dimmer > .ui.scrolling.modal:not(.aligned), -.ui.page.dimmer > .ui.scrolling.legacy.legacy.modal:not(.aligned), -.ui.top.aligned.legacy.legacy.page.dimmer > .ui.modal:not(.aligned), -.ui.top.aligned.dimmer > .ui.legacy.legacy.modal:not(.aligned) { - top: auto; -} - -.ui.legacy.overlay.fullscreen.modal { - margin-top: -2rem !important; -} - /******************************* States *******************************/ @@ -8509,14 +7882,6 @@ Floated Menu / Item overflow: auto; } -.ui.overlay.fullscreen.modal > .content { - min-height: calc(100vh - 9.1rem); -} - -.ui.overlay.fullscreen.modal > .scrolling.content { - max-height: calc(100vh - 9.1rem); -} - /*-------------- Full Screen ---------------*/ @@ -8527,14 +7892,6 @@ Floated Menu / Item margin: 1em auto; } -.ui.overlay.fullscreen.modal { - width: 100%; - left: 0; - margin: 0 auto; - top: 0; - border-radius: 0; -} - .ui.modal > .close.inside + .header, .ui.fullscreen.modal > .header { padding-right: 2.25rem; @@ -8547,10 +7904,6 @@ Floated Menu / Item color: rgba(0, 0, 0, 0.87); } -.ui.basic.fullscreen.modal > .close { - color: #FFFFFF; -} - /*-------------- Size ---------------*/ @@ -8676,45 +8029,6 @@ Floated Menu / Item } } -.ui.large.modal > .header:not(.ui) { - font-size: 1.6em; -} - -@media only screen and (max-width: 767.98px) { - .ui.large.modal { - width: 95%; - margin: 0 0 0 0; - } -} - -@media only screen and (min-width: 768px) { - .ui.large.modal { - width: 88%; - margin: 0 0 0 0; - } -} - -@media only screen and (min-width: 992px) { - .ui.large.modal { - width: 1020px; - margin: 0 0 0 0; - } -} - -@media only screen and (min-width: 1200px) { - .ui.large.modal { - width: 1080px; - margin: 0 0 0 0; - } -} - -@media only screen and (min-width: 1920px) { - .ui.large.modal { - width: 1140px; - margin: 0 0 0 0; - } -} - /******************************* Theme Overrides *******************************/ @@ -8957,14 +8271,6 @@ Floated Menu / Item Active ---------------*/ -.ui.category.search > .results .category.active { - background: #F3F4F5; -} - -.ui.category.search > .results .category.active > .name { - color: rgba(0, 0, 0, 0.87); -} - .ui.search > .results .result.active, .ui.category.search > .results .category .result.active { position: relative; @@ -9033,75 +8339,6 @@ Floated Menu / Item color: #DB2828; } -/*-------------- - Category - ---------------*/ - -.ui.category.search .results { - width: 28em; -} - -.ui.category.search .results.animating, -.ui.category.search .results.visible { - display: table; -} - -/* Category */ - -.ui.category.search > .results .category { - display: table-row; - background: #F3F4F5; - box-shadow: none; - transition: background 0.1s ease, border-color 0.1s ease; -} - -/* Last Category */ - -.ui.category.search > .results .category:last-child { - border-bottom: none; -} - -/* First / Last */ - -.ui.category.search > .results .category:first-child .name + .result { - border-radius: 0 0.28571429rem 0 0; -} - -.ui.category.search > .results .category:last-child .result:last-child { - border-radius: 0 0 0.28571429rem 0; -} - -/* Category Result Name */ - -.ui.category.search > .results .category > .name { - display: table-cell; - text-overflow: ellipsis; - width: 100px; - white-space: nowrap; - background: transparent; - font-family: var(--fonts-regular); - font-size: 1em; - padding: 0.4em 1em; - font-weight: 500; - color: rgba(0, 0, 0, 0.4); - border-bottom: 1px solid rgba(34, 36, 38, 0.1); -} - -/* Category Result */ - -.ui.category.search > .results .category .results { - display: table-cell; - background: #FFFFFF; - border-left: 1px solid rgba(34, 36, 38, 0.15); - border-bottom: 1px solid rgba(34, 36, 38, 0.1); -} - -.ui.category.search > .results .category .result { - border-bottom: 1px solid rgba(34, 36, 38, 0.1); - transition: background 0.1s ease, border-color 0.1s ease; - padding: 0.85714286em 1.14285714em; -} - /******************************* Variations *******************************/ @@ -9143,92 +8380,6 @@ Floated Menu / Item } } -@media only screen and (max-width: 767.98px) { - .ui.search.short > .results { - max-height: 12.17714286em; - } - - .ui.search[class*="very short"] > .results { - max-height: 9.13285714em; - } - - .ui.search.long > .results { - max-height: 24.35428571em; - } - - .ui.search[class*="very long"] > .results { - max-height: 36.53142857em; - } -} - -@media only screen and (min-width: 768px) { - .ui.search.short > .results { - max-height: 18.26571429em; - } - - .ui.search[class*="very short"] > .results { - max-height: 13.69928571em; - } - - .ui.search.long > .results { - max-height: 36.53142857em; - } - - .ui.search[class*="very long"] > .results { - max-height: 54.79714286em; - } -} - -@media only screen and (min-width: 992px) { - .ui.search.short > .results { - max-height: 24.35428571em; - } - - .ui.search[class*="very short"] > .results { - max-height: 18.26571429em; - } - - .ui.search.long > .results { - max-height: 48.70857143em; - } - - .ui.search[class*="very long"] > .results { - max-height: 73.06285714em; - } -} - -@media only screen and (min-width: 1920px) { - .ui.search.short > .results { - max-height: 36.53142857em; - } - - .ui.search[class*="very short"] > .results { - max-height: 27.39857143em; - } - - .ui.search.long > .results { - max-height: 73.06285714em; - } - - .ui.search[class*="very long"] > .results { - max-height: 109.59428571em; - } -} - -/*------------------- - Left / Right - --------------------*/ - -.ui[class*="left aligned"].search > .results { - right: auto; - left: 0; -} - -.ui[class*="right aligned"].search > .results { - right: 0; - left: auto; -} - /*-------------- Fluid ---------------*/ From 65a9c12a1fdc31555b386d1a159c77e55ec226b7 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 22 Jul 2025 14:10:22 +0200 Subject: [PATCH 189/495] Update renovate to v41.42.2 (forgejo) (#8605) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- .forgejo/workflows/renovate.yml | 2 +- Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/renovate.yml b/.forgejo/workflows/renovate.yml index 1be3cc0b17..aa3d48d4a7 100644 --- a/.forgejo/workflows/renovate.yml +++ b/.forgejo/workflows/renovate.yml @@ -28,7 +28,7 @@ jobs: runs-on: docker container: - image: data.forgejo.org/renovate/renovate:41.40.0 + image: data.forgejo.org/renovate/renovate:41.42.2 steps: - name: Load renovate repo cache diff --git a/Makefile b/Makefile index 17ed23662e..1ab8c84646 100644 --- a/Makefile +++ b/Makefile @@ -47,7 +47,7 @@ GO_LICENSES_PACKAGE ?= github.com/google/go-licenses@v1.6.0 # renovate: datasour GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1 # renovate: datasource=go DEADCODE_PACKAGE ?= golang.org/x/tools/cmd/deadcode@v0.35.0 # renovate: datasource=go GOMOCK_PACKAGE ?= go.uber.org/mock/mockgen@v0.5.2 # renovate: datasource=go -RENOVATE_NPM_PACKAGE ?= renovate@41.40.0 # renovate: datasource=docker packageName=data.forgejo.org/renovate/renovate +RENOVATE_NPM_PACKAGE ?= renovate@41.42.2 # renovate: datasource=docker packageName=data.forgejo.org/renovate/renovate # https://github.com/disposable-email-domains/disposable-email-domains/commits/main/ DISPOSABLE_EMAILS_SHA ?= 0c27e671231d27cf66370034d7f6818037416989 # renovate: ... From 0c7612bca430896d240a51ed231cb2922d579114 Mon Sep 17 00:00:00 2001 From: Gusted Date: Tue, 22 Jul 2025 15:02:47 +0200 Subject: [PATCH 190/495] fix: follow symlinks for local assets (#8596) - This reverts behavior that was partially unintentionally introduced in forgejo/forgejo#8143, symbolic links were no longer followed (if they escaped the asset folder) for local assets. - Having symbolic links for user-added files is, to my understanding, a ,common usecase for NixOS and would thus have symbolic links in the asset folders. Avoiding symbolic links is not easy. - The previous code used `http.Dir`, we cannot use that as it's not of the same type. The equivalent is `os.DirFS`. - Unit test to prevent this regression from happening again. Reported-by: bloxx12 (Matrix). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8596 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- modules/assetfs/layered.go | 11 ++--------- modules/assetfs/layered_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/modules/assetfs/layered.go b/modules/assetfs/layered.go index 48c6728f43..2041f28bb1 100644 --- a/modules/assetfs/layered.go +++ b/modules/assetfs/layered.go @@ -56,14 +56,7 @@ func Local(name, base string, sub ...string) *Layer { panic(fmt.Sprintf("Unable to get absolute path for %q: %v", base, err)) } root := util.FilePathJoinAbs(base, sub...) - fsRoot, err := os.OpenRoot(root) - if err != nil { - if errors.Is(err, fs.ErrNotExist) { - return nil - } - panic(fmt.Sprintf("Unable to open layer %q", err)) - } - return &Layer{name: name, fs: fsRoot.FS(), localPath: root} + return &Layer{name: name, fs: os.DirFS(root), localPath: root} } // Bindata returns a new Layer with the given name, it serves files from the given bindata asset. @@ -80,7 +73,7 @@ type LayeredFS struct { // Layered returns a new LayeredFS with the given layers. The first layer is the top layer. func Layered(layers ...*Layer) *LayeredFS { - return &LayeredFS{layers: slices.DeleteFunc(layers, func(layer *Layer) bool { return layer == nil })} + return &LayeredFS{layers: layers} } // Open opens the named file. The caller is responsible for closing the file. diff --git a/modules/assetfs/layered_test.go b/modules/assetfs/layered_test.go index 87d1f92b00..76eeb61d83 100644 --- a/modules/assetfs/layered_test.go +++ b/modules/assetfs/layered_test.go @@ -1,4 +1,5 @@ // Copyright 2023 The Gitea Authors. All rights reserved. +// Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package assetfs @@ -108,3 +109,30 @@ func TestLayered(t *testing.T) { assert.Equal(t, "l1", assets.GetFileLayerName("f1")) assert.Equal(t, "l2", assets.GetFileLayerName("f2")) } + +// Allow layers to read symlink outside the layer root. +func TestLayeredSymlink(t *testing.T) { + dir := t.TempDir() + dirl1 := filepath.Join(dir, "l1") + require.NoError(t, os.MkdirAll(dirl1, 0o755)) + + // Open layer in dir/l1 + layer := Local("l1", dirl1) + + // Create a file in dir/outside + fileContents := []byte("I am outside the layer") + require.NoError(t, os.WriteFile(filepath.Join(dir, "outside"), fileContents, 0o600)) + // Symlink dir/l1/outside to dir/outside + require.NoError(t, os.Symlink(filepath.Join(dir, "outside"), filepath.Join(dirl1, "outside"))) + + // Open dir/l1/outside. + f, err := layer.Open("outside") + require.NoError(t, err) + defer f.Close() + + // Confirm it contains the output of dir/outside + contents, err := io.ReadAll(f) + require.NoError(t, err) + + assert.Equal(t, fileContents, contents) +} From 34caa374d611f9a06580f5117e3a8fa7d25fe095 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 22 Jul 2025 15:32:10 +0200 Subject: [PATCH 191/495] Update dependency forgejo/release-notes-assistant to v1.3.2 (forgejo) (#8606) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Update | Change | |---|---|---| | [forgejo/release-notes-assistant](https://code.forgejo.org/forgejo/release-notes-assistant) | patch | `v1.3.1` -> `v1.3.2` | --- ### Release Notes
forgejo/release-notes-assistant (forgejo/release-notes-assistant) ### [`v1.3.2`](https://code.forgejo.org/forgejo/release-notes-assistant/releases/tag/v1.3.2) [Compare Source](https://code.forgejo.org/forgejo/release-notes-assistant/compare/v1.3.1...v1.3.2) - bug fixes - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/94): fix: use clone --mirror to ensure git fetch retreives all branches - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/92): fix(ci): ensure commits are one second appart
--- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8606 Reviewed-by: Earl Warren Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- .forgejo/workflows/release-notes-assistant-milestones.yml | 2 +- .forgejo/workflows/release-notes-assistant.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/release-notes-assistant-milestones.yml b/.forgejo/workflows/release-notes-assistant-milestones.yml index 2c278c7eb5..e16c5a5507 100644 --- a/.forgejo/workflows/release-notes-assistant-milestones.yml +++ b/.forgejo/workflows/release-notes-assistant-milestones.yml @@ -6,7 +6,7 @@ on: env: RNA_WORKDIR: /srv/rna - RNA_VERSION: v1.3.1 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org + RNA_VERSION: v1.3.2 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org jobs: release-notes: diff --git a/.forgejo/workflows/release-notes-assistant.yml b/.forgejo/workflows/release-notes-assistant.yml index b5eb9cd2b0..9c97d21dff 100644 --- a/.forgejo/workflows/release-notes-assistant.yml +++ b/.forgejo/workflows/release-notes-assistant.yml @@ -8,7 +8,7 @@ on: - labeled env: - RNA_VERSION: v1.3.1 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org + RNA_VERSION: v1.3.2 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org jobs: release-notes: From cf46b22272efbac3c3981b239c85d9e5060ea79e Mon Sep 17 00:00:00 2001 From: Gusted Date: Tue, 22 Jul 2025 18:16:32 +0200 Subject: [PATCH 192/495] fix: upgrade fails or hang at migration[32]: Migrate maven package name concatenation (#8609) - Some SQL queries were not being run in the transaction of v32, which could lead to the migration failing or hanging indefinitely. - Use `db.WithTx` to get a `context.Context` that will make sure to run SQL queries in the transaction. - Using `db.DefaultContext` is fine to be used as parent context for starting the transaction, in all cases of starting the migration `x` and `db.DefaultContext` will point to the same engine. - Resolves forgejo/forgejo#8580 ## Testing 1. Have a v11 Forgejo database with a maven package. 2. Run this migration. ## Release notes - Bug fixes - [PR](https://codeberg.org/forgejo/forgejo/pulls/8609): upgrade fails or hang at migration[32]: Migrate maven package name concatenation Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8609 Reviewed-by: Earl Warren Reviewed-by: JSchlarb Co-authored-by: Gusted Co-committed-by: Gusted --- models/forgejo_migrations/v32.go | 87 +++++++++++++++----------------- 1 file changed, 40 insertions(+), 47 deletions(-) diff --git a/models/forgejo_migrations/v32.go b/models/forgejo_migrations/v32.go index 81b22c585c..ce3f855694 100644 --- a/models/forgejo_migrations/v32.go +++ b/models/forgejo_migrations/v32.go @@ -12,6 +12,7 @@ import ( "strconv" "strings" + "forgejo.org/models/db" "forgejo.org/models/packages" "forgejo.org/modules/json" "forgejo.org/modules/log" @@ -52,55 +53,50 @@ type mavenPackageResult struct { // ChangeMavenArtifactConcatenation resolves old dash-concatenated Maven coordinates and regenerates metadata. // Note: runs per-owner in a single transaction; failures roll back all owners. func ChangeMavenArtifactConcatenation(x *xorm.Engine) error { - sess := x.NewSession() - defer sess.Close() - - if err := sess.Begin(); err != nil { - return err - } - - // get unique owner IDs of Maven packages - var ownerIDs []*int64 - if err := sess. - Table("package"). - Select("package.owner_id"). - Where("package.type = 'maven'"). - GroupBy("package.owner_id"). - OrderBy("package.owner_id DESC"). - Find(&ownerIDs); err != nil { - return err - } - - for _, id := range ownerIDs { - if err := fixMavenArtifactPerOwner(sess, id); err != nil { - log.Error("owner %d migration failed: %v", id, err) - return err // rollback all + return db.WithTx(db.DefaultContext, func(ctx context.Context) error { + // get unique owner IDs of Maven packages + var ownerIDs []*int64 + if err := db.GetEngine(ctx). + Table("package"). + Select("package.owner_id"). + Where("package.type = 'maven'"). + GroupBy("package.owner_id"). + OrderBy("package.owner_id DESC"). + Find(&ownerIDs); err != nil { + return err } - } - return sess.Commit() + for _, id := range ownerIDs { + if err := fixMavenArtifactPerOwner(ctx, id); err != nil { + log.Error("owner %d migration failed: %v", id, err) + return err // rollback all + } + } + + return nil + }) } -func fixMavenArtifactPerOwner(sess *xorm.Session, ownerID *int64) error { - results, err := getMavenPackageResultsToUpdate(sess, ownerID) +func fixMavenArtifactPerOwner(ctx context.Context, ownerID *int64) error { + results, err := getMavenPackageResultsToUpdate(ctx, ownerID) if err != nil { return err } - if err = resolvePackageCollisions(results, sess); err != nil { + if err = resolvePackageCollisions(ctx, results); err != nil { return err } - if err = processPackageVersions(results, sess); err != nil { + if err = processPackageVersions(ctx, results); err != nil { return err } - return processPackageFiles(results, sess) + return processPackageFiles(ctx, results) } // processPackageFiles updates Maven package files and versions in the database // Returns an error if any database or processing operation fails. -func processPackageFiles(results []*mavenPackageResult, sess *xorm.Session) error { +func processPackageFiles(ctx context.Context, results []*mavenPackageResult) error { processedVersion := make(map[string][]*mavenPackageResult) for _, r := range results { @@ -113,7 +109,7 @@ func processPackageFiles(results []*mavenPackageResult, sess *xorm.Session) erro if r.PackageVersion.ID != r.PackageFile.VersionID { pattern := strings.TrimSuffix(r.PackageFile.Name, ".pom") + "%" // Per routers/api/packages/maven/maven.go:338, POM files already have the `IsLead`, so no update needed for this prop - if _, err := sess.Exec("UPDATE package_file SET version_id = ? WHERE version_id = ? and name like ?", r.PackageVersion.ID, r.PackageFile.VersionID, pattern); err != nil { + if _, err := db.GetEngine(ctx).Exec("UPDATE package_file SET version_id = ? WHERE version_id = ? and name like ?", r.PackageVersion.ID, r.PackageFile.VersionID, pattern); err != nil { return err } } @@ -128,14 +124,14 @@ func processPackageFiles(results []*mavenPackageResult, sess *xorm.Session) erro rs := packageResults[0] - pf, md, err := parseMetadata(sess, rs) + pf, md, err := parseMetadata(ctx, rs) if err != nil { return err } if pf != nil && md != nil && md.GroupID == rs.GroupID && md.ArtifactID == rs.ArtifactID { if pf.VersionID != rs.PackageFile.VersionID { - if _, err := sess.ID(pf.ID).Cols("version_id").Update(pf); err != nil { + if _, err := db.GetEngine(ctx).ID(pf.ID).Cols("version_id").Update(pf); err != nil { return err } } @@ -150,11 +146,9 @@ func processPackageFiles(results []*mavenPackageResult, sess *xorm.Session) erro // parseMetadata retrieves metadata for a Maven package file from the database and decodes it into a Metadata object. // Returns the associated PackageFile, Metadata, and any error encountered during processing. -func parseMetadata(sess *xorm.Session, snapshot *mavenPackageResult) (*packages.PackageFile, *Metadata, error) { - ctx := context.Background() - +func parseMetadata(ctx context.Context, snapshot *mavenPackageResult) (*packages.PackageFile, *Metadata, error) { var pf packages.PackageFile - found, err := sess.Table(pf). + found, err := db.GetEngine(ctx).Table(pf). Where("version_id = ?", snapshot.PackageFile.VersionID). // still the old id And("lower_name = ?", "maven-metadata.xml"). Get(&pf) @@ -183,7 +177,7 @@ func parseMetadata(sess *xorm.Session, snapshot *mavenPackageResult) (*packages. // processPackageVersions processes Maven package versions by updating metadata or inserting new records as necessary. // It avoids redundant updates by tracking already processed versions using a map. Returns an error on failure. -func processPackageVersions(results []*mavenPackageResult, sess *xorm.Session) error { +func processPackageVersions(ctx context.Context, results []*mavenPackageResult) error { processedVersion := make(map[string]int64) for _, r := range results { @@ -196,14 +190,14 @@ func processPackageVersions(results []*mavenPackageResult, sess *xorm.Session) e // for non collisions, just update the metadata if r.PackageVersion.PackageID == r.Package.ID { - if _, err := sess.ID(r.PackageVersion.ID).Cols("metadata_json").Update(r.PackageVersion); err != nil { + if _, err := db.GetEngine(ctx).ID(r.PackageVersion.ID).Cols("metadata_json").Update(r.PackageVersion); err != nil { return err } } else { log.Info("Create new maven package version for %s:%s", r.PackageName, r.PackageVersion.Version) r.PackageVersion.ID = 0 r.PackageVersion.PackageID = r.Package.ID - if _, err := sess.Insert(r.PackageVersion); err != nil { + if _, err := db.GetEngine(ctx).Insert(r.PackageVersion); err != nil { return err } } @@ -216,10 +210,9 @@ func processPackageVersions(results []*mavenPackageResult, sess *xorm.Session) e // getMavenPackageResultsToUpdate retrieves Maven package results that need updates based on the owner ID. // It processes POM metadata, fixes package inconsistencies, and filters corrupted package versions. -func getMavenPackageResultsToUpdate(sess *xorm.Session, ownerID *int64) ([]*mavenPackageResult, error) { - ctx := context.Background() +func getMavenPackageResultsToUpdate(ctx context.Context, ownerID *int64) ([]*mavenPackageResult, error) { var candidates []*mavenPackageResult - if err := sess. + if err := db.GetEngine(ctx). Table("package_file"). Select("package_file.*, package_version.*, package.*"). Join("INNER", "package_version", "package_version.id = package_file.version_id"). @@ -265,7 +258,7 @@ func getMavenPackageResultsToUpdate(sess *xorm.Session, ownerID *int64) ([]*mave // resolvePackageCollisions handles name collisions by keeping the first existing record and inserting new Package records for subsequent collisions. // Returns a map from PackageName to its resolved Package.ID. -func resolvePackageCollisions(results []*mavenPackageResult, sess *xorm.Session) error { +func resolvePackageCollisions(ctx context.Context, results []*mavenPackageResult) error { // Group new names by lowerName collisions := make(map[string][]string) for _, r := range results { @@ -292,7 +285,7 @@ func resolvePackageCollisions(results []*mavenPackageResult, sess *xorm.Session) } else if list[0] == r.PackageName { pkgIDByName[r.PackageName] = r.Package.ID - if _, err = sess.ID(r.Package.ID).Cols("name", "lower_name").Update(r.Package); err != nil { + if _, err = db.GetEngine(ctx).ID(r.Package.ID).Cols("name", "lower_name").Update(r.Package); err != nil { return err } // create a new entry @@ -300,7 +293,7 @@ func resolvePackageCollisions(results []*mavenPackageResult, sess *xorm.Session) log.Info("Create new maven package for %s", r.Package.Name) r.Package.ID = 0 - if _, err = sess.Insert(r.Package); err != nil { + if _, err = db.GetEngine(ctx).Insert(r.Package); err != nil { return err } From d74c9daa8af64f9165d62a10828aa10c297cbe13 Mon Sep 17 00:00:00 2001 From: Gusted Date: Tue, 22 Jul 2025 18:18:19 +0200 Subject: [PATCH 193/495] chore: disable E2E test for webkit (#8611) As far as I can see and tell, the newest webkit version contains a regression that makes this specific test fail. The screenshots that are uploaded upon failure do not seem to suggest that this test should fail. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8611 Reviewed-by: 0ko <0ko@noreply.codeberg.org> Reviewed-by: Michael Kriese Co-authored-by: Gusted Co-committed-by: Gusted --- tests/e2e/markup.test.e2e.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/e2e/markup.test.e2e.ts b/tests/e2e/markup.test.e2e.ts index 398a0a6300..b26e83661b 100644 --- a/tests/e2e/markup.test.e2e.ts +++ b/tests/e2e/markup.test.e2e.ts @@ -5,7 +5,8 @@ import {expect} from '@playwright/test'; import {save_visual, test} from './utils_e2e.ts'; -test('markup with #xyz-mode-only', async ({page}) => { +test('markup with #xyz-mode-only', async ({page}, workerInfo) => { + test.skip(['webkit', 'Mobile Safari'].includes(workerInfo.project.name), 'Newest version contains a regression'); const response = await page.goto('/user2/repo1/issues/1'); expect(response?.status()).toBe(200); From ed3c5588ad2bbd8fccbc30092cd5b3e1032bccbb Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 22 Jul 2025 19:26:22 +0200 Subject: [PATCH 194/495] Update renovate to v41.42.5 (forgejo) (#8615) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- .forgejo/workflows/renovate.yml | 2 +- Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/renovate.yml b/.forgejo/workflows/renovate.yml index aa3d48d4a7..a4e438a879 100644 --- a/.forgejo/workflows/renovate.yml +++ b/.forgejo/workflows/renovate.yml @@ -28,7 +28,7 @@ jobs: runs-on: docker container: - image: data.forgejo.org/renovate/renovate:41.42.2 + image: data.forgejo.org/renovate/renovate:41.42.5 steps: - name: Load renovate repo cache diff --git a/Makefile b/Makefile index 1ab8c84646..06d71a51c1 100644 --- a/Makefile +++ b/Makefile @@ -47,7 +47,7 @@ GO_LICENSES_PACKAGE ?= github.com/google/go-licenses@v1.6.0 # renovate: datasour GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1 # renovate: datasource=go DEADCODE_PACKAGE ?= golang.org/x/tools/cmd/deadcode@v0.35.0 # renovate: datasource=go GOMOCK_PACKAGE ?= go.uber.org/mock/mockgen@v0.5.2 # renovate: datasource=go -RENOVATE_NPM_PACKAGE ?= renovate@41.42.2 # renovate: datasource=docker packageName=data.forgejo.org/renovate/renovate +RENOVATE_NPM_PACKAGE ?= renovate@41.42.5 # renovate: datasource=docker packageName=data.forgejo.org/renovate/renovate # https://github.com/disposable-email-domains/disposable-email-domains/commits/main/ DISPOSABLE_EMAILS_SHA ?= 0c27e671231d27cf66370034d7f6818037416989 # renovate: ... From 8235a9752dfb327826b85311b7ddb4c3a5fcbf9d Mon Sep 17 00:00:00 2001 From: 0ko <0ko@noreply.codeberg.org> Date: Tue, 22 Jul 2025 20:51:58 +0200 Subject: [PATCH 195/495] fix(i18n): improve en locale (#8593) This commit has the following: * partial port of changes from [gitea#35053](https://github.com/go-gitea/gitea/pull/35053) ([corresponding WCP](https://codeberg.org/forgejo/forgejo/pulls/8591)) * some changes were applied * some strings we've fixed ourself before * some strings we don't have * a few fixes I wanted to propose but didn't want to dedicate a PR just to add a full stop to one string Co-authored-by: DJ Phoenix Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8593 Reviewed-by: Robert Wolff Reviewed-by: Gusted --- options/locale/locale_en-US.ini | 24 ++++++++++---------- options/locale_next/locale_en-US.json | 2 +- tests/integration/api_packages_cargo_test.go | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index c01d1464cb..391d3d06f0 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -372,7 +372,7 @@ no_reply_address = Hidden email domain no_reply_address_helper = Domain name for users with a hidden email address. For example, the username "joe" will be logged in Git as "joe@noreply.example.org" if the hidden email domain is set to "noreply.example.org". password_algorithm = Password hash algorithm invalid_password_algorithm = Invalid password hash algorithm -password_algorithm_helper = Set the password hashing algorithm. Algorithms have differing requirements and strength. The argon2 algorithm is rather secure but uses a lot of memory and may be inappropriate for small systems. +password_algorithm_helper = Set the password hashing algorithm. Algorithms have differing requirements and strengths. The argon2 algorithm is rather secure but uses a lot of memory and may be inappropriate for small systems. enable_update_checker = Enable update checker env_config_keys = Environment Configuration env_config_keys_prompt = The following environment variables will also be applied to your configuration file: @@ -479,7 +479,7 @@ email_domain_blacklisted = You cannot register with your email address. authorize_application = Authorize Application authorize_redirect_notice = You will be redirected to %s if you authorize this application. authorize_application_created_by = This application was created by %s. -authorize_application_description = If you grant the access, it will be able to access and write to all your account information, including private repos and organizations. +authorize_application_description = If you grant access, it will be able to access and write to all your account information, including private repos and organizations. authorize_title = Authorize "%s" to access your account? authorization_failed = Authorization failed authorization_failed_desc = The authorization failed because we detected an invalid request. Please contact the maintainer of the app you have tried to authorize. @@ -838,7 +838,7 @@ activations_pending = Activations pending can_not_add_email_activations_pending = There is a pending activation, try again in a few minutes if you want to add a new email. delete_email = Remove email_deletion = Remove email address -email_deletion_desc = The email address and related information will be removed from your account. Git commits by this email address will remain unchanged. Continue? +email_deletion_desc = This email address and related information will be removed from your account. Git commits by this email address will remain unchanged. Continue? email_deletion_success = The email address has been removed. theme_update_success = Your theme was updated. theme_update_error = The selected theme does not exist. @@ -1056,7 +1056,7 @@ user_block_success = The user has been blocked successfully. user_block_yourself = You cannot block yourself. quota.applies_to_user = The following quota rules apply to your account -quota.applies_to_org = The following quota rules apply to this organisation +quota.applies_to_org = The following quota rules apply to this organization quota.rule.exceeded = Exceeded quota.rule.exceeded.helper = The total size of objects for this rule has exceeded the quota. quota.rule.no_limit = Unlimited @@ -1153,7 +1153,7 @@ mirror_sync = synced mirror_sync_on_commit = Sync when commits are pushed mirror_address = Clone from URL mirror_address_desc = Put any required credentials in the Authorization section. -mirror_address_url_invalid = The provided URL is invalid. You must escape all components of the URL correctly. +mirror_address_url_invalid = The provided URL is invalid. Make sure that components of the URL are escaped correctly. mirror_address_protocol_invalid = The provided URL is invalid. Only http(s):// or git:// locations can be used for mirroring. mirror_lfs = Large File Storage (LFS) mirror_lfs_desc = Activate mirroring of LFS data. @@ -1251,7 +1251,7 @@ migrate_repo = Migrate repository migrate.repo_desc_helper = Leave empty to import existing description migrate.clone_address = Migrate / Clone from URL migrate.clone_address_desc = The HTTP(S) or Git "clone" URL of an existing repository -migrate.github_token_desc = You can put one or more tokens with comma separated here to make migrating faster because of GitHub API rate limit. WARN: Abusing this feature may violate the service provider's policy and lead to account blocking. +migrate.github_token_desc = You can put one or more tokens here separated by commas to make migrating faster by circumventing the GitHub API rate limit. WARNING: Abusing this feature may violate the service provider's policy and may lead to getting your account(s) blocked. migrate.clone_local_path = or a local server path migrate.permission_denied = You are not allowed to import local repositories. migrate.permission_denied_blocked = You cannot import from disallowed hosts, please ask the admin to check ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS settings. @@ -1919,7 +1919,7 @@ pulls.select_commit_hold_shift_for_range = Select commit. Hold shift + click to pulls.review_only_possible_for_full_diff = Review is only possible when viewing the full diff pulls.filter_changes_by_commit = Filter by commit pulls.nothing_to_compare = These branches are equal. There is no need to create a pull request. -pulls.nothing_to_compare_have_tag = The selected branch/tag are equal. +pulls.nothing_to_compare_have_tag = The selected branches/tags are equal. pulls.nothing_to_compare_and_allow_empty_pr = These branches are equal. This PR will be empty. pulls.has_pull_request = `A pull request between these branches already exists: %[2]s#%[3]d` pulls.create = Create pull request @@ -2088,7 +2088,7 @@ milestones.filter_sort.most_issues = Most issues milestones.filter_sort.least_issues = Least issues signing.will_sign = This commit will be signed with key "%s". -signing.wont_sign.error = There was an error whilst checking if the commit could be signed. +signing.wont_sign.error = There was an error while checking if the commit could be signed. signing.wont_sign.nokey = This instance has no key to sign this commit with. signing.wont_sign.never = Commits are never signed. signing.wont_sign.always = Commits are always signed. @@ -3065,9 +3065,9 @@ dashboard.resync_all_sshprincipals = Update the ".ssh/authorized_principals" fil dashboard.resync_all_hooks = Resynchronize pre-receive, update and post-receive hooks of all repositories dashboard.reinit_missing_repos = Reinitialize all missing Git repositories for which records exist dashboard.sync_external_users = Synchronize external user data -dashboard.cleanup_hook_task_table = Cleanup hook_task table -dashboard.cleanup_packages = Cleanup expired packages -dashboard.cleanup_actions = Cleanup expired logs and artifacts from actions +dashboard.cleanup_hook_task_table = Clean up hook_task table +dashboard.cleanup_packages = Clean up expired packages +dashboard.cleanup_actions = Clean up expired logs and artifacts from actions dashboard.server_uptime = Server uptime dashboard.current_goroutine = Current goroutines dashboard.current_memory_usage = Current memory usage @@ -3797,7 +3797,7 @@ owner.settings.cargo.initialize.success = The Cargo index was successfully creat owner.settings.cargo.rebuild = Rebuild index owner.settings.cargo.rebuild.description = Rebuilding can be useful if the index is not synchronized with the stored Cargo packages. owner.settings.cargo.rebuild.error = Failed to rebuild Cargo index: %v -owner.settings.cargo.rebuild.success = The Cargo index was successfully rebuild. +owner.settings.cargo.rebuild.success = The Cargo index was successfully rebuilt. owner.settings.cargo.rebuild.no_index = Cannot rebuild, no index is initialized. owner.settings.cleanuprules.title = Cleanup rules owner.settings.cleanuprules.add = Add cleanup rule diff --git a/options/locale_next/locale_en-US.json b/options/locale_next/locale_en-US.json index 3c877ff627..be3d7f92c4 100644 --- a/options/locale_next/locale_en-US.json +++ b/options/locale_next/locale_en-US.json @@ -103,7 +103,7 @@ "editor.textarea.tab_hint": "Line already indented. Press Tab again or Escape to leave the editor.", "editor.textarea.shift_tab_hint": "No indentation on this line. Press Shift + Tab again or Escape to leave the editor.", "admin.dashboard.cleanup_offline_runners": "Cleanup offline runners", - "settings.visibility.description": "Profile visibility affects others' ability to access your non-private repositories. Learn more", + "settings.visibility.description": "Profile visibility affects others' ability to access your non-private repositories. Learn more.", "avatar.constraints_hint": "Custom avatar may not exceed %[1]s in size or be larger than %[2]dx%[3]d pixels", "og.repo.summary_card.alt_description": "Summary card of repository %[1]s, described as: %[2]s", "meta.last_line": "Thank you for translating Forgejo! This line isn't seen by the users but it serves other purposes in the translation management. You can place a fun fact in the translation instead of translating it." diff --git a/tests/integration/api_packages_cargo_test.go b/tests/integration/api_packages_cargo_test.go index d42dc61c62..9e03d9e8a8 100644 --- a/tests/integration/api_packages_cargo_test.go +++ b/tests/integration/api_packages_cargo_test.go @@ -441,7 +441,7 @@ func TestRebuildCargo(t *testing.T) { flashCookie := session.GetCookie(gitea_context.CookieNameFlash) assert.NotNil(t, flashCookie) - assert.Equal(t, "success%3DThe%2BCargo%2Bindex%2Bwas%2Bsuccessfully%2Brebuild.", flashCookie.Value) + assert.Equal(t, "success%3DThe%2BCargo%2Bindex%2Bwas%2Bsuccessfully%2Brebuilt.", flashCookie.Value) }) }) } From 6007f2d3d51ae0af19d947469923177947715acf Mon Sep 17 00:00:00 2001 From: Gusted Date: Tue, 22 Jul 2025 23:40:30 +0200 Subject: [PATCH 196/495] fix: make the action feed resilient to database inconsistencies (#8617) This reverts commit 7380eac5a2a2c04e6e8948f74d1b71dee2ffb61e. Resolves forgejo/forgejo#8612 It is possible for the action feed to reference deleted repositories the `INNER JOIN` will make sure that these are filtered out. We cannot filter these out after the fact, because the value of `count` will still be incorrect. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8617 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- models/activities/action.go | 5 ++++- models/activities/action_test.go | 18 ++++++++++++++++++ models/fixtures/action.yml | 8 ++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/models/activities/action.go b/models/activities/action.go index 8592f81414..f928ad6784 100644 --- a/models/activities/action.go +++ b/models/activities/action.go @@ -473,8 +473,11 @@ func GetFeeds(ctx context.Context, opts GetFeedsOptions) (ActionList, int64, err return nil, 0, err } + sess := db.GetEngine(ctx).Where(cond). + Select("`action`.*"). // this line will avoid select other joined table's columns + Join("INNER", "repository", "`repository`.id = `action`.repo_id") + opts.SetDefaultValues() - sess := db.GetEngine(ctx).Where(cond) sess = db.SetSessionPagination(sess, &opts) actions := make([]*Action, 0, opts.PageSize) diff --git a/models/activities/action_test.go b/models/activities/action_test.go index 47dbd8ac2d..161d05bbfa 100644 --- a/models/activities/action_test.go +++ b/models/activities/action_test.go @@ -227,6 +227,24 @@ func TestNotifyWatchers(t *testing.T) { }) } +func TestGetFeedsCorrupted(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + unittest.AssertExistsAndLoadBean(t, &activities_model.Action{ + ID: 8, + RepoID: 1700, + }) + + actions, count, err := activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{ + RequestedUser: user, + Actor: user, + IncludePrivate: true, + }) + require.NoError(t, err) + assert.Empty(t, actions) + assert.Equal(t, int64(0), count) +} + func TestConsistencyUpdateAction(t *testing.T) { if !setting.Database.Type.IsSQLite3() { t.Skip("Test is only for SQLite database.") diff --git a/models/fixtures/action.yml b/models/fixtures/action.yml index a97e94fbf4..f1592d4569 100644 --- a/models/fixtures/action.yml +++ b/models/fixtures/action.yml @@ -59,6 +59,14 @@ created_unix: 1603011540 # grouped with id:7 - id: 8 + user_id: 1 + op_type: 12 # close issue + act_user_id: 1 + repo_id: 1700 # dangling intentional + is_private: false + created_unix: 1603011541 + +- id: 9 user_id: 34 op_type: 12 # close issue act_user_id: 34 From c17dd6c5b3552e3ac5e4d460edaf5743b574f53e Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 22 Jul 2025 23:55:46 +0200 Subject: [PATCH 197/495] Update module github.com/go-webauthn/webauthn to v0.13.4 (forgejo) (#8578) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8578 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 3dab99daf8..8a7c8b6faa 100644 --- a/go.mod +++ b/go.mod @@ -48,7 +48,7 @@ require ( github.com/go-ldap/ldap/v3 v3.4.6 github.com/go-openapi/spec v0.21.0 github.com/go-sql-driver/mysql v1.9.3 - github.com/go-webauthn/webauthn v0.13.3 + github.com/go-webauthn/webauthn v0.13.4 github.com/gobwas/glob v0.2.3 github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85 @@ -158,7 +158,7 @@ require ( github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/fatih/color v1.18.0 // indirect - github.com/fxamacker/cbor/v2 v2.8.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/go-ap/errors v0.0.0-20231003111023-183eef4b31b7 // indirect github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect github.com/go-enry/go-oniguruma v1.2.1 // indirect diff --git a/go.sum b/go.sum index 243dd6154d..a291e6c4b7 100644 --- a/go.sum +++ b/go.sum @@ -202,8 +202,8 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/fxamacker/cbor/v2 v2.8.0 h1:fFtUGXUzXPHTIUdne5+zzMPTfffl3RD5qYnkY40vtxU= -github.com/fxamacker/cbor/v2 v2.8.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/go-ap/activitypub v0.0.0-20231114162308-e219254dc5c9 h1:j2TrkUG/NATGi/EQS+MvEoF79CxiRUmT16ErFroNcKI= github.com/go-ap/activitypub v0.0.0-20231114162308-e219254dc5c9/go.mod h1:cJ9Ye0ZNSMN7RzZDBRY3E+8M3Bpf/R1JX22Ir9yX6WI= github.com/go-ap/errors v0.0.0-20231003111023-183eef4b31b7 h1:I2nuhyVI/48VXoRCCZR2hYBgnSXa+EuDJf/VyX06TC0= @@ -250,8 +250,8 @@ github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI6 github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= -github.com/go-webauthn/webauthn v0.13.3 h1:rvX539Gy9U4xAuFQRFJtkgoH5E1GEUyIVbHUDC89Mo4= -github.com/go-webauthn/webauthn v0.13.3/go.mod h1:H9EdVnxXFMMJyx8Nd/OL3aFFEop3Rb+Af1naR0IbuUQ= +github.com/go-webauthn/webauthn v0.13.4 h1:q68qusWPcqHbg9STSxBLBHnsKaLxNO0RnVKaAqMuAuQ= +github.com/go-webauthn/webauthn v0.13.4/go.mod h1:MglN6OH9ECxvhDqoq1wMoF6P6JRYDiQpC9nc5OomQmI= github.com/go-webauthn/x v0.1.23 h1:9lEO0s+g8iTyz5Vszlg/rXTGrx3CjcD0RZQ1GPZCaxI= github.com/go-webauthn/x v0.1.23/go.mod h1:AJd3hI7NfEp/4fI6T4CHD753u91l510lglU7/NMN6+E= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= From d87e2e7e409f74e03d17e0efa285f6487ed41b24 Mon Sep 17 00:00:00 2001 From: floss4good Date: Wed, 23 Jul 2025 00:20:15 +0200 Subject: [PATCH 198/495] feat: Admin interface for abuse reports (#7905) - Implementation of milestone 5. from **Task F. Moderation features: Reporting** (part of [amendment of the workplan](https://codeberg.org/forgejo/sustainability/src/branch/main/2022-12-01-nlnet/2025-02-07-extended-workplan.md#task-f-moderation-features-reporting) for NLnet 2022-12-035): `5. Forgejo admins can see a list of reports` There is a lot of room for improvements, but it was decided to start with a basic version so that feedback can be collected from real-life usages (based on which the UI might change a lot). - Also covers milestone 2. from same **Task F. Moderation features: Reporting**: `2. Reports from multiple users are combined in the database and don't create additional reports.` But instead of combining the reports when stored, they are grouped when retrieved (it was concluded _that it might be preferable to take care of the deduplication while implementing the admin interface_; see https://codeberg.org/forgejo/forgejo/pulls/7939#issuecomment-4841754 for more details). --- Follow-up of !6977 ### See also: - forgejo/design#30 --- This adds a new _Moderation reports_ section (/admin/moderation/reports) within the _Site administration_ page, where administrators can see an overview with the submitted abuse reports that are still open (not yet handled in any way). When multiple reports exist for the same content (submitted by distinct users) only the first one will be shown in the list and a counter can be seen on the right side (indicating the number of open reports for the same content type and ID). Clicking on the counter or the icon from the right side will open the details page where a list with all the reports (when multiple) linked to the reported content is available, as well as any shadow copy saved for the current report(s). The new section is available only when moderation in enabled ([moderation] ENABLED config is set as true within app.ini). Discussions regarding the UI/UX started with https://codeberg.org/forgejo/design/issues/30#issuecomment-2908849 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7905 Reviewed-by: Otto Reviewed-by: jerger Co-authored-by: floss4good Co-committed-by: floss4good --- models/issues/moderation.go | 31 +++- models/issues/moderation_test.go | 70 ++++++++ models/moderation/abuse_report.go | 15 +- models/moderation/abuse_report_detailed.go | 135 +++++++++++++++ models/moderation/shadow_copy.go | 16 ++ models/repo/moderation.go | 18 ++ models/repo/moderation_test.go | 51 ++++++ models/user/moderation.go | 20 +++ models/user/moderation_test.go | 60 +++++++ options/locale_next/locale_en-US.json | 4 + routers/web/admin/reports.go | 157 +++++++++++++++++ routers/web/web.go | 9 +- services/moderation/moderating.go | 41 +++++ .../admin/moderation/report_details.tmpl | 65 +++++++ templates/admin/moderation/reports.tmpl | 66 ++++++++ templates/admin/navbar.tmpl | 5 + tests/integration/admin_moderation_test.go | 158 ++++++++++++++++++ .../abuse_report.yml | 111 ++++++++++++ .../comment.yml | 21 +++ .../TestAdminModerationViewReports/issue.yml | 23 +++ .../issue_index.yml | 7 + .../repository.yml | 45 +++++ .../TestAdminModerationViewReports/user.yml | 108 ++++++++++++ 23 files changed, 1230 insertions(+), 6 deletions(-) create mode 100644 models/issues/moderation_test.go create mode 100644 models/moderation/abuse_report_detailed.go create mode 100644 models/repo/moderation_test.go create mode 100644 models/user/moderation_test.go create mode 100644 routers/web/admin/reports.go create mode 100644 services/moderation/moderating.go create mode 100644 templates/admin/moderation/report_details.tmpl create mode 100644 templates/admin/moderation/reports.tmpl create mode 100644 tests/integration/admin_moderation_test.go create mode 100644 tests/integration/fixtures/TestAdminModerationViewReports/abuse_report.yml create mode 100644 tests/integration/fixtures/TestAdminModerationViewReports/comment.yml create mode 100644 tests/integration/fixtures/TestAdminModerationViewReports/issue.yml create mode 100644 tests/integration/fixtures/TestAdminModerationViewReports/issue_index.yml create mode 100644 tests/integration/fixtures/TestAdminModerationViewReports/repository.yml create mode 100644 tests/integration/fixtures/TestAdminModerationViewReports/user.yml diff --git a/models/issues/moderation.go b/models/issues/moderation.go index 921f770d4d..9afb711d65 100644 --- a/models/issues/moderation.go +++ b/models/issues/moderation.go @@ -5,6 +5,7 @@ package issues import ( "context" + "strconv" "forgejo.org/models/moderation" "forgejo.org/modules/json" @@ -24,6 +25,21 @@ type IssueData struct { UpdatedUnix timeutil.TimeStamp } +// Implements GetFieldsMap() from ShadowCopyData interface, returning a list of pairs +// to be used when rendering the shadow copy for admins reviewing the corresponding abuse report(s). +func (cd IssueData) GetFieldsMap() []moderation.ShadowCopyField { + return []moderation.ShadowCopyField{ + {Key: "RepoID", Value: strconv.FormatInt(cd.RepoID, 10)}, + {Key: "Index", Value: strconv.FormatInt(cd.Index, 10)}, + {Key: "PosterID", Value: strconv.FormatInt(cd.PosterID, 10)}, + {Key: "Title", Value: cd.Title}, + {Key: "Content", Value: cd.Content}, + {Key: "ContentVersion", Value: strconv.Itoa(cd.ContentVersion)}, + {Key: "CreatedUnix", Value: cd.CreatedUnix.AsLocalTime().String()}, + {Key: "UpdatedUnix", Value: cd.UpdatedUnix.AsLocalTime().String()}, + } +} + // newIssueData creates a trimmed down issue to be used just to create a JSON structure // (keeping only the fields relevant for moderation purposes) func newIssueData(issue *Issue) IssueData { @@ -31,8 +47,8 @@ func newIssueData(issue *Issue) IssueData { RepoID: issue.RepoID, Index: issue.Index, PosterID: issue.PosterID, - Content: issue.Content, Title: issue.Title, + Content: issue.Content, ContentVersion: issue.ContentVersion, CreatedUnix: issue.CreatedUnix, UpdatedUnix: issue.UpdatedUnix, @@ -50,6 +66,19 @@ type CommentData struct { UpdatedUnix timeutil.TimeStamp } +// Implements GetFieldsMap() from ShadowCopyData interface, returning a list of pairs +// to be used when rendering the shadow copy for admins reviewing the corresponding abuse report(s). +func (cd CommentData) GetFieldsMap() []moderation.ShadowCopyField { + return []moderation.ShadowCopyField{ + {Key: "PosterID", Value: strconv.FormatInt(cd.PosterID, 10)}, + {Key: "IssueID", Value: strconv.FormatInt(cd.IssueID, 10)}, + {Key: "Content", Value: cd.Content}, + {Key: "ContentVersion", Value: strconv.Itoa(cd.ContentVersion)}, + {Key: "CreatedUnix", Value: cd.CreatedUnix.AsLocalTime().String()}, + {Key: "UpdatedUnix", Value: cd.UpdatedUnix.AsLocalTime().String()}, + } +} + // newCommentData creates a trimmed down comment to be used just to create a JSON structure // (keeping only the fields relevant for moderation purposes) func newCommentData(comment *Comment) CommentData { diff --git a/models/issues/moderation_test.go b/models/issues/moderation_test.go new file mode 100644 index 0000000000..adb07bd63a --- /dev/null +++ b/models/issues/moderation_test.go @@ -0,0 +1,70 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package issues_test + +import ( + "testing" + + "forgejo.org/models/issues" + "forgejo.org/models/moderation" + "forgejo.org/modules/timeutil" + + "github.com/stretchr/testify/assert" +) + +const ( + tsCreated timeutil.TimeStamp = timeutil.TimeStamp(1753093500) // 2025-07-21 10:25:00 UTC + tsUpdated timeutil.TimeStamp = timeutil.TimeStamp(1753093525) // 2025-07-21 10:25:25 UTC +) + +func testShadowCopyField(t *testing.T, scField moderation.ShadowCopyField, key, value string) { + assert.Equal(t, key, scField.Key) + assert.Equal(t, value, scField.Value) +} + +func TestIssueDataGetFieldsMap(t *testing.T) { + id := issues.IssueData{ + RepoID: 2001, + Index: 2, + PosterID: 1002, + Title: "Professional marketing services", + Content: "Visit my website at promote-your-business.biz for a list of available services.", + ContentVersion: 0, + CreatedUnix: tsCreated, + UpdatedUnix: tsUpdated, + } + scFields := id.GetFieldsMap() + + if assert.Len(t, scFields, 8) { + testShadowCopyField(t, scFields[0], "RepoID", "2001") + testShadowCopyField(t, scFields[1], "Index", "2") + testShadowCopyField(t, scFields[2], "PosterID", "1002") + testShadowCopyField(t, scFields[3], "Title", "Professional marketing services") + testShadowCopyField(t, scFields[4], "Content", "Visit my website at promote-your-business.biz for a list of available services.") + testShadowCopyField(t, scFields[5], "ContentVersion", "0") + testShadowCopyField(t, scFields[6], "CreatedUnix", tsCreated.AsLocalTime().String()) + testShadowCopyField(t, scFields[7], "UpdatedUnix", tsUpdated.AsLocalTime().String()) + } +} + +func TestCommentDataGetFieldsMap(t *testing.T) { + cd := issues.CommentData{ + PosterID: 1002, + IssueID: 3001, + Content: "Check out [alexsmith/website](/alexsmith/website)", + ContentVersion: 0, + CreatedUnix: tsCreated, + UpdatedUnix: tsUpdated, + } + scFields := cd.GetFieldsMap() + + if assert.Len(t, scFields, 6) { + testShadowCopyField(t, scFields[0], "PosterID", "1002") + testShadowCopyField(t, scFields[1], "IssueID", "3001") + testShadowCopyField(t, scFields[2], "Content", "Check out [alexsmith/website](/alexsmith/website)") + testShadowCopyField(t, scFields[3], "ContentVersion", "0") + testShadowCopyField(t, scFields[4], "CreatedUnix", tsCreated.AsLocalTime().String()) + testShadowCopyField(t, scFields[5], "UpdatedUnix", tsUpdated.AsLocalTime().String()) + } +} diff --git a/models/moderation/abuse_report.go b/models/moderation/abuse_report.go index 3a6244ef4c..9852268910 100644 --- a/models/moderation/abuse_report.go +++ b/models/moderation/abuse_report.go @@ -47,14 +47,21 @@ const ( AbuseCategoryTypeIllegalContent // 4 ) +var AbuseCategoriesTranslationKeys = map[AbuseCategoryType]string{ + AbuseCategoryTypeSpam: "moderation.abuse_category.spam", + AbuseCategoryTypeMalware: "moderation.abuse_category.malware", + AbuseCategoryTypeIllegalContent: "moderation.abuse_category.illegal_content", + AbuseCategoryTypeOther: "moderation.abuse_category.other_violations", +} + // GetAbuseCategoriesList returns a list of pairs with the available abuse category types // and their corresponding translation keys func GetAbuseCategoriesList() []AbuseCategoryItem { return []AbuseCategoryItem{ - {AbuseCategoryTypeSpam, "moderation.abuse_category.spam"}, - {AbuseCategoryTypeMalware, "moderation.abuse_category.malware"}, - {AbuseCategoryTypeIllegalContent, "moderation.abuse_category.illegal_content"}, - {AbuseCategoryTypeOther, "moderation.abuse_category.other_violations"}, + {AbuseCategoryTypeSpam, AbuseCategoriesTranslationKeys[AbuseCategoryTypeSpam]}, + {AbuseCategoryTypeMalware, AbuseCategoriesTranslationKeys[AbuseCategoryTypeMalware]}, + {AbuseCategoryTypeIllegalContent, AbuseCategoriesTranslationKeys[AbuseCategoryTypeIllegalContent]}, + {AbuseCategoryTypeOther, AbuseCategoriesTranslationKeys[AbuseCategoryTypeOther]}, } } diff --git a/models/moderation/abuse_report_detailed.go b/models/moderation/abuse_report_detailed.go new file mode 100644 index 0000000000..265d143709 --- /dev/null +++ b/models/moderation/abuse_report_detailed.go @@ -0,0 +1,135 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package moderation + +import ( + "context" + "fmt" + "strings" + + "forgejo.org/models/db" + "forgejo.org/modules/setting" + "forgejo.org/modules/timeutil" + + "xorm.io/builder" +) + +type AbuseReportDetailed struct { + AbuseReport `xorm:"extends"` + ReportedTimes int // only for overview + ReporterName string + ContentReference string + ShadowCopyDate timeutil.TimeStamp // only for details + ShadowCopyRawValue string // only for details +} + +func (ard AbuseReportDetailed) ContentTypeIconName() string { + switch ard.ContentType { + case ReportedContentTypeUser: + return "octicon-person" + case ReportedContentTypeRepository: + return "octicon-repo" + case ReportedContentTypeIssue: + return "octicon-issue-opened" + case ReportedContentTypeComment: + return "octicon-comment" + default: + return "octicon-question" + } +} + +func (ard AbuseReportDetailed) ContentURL() string { + switch ard.ContentType { + case ReportedContentTypeUser: + return strings.TrimLeft(ard.ContentReference, "@") + case ReportedContentTypeIssue: + return strings.ReplaceAll(ard.ContentReference, "#", "/issues/") + default: + return ard.ContentReference + } +} + +func GetOpenReports(ctx context.Context) ([]*AbuseReportDetailed, error) { + var reports []*AbuseReportDetailed + + // - For PostgreSQL user table name should be escaped. + // - Escaping can be done with double quotes (") but this doesn't work for MariaDB. + // - For SQLite index column name should be escaped. + // - Escaping can be done with double quotes (") or backticks (`). + // - For MariaDB/MySQL there is no need to escape the above. + // - Therefore we will use double quotes (") but only for PostgreSQL and SQLite. + identifierEscapeChar := `` + if setting.Database.Type.IsPostgreSQL() || setting.Database.Type.IsSQLite3() { + identifierEscapeChar = `"` + } + + err := db.GetEngine(ctx).SQL(fmt.Sprintf(`SELECT AR.*, ARD.reported_times, U.name AS reporter_name, REFS.ref AS content_reference + FROM abuse_report AR + INNER JOIN ( + SELECT min(id) AS id, count(id) AS reported_times + FROM abuse_report + WHERE status = %[2]d + GROUP BY content_type, content_id + ) ARD ON ARD.id = AR.id + LEFT JOIN %[1]suser%[1]s U ON U.id = AR.reporter_id + LEFT JOIN ( + SELECT %[3]d AS type, id, concat('@', name) AS "ref" + FROM %[1]suser%[1]s WHERE id IN ( + SELECT content_id FROM abuse_report WHERE status = %[2]d AND content_type = %[3]d + ) + UNION + SELECT %[4]d AS "type", id, concat(owner_name, '/', name) AS "ref" + FROM repository WHERE id IN ( + SELECT content_id FROM abuse_report WHERE status = %[2]d AND content_type = %[4]d + ) + UNION + SELECT %[5]d AS "type", I.id, concat(IR.owner_name, '/', IR.name, '#', I.%[1]sindex%[1]s) AS "ref" + FROM issue I + LEFT JOIN repository IR ON IR.id = I.repo_id + WHERE I.id IN ( + SELECT content_id FROM abuse_report WHERE status = %[2]d AND content_type = %[5]d + ) + UNION + SELECT %[6]d AS "type", C.id, concat(CIR.owner_name, '/', CIR.name, '/issues/', CI.%[1]sindex%[1]s, '#issuecomment-', C.id) AS "ref" + FROM comment C + LEFT JOIN issue CI ON CI.id = C.issue_id + LEFT JOIN repository CIR ON CIR.id = CI.repo_id + WHERE C.id IN ( + SELECT content_id FROM abuse_report WHERE status = %[2]d AND content_type = %[6]d + ) + ) REFS ON REFS.type = AR.content_type AND REFS.id = AR.content_id + ORDER BY AR.created_unix ASC`, identifierEscapeChar, ReportStatusTypeOpen, + ReportedContentTypeUser, ReportedContentTypeRepository, ReportedContentTypeIssue, ReportedContentTypeComment)). + Find(&reports) + if err != nil { + return nil, err + } + return reports, nil +} + +func GetOpenReportsByTypeAndContentID(ctx context.Context, contentType ReportedContentType, contentID int64) ([]*AbuseReportDetailed, error) { + var reports []*AbuseReportDetailed + + // Some remarks concerning PostgreSQL: + // - user table should be escaped (e.g. `user`); + // - tried to use aliases for table names but errors like 'invalid reference to FROM-clause entry' + // or 'missing FROM-clause entry' were returned; + err := db.GetEngine(ctx). + Select("abuse_report.*, `user`.name AS reporter_name, abuse_report_shadow_copy.created_unix AS shadow_copy_date, abuse_report_shadow_copy.raw_value AS shadow_copy_raw_value"). + Table("abuse_report"). + Join("LEFT", "user", "`user`.id = abuse_report.reporter_id"). + Join("LEFT", "abuse_report_shadow_copy", "abuse_report_shadow_copy.id = abuse_report.shadow_copy_id"). + Where(builder.Eq{ + "content_type": contentType, + "content_id": contentID, + "status": ReportStatusTypeOpen, + }). + Asc("abuse_report.created_unix"). + Find(&reports) + if err != nil { + return nil, err + } + + return reports, nil +} diff --git a/models/moderation/shadow_copy.go b/models/moderation/shadow_copy.go index d363610a48..8abb32e8ec 100644 --- a/models/moderation/shadow_copy.go +++ b/models/moderation/shadow_copy.go @@ -26,6 +26,22 @@ func (sc AbuseReportShadowCopy) NullableID() sql.NullInt64 { return sql.NullInt64{Int64: sc.ID, Valid: sc.ID > 0} } +// ShadowCopyField defines a pair of a value stored within the shadow copy +// (of some content reported as abusive) and a corresponding key (caption). +// A list of such pairs is used when rendering shadow copies for admins reviewing abuse reports. +type ShadowCopyField struct { + Key string + Value string +} + +// ShadowCopyData interface should be implemented by the type structs used for marshaling/unmarshaling the fields +// preserved as shadow copies for abusive content reports (i.e. UserData, RepositoryData, IssueData, CommentData). +type ShadowCopyData interface { + // GetFieldsMap returns a list of pairs with the fields stored within shadow copies + // of content reported as abusive, to be used when rendering a shadow copy in the admin UI. + GetFieldsMap() []ShadowCopyField +} + func init() { // RegisterModel will create the table if does not already exist // or any missing columns if the table was previously created. diff --git a/models/repo/moderation.go b/models/repo/moderation.go index d7b87dffa0..0d2672227b 100644 --- a/models/repo/moderation.go +++ b/models/repo/moderation.go @@ -5,6 +5,8 @@ package repo import ( "context" + "strconv" + "strings" "forgejo.org/models/moderation" "forgejo.org/modules/json" @@ -25,6 +27,22 @@ type RepositoryData struct { UpdatedUnix timeutil.TimeStamp } +// Implements GetFieldsMap() from ShadowCopyData interface, returning a list of pairs +// to be used when rendering the shadow copy for admins reviewing the corresponding abuse report(s). +func (rd RepositoryData) GetFieldsMap() []moderation.ShadowCopyField { + return []moderation.ShadowCopyField{ + {Key: "OwnerID", Value: strconv.FormatInt(rd.OwnerID, 10)}, + {Key: "OwnerName", Value: rd.OwnerName}, + {Key: "Name", Value: rd.Name}, + {Key: "Description", Value: rd.Description}, + {Key: "Website", Value: rd.Website}, + {Key: "Topics", Value: strings.Join(rd.Topics, ", ")}, + {Key: "Avatar", Value: rd.Avatar}, + {Key: "CreatedUnix", Value: rd.CreatedUnix.AsLocalTime().String()}, + {Key: "UpdatedUnix", Value: rd.UpdatedUnix.AsLocalTime().String()}, + } +} + // newRepositoryData creates a trimmed down repository to be used just to create a JSON structure // (keeping only the fields relevant for moderation purposes) func newRepositoryData(repo *Repository) RepositoryData { diff --git a/models/repo/moderation_test.go b/models/repo/moderation_test.go new file mode 100644 index 0000000000..9852db1b51 --- /dev/null +++ b/models/repo/moderation_test.go @@ -0,0 +1,51 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package repo_test + +import ( + "testing" + + "forgejo.org/models/moderation" + "forgejo.org/models/repo" + "forgejo.org/modules/timeutil" + + "github.com/stretchr/testify/assert" +) + +const ( + tsCreated timeutil.TimeStamp = timeutil.TimeStamp(1753093500) // 2025-07-21 10:25:00 UTC + tsUpdated timeutil.TimeStamp = timeutil.TimeStamp(1753093525) // 2025-07-21 10:25:25 UTC +) + +func testShadowCopyField(t *testing.T, scField moderation.ShadowCopyField, key, value string) { + assert.Equal(t, key, scField.Key) + assert.Equal(t, value, scField.Value) +} + +func TestRepositoryDataGetFieldsMap(t *testing.T) { + rd := repo.RepositoryData{ + OwnerID: 1002, + OwnerName: "alexsmith", + Name: "website", + Description: "My static website.", + Website: "http://promote-your-business.biz", + Topics: []string{"bulk-email", "email-services"}, + Avatar: "avatar-hash-repo-2002", + CreatedUnix: tsCreated, + UpdatedUnix: tsUpdated, + } + scFields := rd.GetFieldsMap() + + if assert.Len(t, scFields, 9) { + testShadowCopyField(t, scFields[0], "OwnerID", "1002") + testShadowCopyField(t, scFields[1], "OwnerName", "alexsmith") + testShadowCopyField(t, scFields[2], "Name", "website") + testShadowCopyField(t, scFields[3], "Description", "My static website.") + testShadowCopyField(t, scFields[4], "Website", "http://promote-your-business.biz") + testShadowCopyField(t, scFields[5], "Topics", "bulk-email, email-services") + testShadowCopyField(t, scFields[6], "Avatar", "avatar-hash-repo-2002") + testShadowCopyField(t, scFields[7], "CreatedUnix", tsCreated.AsLocalTime().String()) + testShadowCopyField(t, scFields[8], "UpdatedUnix", tsUpdated.AsLocalTime().String()) + } +} diff --git a/models/user/moderation.go b/models/user/moderation.go index f9c16a17b3..17901f84ec 100644 --- a/models/user/moderation.go +++ b/models/user/moderation.go @@ -37,6 +37,26 @@ type UserData struct { //revive:disable-line:exported AvatarEmail string } +// Implements GetFieldsMap() from ShadowCopyData interface, returning a list of pairs +// to be used when rendering the shadow copy for admins reviewing the corresponding abuse report(s). +func (ud UserData) GetFieldsMap() []moderation.ShadowCopyField { + return []moderation.ShadowCopyField{ + {Key: "Name", Value: ud.Name}, + {Key: "FullName", Value: ud.FullName}, + {Key: "Email", Value: ud.Email}, + {Key: "LoginName", Value: ud.LoginName}, + {Key: "Location", Value: ud.Location}, + {Key: "Website", Value: ud.Website}, + {Key: "Pronouns", Value: ud.Pronouns}, + {Key: "Description", Value: ud.Description}, + {Key: "CreatedUnix", Value: ud.CreatedUnix.AsLocalTime().String()}, + {Key: "UpdatedUnix", Value: ud.UpdatedUnix.AsLocalTime().String()}, + {Key: "LastLogin", Value: ud.LastLogin.AsLocalTime().String()}, + {Key: "Avatar", Value: ud.Avatar}, + {Key: "AvatarEmail", Value: ud.AvatarEmail}, + } +} + // newUserData creates a trimmed down user to be used just to create a JSON structure // (keeping only the fields relevant for moderation purposes) func newUserData(user *User) UserData { diff --git a/models/user/moderation_test.go b/models/user/moderation_test.go new file mode 100644 index 0000000000..f951e41e11 --- /dev/null +++ b/models/user/moderation_test.go @@ -0,0 +1,60 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package user_test + +import ( + "testing" + + "forgejo.org/models/moderation" + "forgejo.org/models/user" + "forgejo.org/modules/timeutil" + + "github.com/stretchr/testify/assert" +) + +const ( + tsCreated timeutil.TimeStamp = timeutil.TimeStamp(1753093200) // 2025-07-21 10:20:00 UTC + tsUpdated timeutil.TimeStamp = timeutil.TimeStamp(1753093320) // 2025-07-21 10:22:00 UTC + tsLastLogin timeutil.TimeStamp = timeutil.TimeStamp(1753093800) // 2025-07-21 10:30:00 UTC +) + +func testShadowCopyField(t *testing.T, scField moderation.ShadowCopyField, key, value string) { + assert.Equal(t, key, scField.Key) + assert.Equal(t, value, scField.Value) +} + +func TestUserDataGetFieldsMap(t *testing.T) { + ud := user.UserData{ + Name: "alexsmith", + FullName: "Alex Smith", + Email: "alexsmith@example.org", + LoginName: "", + Location: "@master@seo.net", + Website: "http://promote-your-business.biz", + Pronouns: "SEO", + Description: "I can help you promote your business online using SEO.", + CreatedUnix: tsCreated, + UpdatedUnix: tsUpdated, + LastLogin: tsLastLogin, + Avatar: "avatar-hash-user-1002", + AvatarEmail: "alexsmith@example.org", + } + scFields := ud.GetFieldsMap() + + if assert.Len(t, scFields, 13) { + testShadowCopyField(t, scFields[0], "Name", "alexsmith") + testShadowCopyField(t, scFields[1], "FullName", "Alex Smith") + testShadowCopyField(t, scFields[2], "Email", "alexsmith@example.org") + testShadowCopyField(t, scFields[3], "LoginName", "") + testShadowCopyField(t, scFields[4], "Location", "@master@seo.net") + testShadowCopyField(t, scFields[5], "Website", "http://promote-your-business.biz") + testShadowCopyField(t, scFields[6], "Pronouns", "SEO") + testShadowCopyField(t, scFields[7], "Description", "I can help you promote your business online using SEO.") + testShadowCopyField(t, scFields[8], "CreatedUnix", tsCreated.AsLocalTime().String()) + testShadowCopyField(t, scFields[9], "UpdatedUnix", tsUpdated.AsLocalTime().String()) + testShadowCopyField(t, scFields[10], "LastLogin", tsLastLogin.AsLocalTime().String()) + testShadowCopyField(t, scFields[11], "Avatar", "avatar-hash-user-1002") + testShadowCopyField(t, scFields[12], "AvatarEmail", "alexsmith@example.org") + } +} diff --git a/options/locale_next/locale_en-US.json b/options/locale_next/locale_en-US.json index be3d7f92c4..c2c682a4db 100644 --- a/options/locale_next/locale_en-US.json +++ b/options/locale_next/locale_en-US.json @@ -71,6 +71,10 @@ "keys.ssh.link": "SSH keys", "keys.gpg.link": "GPG keys", "admin.config.moderation_config": "Moderation configuration", + "admin.moderation.moderation_reports": "Moderation reports", + "admin.moderation.reports": "Reports", + "admin.moderation.no_open_reports": "There are currently no open reports.", + "admin.moderation.deleted_content_ref": "Reported content with type %[1]v and id %[2]d no longer exists", "moderation.report_abuse": "Report abuse", "moderation.report_content": "Report content", "moderation.report_abuse_form.header": "Report abuse to administrator", diff --git a/routers/web/admin/reports.go b/routers/web/admin/reports.go new file mode 100644 index 0000000000..ac43d1296f --- /dev/null +++ b/routers/web/admin/reports.go @@ -0,0 +1,157 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package admin + +import ( + "fmt" + "net/http" + + "forgejo.org/models/issues" + "forgejo.org/models/moderation" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/user" + "forgejo.org/modules/base" + "forgejo.org/services/context" + moderation_service "forgejo.org/services/moderation" +) + +const ( + tplModerationReports base.TplName = "admin/moderation/reports" + tplModerationReportDetails base.TplName = "admin/moderation/report_details" +) + +// AbuseReports renders the reports overview page from admin moderation section. +func AbuseReports(ctx *context.Context) { + ctx.Data["Title"] = ctx.Tr("admin.moderation.reports") + ctx.Data["PageIsAdminModerationReports"] = true + + reports, err := moderation.GetOpenReports(ctx) + if err != nil { + ctx.ServerError("Failed to load abuse reports", err) + return + } + + ctx.Data["Reports"] = reports + ctx.Data["AbuseCategories"] = moderation.AbuseCategoriesTranslationKeys + ctx.Data["GhostUserName"] = user.GhostUserName + + ctx.HTML(http.StatusOK, tplModerationReports) +} + +// AbuseReportDetails renders a report details page opened from the reports overview from admin moderation section. +func AbuseReportDetails(ctx *context.Context) { + ctx.Data["Title"] = ctx.Tr("admin.moderation.reports") + ctx.Data["PageIsAdminModerationReports"] = true + + ctx.Data["Type"] = ctx.ParamsInt64(":type") + ctx.Data["ID"] = ctx.ParamsInt64(":id") + + contentType := moderation.ReportedContentType(ctx.ParamsInt64(":type")) + + if !contentType.IsValid() { + ctx.Flash.Error("Invalid content type") + return + } + + reports, err := moderation.GetOpenReportsByTypeAndContentID(ctx, contentType, ctx.ParamsInt64(":id")) + if err != nil { + ctx.ServerError("Failed to load reports", err) + return + } + if len(reports) == 0 { + // something is wrong + ctx.HTML(http.StatusOK, tplModerationReportDetails) + return + } + + ctx.Data["Reports"] = reports + ctx.Data["AbuseCategories"] = moderation.AbuseCategoriesTranslationKeys + ctx.Data["GhostUserName"] = user.GhostUserName + + ctx.Data["GetShadowCopyMap"] = moderation_service.GetShadowCopyMap + + if err = setReportedContentDetails(ctx, reports[0]); err != nil { + if user.IsErrUserNotExist(err) || issues.IsErrCommentNotExist(err) || issues.IsErrIssueNotExist(err) || repo_model.IsErrRepoNotExist(err) { + ctx.Data["ContentReference"] = ctx.Tr("admin.moderation.deleted_content_ref", reports[0].ContentType, reports[0].ContentID) + } else { + ctx.ServerError("Failed to load reported content details", err) + return + } + } + + ctx.HTML(http.StatusOK, tplModerationReportDetails) +} + +// setReportedContentDetails adds some values into context data for the given report +// (icon name, a reference, the URL and in case of issues and comments also the poster name). +func setReportedContentDetails(ctx *context.Context, report *moderation.AbuseReportDetailed) error { + contentReference := "" + var contentURL string + var poster string + contentType := report.ContentType + contentID := report.ContentID + + ctx.Data["ContentTypeIconName"] = report.ContentTypeIconName() + + switch contentType { + case moderation.ReportedContentTypeUser: + reportedUser, err := user.GetUserByID(ctx, contentID) + if err != nil { + return err + } + + contentReference = reportedUser.Name + contentURL = reportedUser.HomeLink() + case moderation.ReportedContentTypeRepository: + repo, err := repo_model.GetRepositoryByID(ctx, contentID) + if err != nil { + return err + } + + contentReference = repo.FullName() + contentURL = repo.Link() + case moderation.ReportedContentTypeIssue: + issue, err := issues.GetIssueByID(ctx, contentID) + if err != nil { + return err + } + if err = issue.LoadRepo(ctx); err != nil { + return err + } + if err = issue.LoadPoster(ctx); err != nil { + return err + } + if issue.Poster != nil { + poster = issue.Poster.Name + } + + contentReference = fmt.Sprintf("%s#%d", issue.Repo.FullName(), issue.Index) + contentURL = issue.Link() + case moderation.ReportedContentTypeComment: + comment, err := issues.GetCommentByID(ctx, contentID) + if err != nil { + return err + } + if err = comment.LoadIssue(ctx); err != nil { + return err + } + if err = comment.Issue.LoadRepo(ctx); err != nil { + return err + } + if err = comment.LoadPoster(ctx); err != nil { + return err + } + if comment.Poster != nil { + poster = comment.Poster.Name + } + + contentURL = comment.Link(ctx) + contentReference = contentURL + } + + ctx.Data["ContentReference"] = contentReference + ctx.Data["ContentURL"] = contentURL + ctx.Data["Poster"] = poster + return nil +} diff --git a/routers/web/web.go b/routers/web/web.go index 6cca2a9f2e..497352cdc7 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -781,7 +781,14 @@ func registerRoutes(m *web.Route) { addSettingsRunnersRoutes() addSettingsVariablesRoutes() }) - }, adminReq, ctxDataSet("EnableOAuth2", setting.OAuth2.Enabled, "EnablePackages", setting.Packages.Enabled)) + + if setting.Moderation.Enabled { + m.Group("/moderation/reports", func() { + m.Get("", admin.AbuseReports) + m.Get("/type/{type:1|2|3|4}/id/{id}", admin.AbuseReportDetails) + }) + } + }, adminReq, ctxDataSet("EnableOAuth2", setting.OAuth2.Enabled, "EnablePackages", setting.Packages.Enabled, "EnableModeration", setting.Moderation.Enabled)) // ***** END: Admin ***** m.Group("", func() { diff --git a/services/moderation/moderating.go b/services/moderation/moderating.go new file mode 100644 index 0000000000..f329070963 --- /dev/null +++ b/services/moderation/moderating.go @@ -0,0 +1,41 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package moderation + +import ( + "forgejo.org/models/issues" + "forgejo.org/models/moderation" + "forgejo.org/models/repo" + "forgejo.org/models/user" + "forgejo.org/modules/json" + "forgejo.org/modules/log" + "forgejo.org/services/context" +) + +// GetShadowCopyMap unmarshals the shadow copy raw value of the given abuse report and returns a list of pairs +// (to be rendered when the report is reviewed by an admin). +// If the report does not have a shadow copy ID or the raw value is empty, returns nil. +// If the unmarshal fails a warning is added in the logs and returns nil. +func GetShadowCopyMap(ctx *context.Context, ard *moderation.AbuseReportDetailed) []moderation.ShadowCopyField { + if ard.ShadowCopyID.Valid && len(ard.ShadowCopyRawValue) > 0 { + var data moderation.ShadowCopyData + + switch ard.ContentType { + case moderation.ReportedContentTypeUser: + data = new(user.UserData) + case moderation.ReportedContentTypeRepository: + data = new(repo.RepositoryData) + case moderation.ReportedContentTypeIssue: + data = new(issues.IssueData) + case moderation.ReportedContentTypeComment: + data = new(issues.CommentData) + } + if err := json.Unmarshal([]byte(ard.ShadowCopyRawValue), &data); err != nil { + log.Warn("Unmarshal failed for shadow copy #%d. %v", ard.ShadowCopyID.Int64, err) + return nil + } + return data.GetFieldsMap() + } + return nil +} diff --git a/templates/admin/moderation/report_details.tmpl b/templates/admin/moderation/report_details.tmpl new file mode 100644 index 0000000000..26a8b5964b --- /dev/null +++ b/templates/admin/moderation/report_details.tmpl @@ -0,0 +1,65 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin")}} +
+

+ {{ctx.Locale.Tr "admin.moderation.reports"}} +

+ {{if .Reports}} +
+
+
+ {{svg .ContentTypeIconName 24}} +
+
+
+ {{if .ContentURL}}{{.ContentReference}}{{else}}{{.ContentReference}}{{end}} + {{if .Poster}} — {{.Poster}}{{end}} +
+
+
+
+ {{end}} +
+ {{if .Reports}} +
+ {{range .Reports}} +
+
+
+ + {{svg "octicon-calendar"}} + {{DateUtils.AbsoluteShort .CreatedUnix}} + + + {{svg "octicon-report"}} + {{if .ReporterName}}{{.ReporterName}}{{else}}{{$.GhostUserName}}{{end}} + + + {{svg "octicon-tag" 12}} + {{ctx.Locale.Tr (index $.AbuseCategories .Category)}} + +
+ +
{{.Remarks}}
+ + {{if .ShadowCopyID.Valid}} +
{{DateUtils.FullTime .ShadowCopyDate}} shadow copy + + {{range $scField := (call $.GetShadowCopyMap $.Context .)}} + + + + + {{end}} +
{{$scField.Key}}{{$scField.Value}}
+
+ {{end}} +
+
+ {{end}} +
+ {{else}} +

{{ctx.Locale.Tr "admin.moderation.no_open_reports"}}

+ {{end}} +
+
+{{template "admin/layout_footer" .}} diff --git a/templates/admin/moderation/reports.tmpl b/templates/admin/moderation/reports.tmpl new file mode 100644 index 0000000000..151a079673 --- /dev/null +++ b/templates/admin/moderation/reports.tmpl @@ -0,0 +1,66 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin")}} +
+

+ {{ctx.Locale.Tr "admin.moderation.reports"}} +

+ +
+ {{if .Reports}} +
+
+
+ Type +
+
+ Summary +
+
+ {{ctx.Locale.Tr "admin.moderation.reports"}} +
+
+ {{range .Reports}} +
+
+ {{svg .ContentTypeIconName 24}} +
+
+
+ {{if .ContentReference}} + {{.ContentReference}} + {{else}} + {{ctx.Locale.Tr "admin.moderation.deleted_content_ref" .ContentType .ContentID}} + {{end}} +
+
+ + {{svg "octicon-calendar"}} + {{DateUtils.TimeSince .CreatedUnix}} + + + {{svg "octicon-report"}} + {{if .ReporterName}}{{.ReporterName}}{{else}}{{$.GhostUserName}}{{end}} + + + {{svg "octicon-tag" 12}} + {{ctx.Locale.Tr (index $.AbuseCategories .Category)}} + +
+ +
+ {{ctx.Locale.Tr "moderation.report_remarks"}}: {{.Remarks}} +
+
+ +
+ {{.ReportedTimes}}{{svg "octicon-report" "tw-ml-2"}} +
+
+
+ {{end}} +
+ {{else}} +

{{ctx.Locale.Tr "admin.moderation.no_open_reports"}}

+ {{end}} +
+
+{{template "admin/layout_footer" .}} diff --git a/templates/admin/navbar.tmpl b/templates/admin/navbar.tmpl index 1ec703b296..7ca8538bce 100644 --- a/templates/admin/navbar.tmpl +++ b/templates/admin/navbar.tmpl @@ -108,5 +108,10 @@
+ {{if .EnableModeration}} + + {{ctx.Locale.Tr "admin.moderation.moderation_reports"}} + + {{end}}
diff --git a/tests/integration/admin_moderation_test.go b/tests/integration/admin_moderation_test.go new file mode 100644 index 0000000000..de0daebe86 --- /dev/null +++ b/tests/integration/admin_moderation_test.go @@ -0,0 +1,158 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package integration + +import ( + "net/http" + "strings" + "testing" + + "forgejo.org/models/unittest" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" + "forgejo.org/routers" + "forgejo.org/tests" + + "github.com/stretchr/testify/assert" +) + +func testReportDetails(t *testing.T, htmlDoc *HTMLDoc, reportID, contentIcon, contentRef, contentURL, category, reportsNo string) { + // Check icon octicon + icon := htmlDoc.Find("#report-" + reportID + " svg." + contentIcon) + assert.Equal(t, 1, icon.Length()) + + // Check content reference and URL + title := htmlDoc.Find("#report-" + reportID + " .flex-item-main .flex-item-title a") + if len(contentURL) == 0 { + // No URL means that the content was already deleted, so we should not find the anchor element. + assert.Zero(t, title.Length()) + // Instead we should find an emphasis element. + title = htmlDoc.Find("#report-" + reportID + " .flex-item-main .flex-item-title em") + assert.Equal(t, 1, title.Length()) + assert.Equal(t, contentRef, title.Text()) + } else { + assert.Equal(t, 1, title.Length()) + assert.Equal(t, contentRef, title.Text()) + + href, exists := title.Attr("href") + assert.True(t, exists) + assert.Equal(t, contentURL, href) + } + + // Check category + cat := htmlDoc.Find("#report-" + reportID + " .flex-item-main .flex-items-inline .item:nth-child(3)") + assert.Equal(t, 1, cat.Length()) + assert.Equal(t, category, strings.TrimSpace(cat.Text())) + + // Check number of reports for the same content + count := htmlDoc.Find("#report-" + reportID + " a span") + assert.Equal(t, 1, count.Length()) + assert.Equal(t, reportsNo, count.Text()) +} + +func TestAdminModerationViewReports(t *testing.T) { + defer unittest.OverrideFixtures("tests/integration/fixtures/TestAdminModerationViewReports")() + defer tests.PrepareTestEnv(t)() + + t.Run("Moderation enabled", func(t *testing.T) { + defer test.MockVariableValue(&setting.Moderation.Enabled, true)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + t.Run("Anonymous user", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + req := NewRequest(t, "GET", "/admin/moderation/reports") + MakeRequest(t, req, http.StatusSeeOther) + req = NewRequest(t, "GET", "/admin/moderation/reports/type/1/id/1002") + MakeRequest(t, req, http.StatusSeeOther) + }) + + t.Run("Normal user", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + session := loginUser(t, "user2") + req := NewRequest(t, "GET", "/admin/moderation/reports") + session.MakeRequest(t, req, http.StatusForbidden) + req = NewRequest(t, "GET", "/admin/moderation/reports/type/1/id/1002") + session.MakeRequest(t, req, http.StatusForbidden) + }) + + t.Run("Admin user", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + session := loginUser(t, "user1") + req := NewRequest(t, "GET", "/admin/moderation/reports") + resp := session.MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + + // Check how many reports are being displayed. + // Reports linked to the same content (type and id) should be grouped; therefore we should see only 6 instead of 9. + reports := htmlDoc.Find(".admin-setting-content .flex-list .flex-item.report") + assert.Equal(t, 7, reports.Length()) + + // Check details for shown reports. + testReportDetails(t, htmlDoc, "1", "octicon-person", "@SPAM-services", "/SPAM-services", "Illegal content", "1") + testReportDetails(t, htmlDoc, "2", "octicon-repo", "SPAM-services/spammer-Tools", "/SPAM-services/spammer-Tools", "Illegal content", "1") + testReportDetails(t, htmlDoc, "3", "octicon-issue-opened", "SPAM-services/spammer-Tools#1", "/SPAM-services/spammer-Tools/issues/1", "Spam", "1") + // #4 is combined with #7 and #9 + testReportDetails(t, htmlDoc, "4", "octicon-person", "@spammer01", "/spammer01", "Spam", "3") + // #5 is combined with #6 + testReportDetails(t, htmlDoc, "5", "octicon-comment", "contributor/first/issues/1#issuecomment-1001", "/contributor/first/issues/1#issuecomment-1001", "Malware", "2") + testReportDetails(t, htmlDoc, "8", "octicon-issue-opened", "contributor/first#1", "/contributor/first/issues/1", "Other violations of platform rules", "1") + // #10 is for a Ghost user + testReportDetails(t, htmlDoc, "10", "octicon-person", "Reported content with type 1 and id 9999 no longer exists", "", "Other violations of platform rules", "1") + + t.Run("reports details page", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + req = NewRequest(t, "GET", "/admin/moderation/reports/type/1/id/1002") + resp = session.MakeRequest(t, req, http.StatusOK) + htmlDoc = NewHTMLParser(t, resp.Body) + + // Check the title (content reference) and corresponding URL + title := htmlDoc.Find(".admin-setting-content .flex-item-main .flex-item-title a") + assert.Equal(t, 1, title.Length()) + assert.Equal(t, "spammer01", title.Text()) + href, exists := title.Attr("href") + assert.True(t, exists) + assert.Equal(t, "/spammer01", href) + + // Check how many reports are being displayed for user 1002. + reports = htmlDoc.Find(".admin-setting-content .flex-list .flex-item") + assert.Equal(t, 3, reports.Length()) + }) + }) + }) + + t.Run("Moderation disabled", func(t *testing.T) { + t.Run("Anonymous user", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + req := NewRequest(t, "GET", "/admin/moderation/reports") + MakeRequest(t, req, http.StatusNotFound) + req = NewRequest(t, "GET", "/admin/moderation/reports/type/1/id/1002") + MakeRequest(t, req, http.StatusNotFound) + }) + + t.Run("Normal user", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + session := loginUser(t, "user2") + req := NewRequest(t, "GET", "/admin/moderation/reports") + session.MakeRequest(t, req, http.StatusNotFound) + req = NewRequest(t, "GET", "/admin/moderation/reports/type/1/id/1002") + session.MakeRequest(t, req, http.StatusNotFound) + }) + + t.Run("Admin user", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + session := loginUser(t, "user1") + req := NewRequest(t, "GET", "/admin/moderation/reports") + session.MakeRequest(t, req, http.StatusNotFound) + req = NewRequest(t, "GET", "/admin/moderation/reports/type/1/id/1002") + session.MakeRequest(t, req, http.StatusNotFound) + }) + }) +} diff --git a/tests/integration/fixtures/TestAdminModerationViewReports/abuse_report.yml b/tests/integration/fixtures/TestAdminModerationViewReports/abuse_report.yml new file mode 100644 index 0000000000..8bc3c0834b --- /dev/null +++ b/tests/integration/fixtures/TestAdminModerationViewReports/abuse_report.yml @@ -0,0 +1,111 @@ +- + id: 1 + status: 1 # Open + reporter_id: 1004 # @reporter1 + content_type: 1 # User (users or organizations) + content_id: 1003 # @SPAM-services + category: 4 # IllegalContent + remarks: This organization was created for spamming. + shadow_copy_id: null + created_unix: 1121423460 # 2005-07-15 10:31:00 + +- + id: 2 + status: 1 + reporter_id: 1004 # @reporter1 + content_type: 2 # Repository + content_id: 1002 # SPAM-services/spammer-tools + category: 4 # IllegalContent + remarks: This repository was created for building spamming tools. + shadow_copy_id: null + created_unix: 1121423520 # 2005-07-15 10:32:00 + +- + id: 3 + status: 1 + reporter_id: 1004 # @reporter1 + content_type: 3 # Issue (issues or pull requests) + content_id: 1002 # SPAM-services/spammer-tools#1 + category: 2 # Spam + remarks: This issue advertises spam services. + shadow_copy_id: null + created_unix: 1121423580 # 2005-07-15 10:33:00 + +- + id: 4 + status: 1 + reporter_id: 1004 # @reporter1 + content_type: 1 # User (users or organizations) + content_id: 1002 # @spammer01 + category: 2 # Spam + remarks: | + This profile advertises spam services and the user already created spam content. + I have reported some of them. + shadow_copy_id: null + created_unix: 1121423640 # 2005-07-15 10:34:00 + +- + id: 5 + status: 1 + reporter_id: 1004 # @reporter1 + content_type: 4 # Comment + content_id: 1001 # contributor/first/issues/1#issuecomment-1001 + category: 3 # Malware + remarks: This comment references a spammy issue from a spammy repository of a spammy organization created by a spammer. + shadow_copy_id: null + created_unix: 1121423700 # 2005-07-15 10:35:00 + +- + id: 6 + status: 1 + reporter_id: 1001 # @contributor + content_type: 4 # Comment + content_id: 1001 # contributor/first/issues/1#issuecomment-1001 + category: 2 # Spam + remarks: I should delete this, since I can; but first I want to test the reporting functionality. + shadow_copy_id: null + created_unix: 1121423730 # 2005-07-15 10:35:30 + +- + id: 7 + status: 1 + reporter_id: 1001 # @contributor + content_type: 1 # User (users or organizations) + content_id: 1002 # @spammer01 + category: 1 # Other + remarks: Should investigate the origin of this abuser. + shadow_copy_id: null + created_unix: 1121423760 # 2005-07-15 10:36:00 + +- + id: 8 + status: 1 + reporter_id: 1002 # @spammer01 + content_type: 3 # Issue (issues or pull requests) + content_id: 1001 # contributor/first#1 + category: 1 # Other + remarks: Just because you are the administrator of this Forgejo instance this doesn't mean that you should be more privileged compared to the rest of average users. I believe it is my right to post links to external websites where users can find more about myself and my own work, even if they are professional services. I strongly believe you should reconsider your totalitarian behaviour. The users of this instance deserve better, more inclusive rules that should prevent abuses from administrators or mod. + shadow_copy_id: null + created_unix: 1121424000 # 2005-07-15 10:40:00 + +- + id: 9 + status: 1 + reporter_id: 1005 # @reporter2 + content_type: 1 # User (users or organizations) + content_id: 1002 # @spammer01 + category: 2 # Spam + remarks: This user is just spamming wherever they can. + shadow_copy_id: null + created_unix: 1121424030 # 2005-07-15 10:40:30 + +- + id: 10 + status: 1 + reporter_id: 1005 # @reporter2 + content_type: 1 # User (users or organizations) + content_id: 9999 # Ghost user + category: 1 # Other + remarks: Check this spammer as soon as possible, before they delete their account. + shadow_copy_id: null + created_unix: 1121424150 # 2005-07-15 10:42:30 diff --git a/tests/integration/fixtures/TestAdminModerationViewReports/comment.yml b/tests/integration/fixtures/TestAdminModerationViewReports/comment.yml new file mode 100644 index 0000000000..a7ee83d53e --- /dev/null +++ b/tests/integration/fixtures/TestAdminModerationViewReports/comment.yml @@ -0,0 +1,21 @@ +- + id: 1001 + type: 0 # Standard comment + poster_id: 1002 # @spammer01 + issue_id: 1001 # contributor/first#1 + content: And the first spammer; check SPAM-services/spammer-Tools#1 + created_unix: 1121422990 # 2005-07-15 10:23:10 + +- + id: 1002 + type: 5 # Reference from a comment + poster_id: 1002 # @spammer01 + issue_id: 1002 # SPAM-services/spammer-tools#1 + content: '' + content_version: 0 + created_unix: 1121422990 + ref_repo_id: 1001 + ref_issue_id: 1001 + ref_comment_id: 1001 + ref_action: 0 + ref_is_pull: false diff --git a/tests/integration/fixtures/TestAdminModerationViewReports/issue.yml b/tests/integration/fixtures/TestAdminModerationViewReports/issue.yml new file mode 100644 index 0000000000..74af88b3b6 --- /dev/null +++ b/tests/integration/fixtures/TestAdminModerationViewReports/issue.yml @@ -0,0 +1,23 @@ +- + id: 1001 + repo_id: 1001 # contributor/first + index: 1 + poster_id: 1001 + name: first repo should have a first issue + content: so here we go + is_closed: false + is_pull: false + num_comments: 1 + created_unix: 1121422320 # 2005-07-15 10:12:00 + +- + id: 1002 + repo_id: 1002 # SPAM-services/spammer-tools + index: 1 + poster_id: 1002 + name: Professional marketing services + content: Visit my website at spammer.xyz/services for a list of available services. + is_closed: false + is_pull: false + num_comments: 0 + created_unix: 1121422980 # 2005-07-15 10:23:00 diff --git a/tests/integration/fixtures/TestAdminModerationViewReports/issue_index.yml b/tests/integration/fixtures/TestAdminModerationViewReports/issue_index.yml new file mode 100644 index 0000000000..cecf437282 --- /dev/null +++ b/tests/integration/fixtures/TestAdminModerationViewReports/issue_index.yml @@ -0,0 +1,7 @@ +- + group_id: 1001 + max_index: 1 + +- + group_id: 1002 + max_index: 1 diff --git a/tests/integration/fixtures/TestAdminModerationViewReports/repository.yml b/tests/integration/fixtures/TestAdminModerationViewReports/repository.yml new file mode 100644 index 0000000000..cee5d6a74c --- /dev/null +++ b/tests/integration/fixtures/TestAdminModerationViewReports/repository.yml @@ -0,0 +1,45 @@ +- + id: 1001 + owner_id: 1001 + owner_name: contributor + lower_name: first + name: first + description: '' + website: '' + default_branch: main + num_watches: 1 + num_stars: 0 + num_forks: 0 + num_issues: 1 + num_closed_issues: 0 + num_pulls: 0 + num_closed_pulls: 0 + is_private: false + is_empty: false + is_archived: false + size: 0 + topics: '[]' + created_unix: 1121422260 # 2005-07-15 10:11:00 + +- + id: 1002 + owner_id: 1003 + owner_name: SPAM-services + lower_name: spammer-tools + name: spammer-Tools + description: Another _place_ for abusive content. + website: '' + default_branch: main + num_watches: 1 + num_stars: 0 + num_forks: 0 + num_issues: 1 + num_closed_issues: 0 + num_pulls: 0 + num_closed_pulls: 0 + is_private: false + is_empty: false + is_archived: false + size: 0 + topics: "[\"bulk-email\",\"email-services\",\"spam\",\"spamservices.co\"]" + created_unix: 1121422920 # 2005-07-15 10:22:00 diff --git a/tests/integration/fixtures/TestAdminModerationViewReports/user.yml b/tests/integration/fixtures/TestAdminModerationViewReports/user.yml new file mode 100644 index 0000000000..f00f3de338 --- /dev/null +++ b/tests/integration/fixtures/TestAdminModerationViewReports/user.yml @@ -0,0 +1,108 @@ +- + id: 1001 + lower_name: contributor + name: contributor + full_name: The Contributor + email: contributor@example.org + keep_email_private: true + passwd: passwdSalt:password + passwd_hash_algo: dummy + type: 0 + salt: passwdSalt + description: '' + created_unix: 1121422200 # 2005-07-15 10:10:00 + is_active: true + is_admin: false + is_restricted: false + avatar: avatar-hash-1001 + avatar_email: contributor@example.org + use_custom_avatar: false + num_repos: 1 + +- + id: 1002 + lower_name: spammer01 + name: spammer01 + full_name: King of SPAM + email: spammer01@example.org + keep_email_private: false + passwd: passwdSalt:password + passwd_hash_algo: dummy + type: 0 + location: '@master@smap.net' + website: http://spammer.xyz + pronouns: http://spam.me + salt: passwdSalt + description: I can help you abuse others inboxes. Updated prices on spammer.xyz/services + created_unix: 1121422800 # 2005-07-15 10:20:00 + is_active: true + is_admin: false + is_restricted: false + avatar: avatar-hash-1002 + avatar_email: spammer01@example.org + use_custom_avatar: false + +- + id: 1003 + lower_name: spam-services + name: SPAM-services + full_name: SPAM services + email: get@spamservices.co + keep_email_private: false + email_notifications_preference: '' + passwd: '' + passwd_hash_algo: '' + type: 1 + location: www.spamservices.co + website: https://spamservices.co + salt: 1888c34e04642082a791b49cf147cc88 + description: Contact us for **bulk emails** sending. + created_unix: 1121422860 # 2005-07-15 10:21:00 + is_active: true + is_admin: false + is_restricted: false + allow_create_organization: false + avatar: avatar-hash-1003 + avatar_email: '' + use_custom_avatar: true + num_repos: 1 + +- + id: 1004 + lower_name: reporter1 + name: reporter1 + full_name: Reporter One + email: reporter1@example.org + keep_email_private: true + passwd: passwdSalt:password + passwd_hash_algo: dummy + type: 0 + salt: passwdSalt + description: '' + created_unix: 1121423400 # 2005-07-15 10:30:00 + is_active: true + is_admin: false + is_restricted: false + avatar: avatar-hash-1004 + avatar_email: reporter1@example.org + use_custom_avatar: false + +- + id: 1005 + lower_name: reporter2 + name: reporter2 + full_name: Reporter Two + email: reporter2@example.org + keep_email_private: true + passwd: passwdSalt:password + passwd_hash_algo: dummy + type: 0 + salt: passwdSalt + description: '' + created_unix: 1121424000 # 2005-07-15 10:40:00 + is_active: true + is_admin: false + is_restricted: false + avatar: avatar-hash-1005 + avatar_email: reporter2@example.org + use_custom_avatar: false From 0fb9fc752b37bb5a4aa14c122ccf2d651aa9d00f Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 23 Jul 2025 01:01:31 +0200 Subject: [PATCH 199/495] Update module code.forgejo.org/forgejo/act to v1.32.0 (forgejo) (#8502) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [code.forgejo.org/forgejo/act](https://code.forgejo.org/forgejo/act) | `v1.29.0` -> `v1.32.0` | [![age](https://developer.mend.io/api/mc/badges/age/go/code.forgejo.org%2fforgejo%2fact/v1.32.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/go/code.forgejo.org%2fforgejo%2fact/v1.29.0/v1.32.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
forgejo/act (code.forgejo.org/forgejo/act) ### [`v1.32.0`](https://code.forgejo.org/forgejo/act/compare/v1.31.0...v1.32.0) [Compare Source](https://code.forgejo.org/forgejo/act/compare/v1.31.0...v1.32.0) ### [`v1.31.0`](https://code.forgejo.org/forgejo/act/compare/v1.30.0...v1.31.0) [Compare Source](https://code.forgejo.org/forgejo/act/compare/v1.30.0...v1.31.0) ### [`v1.30.0`](https://code.forgejo.org/forgejo/act/compare/v1.29.0...v1.30.0) [Compare Source](https://code.forgejo.org/forgejo/act/compare/v1.29.0...v1.30.0)
--- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). ## Release notes - Breaking features - [PR](https://codeberg.org/forgejo/forgejo/pulls/8502): Forgejo Actions workflows are verified with a YAML schema and common errors such as using an incorrect context (e.g. `${{ badcontext.FORGEJO_REPOSITORY }}`) or a typo in a required keyword (e.g. `ruins-on:` instead of `runs-on:`) will be reported in the action page and the web page that displays the file in the repository. It is recommended to verify existing workflows are successfully verified prior to upgrading, [as explained in the Forgejo runner release notes](https://code.forgejo.org/forgejo/runner/src/branch/main/RELEASE-NOTES.md#8-0-0). Co-authored-by: Earl Warren Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8502 Reviewed-by: Michael Kriese Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- models/actions/task.go | 2 +- modules/actions/workflows.go | 2 +- release-notes/8502.md | 1 + routers/web/repo/actions/actions.go | 2 +- routers/web/repo/view.go | 2 +- services/actions/commit_status.go | 2 +- services/actions/job_emitter.go | 2 +- services/actions/notifier_helper.go | 6 +++--- services/actions/schedule_tasks.go | 4 ++-- services/actions/workflows.go | 4 ++-- 12 files changed, 17 insertions(+), 16 deletions(-) create mode 100644 release-notes/8502.md diff --git a/go.mod b/go.mod index 8a7c8b6faa..3afb624188 100644 --- a/go.mod +++ b/go.mod @@ -244,7 +244,7 @@ require ( replace github.com/hashicorp/go-version => github.com/6543/go-version v1.3.1 -replace github.com/nektos/act => code.forgejo.org/forgejo/act v1.29.0 +replace github.com/nektos/act => code.forgejo.org/forgejo/act v1.32.0 replace github.com/mholt/archiver/v3 => code.forgejo.org/forgejo/archiver/v3 v3.5.1 diff --git a/go.sum b/go.sum index a291e6c4b7..35d1d09dde 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ code.forgejo.org/f3/gof3/v3 v3.11.0 h1:f/xToKwqTgxG6PYxvewywjDQyCcyHEEJ6sZqUitFs code.forgejo.org/f3/gof3/v3 v3.11.0/go.mod h1:4FaRUNSQGBiD1M0DuB0yNv+Z2wMtlOeckgygHSSq4KQ= code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251 h1:HTZl3CBk3ABNYtFI6TPLvJgGKFIhKT5CBk0sbOtkDKU= code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251/go.mod h1:PphB88CPbx601QrWPMZATeorACeVmQlyv3u+uUMbSaM= -code.forgejo.org/forgejo/act v1.29.0 h1:CPiI0LRPU0f6gUdQj1ZVax0ySc8CfegY4hiRsymdZU0= -code.forgejo.org/forgejo/act v1.29.0/go.mod h1:RPqtuaI2FkC1SVOaYCRODo5jIfoMTBVgEOOP3Sdiuh4= +code.forgejo.org/forgejo/act v1.32.0 h1:hns2WvrJs6qWCmvzoSllNGNzSvcDMcSvJvVtQj3FaQc= +code.forgejo.org/forgejo/act v1.32.0/go.mod h1:WkmxVBteC4zoyQGYp8ZFZY7Xb+jat+b7ChvqW6TxqF8= code.forgejo.org/forgejo/archiver/v3 v3.5.1 h1:UmmbA7D5550uf71SQjarmrn6yKwOGxtEjb3jaYYtmSE= code.forgejo.org/forgejo/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4= code.forgejo.org/forgejo/go-rpmutils v1.0.0 h1:RZGGeKt70p/WaIEL97pyT6uiiEIoN8/aLmS5Z6WmX0M= diff --git a/models/actions/task.go b/models/actions/task.go index 93369db7e8..7c85ffc232 100644 --- a/models/actions/task.go +++ b/models/actions/task.go @@ -275,7 +275,7 @@ func CreateTaskForRunner(ctx context.Context, runner *ActionRunner) (*ActionTask } var workflowJob *jobparser.Job - if gots, err := jobparser.Parse(job.WorkflowPayload); err != nil { + if gots, err := jobparser.Parse(job.WorkflowPayload, false); err != nil { return nil, false, fmt.Errorf("parse workflow of job %d: %w", job.ID, err) } else if len(gots) != 1 { return nil, false, fmt.Errorf("workflow of job %d: not single workflow", job.ID) diff --git a/modules/actions/workflows.go b/modules/actions/workflows.go index 7ae4557ed6..b04f97df0f 100644 --- a/modules/actions/workflows.go +++ b/modules/actions/workflows.go @@ -86,7 +86,7 @@ func GetContentFromEntry(entry *git.TreeEntry) ([]byte, error) { } func GetEventsFromContent(content []byte) ([]*jobparser.Event, error) { - workflow, err := model.ReadWorkflow(bytes.NewReader(content)) + workflow, err := model.ReadWorkflow(bytes.NewReader(content), false) if err != nil { return nil, err } diff --git a/release-notes/8502.md b/release-notes/8502.md new file mode 100644 index 0000000000..b7fa0fd892 --- /dev/null +++ b/release-notes/8502.md @@ -0,0 +1 @@ +Forgejo Actions workflows are verified with a YAML schema and common errors such as using an incorrect context (e.g. `${{ badcontext.FORGEJO_REPOSITORY }}`) or a typo in a required keyword (e.g. `ruins-on:` instead of `runs-on:`) will be reported in the action page and the web page that displays the file in the repository. It is recommended to verify existing workflows are successfully verified prior to upgrading, [as explained in the Forgejo runner release notes](https://code.forgejo.org/forgejo/runner/src/branch/main/RELEASE-NOTES.md#8-0-0). diff --git a/routers/web/repo/actions/actions.go b/routers/web/repo/actions/actions.go index 7aa52ddd4c..6f1f19b107 100644 --- a/routers/web/repo/actions/actions.go +++ b/routers/web/repo/actions/actions.go @@ -111,7 +111,7 @@ func List(ctx *context.Context) { ctx.ServerError("GetContentFromEntry", err) return } - wf, err := model.ReadWorkflow(bytes.NewReader(content)) + wf, err := model.ReadWorkflow(bytes.NewReader(content), true) if err != nil { workflow.ErrMsg = ctx.Locale.TrString("actions.runs.invalid_workflow_helper", err.Error()) workflows = append(workflows, workflow) diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go index e61059da64..8e1028968e 100644 --- a/routers/web/repo/view.go +++ b/routers/web/repo/view.go @@ -434,7 +434,7 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) { if err != nil { log.Error("actions.GetContentFromEntry: %v", err) } - _, workFlowErr := model.ReadWorkflow(bytes.NewReader(content)) + _, workFlowErr := model.ReadWorkflow(bytes.NewReader(content), true) if workFlowErr != nil { ctx.Data["FileError"] = ctx.Locale.Tr("actions.runs.invalid_workflow_helper", workFlowErr.Error()) } diff --git a/services/actions/commit_status.go b/services/actions/commit_status.go index 755fa648dc..b054f2036c 100644 --- a/services/actions/commit_status.go +++ b/services/actions/commit_status.go @@ -80,7 +80,7 @@ func createCommitStatus(ctx context.Context, job *actions_model.ActionRunJob) er repo := run.Repo // TODO: store workflow name as a field in ActionRun to avoid parsing runName := path.Base(run.WorkflowID) - if wfs, err := jobparser.Parse(job.WorkflowPayload); err == nil && len(wfs) > 0 { + if wfs, err := jobparser.Parse(job.WorkflowPayload, false); err == nil && len(wfs) > 0 { runName = wfs[0].Name } ctxname := fmt.Sprintf("%s / %s (%s)", runName, job.Name, event) diff --git a/services/actions/job_emitter.go b/services/actions/job_emitter.go index 942c698e73..8178d210ce 100644 --- a/services/actions/job_emitter.go +++ b/services/actions/job_emitter.go @@ -142,7 +142,7 @@ func (r *jobStatusResolver) resolve() map[int64]actions_model.Status { } else { // Check if the job has an "if" condition hasIf := false - if wfJobs, _ := jobparser.Parse(r.jobMap[id].WorkflowPayload); len(wfJobs) == 1 { + if wfJobs, _ := jobparser.Parse(r.jobMap[id].WorkflowPayload, false); len(wfJobs) == 1 { _, wfJob := wfJobs[0].Job() hasIf = len(wfJob.If.Value) > 0 } diff --git a/services/actions/notifier_helper.go b/services/actions/notifier_helper.go index e240c996b5..e31817a5e2 100644 --- a/services/actions/notifier_helper.go +++ b/services/actions/notifier_helper.go @@ -345,7 +345,7 @@ func handleWorkflows( Status: actions_model.StatusWaiting, } - if workflow, err := model.ReadWorkflow(bytes.NewReader(dwf.Content)); err == nil { + if workflow, err := model.ReadWorkflow(bytes.NewReader(dwf.Content), false); err == nil { notifications, err := workflow.Notifications() if err != nil { log.Error("Notifications: %w", err) @@ -372,7 +372,7 @@ func handleWorkflows( continue } - jobs, err := jobparser.Parse(dwf.Content, jobparser.WithVars(vars)) + jobs, err := jobparser.Parse(dwf.Content, false, jobparser.WithVars(vars)) if err != nil { run.Status = actions_model.StatusFailure log.Info("jobparser.Parse: invalid workflow, setting job status to failed: %v", err) @@ -537,7 +537,7 @@ func handleSchedules( crons := make([]*actions_model.ActionSchedule, 0, len(detectedWorkflows)) for _, dwf := range detectedWorkflows { // Check cron job condition. Only working in default branch - workflow, err := model.ReadWorkflow(bytes.NewReader(dwf.Content)) + workflow, err := model.ReadWorkflow(bytes.NewReader(dwf.Content), false) if err != nil { log.Error("ReadWorkflow: %v", err) continue diff --git a/services/actions/schedule_tasks.go b/services/actions/schedule_tasks.go index cf8b29ead7..d275837cbb 100644 --- a/services/actions/schedule_tasks.go +++ b/services/actions/schedule_tasks.go @@ -142,7 +142,7 @@ func CreateScheduleTask(ctx context.Context, cron *actions_model.ActionSchedule) return err } - workflow, err := act_model.ReadWorkflow(bytes.NewReader(cron.Content)) + workflow, err := act_model.ReadWorkflow(bytes.NewReader(cron.Content), false) if err != nil { return err } @@ -153,7 +153,7 @@ func CreateScheduleTask(ctx context.Context, cron *actions_model.ActionSchedule) run.NotifyEmail = notifications // Parse the workflow specification from the cron schedule - workflows, err := jobparser.Parse(cron.Content, jobparser.WithVars(vars)) + workflows, err := jobparser.Parse(cron.Content, false, jobparser.WithVars(vars)) if err != nil { return err } diff --git a/services/actions/workflows.go b/services/actions/workflows.go index fbba3fd667..22417d4e32 100644 --- a/services/actions/workflows.go +++ b/services/actions/workflows.go @@ -56,7 +56,7 @@ func (entry *Workflow) Dispatch(ctx context.Context, inputGetter InputValueGette return nil, nil, err } - wf, err := act_model.ReadWorkflow(bytes.NewReader(content)) + wf, err := act_model.ReadWorkflow(bytes.NewReader(content), false) if err != nil { return nil, nil, err } @@ -138,7 +138,7 @@ func (entry *Workflow) Dispatch(ctx context.Context, inputGetter InputValueGette return nil, nil, err } - jobs, err := jobparser.Parse(content, jobparser.WithVars(vars)) + jobs, err := jobparser.Parse(content, false, jobparser.WithVars(vars)) if err != nil { return nil, nil, err } From b06f4fdd631ed10704b453257e50f2a42b12c77c Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 23 Jul 2025 01:12:08 +0200 Subject: [PATCH 200/495] Update dependency forgejo/release-notes-assistant to v1.3.3 (forgejo) (#8620) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Update | Change | |---|---|---| | [forgejo/release-notes-assistant](https://code.forgejo.org/forgejo/release-notes-assistant) | patch | `v1.3.2` -> `v1.3.3` | --- ### Release Notes
forgejo/release-notes-assistant (forgejo/release-notes-assistant) ### [`v1.3.3`](https://code.forgejo.org/forgejo/release-notes-assistant/releases/tag/v1.3.3) [Compare Source](https://code.forgejo.org/forgejo/release-notes-assistant/compare/v1.3.2...v1.3.3) - bug fixes - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/95): fix: git fetch on a mirror must explicitly prune tags
--- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8620 Reviewed-by: Earl Warren Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- .forgejo/workflows/release-notes-assistant-milestones.yml | 2 +- .forgejo/workflows/release-notes-assistant.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/release-notes-assistant-milestones.yml b/.forgejo/workflows/release-notes-assistant-milestones.yml index e16c5a5507..6c61774325 100644 --- a/.forgejo/workflows/release-notes-assistant-milestones.yml +++ b/.forgejo/workflows/release-notes-assistant-milestones.yml @@ -6,7 +6,7 @@ on: env: RNA_WORKDIR: /srv/rna - RNA_VERSION: v1.3.2 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org + RNA_VERSION: v1.3.3 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org jobs: release-notes: diff --git a/.forgejo/workflows/release-notes-assistant.yml b/.forgejo/workflows/release-notes-assistant.yml index 9c97d21dff..b1acde6030 100644 --- a/.forgejo/workflows/release-notes-assistant.yml +++ b/.forgejo/workflows/release-notes-assistant.yml @@ -8,7 +8,7 @@ on: - labeled env: - RNA_VERSION: v1.3.2 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org + RNA_VERSION: v1.3.3 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org jobs: release-notes: From c11dd3fb46d2c21be8f609484d9e0619b569306a Mon Sep 17 00:00:00 2001 From: 0ko <0ko@noreply.codeberg.org> Date: Wed, 23 Jul 2025 02:06:13 +0200 Subject: [PATCH 201/495] feat(ui): improve org header with new noJS dropdown and more options (#8572) Related: https://codeberg.org/forgejo/forgejo/pulls/6977/files#diff-fd05eba523810d46c7763db938ad5839372a074a, https://codeberg.org/forgejo/forgejo/pulls/3949, https://codeberg.org/forgejo/forgejo/pulls/7906 * use the new noJS dropdown for extra actions in org view (currently only includes report button) * this required some refactoring of the area because the said dropdown was not built to be placed in an area where `font-size:36px` is forced onto everything * this greatly improves consistently with user profiles which now use this type of dropdown * I decided against making the opener button mimicrate an actual button because it looks ok as is and is consitent with menu in user profiles and because I don't think this is a good design language to make a kebab menu opener look this way * add icon to the entry * add atom entry Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8572 Reviewed-by: Gusted Reviewed-by: Beowulf Co-authored-by: 0ko <0ko@noreply.codeberg.org> Co-committed-by: 0ko <0ko@noreply.codeberg.org> --- templates/org/follow_unfollow.tmpl | 2 +- templates/org/header.tmpl | 42 ++++++++++++++---------- tests/integration/org_profile_test.go | 46 +++++++++++++++++++++++++++ web_src/css/modules/dropdown.css | 8 ++++- web_src/css/org.css | 17 +++++----- 5 files changed, 88 insertions(+), 27 deletions(-) diff --git a/templates/org/follow_unfollow.tmpl b/templates/org/follow_unfollow.tmpl index ba0bd01efe..9175088da4 100644 --- a/templates/org/follow_unfollow.tmpl +++ b/templates/org/follow_unfollow.tmpl @@ -1,4 +1,4 @@ - + {{$moderationEntryNeeded := and .IsModerationEnabled .IsSigned (not .IsOrganizationOwner)}} + {{if or .EnableFeed $moderationEntryNeeded}} + {{end}}
diff --git a/tests/integration/org_profile_test.go b/tests/integration/org_profile_test.go index 2211a8b3d2..8125c3e6ba 100644 --- a/tests/integration/org_profile_test.go +++ b/tests/integration/org_profile_test.go @@ -104,5 +104,51 @@ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequa assert.NotContains(t, resp.Body.String(), "veniam") }) }) + + t.Run("More actions - feeds only", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + defer test.MockVariableValue(&setting.Other.EnableFeed, true)() + defer test.MockVariableValue(&setting.Moderation.Enabled, false)() + + // Both guests and logged in users should see the feed option + doc := NewHTMLParser(t, MakeRequest(t, NewRequest(t, "GET", "/org3"), http.StatusOK).Body) + doc.AssertElement(t, "details.dropdown a[href='/org3.rss']", true) + doc.AssertElement(t, "details.dropdown a[href^='/report_abuse']", false) + + doc = NewHTMLParser(t, loginUser(t, "user10").MakeRequest(t, NewRequest(t, "GET", "/org3"), http.StatusOK).Body) + doc.AssertElement(t, "details.dropdown a[href='/org3.rss']", true) + doc.AssertElement(t, "details.dropdown a[href^='/report_abuse']", false) + }) + + t.Run("More actions - none", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + defer test.MockVariableValue(&setting.Other.EnableFeed, false)() + defer test.MockVariableValue(&setting.Moderation.Enabled, false)() + + // The dropdown won't appear if no entries are available, for both guests and logged in users + doc := NewHTMLParser(t, MakeRequest(t, NewRequest(t, "GET", "/org3"), http.StatusOK).Body) + doc.AssertElement(t, "details.dropdown", false) + + doc = NewHTMLParser(t, loginUser(t, "user10").MakeRequest(t, NewRequest(t, "GET", "/org3"), http.StatusOK).Body) + doc.AssertElement(t, "details.dropdown", false) + }) + + t.Run("More actions - moderation", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + defer test.MockVariableValue(&setting.Other.EnableFeed, false)() + defer test.MockVariableValue(&setting.Moderation.Enabled, true)() + + // The report option shouldn't be available to a guest + doc := NewHTMLParser(t, MakeRequest(t, NewRequest(t, "GET", "/org3"), http.StatusOK).Body) + doc.AssertElement(t, "details.dropdown", false) + + // But should be available to a logged in user + doc = NewHTMLParser(t, loginUser(t, "user10").MakeRequest(t, NewRequest(t, "GET", "/org3"), http.StatusOK).Body) + doc.AssertElement(t, "details.dropdown a[href^='/report_abuse']", true) + + // But the org owner shouldn't see the report option + doc = NewHTMLParser(t, loginUser(t, "user1").MakeRequest(t, NewRequest(t, "GET", "/org3"), http.StatusOK).Body) + doc.AssertElement(t, "details.dropdown", false) + }) }) } diff --git a/web_src/css/modules/dropdown.css b/web_src/css/modules/dropdown.css index 66762ac45c..22920c9f67 100644 --- a/web_src/css/modules/dropdown.css +++ b/web_src/css/modules/dropdown.css @@ -99,7 +99,13 @@ details.dropdown > summary + ul > li:last-child { /* Note: https://css-tricks.com/css-anchor-positioning-guide/ * looks like a great thing but FF still doesn't support it. */ -/* Note: dropdown.dir-rtl can be implemented when needed, e.g. for navbar profile dropdown on desktop layout. */ +details.dropdown.dir-rtl > summary + ul { + inset-inline: 0 auto; + direction: rtl; +} +details.dropdown.dir-rtl > summary + ul > li { + direction: ltr; +} details.dropdown > summary + ul > li > .item { padding: var(--dropdown-item-padding); diff --git a/web_src/css/org.css b/web_src/css/org.css index 6853a26bf7..05eb0c5476 100644 --- a/web_src/css/org.css +++ b/web_src/css/org.css @@ -89,28 +89,29 @@ text-align: center; } -.page-content.organization .org-avatar { - margin-right: 15px; -} - .page-content.organization #org-info { overflow-wrap: anywhere; flex: 1; } -.page-content.organization #org-info .ui.header { +.page-content.organization #org-info .org-title { display: flex; + column-gap: 1rem; align-items: center; - font-size: 36px; - margin-bottom: 0; +} + +.page-content.organization #org-info .org-title h1 { + margin: 0; + font-size: 2.5rem; } @media (max-width: 767.98px) { - .page-content.organization #org-info .ui.header { + .page-content.organization #org-info .org-header { flex-direction: column; margin-bottom: 1rem; } .page-content.organization #org-info .org-title { + flex-wrap: wrap; width: 100%; margin-bottom: 0.5rem; } From c3b18a6debe08f63cc69eb43aff1e7b2bc91ac64 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 23 Jul 2025 02:58:57 +0200 Subject: [PATCH 202/495] Update module github.com/yuin/goldmark to v1.7.13 (forgejo) (#8621) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8621 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 3afb624188..6007181a63 100644 --- a/go.mod +++ b/go.mod @@ -94,7 +94,7 @@ require ( github.com/urfave/cli/v3 v3.3.3 github.com/valyala/fastjson v1.6.4 github.com/yohcop/openid-go v1.0.1 - github.com/yuin/goldmark v1.7.12 + github.com/yuin/goldmark v1.7.13 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc gitlab.com/gitlab-org/api/client-go v0.130.1 go.uber.org/mock v0.5.2 diff --git a/go.sum b/go.sum index 35d1d09dde..7725cfd6d0 100644 --- a/go.sum +++ b/go.sum @@ -548,8 +548,8 @@ github.com/yohcop/openid-go v1.0.1/go.mod h1:b/AvD03P0KHj4yuihb+VtLD6bYYgsy0zqBz github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark v1.4.15/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/goldmark v1.7.12 h1:YwGP/rrea2/CnCtUHgjuolG/PnMxdQtPMO5PvaE2/nY= -github.com/yuin/goldmark v1.7.12/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= +github.com/yuin/goldmark v1.7.13 h1:GPddIs617DnBLFFVJFgpo1aBfe/4xcvMc3SB5t/D0pA= +github.com/yuin/goldmark v1.7.13/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc h1:+IAOyRda+RLrxa1WC7umKOZRsGq4QrFFMYApOeHzQwQ= github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc/go.mod h1:ovIvrum6DQJA4QsJSovrkC4saKHQVs7TvcaeO8AIl5I= github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= From 83ea43cf49c235b61531570d3719c1190a92ac67 Mon Sep 17 00:00:00 2001 From: oliverpool Date: Wed, 23 Jul 2025 04:10:50 +0200 Subject: [PATCH 203/495] frontend: generic lazy loader for webcomponents (#8510) After seeing #8111 use a webcomponent, I think that they are a neat usecase for Forgejo where most of the frontend is backend-generated, with some "island of enhancements". I am considering using a webcomponent for the CITATION management (last occurrence of [`Blob.GetBlobContent`](https://codeberg.org/forgejo/forgejo/issues/8222)), however I noticed that the developer experience wasn't ideal. With this PR it would be very easy to declare a webcomponent, which will be loaded only if needed (I converted `model-viewer` and `pdf-object` to this technique). Some cleanup in the neighbor webcomponents. ## Testing 1) Create a new repository or use an existing one. 2) Upload a `.pdf` or `.glb` file (such as https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/testdata/data/viewer/Unicode%E2%9D%A4%E2%99%BBTest.glb) 3) Open the Network inspector and view the file in the repository. - After a short loading spinner, the PDF or 3D model should be rendered in a viewer - the related JS should have been loaded (e.g. http://localhost:3000/assets/js/model-viewer.494bf0cd.js) - visiting another page and check that this JS file isn't loaded Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8510 Reviewed-by: Gusted Reviewed-by: 0ko <0ko@noreply.codeberg.org> Reviewed-by: Beowulf Co-authored-by: oliverpool Co-committed-by: oliverpool --- modules/translation/plural_rules.go | 3 +- templates/repo/settings/lfs_file.tmpl | 6 +- templates/repo/view_file.tmpl | 6 +- web_src/css/modules/animations.css | 6 +- web_src/css/repo.css | 8 +-- web_src/js/index.js | 4 -- web_src/js/render/gltf.js | 6 -- web_src/js/render/pdf.js | 19 ------ web_src/js/webcomponents/i18n.js | 75 ----------------------- web_src/js/webcomponents/index.js | 3 +- web_src/js/webcomponents/lazy-webc.js | 66 ++++++++++++++++++++ web_src/js/webcomponents/pdf-object.js | 14 +++++ web_src/js/webcomponents/polyfills.js | 17 ----- web_src/js/webcomponents/relative-time.js | 70 ++++++++++++++++++++- 14 files changed, 166 insertions(+), 137 deletions(-) delete mode 100644 web_src/js/render/gltf.js delete mode 100644 web_src/js/render/pdf.js delete mode 100644 web_src/js/webcomponents/i18n.js create mode 100644 web_src/js/webcomponents/lazy-webc.js create mode 100644 web_src/js/webcomponents/pdf-object.js delete mode 100644 web_src/js/webcomponents/polyfills.js diff --git a/modules/translation/plural_rules.go b/modules/translation/plural_rules.go index 59665da255..587ee48850 100644 --- a/modules/translation/plural_rules.go +++ b/modules/translation/plural_rules.go @@ -2,6 +2,7 @@ // SPDX-License-Identifier: MIT // Some useful links: +// https://codeberg.org/forgejo/forgejo/src/branch/forgejo/web_src/js/webcomponents/relative-time.js // https://www.unicode.org/cldr/charts/46/supplemental/language_plural_rules.html // https://translate.codeberg.org/languages/$LANGUAGE_CODE/#information // https://github.com/WeblateOrg/language-data/blob/main/languages.csv @@ -16,7 +17,7 @@ import ( "forgejo.org/modules/translation/i18n" ) -// The constants refer to indices below in `PluralRules` and also in i18n.js, keep them in sync! +// The constants refer to indices below in `PluralRules` and also in web_src/js/webcomponents/relative-time.js, keep them in sync! const ( PluralRuleDefault = 0 PluralRuleBengali = 1 diff --git a/templates/repo/settings/lfs_file.tmpl b/templates/repo/settings/lfs_file.tmpl index 9864ed01d6..00bbae616a 100644 --- a/templates/repo/settings/lfs_file.tmpl +++ b/templates/repo/settings/lfs_file.tmpl @@ -31,10 +31,12 @@ {{ctx.Locale.Tr "repo.audio_not_supported_in_browser"}} {{else if .IsPDFFile}} -
+ + {{ctx.Locale.Tr "repo.diff.view_file"}} + {{else if .Is3DModelFile}} {{if .IsGLBFile}} - + {{else}} {{ctx.Locale.Tr "repo.file_view_raw"}}! {{end}} diff --git a/templates/repo/view_file.tmpl b/templates/repo/view_file.tmpl index 36809b769e..65be791405 100644 --- a/templates/repo/view_file.tmpl +++ b/templates/repo/view_file.tmpl @@ -127,10 +127,12 @@ {{ctx.Locale.Tr "repo.audio_not_supported_in_browser"}} {{else if .IsPDFFile}} -
+ + {{ctx.Locale.Tr "repo.diff.view_file"}} + {{else if .Is3DModelFile}} {{if .IsGLBFile}} - + {{else}} {{ctx.Locale.Tr "repo.file_view_raw"}} {{end}} diff --git a/web_src/css/modules/animations.css b/web_src/css/modules/animations.css index a86c9234aa..88b128c643 100644 --- a/web_src/css/modules/animations.css +++ b/web_src/css/modules/animations.css @@ -3,11 +3,13 @@ 100% { transform: translate(-50%, -50%) rotate(360deg); } } +lazy-webc, .is-loading { pointer-events: none !important; position: relative !important; } +lazy-webc > *, .is-loading > * { opacity: 0.3; } @@ -17,6 +19,7 @@ opacity: 0; } +lazy-webc::after, .is-loading::after { content: ""; position: absolute; @@ -52,8 +55,7 @@ form.single-button-form.is-loading .button { } .markup pre.is-loading, -.editor-loading.is-loading, -.pdf-content.is-loading { +.editor-loading.is-loading { height: var(--height-loading); } diff --git a/web_src/css/repo.css b/web_src/css/repo.css index 078ff7b4c4..a3713a4c3d 100644 --- a/web_src/css/repo.css +++ b/web_src/css/repo.css @@ -415,12 +415,14 @@ td .commit-summary { max-width: 600px !important; } +lazy-webc[tag="model-viewer"], model-viewer { width: 100%; height: 100vh; } -.pdf-content { +lazy-webc[tag="pdf-object"], +pdf-object { width: 100%; height: 100vh; border: none !important; @@ -429,10 +431,6 @@ model-viewer { justify-content: center; } -.pdf-content .pdf-fallback-button { - margin: 50px auto; -} - .repository.file.list .non-diff-file-content .plain-text { padding: 1em 2em; } diff --git a/web_src/js/index.js b/web_src/js/index.js index 1dab9ae292..98e57ef450 100644 --- a/web_src/js/index.js +++ b/web_src/js/index.js @@ -22,8 +22,6 @@ import {initRepoIssueContentHistory} from './features/repo-issue-content.js'; import {initStopwatch} from './features/stopwatch.js'; import {initFindFileInRepo} from './features/repo-findfile.js'; import {initCommentContent, initMarkupContent} from './markup/content.js'; -import {initPdfViewer} from './render/pdf.js'; -import {initGltfViewer} from './render/gltf.js'; import {initUserAuthOauth2, initUserAuth} from './features/user-auth.js'; import { @@ -189,8 +187,6 @@ onDomReady(() => { initUserAuthWebAuthnRegister(); initUserAuth(); initRepoDiffView(); - initPdfViewer(); - initGltfViewer(); initScopedAccessTokenCategories(); initColorPickers(); diff --git a/web_src/js/render/gltf.js b/web_src/js/render/gltf.js deleted file mode 100644 index 2d48e9f8e6..0000000000 --- a/web_src/js/render/gltf.js +++ /dev/null @@ -1,6 +0,0 @@ -export async function initGltfViewer() { - const els = document.querySelectorAll('model-viewer'); - if (!els.length) return; - - await import(/* webpackChunkName: "@google/model-viewer" */'@google/model-viewer'); -} diff --git a/web_src/js/render/pdf.js b/web_src/js/render/pdf.js deleted file mode 100644 index f31f161e6e..0000000000 --- a/web_src/js/render/pdf.js +++ /dev/null @@ -1,19 +0,0 @@ -import {htmlEscape} from 'escape-goat'; - -export async function initPdfViewer() { - const els = document.querySelectorAll('.pdf-content'); - if (!els.length) return; - - const pdfobject = await import(/* webpackChunkName: "pdfobject" */'pdfobject'); - - for (const el of els) { - const src = el.getAttribute('data-src'); - const fallbackText = el.getAttribute('data-fallback-button-text'); - pdfobject.embed(src, el, { - fallbackLink: htmlEscape` - ${fallbackText} - `, - }); - el.classList.remove('is-loading'); - } -} diff --git a/web_src/js/webcomponents/i18n.js b/web_src/js/webcomponents/i18n.js deleted file mode 100644 index c94b82b583..0000000000 --- a/web_src/js/webcomponents/i18n.js +++ /dev/null @@ -1,75 +0,0 @@ -const {pageData} = window.config; - -/** - * A list of plural rules for all languages. - * `plural_rules.go` defines the index for each of the 14 known plural rules. - * - * `pageData.PLURAL_RULE_LANG` is the index of the plural rule for the current language. - * `pageData.PLURAL_RULE_FALLBACK` is the index of the plural rule for the default language, - * to be used when a string is not translated in the current language. - * - * Each plural rule is a function that maps an amount `n` to the appropriate plural form index. - * Which index means which rule is specific for each language and also defined in `plural_rules.go`. - * The actual strings are in `pageData.PLURALSTRINGS_LANG` and `pageData.PLURALSTRINGS_FALLBACK` - * respectively, which is an array indexed by the plural form index. - * - * Links to the language plural rule and form definitions: - * https://codeberg.org/forgejo/forgejo/src/branch/forgejo/modules/translation/plural_rules.go - * https://www.unicode.org/cldr/charts/46/supplemental/language_plural_rules.html - * https://translate.codeberg.org/languages/$LANGUAGE_CODE/#information - * https://github.com/WeblateOrg/language-data/blob/main/languages.csv - */ -const PLURAL_RULES = [ - // [ 0] Common 2-form, e.g. English, German - function (n) { return n !== 1 ? 1 : 0 }, - - // [ 1] Bengali 2-form - function (n) { return n > 1 ? 1 : 0 }, - - // [ 2] Icelandic 2-form - function (n) { return n % 10 !== 1 || n % 100 === 11 ? 1 : 0 }, - - // [ 3] Filipino 2-form - function (n) { return n !== 1 && n !== 2 && n !== 3 && (n % 10 === 4 || n % 10 === 6 || n % 10 === 9) ? 1 : 0 }, - - // [ 4] One form - function (_) { return 0 }, - - // [ 5] Czech 3-form - function (n) { return (n === 1) ? 0 : (n >= 2 && n <= 4) ? 1 : 2 }, - - // [ 6] Russian 3-form - function (n) { return n % 10 === 1 && n % 100 !== 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2 }, - - // [ 7] Polish 3-form - function (n) { return n === 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2 }, - - // [ 8] Latvian 3-form - function (n) { return (n % 10 === 0 || n % 100 >= 11 && n % 100 <= 19) ? 0 : ((n % 10 === 1 && n % 100 !== 11) ? 1 : 2) }, - - // [ 9] Lithunian 3-form - function (n) { return (n % 10 === 1 && (n % 100 < 11 || n % 100 > 19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? 1 : 2) }, - - // [10] French 3-form - function (n) { return (n === 0 || n === 1) ? 0 : ((n !== 0 && n % 1000000 === 0) ? 1 : 2) }, - - // [11] Catalan 3-form - function (n) { return (n === 1) ? 0 : ((n !== 0 && n % 1000000 === 0) ? 1 : 2) }, - - // [12] Slovenian 4-form - function (n) { return n % 100 === 1 ? 0 : n % 100 === 2 ? 1 : n % 100 === 3 || n % 100 === 4 ? 2 : 3 }, - - // [13] Arabic 6-form - function (n) { return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5 }, -]; - -/** - * Look up the correct localized plural form for amount `n` for the string with the translation key `key`. - * If the current language does not contain a translation for this key, returns the text in the default language, - * or `null` if `suppress_fallback` is set to `true`. - */ -export function GetPluralizedString(key, n, suppress_fallback) { - const result = pageData.PLURALSTRINGS_LANG[key]?.[PLURAL_RULES[pageData.PLURAL_RULE_LANG](n)]; - if (result || suppress_fallback) return result; - return pageData.PLURALSTRINGS_FALLBACK[key][PLURAL_RULES[pageData.PLURAL_RULE_FALLBACK](n)]; -} diff --git a/web_src/js/webcomponents/index.js b/web_src/js/webcomponents/index.js index f8883fa47a..1572de262f 100644 --- a/web_src/js/webcomponents/index.js +++ b/web_src/js/webcomponents/index.js @@ -1,6 +1,5 @@ -import './polyfills.js'; -import './i18n.js'; import './relative-time.js'; import './origin-url.js'; import './overflow-menu.js'; import './absolute-date.js'; +import './lazy-webc.js'; // infrequently used components should be lazy-loaded with ... diff --git a/web_src/js/webcomponents/lazy-webc.js b/web_src/js/webcomponents/lazy-webc.js new file mode 100644 index 0000000000..3570df3b5d --- /dev/null +++ b/web_src/js/webcomponents/lazy-webc.js @@ -0,0 +1,66 @@ +import {onDomReady} from '../utils/dom.js'; + +/** + * Lazy-load the promise (making it a singleton). + * @param {()=>Promise} newPromise Promise factory. + * @returns {()=>Promise} Singleton promise + */ +function lazyPromise(newPromise) { + /** @type {Promise?} */ + let p; + return () => { + p ??= newPromise(); + return p; + }; +} + +// the following web components will only be loaded if present in the page (to reduce the bundle size for infrequently used components) +const loadableComponents = { + 'model-viewer': lazyPromise(() => { + return import(/* webpackChunkName: "model-viewer" */ '@google/model-viewer'); + }), + 'pdf-object': lazyPromise(() => { + return import(/* webpackChunkName: "pdf-object" */ './pdf-object.js'); + }), +}; + +/** + * Replace elt with an element having the given tag. + * @param {HTMLElement} elt The element to replace. + * @param {string} name The tagName of the new element. + */ +function replaceTag(elt, name) { + const successor = document.createElement(name); + // Move the children to the successor + while (elt.firstChild) { + successor.append(elt.firstChild); + } + // Copy the attributes to the successor + for (let index = elt.attributes.length - 1; index >= 0; --index) { + successor.attributes.setNamedItem(elt.attributes[index].cloneNode()); + } + // Replace elt with the successor + elt.parentNode.replaceChild(successor, elt); +} + +onDomReady(() => { + // The lazy-webc component will replace itself with an element of the type given in the attribute tag. + // This seems to be the best way without having to create a global mutationObserver. + // See https://codeberg.org/forgejo/forgejo/pulls/8510 for discussion. + window.customElements.define( + 'lazy-webc', + class extends HTMLElement { + connectedCallback() { + const name = this.getAttribute('tag'); + if (loadableComponents[name]) { + loadableComponents[name]().finally(() => { + replaceTag(this, name); + }); + } else { + console.error('lazy-webc: unknown webcomponent:', name); + replaceTag(this, name); // still replace it, maybe it was eagerly defined + } + } + }, + ); +}); diff --git a/web_src/js/webcomponents/pdf-object.js b/web_src/js/webcomponents/pdf-object.js new file mode 100644 index 0000000000..15334dafe7 --- /dev/null +++ b/web_src/js/webcomponents/pdf-object.js @@ -0,0 +1,14 @@ +import pdfobject from 'pdfobject'; + +window.customElements.define( + 'pdf-object', + class extends HTMLElement { + connectedCallback() { + // since the web-component is defined after the DOM is ready, it is safe to look at the children. + const fallbackLink = this.innerHTML; // eslint-disable-line wc/no-child-traversal-in-connectedcallback + pdfobject.embed(this.getAttribute('src'), this, { + fallbackLink, + }); + } + }, +); diff --git a/web_src/js/webcomponents/polyfills.js b/web_src/js/webcomponents/polyfills.js deleted file mode 100644 index 38f50fa02f..0000000000 --- a/web_src/js/webcomponents/polyfills.js +++ /dev/null @@ -1,17 +0,0 @@ -try { - // some browsers like PaleMoon don't have full support for Intl.NumberFormat, so do the minimum polyfill to support "relative-time-element" - // https://repo.palemoon.org/MoonchildProductions/UXP/issues/2289 - new Intl.NumberFormat('en', {style: 'unit', unit: 'minute'}).format(1); -} catch { - const intlNumberFormat = Intl.NumberFormat; - Intl.NumberFormat = function(locales, options) { - if (options.style === 'unit') { - return { - format(value) { - return ` ${value} ${options.unit}`; - }, - }; - } - return intlNumberFormat(locales, options); - }; -} diff --git a/web_src/js/webcomponents/relative-time.js b/web_src/js/webcomponents/relative-time.js index d247ced3ca..2ec87450c1 100644 --- a/web_src/js/webcomponents/relative-time.js +++ b/web_src/js/webcomponents/relative-time.js @@ -1,4 +1,3 @@ -import {GetPluralizedString} from './i18n.js'; import dayjs from 'dayjs'; const {pageData} = window.config; @@ -17,8 +16,75 @@ const ABSOLUTE_DATETIME_FORMAT = new Intl.DateTimeFormat(navigator.language, { }); const FALLBACK_DATETIME_FORMAT = new Intl.RelativeTimeFormat(navigator.language, {style: 'long'}); +/** + * A list of plural rules for all languages. + * `plural_rules.go` defines the index for each of the 14 known plural rules. + * + * `pageData.PLURAL_RULE_LANG` is the index of the plural rule for the current language. + * `pageData.PLURAL_RULE_FALLBACK` is the index of the plural rule for the default language, + * to be used when a string is not translated in the current language. + * + * Each plural rule is a function that maps an amount `n` to the appropriate plural form index. + * Which index means which rule is specific for each language and also defined in `plural_rules.go`. + * The actual strings are in `pageData.PLURALSTRINGS_LANG` and `pageData.PLURALSTRINGS_FALLBACK` + * respectively, which is an array indexed by the plural form index. + * + * Links to the language plural rule and form definitions: + * https://codeberg.org/forgejo/forgejo/src/branch/forgejo/modules/translation/plural_rules.go + * https://www.unicode.org/cldr/charts/46/supplemental/language_plural_rules.html + * https://translate.codeberg.org/languages/$LANGUAGE_CODE/#information + * https://github.com/WeblateOrg/language-data/blob/main/languages.csv + */ +const PLURAL_RULES = [ + // [ 0] Common 2-form, e.g. English, German + function (n) { return n !== 1 ? 1 : 0 }, + + // [ 1] Bengali 2-form + function (n) { return n > 1 ? 1 : 0 }, + + // [ 2] Icelandic 2-form + function (n) { return n % 10 !== 1 || n % 100 === 11 ? 1 : 0 }, + + // [ 3] Filipino 2-form + function (n) { return n !== 1 && n !== 2 && n !== 3 && (n % 10 === 4 || n % 10 === 6 || n % 10 === 9) ? 1 : 0 }, + + // [ 4] One form + function (_) { return 0 }, + + // [ 5] Czech 3-form + function (n) { return (n === 1) ? 0 : (n >= 2 && n <= 4) ? 1 : 2 }, + + // [ 6] Russian 3-form + function (n) { return n % 10 === 1 && n % 100 !== 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2 }, + + // [ 7] Polish 3-form + function (n) { return n === 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2 }, + + // [ 8] Latvian 3-form + function (n) { return (n % 10 === 0 || n % 100 >= 11 && n % 100 <= 19) ? 0 : ((n % 10 === 1 && n % 100 !== 11) ? 1 : 2) }, + + // [ 9] Lithunian 3-form + function (n) { return (n % 10 === 1 && (n % 100 < 11 || n % 100 > 19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? 1 : 2) }, + + // [10] French 3-form + function (n) { return (n === 0 || n === 1) ? 0 : ((n !== 0 && n % 1000000 === 0) ? 1 : 2) }, + + // [11] Catalan 3-form + function (n) { return (n === 1) ? 0 : ((n !== 0 && n % 1000000 === 0) ? 1 : 2) }, + + // [12] Slovenian 4-form + function (n) { return n % 100 === 1 ? 0 : n % 100 === 2 ? 1 : n % 100 === 3 || n % 100 === 4 ? 2 : 3 }, + + // [13] Arabic 6-form + function (n) { return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5 }, +]; + +/** + * Look up the correct localized plural form for amount `n` for the string with the translation key `key`. + * If the current language does not contain a translation for this key, fallback to the browser's formatting. + */ function GetPluralizedStringOrFallback(key, n, unit) { - const translation = GetPluralizedString(key, n, true); + const translation = pageData.PLURALSTRINGS_LANG[key]?.[PLURAL_RULES[pageData.PLURAL_RULE_LANG](n)]; if (translation) return translation.replace('%d', n); return FALLBACK_DATETIME_FORMAT.format(-n, unit); } From 82daae4c7cccb8bfa90efcd6aea6da91565ecd3a Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 23 Jul 2025 04:38:03 +0200 Subject: [PATCH 204/495] Update dependency vue to v3.5.18 (forgejo) (#8623) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 144 +++++++++++++++++++++++++++------------------- package.json | 2 +- 2 files changed, 87 insertions(+), 59 deletions(-) diff --git a/package-lock.json b/package-lock.json index dbf23af045..d69bddd887 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,7 +52,7 @@ "tributejs": "5.1.3", "uint8-to-base64": "0.2.0", "vanilla-colorful": "0.7.2", - "vue": "3.5.16", + "vue": "3.5.18", "vue-chartjs": "5.3.1", "vue-loader": "17.4.2", "vue3-calendar-heatmap": "2.0.5", @@ -4342,42 +4342,42 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.16.tgz", - "integrity": "sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.18.tgz", + "integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.2", - "@vue/shared": "3.5.16", + "@babel/parser": "^7.28.0", + "@vue/shared": "3.5.18", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.16.tgz", - "integrity": "sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz", + "integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.16", - "@vue/shared": "3.5.16" + "@vue/compiler-core": "3.5.18", + "@vue/shared": "3.5.18" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.16.tgz", - "integrity": "sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz", + "integrity": "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.2", - "@vue/compiler-core": "3.5.16", - "@vue/compiler-dom": "3.5.16", - "@vue/compiler-ssr": "3.5.16", - "@vue/shared": "3.5.16", + "@babel/parser": "^7.28.0", + "@vue/compiler-core": "3.5.18", + "@vue/compiler-dom": "3.5.18", + "@vue/compiler-ssr": "3.5.18", + "@vue/shared": "3.5.18", "estree-walker": "^2.0.2", "magic-string": "^0.30.17", - "postcss": "^8.5.3", + "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, @@ -4390,64 +4390,92 @@ "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.16.tgz", - "integrity": "sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==", + "node_modules/@vue/compiler-sfc/node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "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": { - "@vue/compiler-dom": "3.5.16", - "@vue/shared": "3.5.16" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz", + "integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.18", + "@vue/shared": "3.5.18" } }, "node_modules/@vue/reactivity": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.16.tgz", - "integrity": "sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.18.tgz", + "integrity": "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.16" + "@vue/shared": "3.5.18" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.16.tgz", - "integrity": "sha512-bw5Ykq6+JFHYxrQa7Tjr+VSzw7Dj4ldR/udyBZbq73fCdJmyy5MPIFR9IX/M5Qs+TtTjuyUTCnmK3lWWwpAcFQ==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.18.tgz", + "integrity": "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.16", - "@vue/shared": "3.5.16" + "@vue/reactivity": "3.5.18", + "@vue/shared": "3.5.18" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.16.tgz", - "integrity": "sha512-T1qqYJsG2xMGhImRUV9y/RseB9d0eCYZQ4CWca9ztCuiPj/XWNNN+lkNBuzVbia5z4/cgxdL28NoQCvC0Xcfww==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz", + "integrity": "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.16", - "@vue/runtime-core": "3.5.16", - "@vue/shared": "3.5.16", + "@vue/reactivity": "3.5.18", + "@vue/runtime-core": "3.5.18", + "@vue/shared": "3.5.18", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.16.tgz", - "integrity": "sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.18.tgz", + "integrity": "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.16", - "@vue/shared": "3.5.16" + "@vue/compiler-ssr": "3.5.18", + "@vue/shared": "3.5.18" }, "peerDependencies": { - "vue": "3.5.16" + "vue": "3.5.18" } }, "node_modules/@vue/shared": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.16.tgz", - "integrity": "sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", + "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==", "license": "MIT" }, "node_modules/@vue/test-utils": { @@ -15522,16 +15550,16 @@ "license": "MIT" }, "node_modules/vue": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.16.tgz", - "integrity": "sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.18.tgz", + "integrity": "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.16", - "@vue/compiler-sfc": "3.5.16", - "@vue/runtime-dom": "3.5.16", - "@vue/server-renderer": "3.5.16", - "@vue/shared": "3.5.16" + "@vue/compiler-dom": "3.5.18", + "@vue/compiler-sfc": "3.5.18", + "@vue/runtime-dom": "3.5.18", + "@vue/server-renderer": "3.5.18", + "@vue/shared": "3.5.18" }, "peerDependencies": { "typescript": "*" diff --git a/package.json b/package.json index 4f4f9d48b8..466f8fbb01 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "tributejs": "5.1.3", "uint8-to-base64": "0.2.0", "vanilla-colorful": "0.7.2", - "vue": "3.5.16", + "vue": "3.5.18", "vue-chartjs": "5.3.1", "vue-loader": "17.4.2", "vue3-calendar-heatmap": "2.0.5", From 7643bdd2b503d3e141e2e9fc96afb7bccbad4e97 Mon Sep 17 00:00:00 2001 From: Robert Wolff Date: Wed, 23 Jul 2025 04:45:58 +0200 Subject: [PATCH 205/495] feat(ui): add links to review request targets in issue comments (#8239) - Add links to review request targets in issue comments - Fix links to ghost users/orgs/teams to be empty Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8239 Reviewed-by: Gusted Co-authored-by: Robert Wolff Co-committed-by: Robert Wolff --- models/issues/action_aggregator.go | 8 ++ models/issues/action_aggregator_test.go | 37 +++++++++ models/organization/org.go | 5 ++ models/organization/team.go | 50 +++++++++--- models/organization/team_test.go | 30 ++++++-- models/user/user.go | 12 +++ models/user/user_test.go | 22 ++++++ modules/templates/util_render.go | 12 ++- modules/templates/util_render_test.go | 17 ++++ .../repo/issue/view_content/comments.tmpl | 7 +- tests/integration/issue_comment_test.go | 77 +++++++++++++++++++ 11 files changed, 256 insertions(+), 21 deletions(-) create mode 100644 models/issues/action_aggregator_test.go diff --git a/models/issues/action_aggregator.go b/models/issues/action_aggregator.go index d3643adeef..c4632fd4dd 100644 --- a/models/issues/action_aggregator.go +++ b/models/issues/action_aggregator.go @@ -4,6 +4,7 @@ package issues import ( + "context" "slices" "forgejo.org/models/organization" @@ -374,3 +375,10 @@ func (t *RequestReviewTarget) Type() string { } return "team" } + +func (t *RequestReviewTarget) Link(ctx context.Context) string { + if t.User != nil { + return t.User.HomeLink() + } + return t.Team.Link(ctx) +} diff --git a/models/issues/action_aggregator_test.go b/models/issues/action_aggregator_test.go new file mode 100644 index 0000000000..1962596d2d --- /dev/null +++ b/models/issues/action_aggregator_test.go @@ -0,0 +1,37 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package issues + +import ( + "testing" + + "forgejo.org/models/db" + org_model "forgejo.org/models/organization" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + + "github.com/stretchr/testify/assert" +) + +func TestRequestReviewTarget(t *testing.T) { + unittest.PrepareTestEnv(t) + + target := RequestReviewTarget{User: &user_model.User{ID: 1, Name: "user1"}} + assert.Equal(t, int64(1), target.ID()) + assert.Equal(t, "user1", target.Name()) + assert.Equal(t, "user", target.Type()) + assert.Equal(t, "/user1", target.Link(db.DefaultContext)) + + target = RequestReviewTarget{Team: &org_model.Team{ID: 2, Name: "Collaborators", OrgID: 3}} + assert.Equal(t, int64(2), target.ID()) + assert.Equal(t, "Collaborators", target.Name()) + assert.Equal(t, "team", target.Type()) + assert.Equal(t, "/org/org3/teams/Collaborators", target.Link(db.DefaultContext)) + + target = RequestReviewTarget{Team: org_model.NewGhostTeam()} + assert.Equal(t, int64(-1), target.ID()) + assert.Equal(t, "Ghost team", target.Name()) + assert.Equal(t, "team", target.Type()) + assert.Empty(t, target.Link(db.DefaultContext)) +} diff --git a/models/organization/org.go b/models/organization/org.go index ff95261051..c4df5d4fe1 100644 --- a/models/organization/org.go +++ b/models/organization/org.go @@ -186,6 +186,11 @@ func (org *Organization) CanCreateRepo() bool { return org.AsUser().CanCreateRepo() } +// IsGhost returns if the organization is a ghost +func (org *Organization) IsGhost() bool { + return org.AsUser().IsGhost() +} + // FindOrgMembersOpts represensts find org members conditions type FindOrgMembersOpts struct { db.ListOptions diff --git a/models/organization/team.go b/models/organization/team.go index c78eff39fb..209471e013 100644 --- a/models/organization/team.go +++ b/models/organization/team.go @@ -1,5 +1,6 @@ -// Copyright 2018 The Gitea Authors. All rights reserved. // Copyright 2016 The Gogs Authors. All rights reserved. +// Copyright 2018 The Gitea Authors. All rights reserved. +// Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package organization @@ -7,6 +8,7 @@ package organization import ( "context" "fmt" + "net/url" "strings" "forgejo.org/models/db" @@ -20,13 +22,6 @@ import ( "xorm.io/builder" ) -// ___________ -// \__ ___/___ _____ _____ -// | |_/ __ \\__ \ / \ -// | |\ ___/ / __ \| Y Y \ -// |____| \___ >____ /__|_| / -// \/ \/ \/ - // ErrTeamAlreadyExist represents a "TeamAlreadyExist" kind of error. type ErrTeamAlreadyExist struct { OrgID int64 @@ -193,6 +188,27 @@ func (t *Team) UnitAccessMode(ctx context.Context, tp unit.Type) perm.AccessMode return perm.AccessModeNone } +// GetOrg returns the team's organization +func (t *Team) GetOrg(ctx context.Context) *Organization { + org, err := GetOrgByID(ctx, t.OrgID) + if err != nil { + return OrgFromUser(user_model.NewGhostUser()) + } + return org +} + +// Link returns the team's page link +func (t *Team) Link(ctx context.Context) string { + if t.IsGhost() { + return "" + } + org := t.GetOrg(ctx) + if org.IsGhost() { + return "" + } + return org.OrganisationLink() + "/teams/" + url.PathEscape(t.Name) +} + // IsUsableTeamName tests if a name could be as team name func IsUsableTeamName(name string) error { switch name { @@ -293,10 +309,22 @@ func FixInconsistentOwnerTeams(ctx context.Context) (int64, error) { return int64(len(teamIDs)), nil } +const ( + GhostTeamID = -1 + GhostTeamName = "Ghost team" + GhostTeamLowerName = "ghost team" +) + +// NewGhostTeam creates ghost team (for deleted team) func NewGhostTeam() *Team { return &Team{ - ID: -1, - Name: "Ghost team", - LowerName: "ghost team", + ID: GhostTeamID, + Name: GhostTeamName, + LowerName: GhostTeamLowerName, } } + +// IsGhost returns if a team is a ghost team +func (t *Team) IsGhost() bool { + return t.ID == GhostTeamID +} diff --git a/models/organization/team_test.go b/models/organization/team_test.go index 60c500e7ec..768ccdf5be 100644 --- a/models/organization/team_test.go +++ b/models/organization/team_test.go @@ -1,4 +1,5 @@ // Copyright 2017 The Gitea Authors. All rights reserved. +// Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package organization_test @@ -15,14 +16,33 @@ import ( "github.com/stretchr/testify/require" ) -func TestTeam_IsOwnerTeam(t *testing.T) { +func TestTeam(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) - team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 1}) - assert.True(t, team.IsOwnerTeam()) + owners := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 1}) + assert.Equal(t, int64(3), owners.GetOrg(db.DefaultContext).ID) + assert.Equal(t, "/org/org3/teams/Owners", owners.Link(db.DefaultContext)) + assert.False(t, owners.IsGhost()) + assert.True(t, owners.IsOwnerTeam()) - team = unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 2}) - assert.False(t, team.IsOwnerTeam()) + team1 := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 2}) + assert.Equal(t, int64(3), team1.GetOrg(db.DefaultContext).ID) + assert.Equal(t, "/org/org3/teams/team1", team1.Link(db.DefaultContext)) + assert.False(t, team1.IsGhost()) + assert.False(t, team1.IsOwnerTeam()) + + ghost := organization.NewGhostTeam() + assert.Equal(t, int64(-1), ghost.ID) + assert.Equal(t, int64(-1), ghost.GetOrg(db.DefaultContext).ID) + assert.Empty(t, ghost.Link(db.DefaultContext)) + assert.True(t, ghost.IsGhost()) + assert.False(t, ghost.IsOwnerTeam()) + + ghosted := organization.Team{ID: 10, Name: "Ghosted"} + assert.Equal(t, int64(-1), ghosted.GetOrg(db.DefaultContext).ID) + assert.Empty(t, ghosted.Link(db.DefaultContext)) + assert.False(t, ghosted.IsGhost()) + assert.False(t, ghosted.IsOwnerTeam()) } func TestTeam_IsMember(t *testing.T) { diff --git a/models/user/user.go b/models/user/user.go index 6b54776adf..e3d725677f 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -296,6 +296,9 @@ func (u *User) CanImportLocal() bool { // DashboardLink returns the user dashboard page link. func (u *User) DashboardLink() string { + if u.IsGhost() { + return "" + } if u.IsOrganization() { return u.OrganisationLink() + "/dashboard" } @@ -304,16 +307,25 @@ func (u *User) DashboardLink() string { // HomeLink returns the user or organization home page link. func (u *User) HomeLink() string { + if u.IsGhost() { + return "" + } return setting.AppSubURL + "/" + url.PathEscape(u.Name) } // HTMLURL returns the user or organization's full link. func (u *User) HTMLURL() string { + if u.IsGhost() { + return "" + } return setting.AppURL + url.PathEscape(u.Name) } // OrganisationLink returns the organization sub page link. func (u *User) OrganisationLink() string { + if u.IsGhost() || !u.IsOrganization() { + return "" + } return setting.AppSubURL + "/org/" + url.PathEscape(u.Name) } diff --git a/models/user/user_test.go b/models/user/user_test.go index f9a3aa6075..71190751da 100644 --- a/models/user/user_test.go +++ b/models/user/user_test.go @@ -46,6 +46,28 @@ func TestIsValidUserID(t *testing.T) { assert.True(t, user_model.IsValidUserID(200)) } +func TestUserLinks(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + assert.Equal(t, "/", user1.DashboardLink()) + assert.Equal(t, "/user1", user1.HomeLink()) + assert.Equal(t, "https://try.gitea.io/user1", user1.HTMLURL()) + assert.Empty(t, user1.OrganisationLink()) + + org3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}) + assert.Equal(t, "/org/org3/dashboard", org3.DashboardLink()) + assert.Equal(t, "/org3", org3.HomeLink()) + assert.Equal(t, "https://try.gitea.io/org3", org3.HTMLURL()) + assert.Equal(t, "/org/org3", org3.OrganisationLink()) + + ghost := user_model.NewGhostUser() + assert.Empty(t, ghost.DashboardLink()) + assert.Empty(t, ghost.HomeLink()) + assert.Empty(t, ghost.HTMLURL()) + assert.Empty(t, ghost.OrganisationLink()) +} + func TestGetUserFromMap(t *testing.T) { id := int64(200) idMap := map[int64]*user_model.User{ diff --git a/modules/templates/util_render.go b/modules/templates/util_render.go index 48f4eb04a3..badff5f193 100644 --- a/modules/templates/util_render.go +++ b/modules/templates/util_render.go @@ -275,10 +275,18 @@ func RenderUser(ctx context.Context, user user_model.User) template.HTML { html.EscapeString(user.GetDisplayName()))) } -func RenderReviewRequest(users []issues_model.RequestReviewTarget) template.HTML { +func RenderReviewRequest(ctx context.Context, users []issues_model.RequestReviewTarget) template.HTML { usernames := make([]string, 0, len(users)) for _, user := range users { - usernames = append(usernames, html.EscapeString(user.Name())) + if user.ID() > 0 { + usernames = append(usernames, fmt.Sprintf( + "%s", + user.Link(ctx), html.EscapeString(user.Name()))) + } else { + usernames = append(usernames, fmt.Sprintf( + "%s", + html.EscapeString(user.Name()))) + } } htmlCode := `` diff --git a/modules/templates/util_render_test.go b/modules/templates/util_render_test.go index a5fb18642a..8d58d7d2d4 100644 --- a/modules/templates/util_render_test.go +++ b/modules/templates/util_render_test.go @@ -10,6 +10,7 @@ import ( "forgejo.org/models/db" issues_model "forgejo.org/models/issues" + org_model "forgejo.org/models/organization" "forgejo.org/models/unittest" user_model "forgejo.org/models/user" "forgejo.org/modules/setting" @@ -266,3 +267,19 @@ func TestRenderUser(t *testing.T) { assert.Contains(t, RenderUser(db.DefaultContext, *ghost), "Ghost") } + +func TestRenderReviewRequest(t *testing.T) { + unittest.PrepareTestEnv(t) + + target1 := issues_model.RequestReviewTarget{User: &user_model.User{ID: 1, Name: "user1", FullName: "User "}} + target2 := issues_model.RequestReviewTarget{Team: &org_model.Team{ID: 2, Name: "Team2", OrgID: 3}} + target3 := issues_model.RequestReviewTarget{Team: org_model.NewGhostTeam()} + assert.Contains(t, RenderReviewRequest(db.DefaultContext, []issues_model.RequestReviewTarget{target1, target2, target3}), + "user1, "+ + "Team2, "+ + "Ghost team") + + defer test.MockVariableValue(&setting.UI.DefaultShowFullName, true)() + assert.Contains(t, RenderReviewRequest(db.DefaultContext, []issues_model.RequestReviewTarget{target1}), + "User <One>") +} diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl index 4ab1fa7584..76b02f4755 100644 --- a/templates/repo/issue/view_content/comments.tmpl +++ b/templates/repo/issue/view_content/comments.tmpl @@ -548,14 +548,15 @@ {{svg "octicon-eye"}} {{template "shared/user/avatarlink" dict "user" .Poster}} + {{template "shared/user/authorlink" .Poster}} {{if and (eq (len .RemovedRequestReview) 1) (eq (len .AddedRequestReview) 0) (eq ((index .RemovedRequestReview 0).ID) .PosterID) (eq ((index .RemovedRequestReview 0).Type) "user")}} {{ctx.Locale.Tr "repo.issues.review.remove_review_request_self" $createdStr}} {{else if and .AddedRequestReview (not .RemovedRequestReview)}} - {{ctx.Locale.TrN (len .AddedRequestReview) "repo.issues.review.add_review_request" "repo.issues.review.add_review_requests" (RenderReviewRequest .AddedRequestReview) $createdStr}} + {{ctx.Locale.TrN (len .AddedRequestReview) "repo.issues.review.add_review_request" "repo.issues.review.add_review_requests" (RenderReviewRequest $.Context .AddedRequestReview) $createdStr}} {{else if and (not .AddedRequestReview) .RemovedRequestReview}} - {{ctx.Locale.TrN (len .RemovedRequestReview) "repo.issues.review.remove_review_request" "repo.issues.review.remove_review_requests" (RenderReviewRequest .RemovedRequestReview) $createdStr}} + {{ctx.Locale.TrN (len .RemovedRequestReview) "repo.issues.review.remove_review_request" "repo.issues.review.remove_review_requests" (RenderReviewRequest $.Context .RemovedRequestReview) $createdStr}} {{else}} - {{ctx.Locale.Tr "repo.issues.review.add_remove_review_requests" (RenderReviewRequest .AddedRequestReview) (RenderReviewRequest .RemovedRequestReview) $createdStr}} + {{ctx.Locale.Tr "repo.issues.review.add_remove_review_requests" (RenderReviewRequest $.Context .AddedRequestReview) (RenderReviewRequest $.Context .RemovedRequestReview) $createdStr}} {{end}}
diff --git a/tests/integration/issue_comment_test.go b/tests/integration/issue_comment_test.go index 6c4a514eba..eda643fa79 100644 --- a/tests/integration/issue_comment_test.go +++ b/tests/integration/issue_comment_test.go @@ -5,13 +5,20 @@ package integration import ( "net/http" + "strconv" "strings" "testing" + "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + org_model "forgejo.org/models/organization" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" "forgejo.org/tests" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func testIssueCommentChangeEvent(t *testing.T, htmlDoc *HTMLDoc, commentID, badgeOcticon, avatarTitle, avatarLink string, texts, links []string) { @@ -238,6 +245,76 @@ func TestIssueCommentChangeAssignee(t *testing.T) { []string{"/user2"}) } +func TestIssueCommentChangeReviewRequest(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + pull := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 6}) + require.NoError(t, pull.LoadIssue(db.DefaultContext)) + issue := pull.Issue + require.NoError(t, issue.LoadRepo(db.DefaultContext)) + + user1, err := user_model.GetUserByID(db.DefaultContext, 1) + require.NoError(t, err) + user2, err := user_model.GetUserByID(db.DefaultContext, 2) + require.NoError(t, err) + team1, err := org_model.GetTeamByID(db.DefaultContext, 2) + require.NoError(t, err) + assert.NotNil(t, team1) + + // Request from other + comment1, err := issues_model.AddReviewRequest(db.DefaultContext, issue, user2, user1) + require.NoError(t, err) + + // Refuse review + comment2, err := issues_model.RemoveReviewRequest(db.DefaultContext, issue, user2, user2) + require.NoError(t, err) + + // Request from other + comment3, err := issues_model.AddReviewRequest(db.DefaultContext, issue, user2, user1) + require.NoError(t, err) + // Request from team + comment4, err := issues_model.AddTeamReviewRequest(db.DefaultContext, issue, team1, user1) + require.NoError(t, err) + + // Remove request from team + comment5, err := issues_model.RemoveTeamReviewRequest(db.DefaultContext, issue, team1, user2) + require.NoError(t, err) + // Request from other + comment6, err := issues_model.AddReviewRequest(db.DefaultContext, issue, user1, user2) + require.NoError(t, err) + + session := loginUser(t, "user2") + req := NewRequest(t, "GET", "/org3/repo3/pulls/2") + resp := session.MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + + // Request from other + testIssueCommentChangeEvent(t, htmlDoc, strconv.FormatInt(comment1.ID, 10), + "octicon-eye", "User One", "/user1", + []string{"user1 requested review from user2"}, + []string{"/user1", "/user2"}) + + // Refuse review + testIssueCommentChangeEvent(t, htmlDoc, strconv.FormatInt(comment2.ID, 10), + "octicon-eye", "< Ur Tw ><", "/user2", + []string{"user2 refused to review"}, + []string{"/user2"}) + + // Request review from other and from team + testIssueCommentChangeEvent(t, htmlDoc, strconv.FormatInt(comment3.ID, 10), + "octicon-eye", "User One", "/user1", + []string{"user1 requested reviews from user2, team1"}, + []string{"/user1", "/user2", "/org/org3/teams/team1"}) + assert.Empty(t, htmlDoc.Find("#issuecomment-"+strconv.FormatInt(comment4.ID, 10)+" .text").Text()) + + // Remove and add request + testIssueCommentChangeEvent(t, htmlDoc, strconv.FormatInt(comment5.ID, 10), + "octicon-eye", "< Ur Tw ><", "/user2", + []string{"user2 requested reviews from user1 and removed review requests for team1"}, + []string{"/user2", "/user1", "/org/org3/teams/team1"}) + assert.Empty(t, htmlDoc.Find("#issuecomment-"+strconv.FormatInt(comment6.ID, 10)+" .text").Text()) +} + func TestIssueCommentChangeLock(t *testing.T) { defer tests.PrepareTestEnv(t)() From f3ccfc49697ffc762d1043d838fc13314ce98799 Mon Sep 17 00:00:00 2001 From: Gusted Date: Wed, 23 Jul 2025 07:30:30 +0200 Subject: [PATCH 206/495] fix: short-circuit to avoid rebasing (#8622) - Do not try to rebase a pull request when it is zero commits behind. We can trust this number as before merging a repository the status of the pull request is mergeable and thus not in a conflict checking stage (where this would be updated). - This resolves a issue where `git-replay` would rebase a pull request when this is not needed and causes to lose the signature of Git commits and commit IDs as shown in the pullrequest commits timeline. - Resolves forgejo/forgejo#8619 - Add a simple integration test that simply checks that after merging a up-to-date pull request via the rebase style that the commit ID didn't change. This demonstrates that it didn't do needlessly rebasing. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8622 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- services/pull/merge_prepare.go | 5 +++++ tests/integration/pull_merge_test.go | 29 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/services/pull/merge_prepare.go b/services/pull/merge_prepare.go index fc70da10a4..4598d57b7a 100644 --- a/services/pull/merge_prepare.go +++ b/services/pull/merge_prepare.go @@ -249,6 +249,11 @@ func rebaseTrackingOnToBase(ctx *mergeContext, mergeStyle repo_model.MergeStyle) ctx.outbuf.Reset() ctx.errbuf.Reset() + // If the pull request is zero commits behind, then no rebasing needs to be done. + if ctx.pr.CommitsBehind == 0 { + return nil + } + // Check git version for availability of git-replay. If it is available, we use // it for performance and to preserve unknown commit headers like the // "change-id" header used by Jujutsu and GitButler to track changes across diff --git a/tests/integration/pull_merge_test.go b/tests/integration/pull_merge_test.go index cca2381fd4..ab3d1604de 100644 --- a/tests/integration/pull_merge_test.go +++ b/tests/integration/pull_merge_test.go @@ -1135,3 +1135,32 @@ func TestPullDeleteBranchPerms(t *testing.T) { user4Session.MakeRequest(t, req, http.StatusOK) }) } + +// Test that rebasing only happens when its necessary. +func TestRebaseWhenNecessary(t *testing.T) { + onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { + session := loginUser(t, "user1") + testRepoFork(t, session, "user2", "repo1", "user1", "repo1") + testEditFile(t, session, "user1", "repo1", "master", "README.md", "Hello, World (Edited)\n") + + resp := testPullCreate(t, session, "user1", "repo1", false, "master", "master", "This is a pull title") + pullLink := test.RedirectURL(resp) + + resp = session.MakeRequest(t, NewRequest(t, "GET", test.RedirectURL(resp)+"/commits"), http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + commitLinkBefore, ok := htmlDoc.Find("a.sha").Attr("href") + assert.True(t, ok) + commitBefore := commitLinkBefore[strings.LastIndexByte(commitLinkBefore, '/'):] + + elem := strings.Split(pullLink, "/") + testPullMerge(t, session, elem[1], elem[2], elem[4], repo_model.MergeStyleRebase, false) + + resp = session.MakeRequest(t, NewRequest(t, "GET", "/user2/repo1"), http.StatusOK) + htmlDoc = NewHTMLParser(t, resp.Body) + commitLinkAfter, ok := htmlDoc.Find(".latest-commit a.sha").Attr("href") + assert.True(t, ok) + commitAfter := commitLinkAfter[strings.LastIndexByte(commitLinkAfter, '/'):] + + assert.Equal(t, commitBefore, commitAfter) + }) +} From 4d06d62515a5e8d63f8714c67272159a7cc08ad2 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Wed, 23 Jul 2025 09:17:32 +0200 Subject: [PATCH 207/495] fix(ci): pull stylus from github:stylus/stylus#0.57.0 (#8625) npm error 404 Not Found - GET https://registry.npmjs.org/stylus/-/stylus-0.57.0.tgz - Not found Workaround to be reverted when the issue is fixed. Refs https://github.com/stylus/stylus/issues/2938 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8625 Reviewed-by: Michael Kriese Reviewed-by: Beowulf Co-authored-by: Earl Warren Co-committed-by: Earl Warren --- package-lock.json | 3 +-- package.json | 3 +++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index d69bddd887..d5516ede3e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14138,8 +14138,7 @@ }, "node_modules/stylus": { "version": "0.57.0", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.57.0.tgz", - "integrity": "sha512-yOI6G8WYfr0q8v8rRvE91wbxFU+rJPo760Va4MF6K0I6BZjO4r+xSynkvyPBP9tV1CIEUeRsiidjIs2rzb1CnQ==", + "resolved": "git+ssh://git@github.com/stylus/stylus.git#bc1404aa1f6c03341bd76529c8cf4beb4f3d99f7", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 466f8fbb01..2a2928a699 100644 --- a/package.json +++ b/package.json @@ -101,6 +101,9 @@ "vite-string-plugin": "1.4.6", "vitest": "3.2.4" }, + "overrides": { + "stylus": "github:stylus/stylus#0.57.0" + }, "browserslist": [ "defaults" ] From 4d20a74c0463c41f45976a4cd6858b43ffcb3926 Mon Sep 17 00:00:00 2001 From: Michael Kriese Date: Wed, 23 Jul 2025 10:37:46 +0200 Subject: [PATCH 208/495] chore(renovate): use `forgejo` platform (#8629) Use the new `forgejo` platform instead of the `gitea` Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8629 Reviewed-by: Earl Warren Co-authored-by: Michael Kriese Co-committed-by: Michael Kriese --- .forgejo/workflows/renovate.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/renovate.yml b/.forgejo/workflows/renovate.yml index a4e438a879..ecc39e7c62 100644 --- a/.forgejo/workflows/renovate.yml +++ b/.forgejo/workflows/renovate.yml @@ -49,7 +49,7 @@ jobs: LOG_LEVEL: debug RENOVATE_BASE_DIR: ${{ github.workspace }}/.tmp RENOVATE_ENDPOINT: ${{ github.server_url }} - RENOVATE_PLATFORM: gitea + RENOVATE_PLATFORM: forgejo RENOVATE_REPOSITORY_CACHE: 'enabled' RENOVATE_TOKEN: ${{ secrets.RENOVATE_TOKEN }} RENOVATE_GIT_AUTHOR: 'Renovate Bot ' From b52cec753fc35391b58399563ce696bea549f79e Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Wed, 23 Jul 2025 22:30:39 +0200 Subject: [PATCH 209/495] Revert "fix(ci): pull stylus from github:stylus/stylus#0.57.0 (#8625)" (#8638) This reverts commit 4d06d62515a5e8d63f8714c67272159a7cc08ad2. https://www.npmjs.com/package/stylus?activeTab=versions is back. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8638 Reviewed-by: Michael Kriese Reviewed-by: Beowulf Co-authored-by: Earl Warren Co-committed-by: Earl Warren --- package-lock.json | 3 ++- package.json | 3 --- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index d5516ede3e..d69bddd887 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14138,7 +14138,8 @@ }, "node_modules/stylus": { "version": "0.57.0", - "resolved": "git+ssh://git@github.com/stylus/stylus.git#bc1404aa1f6c03341bd76529c8cf4beb4f3d99f7", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.57.0.tgz", + "integrity": "sha512-yOI6G8WYfr0q8v8rRvE91wbxFU+rJPo760Va4MF6K0I6BZjO4r+xSynkvyPBP9tV1CIEUeRsiidjIs2rzb1CnQ==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 2a2928a699..466f8fbb01 100644 --- a/package.json +++ b/package.json @@ -101,9 +101,6 @@ "vite-string-plugin": "1.4.6", "vitest": "3.2.4" }, - "overrides": { - "stylus": "github:stylus/stylus#0.57.0" - }, "browserslist": [ "defaults" ] From 2f708695192e4c3d6a14b7bb33b1476997b36414 Mon Sep 17 00:00:00 2001 From: Gusted Date: Wed, 23 Jul 2025 22:35:40 +0200 Subject: [PATCH 210/495] chore: integration test when rebase should happen (#8635) - Follow up to forgejo/forgejo#8622 - Now the converse is also tested, a rebase should have happened and the commit IDs should differ. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8635 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- tests/integration/pull_merge_test.go | 73 ++++++++++++++++++++++------ 1 file changed, 57 insertions(+), 16 deletions(-) diff --git a/tests/integration/pull_merge_test.go b/tests/integration/pull_merge_test.go index ab3d1604de..b8923dd6f4 100644 --- a/tests/integration/pull_merge_test.go +++ b/tests/integration/pull_merge_test.go @@ -1141,26 +1141,67 @@ func TestRebaseWhenNecessary(t *testing.T) { onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { session := loginUser(t, "user1") testRepoFork(t, session, "user2", "repo1", "user1", "repo1") - testEditFile(t, session, "user1", "repo1", "master", "README.md", "Hello, World (Edited)\n") - resp := testPullCreate(t, session, "user1", "repo1", false, "master", "master", "This is a pull title") - pullLink := test.RedirectURL(resp) + t.Run("No rebase needed", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() - resp = session.MakeRequest(t, NewRequest(t, "GET", test.RedirectURL(resp)+"/commits"), http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - commitLinkBefore, ok := htmlDoc.Find("a.sha").Attr("href") - assert.True(t, ok) - commitBefore := commitLinkBefore[strings.LastIndexByte(commitLinkBefore, '/'):] + testEditFile(t, session, "user1", "repo1", "master", "README.md", "Hello, World (Edited)\n") - elem := strings.Split(pullLink, "/") - testPullMerge(t, session, elem[1], elem[2], elem[4], repo_model.MergeStyleRebase, false) + resp := testPullCreate(t, session, "user1", "repo1", false, "master", "master", "This is a pull title") + pullLink := test.RedirectURL(resp) - resp = session.MakeRequest(t, NewRequest(t, "GET", "/user2/repo1"), http.StatusOK) - htmlDoc = NewHTMLParser(t, resp.Body) - commitLinkAfter, ok := htmlDoc.Find(".latest-commit a.sha").Attr("href") - assert.True(t, ok) - commitAfter := commitLinkAfter[strings.LastIndexByte(commitLinkAfter, '/'):] + resp = session.MakeRequest(t, NewRequest(t, "GET", test.RedirectURL(resp)+"/commits"), http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + commitLinkBefore, ok := htmlDoc.Find("a.sha").Attr("href") + assert.True(t, ok) + commitBefore := commitLinkBefore[strings.LastIndexByte(commitLinkBefore, '/'):] - assert.Equal(t, commitBefore, commitAfter) + elem := strings.Split(pullLink, "/") + testPullMerge(t, session, elem[1], elem[2], elem[4], repo_model.MergeStyleRebase, false) + + resp = session.MakeRequest(t, NewRequest(t, "GET", "/user2/repo1"), http.StatusOK) + htmlDoc = NewHTMLParser(t, resp.Body) + commitLinkAfter, ok := htmlDoc.Find(".latest-commit a.sha").Attr("href") + assert.True(t, ok) + commitAfter := commitLinkAfter[strings.LastIndexByte(commitLinkAfter, '/'):] + + assert.Equal(t, commitBefore, commitAfter) + }) + + t.Run("Rebase needed", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + // Make user2/repo1 ahead of user1/repo1 + testEditFile(t, session, "user2", "repo1", "master", "README.md", "Hello, World (Edited 2x)\n") + + // To avoid conflicts, create a new file on /user/repo1. + session.MakeRequest(t, NewRequestWithValues(t, "POST", "/user1/repo1/_new/master", map[string]string{ + "_csrf": GetCSRF(t, session, "/user/settings"), + "commit_choice": "direct", + "tree_path": "test-file.md", + "content": "newly-added-test-file", + "commit_mail_id": "-1", + }), http.StatusSeeOther) + + resp := testPullCreate(t, session, "user1", "repo1", false, "master", "master", "This is another pull") + pullLink := test.RedirectURL(resp) + + resp = session.MakeRequest(t, NewRequest(t, "GET", test.RedirectURL(resp)+"/commits"), http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + commitLinkBefore, ok := htmlDoc.Find("a.sha").Attr("href") + assert.True(t, ok) + commitBefore := commitLinkBefore[strings.LastIndexByte(commitLinkBefore, '/'):] + + elem := strings.Split(pullLink, "/") + testPullMerge(t, session, elem[1], elem[2], elem[4], repo_model.MergeStyleRebase, false) + + resp = session.MakeRequest(t, NewRequest(t, "GET", "/user2/repo1"), http.StatusOK) + htmlDoc = NewHTMLParser(t, resp.Body) + commitLinkAfter, ok := htmlDoc.Find(".latest-commit a.sha").Attr("href") + assert.True(t, ok) + commitAfter := commitLinkAfter[strings.LastIndexByte(commitLinkAfter, '/'):] + + assert.NotEqual(t, commitBefore, commitAfter) + }) }) } From 87a7bf2436de7c14f782764fbea7cdc1d86af3c8 Mon Sep 17 00:00:00 2001 From: 0ko <0ko@noreply.codeberg.org> Date: Thu, 24 Jul 2025 07:17:11 +0200 Subject: [PATCH 211/495] fix(ui): update i18n usage in comments (#8644) Fix regression of https://codeberg.org/forgejo/forgejo/pulls/8214 (regressing v11 feature https://codeberg.org/forgejo/forgejo/pulls/6523) Reporeted by @Andre601. ## Preview ![bug](/attachments/0e0c4703-537f-4adc-95f7-4047710522b4) ![fixed](/attachments/07bc5824-87ae-43da-92a2-8e6e9b9cf567) ## Testing * go to https://v13.next.forgejo.org/, log in * create repo, add some issue labels (on `./labels`) * create issue * add some labels to it and then close it * observe that what you see looks more like the 2nd screenshot than the 1st screenshot ## Release notes - Bug fixes - [PR](https://codeberg.org/forgejo/forgejo/pulls/8644): fix(ui): update i18n usage in comments Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8644 Reviewed-by: Earl Warren Reviewed-by: Robert Wolff Co-authored-by: 0ko <0ko@noreply.codeberg.org> Co-committed-by: 0ko <0ko@noreply.codeberg.org> --- templates/repo/issue/view_content/comments.tmpl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl index 76b02f4755..3e833cbc5a 100644 --- a/templates/repo/issue/view_content/comments.tmpl +++ b/templates/repo/issue/view_content/comments.tmpl @@ -721,18 +721,18 @@
  • {{svg "octicon-dot-fill"}} {{if .Issue.IsPull}} - {{ctx.Locale.Tr "repo.pulls.reopened_at" "" ""}} + {{ctx.Locale.Tr "repo.pulls.reopened_at" ""}} {{else}} - {{ctx.Locale.Tr "repo.issues.reopened_at" "" ""}} + {{ctx.Locale.Tr "repo.issues.reopened_at" ""}} {{end}}
  • {{else if and (not .Aggregator.PrevClosed) .Aggregator.IsClosed}} {{svg "octicon-circle-slash"}}
  • {{if .Issue.IsPull}} - {{ctx.Locale.Tr "repo.pulls.closed_at" "" ""}} + {{ctx.Locale.Tr "repo.pulls.closed_at" ""}} {{else}} - {{ctx.Locale.Tr "repo.issues.closed_at" "" ""}} + {{ctx.Locale.Tr "repo.issues.closed_at" ""}} {{end}}
  • {{end}} From bfa9c89e6f1e8eef787d848a20c872820098f851 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Thu, 24 Jul 2025 17:19:24 +0200 Subject: [PATCH 212/495] Revert "feat: remove API authentication methods that uses the URL query (#7924)" (#8633) This reverts commit b2a3966e648fc72eddf1bbc9383b069b0c8d59e8. weblate etc. are using this method and need to be updated before the change is enforced. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8633 Reviewed-by: Michael Kriese Co-authored-by: Earl Warren Co-committed-by: Earl Warren --- modules/setting/security.go | 11 +++++++++++ routers/api/shared/middleware.go | 8 ++++++++ routers/api/v1/api.go | 12 ++++++++++++ services/auth/oauth2.go | 12 ++++++++++++ templates/swagger/v1_json.tmpl | 18 ++++++++++++++++++ tests/mysql.ini.tmpl | 1 + tests/pgsql.ini.tmpl | 1 + tests/sqlite.ini.tmpl | 1 + 8 files changed, 64 insertions(+) diff --git a/modules/setting/security.go b/modules/setting/security.go index c38d8dae79..f3480d1056 100644 --- a/modules/setting/security.go +++ b/modules/setting/security.go @@ -35,6 +35,7 @@ var ( PasswordHashAlgo string PasswordCheckPwn bool SuccessfulTokensCacheSize int + DisableQueryAuthToken bool CSRFCookieName = "_csrf" CSRFCookieHTTPOnly = true ) @@ -159,4 +160,14 @@ func loadSecurityFrom(rootCfg ConfigProvider) { PasswordComplexity = append(PasswordComplexity, name) } } + + sectionHasDisableQueryAuthToken := sec.HasKey("DISABLE_QUERY_AUTH_TOKEN") + + // TODO: default value should be true in future releases + DisableQueryAuthToken = sec.Key("DISABLE_QUERY_AUTH_TOKEN").MustBool(false) + + // warn if the setting is set to false explicitly + if sectionHasDisableQueryAuthToken && !DisableQueryAuthToken { + log.Warn("Enabling Query API Auth tokens is not recommended. DISABLE_QUERY_AUTH_TOKEN will default to true in gitea 1.23 and will be removed in gitea 1.24.") + } } diff --git a/routers/api/shared/middleware.go b/routers/api/shared/middleware.go index 7d537f1ef9..f56acbe1bf 100644 --- a/routers/api/shared/middleware.go +++ b/routers/api/shared/middleware.go @@ -30,6 +30,7 @@ func Middlewares() (stack []any) { return append(stack, context.APIContexter(), + checkDeprecatedAuthMethods, // Get user from session if logged in. apiAuth(buildAuthGroup()), verifyAuthWithOptions(&common.VerifyOptions{ @@ -126,6 +127,13 @@ func verifyAuthWithOptions(options *common.VerifyOptions) func(ctx *context.APIC } } +// check for and warn against deprecated authentication options +func checkDeprecatedAuthMethods(ctx *context.APIContext) { + if ctx.FormString("token") != "" || ctx.FormString("access_token") != "" { + ctx.Resp.Header().Set("Warning", "token and access_token API authentication is deprecated and will be removed in gitea 1.23. Please use AuthorizationHeaderToken instead. Existing queries will continue to work but without authorization.") + } +} + func securityHeaders() func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) { diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 3b66d02fba..6a51f33bd8 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -22,6 +22,8 @@ // // Security: // - BasicAuth : +// - Token : +// - AccessToken : // - AuthorizationHeaderToken : // - SudoParam : // - SudoHeader : @@ -30,6 +32,16 @@ // SecurityDefinitions: // BasicAuth: // type: basic +// Token: +// type: apiKey +// name: token +// in: query +// description: This authentication option is deprecated for removal in Forgejo v13.0.0. Please use AuthorizationHeaderToken instead. +// AccessToken: +// type: apiKey +// name: access_token +// in: query +// description: This authentication option is deprecated for removal in Forgejo v13.0.0. Please use AuthorizationHeaderToken instead. // AuthorizationHeaderToken: // type: apiKey // name: Authorization diff --git a/services/auth/oauth2.go b/services/auth/oauth2.go index 4fdd15d7ec..fa13c20a7f 100644 --- a/services/auth/oauth2.go +++ b/services/auth/oauth2.go @@ -122,6 +122,18 @@ func (o *OAuth2) Name() string { // representing whether the token exists or not func parseToken(req *http.Request) (string, bool) { _ = req.ParseForm() + if !setting.DisableQueryAuthToken { + // Check token. + if token := req.Form.Get("token"); token != "" { + return token, true + } + // Check access token. + if token := req.Form.Get("access_token"); token != "" { + return token, true + } + } else if req.Form.Get("token") != "" || req.Form.Get("access_token") != "" { + log.Warn("API token sent in query string but DISABLE_QUERY_AUTH_TOKEN=true") + } // check header token if auHead := req.Header.Get("Authorization"); auHead != "" { diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index bba6825b72..7cf3d4301f 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -30084,6 +30084,12 @@ } }, "securityDefinitions": { + "AccessToken": { + "description": "This authentication option is deprecated for removal in Forgejo v13.0.0. Please use AuthorizationHeaderToken instead.", + "type": "apiKey", + "name": "access_token", + "in": "query" + }, "AuthorizationHeaderToken": { "description": "API tokens must be prepended with \"token\" followed by a space.", "type": "apiKey", @@ -30110,12 +30116,24 @@ "type": "apiKey", "name": "X-FORGEJO-OTP", "in": "header" + }, + "Token": { + "description": "This authentication option is deprecated for removal in Forgejo v13.0.0. Please use AuthorizationHeaderToken instead.", + "type": "apiKey", + "name": "token", + "in": "query" } }, "security": [ { "BasicAuth": [] }, + { + "Token": [] + }, + { + "AccessToken": [] + }, { "AuthorizationHeaderToken": [] }, diff --git a/tests/mysql.ini.tmpl b/tests/mysql.ini.tmpl index f44aff7594..3315d85a3f 100644 --- a/tests/mysql.ini.tmpl +++ b/tests/mysql.ini.tmpl @@ -92,6 +92,7 @@ DISABLE_GIT_HOOKS = false INSTALL_LOCK = true SECRET_KEY = 9pCviYTWSb INTERNAL_TOKEN = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0OTU1NTE2MTh9.hhSVGOANkaKk3vfCd2jDOIww4pUk0xtg9JRde5UogyQ +DISABLE_QUERY_AUTH_TOKEN = true [lfs] PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mysql/data/lfs diff --git a/tests/pgsql.ini.tmpl b/tests/pgsql.ini.tmpl index 829fdc5b75..1e9b981800 100644 --- a/tests/pgsql.ini.tmpl +++ b/tests/pgsql.ini.tmpl @@ -97,6 +97,7 @@ DISABLE_GIT_HOOKS = false INSTALL_LOCK = true SECRET_KEY = 9pCviYTWSb INTERNAL_TOKEN = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0OTU1NTE2MTh9.hhSVGOANkaKk3vfCd2jDOIww4pUk0xtg9JRde5UogyQ +DISABLE_QUERY_AUTH_TOKEN = true [lfs] MINIO_BASE_PATH = lfs/ diff --git a/tests/sqlite.ini.tmpl b/tests/sqlite.ini.tmpl index d36388405b..df6cea44ca 100644 --- a/tests/sqlite.ini.tmpl +++ b/tests/sqlite.ini.tmpl @@ -94,6 +94,7 @@ DISABLE_GIT_HOOKS = false INSTALL_LOCK = true SECRET_KEY = 9pCviYTWSb INTERNAL_TOKEN = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0OTI3OTU5ODN9.OQkH5UmzID2XBdwQ9TAI6Jj2t1X-wElVTjbE7aoN4I8 +DISABLE_QUERY_AUTH_TOKEN = true [oauth2] JWT_SECRET = KZb_QLUd4fYVyxetjxC4eZkrBgWM2SndOOWDNtgUUko From f4894b0edd1fceb1fade57b58941ac583f021447 Mon Sep 17 00:00:00 2001 From: DebuggerAndrzej Date: Thu, 24 Jul 2025 22:40:27 +0200 Subject: [PATCH 213/495] feat: add sort parameter for users/search api endpoint (#8594) Introduces a new sort parameter to the `/users/search` API endpoint, similar to the one that already exists for the `/admin/users` endpoint. Resolves #8499 Co-authored-by: DebuggerAndrzej Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8594 Reviewed-by: Lucas Reviewed-by: Gusted Co-authored-by: DebuggerAndrzej Co-committed-by: DebuggerAndrzej --- routers/api/v1/admin/user.go | 22 +------- routers/api/v1/user/user.go | 6 +++ routers/api/v1/utils/db_search_order.go | 28 ++++++++++ templates/swagger/v1_json.tmpl | 14 +++++ tests/integration/api_user_search_test.go | 65 +++++++++++++++++++++++ 5 files changed, 114 insertions(+), 21 deletions(-) create mode 100644 routers/api/v1/utils/db_search_order.go diff --git a/routers/api/v1/admin/user.go b/routers/api/v1/admin/user.go index 8aa67b3b0a..de54f21d94 100644 --- a/routers/api/v1/admin/user.go +++ b/routers/api/v1/admin/user.go @@ -436,26 +436,6 @@ func SearchUsers(ctx *context.APIContext) { listOptions := utils.GetListOptions(ctx) - sort := ctx.FormString("sort") - var orderBy db.SearchOrderBy - - switch sort { - case "oldest": - orderBy = db.SearchOrderByOldest - case "newest": - orderBy = db.SearchOrderByNewest - case "alphabetically": - orderBy = db.SearchOrderByAlphabetically - case "reversealphabetically": - orderBy = db.SearchOrderByAlphabeticallyReverse - case "recentupdate": - orderBy = db.SearchOrderByRecentUpdated - case "leastupdate": - orderBy = db.SearchOrderByLeastUpdated - default: - orderBy = db.SearchOrderByAlphabetically - } - intSource, err := strconv.ParseInt(ctx.FormString("source_id"), 10, 64) var sourceID optional.Option[int64] if ctx.FormString("source_id") == "" || err != nil { @@ -469,7 +449,7 @@ func SearchUsers(ctx *context.APIContext) { Type: user_model.UserTypeIndividual, LoginName: ctx.FormTrim("login_name"), SourceID: sourceID, - OrderBy: orderBy, + OrderBy: utils.GetDbSearchOrder(ctx), ListOptions: listOptions, }) if err != nil { diff --git a/routers/api/v1/user/user.go b/routers/api/v1/user/user.go index 5bdd56c892..19f7440047 100644 --- a/routers/api/v1/user/user.go +++ b/routers/api/v1/user/user.go @@ -33,6 +33,11 @@ func Search(ctx *context.APIContext) { // description: ID of the user to search for // type: integer // format: int64 + // - name: sort + // in: query + // description: sort order of results + // type: string + // enum: [oldest, newest, alphabetically, reversealphabetically, recentupdate, leastupdate] // - name: page // in: query // description: page number of results to return (1-based) @@ -81,6 +86,7 @@ func Search(ctx *context.APIContext) { SearchByEmail: true, Visible: visible, ListOptions: listOptions, + OrderBy: utils.GetDbSearchOrder(ctx), }) if err != nil { ctx.JSON(http.StatusInternalServerError, map[string]any{ diff --git a/routers/api/v1/utils/db_search_order.go b/routers/api/v1/utils/db_search_order.go new file mode 100644 index 0000000000..f089ba5f16 --- /dev/null +++ b/routers/api/v1/utils/db_search_order.go @@ -0,0 +1,28 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package utils + +import ( + "forgejo.org/models/db" + "forgejo.org/services/context" +) + +func GetDbSearchOrder(ctx *context.APIContext) db.SearchOrderBy { + switch ctx.FormString("sort") { + case "oldest": + return db.SearchOrderByOldest + case "newest": + return db.SearchOrderByNewest + case "alphabetically": + return db.SearchOrderByAlphabetically + case "reversealphabetically": + return db.SearchOrderByAlphabeticallyReverse + case "recentupdate": + return db.SearchOrderByRecentUpdated + case "leastupdate": + return db.SearchOrderByLeastUpdated + default: + return db.SearchOrderByAlphabetically + } +} diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 7cf3d4301f..e03f5d57c1 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -20284,6 +20284,20 @@ "name": "uid", "in": "query" }, + { + "enum": [ + "oldest", + "newest", + "alphabetically", + "reversealphabetically", + "recentupdate", + "leastupdate" + ], + "type": "string", + "description": "sort order of results", + "name": "sort", + "in": "query" + }, { "type": "integer", "description": "page number of results to return (1-based)", diff --git a/tests/integration/api_user_search_test.go b/tests/integration/api_user_search_test.go index 6252c2ebde..0e8f7a123e 100644 --- a/tests/integration/api_user_search_test.go +++ b/tests/integration/api_user_search_test.go @@ -4,18 +4,25 @@ package integration import ( + "context" + "fmt" "net/http" + "strconv" "testing" + "time" auth_model "forgejo.org/models/auth" + "forgejo.org/models/db" "forgejo.org/models/unittest" user_model "forgejo.org/models/user" "forgejo.org/modules/setting" api "forgejo.org/modules/structs" "forgejo.org/modules/test" + "forgejo.org/modules/timeutil" "forgejo.org/tests" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) type SearchResults struct { @@ -179,3 +186,61 @@ func TestAPIUserSearchByEmail(t *testing.T) { assert.Len(t, results.Data, 1) assert.Equal(t, query, results.Data[0].Email) } + +func TestUsersSearchSorted(t *testing.T) { + defer tests.PrepareTestEnv(t)() + createTimestamp := time.Now().Unix() - 1000 + updateTimestamp := time.Now().Unix() - 500 + sess := db.GetEngine(context.Background()) + + for i := int64(1); i <= 10; i++ { + name := "sorttest" + strconv.Itoa(int(i)) + user := &user_model.User{ + Name: name, + LowerName: name, + LoginName: name, + Email: name + "@example.com", + Passwd: name + ".password", + Avatar: "xyz", + Type: user_model.UserTypeIndividual, + LoginType: auth_model.OAuth2, + CreatedUnix: timeutil.TimeStamp(createTimestamp - i), + UpdatedUnix: timeutil.TimeStamp(updateTimestamp - i), + } + _, err := sess.NoAutoTime().Insert(user) + require.NoError(t, err) + } + + session := loginUser(t, "user1") + token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadUser) + + testCases := []struct { + sortType string + expectedUsers []string + }{ + {"alphabetically", []string{"sorttest1", "sorttest10", "sorttest2", "sorttest3"}}, + {"reversealphabetically", []string{"sorttest9", "sorttest8", "sorttest7", "sorttest6"}}, + {"newest", []string{"sorttest1", "sorttest2", "sorttest3", "sorttest4"}}, + {"oldest", []string{"sorttest10", "sorttest9", "sorttest8", "sorttest7"}}, + {"recentupdate", []string{"sorttest1", "sorttest2", "sorttest3", "sorttest4"}}, + {"leastupdate", []string{"sorttest10", "sorttest9", "sorttest8", "sorttest7"}}, + } + + for _, testCase := range testCases { + req := NewRequest( + t, + "GET", + fmt.Sprintf("/api/v1/users/search?q=sorttest&sort=%s&limit=4", + testCase.sortType, + ), + ).AddTokenAuth(token) + resp := session.MakeRequest(t, req, http.StatusOK) + + var results SearchResults + DecodeJSON(t, resp, &results) + assert.Len(t, results.Data, 4) + for i, searchData := range results.Data { + assert.Equalf(t, testCase.expectedUsers[i], searchData.UserName, "Sort type: %s, index %d", testCase.sortType, i) + } + } +} From 38c83ae6e128a88b9f4b66df83fd2883e26a6cb7 Mon Sep 17 00:00:00 2001 From: Otto Richter Date: Fri, 25 Jul 2025 02:39:16 +0200 Subject: [PATCH 214/495] tests(e2e): Silence heading level warning (#8659) The problem surfaced in and after https://codeberg.org/forgejo/forgejo/pulls/8572, but the actual problem is the underlying mess of forms. A better fix would be https://codeberg.org/forgejo/forgejo/issues/8658, but I want to make playwright tests pass again. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8659 Reviewed-by: Gusted Co-authored-by: Otto Richter Co-committed-by: Otto Richter --- tests/e2e/shared/forms.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/e2e/shared/forms.ts b/tests/e2e/shared/forms.ts index adb5b6e3cb..862a243600 100644 --- a/tests/e2e/shared/forms.ts +++ b/tests/e2e/shared/forms.ts @@ -10,6 +10,9 @@ export async function validate_form({page}: {page: Page}, scope: 'form' | 'field // legacy dropdowns don't use semantic HTML yet, // avoid using these where possible '.ui.dropdown', + // for some reason we use h1 to h5 for form sections, + // and it usually makes no sense semantically + '.ui.top.attached.header', ]; await accessibilityCheck({page}, [scope], excludedElements, []); From 1b32d7a8748d4ead9c4c1c86c9302cb656518e0c Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 25 Jul 2025 06:36:01 +0200 Subject: [PATCH 215/495] Update module code.forgejo.org/forgejo/act to v1.33.0 (forgejo) (#8661) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [code.forgejo.org/forgejo/act](https://code.forgejo.org/forgejo/act) | `v1.32.0` -> `v1.33.0` | [![age](https://developer.mend.io/api/mc/badges/age/go/code.forgejo.org%2fforgejo%2fact/v1.33.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/go/code.forgejo.org%2fforgejo%2fact/v1.32.0/v1.33.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
    forgejo/act (code.forgejo.org/forgejo/act) ### [`v1.33.0`](https://code.forgejo.org/forgejo/act/compare/v1.32.0...v1.33.0) [Compare Source](https://code.forgejo.org/forgejo/act/compare/v1.32.0...v1.33.0)
    --- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8661 Reviewed-by: Earl Warren Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6007181a63..01a8be0c51 100644 --- a/go.mod +++ b/go.mod @@ -244,7 +244,7 @@ require ( replace github.com/hashicorp/go-version => github.com/6543/go-version v1.3.1 -replace github.com/nektos/act => code.forgejo.org/forgejo/act v1.32.0 +replace github.com/nektos/act => code.forgejo.org/forgejo/act v1.33.0 replace github.com/mholt/archiver/v3 => code.forgejo.org/forgejo/archiver/v3 v3.5.1 diff --git a/go.sum b/go.sum index 7725cfd6d0..0bef4abf37 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ code.forgejo.org/f3/gof3/v3 v3.11.0 h1:f/xToKwqTgxG6PYxvewywjDQyCcyHEEJ6sZqUitFs code.forgejo.org/f3/gof3/v3 v3.11.0/go.mod h1:4FaRUNSQGBiD1M0DuB0yNv+Z2wMtlOeckgygHSSq4KQ= code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251 h1:HTZl3CBk3ABNYtFI6TPLvJgGKFIhKT5CBk0sbOtkDKU= code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251/go.mod h1:PphB88CPbx601QrWPMZATeorACeVmQlyv3u+uUMbSaM= -code.forgejo.org/forgejo/act v1.32.0 h1:hns2WvrJs6qWCmvzoSllNGNzSvcDMcSvJvVtQj3FaQc= -code.forgejo.org/forgejo/act v1.32.0/go.mod h1:WkmxVBteC4zoyQGYp8ZFZY7Xb+jat+b7ChvqW6TxqF8= +code.forgejo.org/forgejo/act v1.33.0 h1:ayQTXkpk+Vj5/yQMNZagA0xpQgGVeSbcrPXcIS3K1kY= +code.forgejo.org/forgejo/act v1.33.0/go.mod h1:WkmxVBteC4zoyQGYp8ZFZY7Xb+jat+b7ChvqW6TxqF8= code.forgejo.org/forgejo/archiver/v3 v3.5.1 h1:UmmbA7D5550uf71SQjarmrn6yKwOGxtEjb3jaYYtmSE= code.forgejo.org/forgejo/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4= code.forgejo.org/forgejo/go-rpmutils v1.0.0 h1:RZGGeKt70p/WaIEL97pyT6uiiEIoN8/aLmS5Z6WmX0M= From f9c2c910d6a89f9a5af834288748e1849afc8c88 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 25 Jul 2025 06:36:59 +0200 Subject: [PATCH 216/495] Update module github.com/mattn/go-sqlite3 to v1.14.29 (forgejo) (#8660) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [github.com/mattn/go-sqlite3](https://github.com/mattn/go-sqlite3) | `v1.14.28` -> `v1.14.29` | [![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fmattn%2fgo-sqlite3/v1.14.29?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fmattn%2fgo-sqlite3/v1.14.28/v1.14.29?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
    mattn/go-sqlite3 (github.com/mattn/go-sqlite3) ### [`v1.14.29`](https://github.com/mattn/go-sqlite3/compare/v1.14.28...v1.14.29) [Compare Source](https://github.com/mattn/go-sqlite3/compare/v1.14.28...v1.14.29)
    --- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8660 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 01a8be0c51..9cf9183b8e 100644 --- a/go.mod +++ b/go.mod @@ -71,7 +71,7 @@ require ( github.com/lib/pq v1.10.9 github.com/markbates/goth v1.80.0 github.com/mattn/go-isatty v0.0.20 - github.com/mattn/go-sqlite3 v1.14.28 + github.com/mattn/go-sqlite3 v1.14.29 github.com/meilisearch/meilisearch-go v0.31.0 github.com/mholt/archiver/v3 v3.5.1 github.com/microcosm-cc/bluemonday v1.0.27 diff --git a/go.sum b/go.sum index 0bef4abf37..1367fc8d10 100644 --- a/go.sum +++ b/go.sum @@ -395,8 +395,8 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.14.28 h1:ThEiQrnbtumT+QMknw63Befp/ce/nUPgBPMlRFEum7A= -github.com/mattn/go-sqlite3 v1.14.28/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/mattn/go-sqlite3 v1.14.29 h1:1O6nRLJKvsi1H2Sj0Hzdfojwt8GiGKm+LOfLaBFaouQ= +github.com/mattn/go-sqlite3 v1.14.29/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/meilisearch/meilisearch-go v0.31.0 h1:yZRhY1qJqdH8h6GFZALGtkDLyj8f9v5aJpsNMyrUmnY= github.com/meilisearch/meilisearch-go v0.31.0/go.mod h1:aNtyuwurDg/ggxQIcKqWH6G9g2ptc8GyY7PLY4zMn/g= github.com/mholt/acmez/v3 v3.1.2 h1:auob8J/0FhmdClQicvJvuDavgd5ezwLBfKuYmynhYzc= From 61334f7982aff3e46e2bd9a4745ee932c068bcd6 Mon Sep 17 00:00:00 2001 From: forgejo-release-manager Date: Fri, 25 Jul 2025 11:05:03 +0200 Subject: [PATCH 217/495] chore(release-notes): Forgejo v12.0.1 [skip ci] (#8664) https://codeberg.org/forgejo/forgejo/milestone/22237 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8664 Reviewed-by: Beowulf Reviewed-by: Michael Kriese Co-authored-by: forgejo-release-manager Co-committed-by: forgejo-release-manager --- release-notes-published/12.0.1.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 release-notes-published/12.0.1.md diff --git a/release-notes-published/12.0.1.md b/release-notes-published/12.0.1.md new file mode 100644 index 0000000000..e3de6cae3a --- /dev/null +++ b/release-notes-published/12.0.1.md @@ -0,0 +1,24 @@ +Insecure authentication methods have been deprecated since 2023. They were [removed in v12.0.0](https://codeberg.org/forgejo/forgejo/pulls/7924) but they were [restored in v12.0.1](https://codeberg.org/forgejo/forgejo/pulls/8653). Certain OAuth2 clients and packages in the Forgejo ecosystem still rely on these methods and it was premature to remove them. + + + +## Release notes + +- User Interface bug fixes + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8575) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8576)): allow for tracked time to be removed again + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8565) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8574)): correct image source for quoted reply + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8553) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8555)): prevent render failure on faulty org settings post +- Bug fixes + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8633) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8653)): Revert "feat: remove API authentication methods that uses the URL query (#7924)" + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8644) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8646)): update i18n usage in comments + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8609) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8613)): upgrade fails or hang at migration[31]: Migrate maven package name concatenation + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8622) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8624)): rebase and fast forward merge breaks commit signatures + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8617) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8618)): make the action feed resilient to database inconsistencies + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8533) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8584)): make sure to use unaltered fields when saving a shadow copy for updated profiles or comments + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8596) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8610)): follow symlinks for local assets + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8550) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8552)): use correct ACME default +- Included for completeness but not user-facing (chores, etc.) + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8638) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8641)): Revert "fix(ci): pull stylus from github:stylus/stylus#0.57.0 (#8625)" + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8625) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8627)): fix(ci): pull stylus from github:stylus/stylus#0.57.0 + - [PR](https://codeberg.org/forgejo/forgejo/pulls/8611) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8616)): chore: disable E2E test for webkit + From d4e4a2a1e3d90c77ae88381c189ba89b8508a93f Mon Sep 17 00:00:00 2001 From: Gusted Date: Fri, 25 Jul 2025 11:55:15 +0200 Subject: [PATCH 218/495] chore: move template context (#8663) The template module now holds the **Template** context, this makes it possible for (render) function in the template module to access functions and share data between render functions. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8663 Reviewed-by: Earl Warren Reviewed-by: Lucas Co-authored-by: Gusted Co-committed-by: Gusted --- modules/templates/context.go | 23 ++++++++++++ modules/templates/context_test.go | 18 ++++++++++ modules/templates/util_render.go | 9 +++-- modules/templates/util_render_test.go | 13 ++++--- routers/common/errpage.go | 5 ++- services/context/context.go | 13 ++++--- services/context/context_template.go | 35 ------------------- templates/repo/issue/card.tmpl | 2 +- templates/repo/issue/filter_actions.tmpl | 2 +- templates/repo/issue/labels/label.tmpl | 2 +- templates/repo/issue/labels/label_list.tmpl | 4 +-- .../issue/labels/labels_selector_field.tmpl | 4 +-- .../repo/issue/view_content/comments.tmpl | 12 +++---- templates/shared/issuelist.tmpl | 2 +- templates/shared/label_filter.tmpl | 2 +- tests/integration/issue_test.go | 12 +++++++ 16 files changed, 88 insertions(+), 70 deletions(-) create mode 100644 modules/templates/context.go create mode 100644 modules/templates/context_test.go delete mode 100644 services/context/context_template.go diff --git a/modules/templates/context.go b/modules/templates/context.go new file mode 100644 index 0000000000..d2b896391b --- /dev/null +++ b/modules/templates/context.go @@ -0,0 +1,23 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package templates + +import ( + "context" + + "forgejo.org/modules/translation" +) + +type Context struct { + context.Context + Locale translation.Locale + AvatarUtils *AvatarUtils + Data map[string]any +} + +var _ context.Context = Context{} + +func NewContext(ctx context.Context) *Context { + return &Context{Context: ctx} +} diff --git a/modules/templates/context_test.go b/modules/templates/context_test.go new file mode 100644 index 0000000000..d854fbf0ff --- /dev/null +++ b/modules/templates/context_test.go @@ -0,0 +1,18 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later +package templates + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestContext(t *testing.T) { + type ctxKey struct{} + + // Test that the original context is used for its context functions. + ctx := NewContext(context.WithValue(t.Context(), ctxKey{}, "there")) + assert.Equal(t, "there", ctx.Value(ctxKey{})) +} diff --git a/modules/templates/util_render.go b/modules/templates/util_render.go index badff5f193..bec8d5f5e3 100644 --- a/modules/templates/util_render.go +++ b/modules/templates/util_render.go @@ -22,7 +22,6 @@ import ( "forgejo.org/modules/markup" "forgejo.org/modules/markup/markdown" "forgejo.org/modules/setting" - "forgejo.org/modules/translation" "forgejo.org/modules/util" ) @@ -145,7 +144,7 @@ func RenderRefIssueTitle(ctx context.Context, text string) template.HTML { // RenderLabel renders a label // locale is needed due to an import cycle with our context providing the `Tr` function -func RenderLabel(ctx context.Context, locale translation.Locale, label *issues_model.Label) template.HTML { +func RenderLabel(ctx *Context, label *issues_model.Label) template.HTML { var ( archivedCSSClass string textColor = util.ContrastColor(label.Color) @@ -156,7 +155,7 @@ func RenderLabel(ctx context.Context, locale translation.Locale, label *issues_m if label.IsArchived() { archivedCSSClass = "archived-label" - description = locale.TrString("repo.issues.archived_label_description", description) + description = ctx.Locale.TrString("repo.issues.archived_label_description", description) } if labelScope == "" { @@ -246,7 +245,7 @@ func RenderMarkdownToHtml(ctx context.Context, input string) template.HTML { //n return output } -func RenderLabels(ctx context.Context, locale translation.Locale, labels []*issues_model.Label, repoLink string, isPull bool) template.HTML { +func RenderLabels(ctx *Context, labels []*issues_model.Label, repoLink string, isPull bool) template.HTML { htmlCode := `` for _, label := range labels { // Protect against nil value in labels - shouldn't happen but would cause a panic if so @@ -259,7 +258,7 @@ func RenderLabels(ctx context.Context, locale translation.Locale, labels []*issu issuesOrPull = "pulls" } htmlCode += fmt.Sprintf("%s ", - repoLink, issuesOrPull, label.ID, RenderLabel(ctx, locale, label)) + repoLink, issuesOrPull, label.ID, RenderLabel(ctx, label)) } htmlCode += "" return template.HTML(htmlCode) diff --git a/modules/templates/util_render_test.go b/modules/templates/util_render_test.go index 8d58d7d2d4..3cfd572491 100644 --- a/modules/templates/util_render_test.go +++ b/modules/templates/util_render_test.go @@ -223,23 +223,26 @@ func TestRenderLabels(t *testing.T) { labelMalicious := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 11}) labelArchived := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: 12}) - rendered := RenderLabels(db.DefaultContext, tr, []*issues_model.Label{label}, "user2/repo1", false) + ctx := NewContext(t.Context()) + ctx.Locale = tr + + rendered := RenderLabels(ctx, []*issues_model.Label{label}, "user2/repo1", false) assert.Contains(t, rendered, "user2/repo1/issues?labels=1") assert.Contains(t, rendered, ">label1<") assert.Contains(t, rendered, "title='First label'") - rendered = RenderLabels(db.DefaultContext, tr, []*issues_model.Label{label}, "user2/repo1", true) + rendered = RenderLabels(ctx, []*issues_model.Label{label}, "user2/repo1", true) assert.Contains(t, rendered, "user2/repo1/pulls?labels=1") assert.Contains(t, rendered, ">label1<") - rendered = RenderLabels(db.DefaultContext, tr, []*issues_model.Label{labelScoped}, "user2/repo1", false) + rendered = RenderLabels(ctx, []*issues_model.Label{labelScoped}, "user2/repo1", false) assert.Contains(t, rendered, "user2/repo1/issues?labels=7") assert.Contains(t, rendered, ">scope<") assert.Contains(t, rendered, ">label1<") - rendered = RenderLabels(db.DefaultContext, tr, []*issues_model.Label{labelMalicious}, "user2/repo1", false) + rendered = RenderLabels(ctx, []*issues_model.Label{labelMalicious}, "user2/repo1", false) assert.Contains(t, rendered, "user2/repo1/issues?labels=11") assert.Contains(t, rendered, "> <script>malicious</script> <") assert.Contains(t, rendered, ">'?&<") assert.Contains(t, rendered, "title='Malicious label ' <script>malicious</script>'") - rendered = RenderLabels(db.DefaultContext, tr, []*issues_model.Label{labelArchived}, "user2/repo1", false) + rendered = RenderLabels(ctx, []*issues_model.Label{labelArchived}, "user2/repo1", false) assert.Contains(t, rendered, "user2/repo1/issues?labels=12") assert.Contains(t, rendered, ">archived label<><") assert.Contains(t, rendered, "title='repo.issues.archived_label_description'") diff --git a/routers/common/errpage.go b/routers/common/errpage.go index 907c278ab1..4dc5a58858 100644 --- a/routers/common/errpage.go +++ b/routers/common/errpage.go @@ -15,7 +15,6 @@ import ( "forgejo.org/modules/templates" "forgejo.org/modules/web/middleware" "forgejo.org/modules/web/routing" - "forgejo.org/services/context" ) const tplStatus500 base.TplName = "status/500" @@ -36,8 +35,8 @@ func RenderPanicErrorPage(w http.ResponseWriter, req *http.Request, err any) { httpcache.SetCacheControlInHeader(w.Header(), 0, "no-transform") w.Header().Set(`X-Frame-Options`, setting.CORSConfig.XFrameOptions) - tmplCtx := context.TemplateContext{} - tmplCtx["Locale"] = middleware.Locale(w, req) + tmplCtx := templates.NewContext(req.Context()) + tmplCtx.Locale = middleware.Locale(w, req) ctxData := middleware.GetContextData(req.Context()) // This recovery handler could be called without Gitea's web context, so we shouldn't touch that context too much. diff --git a/services/context/context.go b/services/context/context.go index 1a839773a8..68074964c8 100644 --- a/services/context/context.go +++ b/services/context/context.go @@ -41,7 +41,7 @@ type Render interface { type Context struct { *Base - TemplateContext TemplateContext + TemplateContext *templates.Context Render Render PageData map[string]any // data used by JavaScript modules in one page, it's `window.config.pageData` @@ -64,8 +64,6 @@ type Context struct { Package *Package } -type TemplateContext map[string]any - func init() { web.RegisterResponseStatusProvider[*Context](func(req *http.Request) web_types.ResponseStatusProvider { return req.Context().Value(WebContextKey).(*Context) @@ -98,10 +96,11 @@ func GetValidateContext(req *http.Request) (ctx *ValidateContext) { return ctx } -func NewTemplateContextForWeb(ctx *Context) TemplateContext { - tmplCtx := NewTemplateContext(ctx) - tmplCtx["Locale"] = ctx.Locale - tmplCtx["AvatarUtils"] = templates.NewAvatarUtils(ctx) +func NewTemplateContextForWeb(ctx *Context) *templates.Context { + tmplCtx := templates.NewContext(ctx) + tmplCtx.Locale = ctx.Locale + tmplCtx.AvatarUtils = templates.NewAvatarUtils(ctx) + tmplCtx.Data = ctx.Data return tmplCtx } diff --git a/services/context/context_template.go b/services/context/context_template.go deleted file mode 100644 index 7878d409ca..0000000000 --- a/services/context/context_template.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2023 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package context - -import ( - "context" - "time" -) - -var _ context.Context = TemplateContext(nil) - -func NewTemplateContext(ctx context.Context) TemplateContext { - return TemplateContext{"_ctx": ctx} -} - -func (c TemplateContext) parentContext() context.Context { - return c["_ctx"].(context.Context) -} - -func (c TemplateContext) Deadline() (deadline time.Time, ok bool) { - return c.parentContext().Deadline() -} - -func (c TemplateContext) Done() <-chan struct{} { - return c.parentContext().Done() -} - -func (c TemplateContext) Err() error { - return c.parentContext().Err() -} - -func (c TemplateContext) Value(key any) any { - return c.parentContext().Value(key) -} diff --git a/templates/repo/issue/card.tmpl b/templates/repo/issue/card.tmpl index 6d2f441793..ba6022ae3a 100644 --- a/templates/repo/issue/card.tmpl +++ b/templates/repo/issue/card.tmpl @@ -65,7 +65,7 @@
    diff --git a/templates/repo/issue/filter_actions.tmpl b/templates/repo/issue/filter_actions.tmpl index 60237f225d..ea7878c47b 100644 --- a/templates/repo/issue/filter_actions.tmpl +++ b/templates/repo/issue/filter_actions.tmpl @@ -30,7 +30,7 @@ {{end}} {{$previousExclusiveScope = $exclusiveScope}}
    - {{if SliceUtils.Contains $.SelLabelIDs .ID}}{{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}{{end}} {{RenderLabel $.Context ctx.Locale .}} + {{if SliceUtils.Contains $.SelLabelIDs .ID}}{{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}{{end}} {{RenderLabel ctx .}} {{template "repo/issue/labels/label_archived" .}}
    {{end}} diff --git a/templates/repo/issue/labels/label.tmpl b/templates/repo/issue/labels/label.tmpl index 7844362911..fe4c7494bb 100644 --- a/templates/repo/issue/labels/label.tmpl +++ b/templates/repo/issue/labels/label.tmpl @@ -4,5 +4,5 @@ href="{{.root.RepoLink}}/{{if or .root.IsPull .root.Issue.IsPull}}pulls{{else}}issues{{end}}?labels={{.label.ID}}"{{/* FIXME: use .root.Issue.Link or create .root.Link */}} rel="nofollow" > - {{- RenderLabel $.Context ctx.Locale .label -}} + {{- RenderLabel ctx .label -}} diff --git a/templates/repo/issue/labels/label_list.tmpl b/templates/repo/issue/labels/label_list.tmpl index 8d7fc2c3db..0a7262bdd8 100644 --- a/templates/repo/issue/labels/label_list.tmpl +++ b/templates/repo/issue/labels/label_list.tmpl @@ -32,7 +32,7 @@ {{range .Labels}}
  • - {{RenderLabel $.Context ctx.Locale .}} + {{RenderLabel ctx .}} {{if .Description}}
    {{.Description | RenderEmoji $.Context}}{{end}}
    @@ -72,7 +72,7 @@ {{range .OrgLabels}}
  • - {{RenderLabel $.Context ctx.Locale .}} + {{RenderLabel ctx .}} {{if .Description}}
    {{.Description | RenderEmoji $.Context}}{{end}}
    diff --git a/templates/repo/issue/labels/labels_selector_field.tmpl b/templates/repo/issue/labels/labels_selector_field.tmpl index 9e54e7a649..8a931a9433 100644 --- a/templates/repo/issue/labels/labels_selector_field.tmpl +++ b/templates/repo/issue/labels/labels_selector_field.tmpl @@ -21,7 +21,7 @@
    {{end}} {{$previousExclusiveScope = $exclusiveScope}} - {{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}  {{RenderLabel $.Context ctx.Locale .}} + {{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}  {{RenderLabel ctx .}} {{if .Description}}
    {{.Description | RenderEmoji $.Context}}{{end}}

    {{template "repo/issue/labels/label_archived" .}}

    @@ -34,7 +34,7 @@
    {{end}} {{$previousExclusiveScope = $exclusiveScope}} - {{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}  {{RenderLabel $.Context ctx.Locale .}} + {{if $exclusiveScope}}{{svg "octicon-dot-fill"}}{{else}}{{svg "octicon-check"}}{{end}}  {{RenderLabel ctx .}} {{if .Description}}
    {{.Description | RenderEmoji $.Context}}{{end}}

    {{template "repo/issue/labels/label_archived" .}}

    diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl index 3e833cbc5a..454467a4d0 100644 --- a/templates/repo/issue/view_content/comments.tmpl +++ b/templates/repo/issue/view_content/comments.tmpl @@ -176,11 +176,11 @@ {{template "shared/user/authorlink" .Poster}} {{if and .AddedLabels (not .RemovedLabels)}} - {{ctx.Locale.TrN (len .AddedLabels) "repo.issues.add_label" "repo.issues.add_labels" (RenderLabels $.Context ctx.Locale .AddedLabels $.RepoLink .Issue.IsPull) $createdStr}} + {{ctx.Locale.TrN (len .AddedLabels) "repo.issues.add_label" "repo.issues.add_labels" (RenderLabels ctx .AddedLabels $.RepoLink .Issue.IsPull) $createdStr}} {{else if and (not .AddedLabels) .RemovedLabels}} - {{ctx.Locale.TrN (len .RemovedLabels) "repo.issues.remove_label" "repo.issues.remove_labels" (RenderLabels $.Context ctx.Locale .RemovedLabels $.RepoLink .Issue.IsPull) $createdStr}} + {{ctx.Locale.TrN (len .RemovedLabels) "repo.issues.remove_label" "repo.issues.remove_labels" (RenderLabels ctx .RemovedLabels $.RepoLink .Issue.IsPull) $createdStr}} {{else}} - {{ctx.Locale.Tr "repo.issues.add_remove_labels" (RenderLabels $.Context ctx.Locale .AddedLabels $.RepoLink .Issue.IsPull) (RenderLabels $.Context ctx.Locale .RemovedLabels $.RepoLink .Issue.IsPull) $createdStr}} + {{ctx.Locale.Tr "repo.issues.add_remove_labels" (RenderLabels ctx .AddedLabels $.RepoLink .Issue.IsPull) (RenderLabels ctx .RemovedLabels $.RepoLink .Issue.IsPull) $createdStr}} {{end}}
    @@ -742,11 +742,11 @@
  • {{svg "octicon-tag" 20}} {{if and .AddedLabels (not .RemovedLabels)}} - {{ctx.Locale.TrN (len .AddedLabels) "repo.issues.add_label" "repo.issues.add_labels" (RenderLabels $.Context ctx.Locale .AddedLabels $.RepoLink .Issue.IsPull) ""}} + {{ctx.Locale.TrN (len .AddedLabels) "repo.issues.add_label" "repo.issues.add_labels" (RenderLabels ctx .AddedLabels $.RepoLink .Issue.IsPull) ""}} {{else if and (not .AddedLabels) .RemovedLabels}} - {{ctx.Locale.TrN (len .RemovedLabels) "repo.issues.remove_label" "repo.issues.remove_labels" (RenderLabels $.Context ctx.Locale .RemovedLabels $.RepoLink .Issue.IsPull) ""}} + {{ctx.Locale.TrN (len .RemovedLabels) "repo.issues.remove_label" "repo.issues.remove_labels" (RenderLabels ctx .RemovedLabels $.RepoLink .Issue.IsPull) ""}} {{else}} - {{ctx.Locale.Tr "repo.issues.add_remove_labels" (RenderLabels $.Context ctx.Locale .AddedLabels $.RepoLink .Issue.IsPull) (RenderLabels $.Context ctx.Locale .RemovedLabels $.RepoLink .Issue.IsPull) ""}} + {{ctx.Locale.Tr "repo.issues.add_remove_labels" (RenderLabels ctx .AddedLabels $.RepoLink .Issue.IsPull) (RenderLabels ctx .RemovedLabels $.RepoLink .Issue.IsPull) ""}} {{end}}
  • {{end}} diff --git a/templates/shared/issuelist.tmpl b/templates/shared/issuelist.tmpl index 6c0950caff..256b5e3e07 100644 --- a/templates/shared/issuelist.tmpl +++ b/templates/shared/issuelist.tmpl @@ -21,7 +21,7 @@ {{end}} {{range .Labels}} - {{RenderLabel $.Context ctx.Locale .}} + {{RenderLabel ctx .}} {{end}}
    diff --git a/templates/shared/label_filter.tmpl b/templates/shared/label_filter.tmpl index 50040c208d..0c8d537cc7 100644 --- a/templates/shared/label_filter.tmpl +++ b/templates/shared/label_filter.tmpl @@ -42,7 +42,7 @@ {{svg "octicon-check"}} {{end}} {{end}} - {{RenderLabel $.Context ctx.Locale .}} + {{RenderLabel ctx .}}

    {{template "repo/issue/labels/label_archived" .}}

    {{end}} diff --git a/tests/integration/issue_test.go b/tests/integration/issue_test.go index 72fe2a4e49..f75c345e63 100644 --- a/tests/integration/issue_test.go +++ b/tests/integration/issue_test.go @@ -1524,3 +1524,15 @@ func TestIssuePostersSearch(t *testing.T) { assert.EqualValues(t, 1, data.Results[0].UserID) }) } + +func TestIssueTimelineLabels(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + req := NewRequest(t, "GET", "/user2/repo1/issues/1") + resp := MakeRequest(t, req, http.StatusOK) + assert.NotContains(t, resp.Body.String(), `status-page-500`) + + htmlDoc := NewHTMLParser(t, resp.Body) + filterLinks := htmlDoc.Find(".timeline .labels-list a") + assert.Equal(t, 9, filterLinks.Length()) +} From 57148eb1e89942821c27925e5c1da2ee1f7c4dc4 Mon Sep 17 00:00:00 2001 From: Michael Kriese Date: Fri, 25 Jul 2025 12:24:26 +0200 Subject: [PATCH 219/495] fix: query token auth version mismatch (#8666) It's now scheduled for Forgejo v13 see #8633 for more context I used Github Copilot for some auto completion of code. ## Checklist The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org). ### Tests - I added test coverage for Go changes... - [ ] in their respective `*_test.go` for unit tests. - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server. - I added test coverage for JavaScript changes... - [ ] in `web_src/js/*.test.js` if it can be unit tested. - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)). ### Documentation - [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [x] I do not want this change to show in the release notes. - [ ] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/.md` to be be used for the release notes instead of the title. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8666 Reviewed-by: Earl Warren Co-authored-by: Michael Kriese Co-committed-by: Michael Kriese --- modules/setting/security.go | 2 +- routers/api/shared/middleware.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/setting/security.go b/modules/setting/security.go index f3480d1056..1f38857af6 100644 --- a/modules/setting/security.go +++ b/modules/setting/security.go @@ -168,6 +168,6 @@ func loadSecurityFrom(rootCfg ConfigProvider) { // warn if the setting is set to false explicitly if sectionHasDisableQueryAuthToken && !DisableQueryAuthToken { - log.Warn("Enabling Query API Auth tokens is not recommended. DISABLE_QUERY_AUTH_TOKEN will default to true in gitea 1.23 and will be removed in gitea 1.24.") + log.Warn("Enabling Query API Auth tokens is not recommended. DISABLE_QUERY_AUTH_TOKEN will be removed in Forgejo v13.0.0.") } } diff --git a/routers/api/shared/middleware.go b/routers/api/shared/middleware.go index f56acbe1bf..b57fabac0e 100644 --- a/routers/api/shared/middleware.go +++ b/routers/api/shared/middleware.go @@ -130,7 +130,7 @@ func verifyAuthWithOptions(options *common.VerifyOptions) func(ctx *context.APIC // check for and warn against deprecated authentication options func checkDeprecatedAuthMethods(ctx *context.APIContext) { if ctx.FormString("token") != "" || ctx.FormString("access_token") != "" { - ctx.Resp.Header().Set("Warning", "token and access_token API authentication is deprecated and will be removed in gitea 1.23. Please use AuthorizationHeaderToken instead. Existing queries will continue to work but without authorization.") + ctx.Resp.Header().Set("Warning", "token and access_token API authentication is deprecated and will be removed in Forgejo v13.0.0. Please use AuthorizationHeaderToken instead. Existing queries will continue to work but without authorization.") } } From e8acd8afd3a06726ad5c29a33d5d6ef7ae6b2dab Mon Sep 17 00:00:00 2001 From: Codeberg Translate Date: Fri, 25 Jul 2025 14:11:36 +0000 Subject: [PATCH 220/495] i18n: update of translations from Codeberg Translate Co-authored-by: 0ko <0ko@noreply.codeberg.org> Co-authored-by: Benedikt Straub Co-authored-by: Codeberg Translate Co-authored-by: Edgarsons Co-authored-by: Fjuro Co-authored-by: Juno Takano Co-authored-by: Lzebulon Co-authored-by: SomeTr Co-authored-by: Vyxie Co-authored-by: Wuzzy Co-authored-by: Zalexanninev15 Co-authored-by: adf19 Co-authored-by: darkswordreams Co-authored-by: earl-warren Co-authored-by: justbispo Co-authored-by: oatbiscuits Co-authored-by: xtex Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/ar/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/cs/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/de/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/fil/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/fr/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/hi/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/lv/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/nds/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/pt_BR/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/pt_PT/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/ru/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/uk/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/zh_Hans/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/ar/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/cs/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/de/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/fil/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/fr/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/lv/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/nds/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/pt_BR/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/ru/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/uk/ Translation: Forgejo/forgejo Translation: Forgejo/forgejo-next --- options/locale/locale_ar.ini | 352 +++++++++++++++++++++++--- options/locale/locale_cs-CZ.ini | 20 +- options/locale/locale_de-DE.ini | 10 +- options/locale/locale_fil.ini | 12 +- options/locale/locale_fr-FR.ini | 2 +- options/locale/locale_lv-LV.ini | 4 +- options/locale/locale_nds.ini | 10 +- options/locale/locale_pt-BR.ini | 12 +- options/locale/locale_ru-RU.ini | 10 +- options/locale/locale_uk-UA.ini | 99 ++++++-- options/locale_next/locale_ar.json | 6 +- options/locale_next/locale_cs-CZ.json | 45 ++-- options/locale_next/locale_de-DE.json | 9 +- options/locale_next/locale_fil.json | 9 +- options/locale_next/locale_fr-FR.json | 3 +- options/locale_next/locale_hi.json | 82 +++++- options/locale_next/locale_lv-LV.json | 9 +- options/locale_next/locale_nds.json | 9 +- options/locale_next/locale_pt-BR.json | 9 +- options/locale_next/locale_pt-PT.json | 3 +- options/locale_next/locale_ru-RU.json | 3 +- options/locale_next/locale_uk-UA.json | 8 +- options/locale_next/locale_zh-CN.json | 3 +- 23 files changed, 587 insertions(+), 142 deletions(-) diff --git a/options/locale/locale_ar.ini b/options/locale/locale_ar.ini index 638c2dc6ce..0b81b9cc03 100644 --- a/options/locale/locale_ar.ini +++ b/options/locale/locale_ar.ini @@ -309,31 +309,31 @@ blocked_since = محظور منذ %s comment_type_group_milestone = الأهداف ui = السمة email_notifications.disable = عطّل إشعارات البريد الإلكتروني -passcode_invalid = رمز الدخول خطأ. حاول مرة أخرى. +passcode_invalid = رمز الدخول خطأ. حاول مجدداً. openid_deletion = أزل عنوان OpenID activate_email = أرسل التفعيل uploaded_avatar_not_a_image = الملف المرفوع ليس صورة. theme_update_error = السمة المختارة غير موجودة. -twofa_disabled = عُطِّل الاستيثاق الثنائي. +twofa_disabled = تم تعطيل المصادقة الثنائية. theme_desc = ستكون هذه السمة المبدئية لك عبر الموقع. new_password = كلمة المرور الجديدة -twofa_disable_desc = تعطيل الاستيثاق الثنائي سيجعل حسابك أقل أمانًا. أتريد الاستمرار؟ +twofa_disable_desc = تعطيل المصادقة الثنائية سيجعل حسابك أقل أماناً. الاستمرار؟ manage_themes = الموضوع الافتراضي -delete_prompt = هذه العملية ستحذف حسابك إلى الأبد. لا يمكن التراجع عنها بعد ذلك. -cancel = ألغ -repos_none = ليس لديك أي مستودع. +delete_prompt = هذه العملية ستحذف حسابك إلى الأبد. لا يمكن التراجع عن ذلك. +cancel = إلغاء +repos_none = لا تملك أية مستودع. twofa_desc = لحماية حسابك من سرقة كلمة المرور، يمكنك استخدام هاتف ذكي أو جهاز آخر لاستلام كلمة مرور مؤقتة ذات استخدام واحد ("TOTP"). -email_notifications.submit = اضبط تفضيلات البريد الإلكتروني +email_notifications.submit = ضبط تفضيلات البريد الإلكتروني update_user_avatar_success = حُدِّثت صورة المستخدم الرمزية. activations_pending = في انتظار التفعيل -language = اللغة +language = اللّغة primary = الأساسي update_avatar_success = حُدِّثت صورتك الرمزية. keep_email_private = أخفِ عنوان البريد delete_current_avatar = احذف الصورة الرمزية الحالية avatar = صورة رمزية email_preference_set_success = حُدِّثت تفضيلات البريد الإلكتروني. -scan_this_image = امسح هذه الصورة بتطبيق الاستيثاق الذي تستخدمه: +scan_this_image = امسح هذه الصورة بتطبيق المصادقة الذي تستخدمه: orgs_none = لست عضوًا في أي منظمة. delete_email = أزله theme_update_success = حُدِّثت السمة. @@ -360,14 +360,14 @@ openid_deletion_success = أزيل عنوان OpenID. add_email_success = أضيف عنوان البريد الجديد. enable_custom_avatar = استخدم صورة رمزية مخصصة update_avatar = حدّث الصورة الرمزية -twofa_disable = تعطيل الاستيثاق الثنائي +twofa_disable = تعطيل المصادقة الثنائية retype_new_password = تأكيد كلمة المرور الجديدة manage_emails = أدر عناوين البريد الإلكتروني then_enter_passcode = وأدخل رمز الدخول الظاهر في التطبيق: update_password = حدّث كلمة المرور continue = استمر emails = عناوين البريد الإلكتروني -confirm_delete_account = أكُد الحذف +confirm_delete_account = تأكيد الحذف change_password_success = حُدِّثت كلمة مرورك. سجّل الدخول بكلمة مرورك الجديدة من الآن فصاعدا. email_deletion_desc = سيُزال عنوان البريد هذا مع كل المعلومات المرتطبة به من حسابك. لكن ستبقى إيداعات Git المودعة به بلا تغيير. أتريد الاستمرار؟ or_enter_secret = أو أدخل السر: %s @@ -386,14 +386,14 @@ saved_successfully = حُدِّثت إعداداتك بنجاح. update_theme = حدِّث السمة access_token_deletion_confirm_action = احذف website = الموقع الإلكتروني -delete_token = احذف +delete_token = حذف hidden_comment_types.ref_tooltip = التعليقات التي تقول أن هذه المسألة قد أشير إليها في مسألة أخرى أو إيداع أو غير ذلك… update_language_success = تم تحديث اللغة. privacy = الخصوصية comment_type_group_label = التصنيفات account_link = الحسابات المرتبطة comment_type_group_assignee = المكلفون -update_language = حدِّث اللغة +update_language = تغيير اللغة organization = المنظمات update_language_not_found = اللغة "%s" غير متاحة. update_profile_success = تم تحديث ملفك الشخصي. @@ -421,7 +421,7 @@ can_write_info = كتابة delete = احذف الحساب oauth2_application_name = اسم التطبيق key_state_desc = هذا المفتاح أستُعمل خلال آخر 7 أيام -webauthn_delete_key = أزِل مفتاح الأمان +webauthn_delete_key = إزالة مفتاح الأمان valid_forever = صالح للأبد can_read_info = قراءة create_oauth2_application_button = أنشئ تطبيقا @@ -433,14 +433,14 @@ select_permissions = أختر التصاريح added_on = مُضاف في %s show_openid = أظهر على الملف الشخصي hide_openid = أخفي من الملف الشخصي -webauthn_delete_key_desc = إذا أزلت مفتاح الأمان، فلن تتمكن من تسجيل الدخول باستخدامه. اكمل؟ +webauthn_delete_key_desc = إذا أزلت مفتاح الأمان، فلن تتمكن من تسجيل الدخول باستخدامه. المتابعة؟ permissions_list = التصاريح: webauthn_key_loss_warning = إذا فقدت مفاتيح الأمان الخاصة بك، فسوف تفقد الوصول إلى حسابك. -hooks.desc = أضف خطاطيف ويب تُطلق لكل مستودعاتك. +hooks.desc = إضافة خطاطيف ويب سيتم تشغيلها لـ جميع المستودعات التي تمتلكها. keep_activity_private_popup = يجعل النشاط مرأياً لك وللمديرين فقط keep_email_private_popup = سيؤدي هذا إلى إخفاء عنوان بريدك الإلكتروني من ملفك الشخصي، وكذلك عند تقديم طلب سحب أو تحرير ملف باستخدام واجهة الويب. لن يتم تعديل الالتزامات المدفوعة. استخدم %s في الإيداعات لربطها بحسابك. ssh_key_name_used = هناك مفتاح SSH بنفس الاسم موجود بالفعل على حسابك. -authorized_oauth2_applications = تطبيقات OAuth2 المأذونة +authorized_oauth2_applications = تطبيقات OAuth2 المأذون لها uid = المعرّف الرمزي manage_openid = عناوين OpenID webauthn = استيثاق ثنائي (مفاتيح الأمان) @@ -465,11 +465,11 @@ key_content_gpg_placeholder = يبدأ بـ '-----BEGIN PGP PUBLIC KEY BLOCK---- add_email_confirmation_sent = بريد تفعيل جديد تم إرساله إلى "%s". يُرجى التحقق من البريد الوارد خلال %s لتأكيد عنوان البريد الإلكتروني. ssh_desc = مفاتيح SSH العمومية هذه مرتبطة بحسابك. وتسمح المفاتيح الخصوصية المرافقة بالوصول الكامل إلى مستودعاتك. ويمكن استعمال مفاتيح SSH الموثَّقة لتوثيق إيداعات جت الموقَّعة بمفاتيح SSH. ssh_gpg_keys = مفاتيح SSH / GPG -authorized_oauth2_applications_description = لقد منحتَ إمكانية الوصول إلى حسابك الشخصي على فورجيو لهذه التطبيقات من تطبيقات خارجية. الرجاء إلغاء وصول التطبيقات التي لم تعد بحاجة إليها. +authorized_oauth2_applications_description = لقد منحت حق الوصول إلى حسابك الشخصي في Forgejo لهذه التطبيقات الخارجية. يرجى إلغاء الوصول للتطبيقات التي لم تعد قيد الاستخدام. ssh_key_been_used = هذا المفتاح الـSSH تم إضافته بالفعل إلى هذا الخادم. password_change_disabled = المستخدمين غير المحليين لا يمكنهم تغيير كلمة مرورهم عن طريق واجهة ويب فورجيو. token_state_desc = هذا الرمز استخدم خلال آخر 7 أيام -delete_key = أزله +delete_key = إزالة ssh_invalid_token_signature = مفتاح SSH المزود، والتوقيع والرمز لا يتطابقوا أو الرمز قديم. ssh_token_help = يمكنك توليد توقيع باستخدام: gpg_key_verify = تحقق @@ -483,10 +483,10 @@ unbind = الغ الربط verify_ssh_key_success = تم التحقق من مفتاح SSH "%s". gpg_token_required = يجب أن تقدم توقيعاً للرمز التالي ssh_key_verified_long = تم التحقق من المفتاح مع رمز ويمكن استخدامه للتحقق من الإيداعات المتطابقة مع أي عناوين البريد المفعلة لهذا المستخدم. -gpg_key_deletion = أزل مفتاح GPG +gpg_key_deletion = إزالة مفتاح GPG gpg_token_help = يمكنك توليد توقيع باستخدام: -ssh_key_deletion = أزل مفتاح SSH -ssh_token = رمز +ssh_key_deletion = إزالة مفتاح SSH +ssh_token = رمز فريد ssh_disabled = SSH مُعطل gpg_key_verified_long = تم التحقق من المفتاح بواسطة رمز ويمكن استخدامه للتحقق من إيداعات متطابقة لعناوين البريد المفعلة لهذا المستخدم بالإضافة إلى أي هويات متطابقة لهذا المفتاح. change_username_redirect_prompt = اسم المستخدم القديم سوف يعاد توجيهه حتى يطالب به شخص آخر. @@ -494,7 +494,7 @@ add_key_success = تم إضافة مفتاح SSH "%s". key_name = اسم المفتاح comment_type_group_time_tracking = تتبع الوقت gpg_invalid_token_signature = مفتاح GPG المزود، والتوقيع والرمز لا يتطابقوا أو الرمز قديم. -ssh_key_verified = مفتاح مُتحقق منه +ssh_key_verified = مفتاح تم التحقق منه ssh_key_deletion_success = تم إزالة مفتاح SSH. key_signature_ssh_placeholder = يبدأ بـ'-----BEGIN SSH SIGNATURE-----' gpg_token_code = echo "%s" | gpg -a --default-key %s --detach-sig @@ -508,7 +508,7 @@ gpg_key_deletion_desc = إزالة مفتاح GPG يُلغي تحقق الإيد permission_read = القراءة ssh_token_signature = توقيع SSH مصفح ssh_key_deletion_desc = إزالة مفتاح SSH يلغي وصوله إلى حسابك. أكمل؟ -revoke_key = أسحب +revoke_key = سحب gpg_token = رمز gpg_key_matched_identities_long = الهويات المدمجة في هذا المفتاح تطابق عناوين البريد الإلكتروني المفعلة التالية لهذا المستخدم. ويمكن التحقق من صحة الإيداعات المطابقة لهذه العناوين البريدية مع هذا المفتاح. key_content = المحتوى @@ -522,8 +522,120 @@ remove_oauth2_application_success = أُزيل التطبيق. update_oauth2_application_success = لقد حدّثت بنجاح تطبيق OAuth2. oauth2_redirect_uris = روابط إعادة التوجيه. نرجو وضع كل رابط في سطر وحده. remove_account_link = أزل الحساب المربوط -remove_account_link_success = أُزيل الحساب المربوط. +remove_account_link_success = أُزيل الحساب المرتبط. quota = كوتا +update_hints = حدِّث التلميحات +keep_activity_private.description = سيكون نشاطك العام مرئيًا لك ولمشرفي المثيل فقط. +manage_ssh_principals = إدارة مدراء شهادات SSH الرئيسية +pronouns = الضمائر +pronouns_unspecified = غير محدد +ssh_principal_been_used = تمت إضافة هذه الهوية الرئيسية إلى الخادم مسبقاً. +principal_desc = هذه الهُويات الرئيسية لشهادات SSH مرتبطة بحسابك وتتيح وصولاً كاملاً إلى مستودعاتك. +gpg_helper = تحتاج لمساعدة؟ اطّلع على الدليل حول GPG. +ssh_helper = هل تحتاج مساعدة؟ اطلع على الدليل لـ إنشاء مفاتيح SSH الخاصة بك أو لحل المشكلات الشائعة التي قد تواجهها عند استخدام SSH. +add_new_principal = إضافة هوية رئيسية +keep_pronouns_private.description = سيؤدي ذلك إلى إخفاء ضمائرك عن الزوار الذين لم يقوموا بتسجيل الدخول. +language.description = سيتم حفظ هذه اللغة في حسابك واستخدامها كلغة افتراضية بعد تسجيل الدخول. +storage_overview = نظرة عامة على التخزين +hints = تلميحات +language.title = اللغة الافتراضية +update_hints_success = تم تحديث التلميحات. +language.localization_project = "ساعدنا في ترجمة Forgejo إلى لغتك! المزيد من المعلومات. +change_username_redirect_prompt.with_cooldown.one = سيصبح اسم المستخدم القديم متاحًا للجميع بعد فترة تباطؤ تبلغ %[1]d يومًا. لا يزال بإمكانك استعادة اسم المستخدم القديم خلال فترة التهدئة. +additional_repo_units_hint = اقتراح تفعيل وحدات المستودعات الإضافية +additional_repo_units_hint_description = اعرض تلميح "تفعيل المزيد" للمستودعات التي لم يتم تفعيل جميع الوحدات المتاحة بها. +change_password = غيّر كلمة المرور +keep_pronouns_private = إظهار الضمائر للمستخدمين الذين تمت مصادقتهم فقط +change_username_redirect_prompt.with_cooldown.few = سيصبح اسم المستخدم القديم متاحًا للجميع بعد فترة تباطؤ تبلغ يومًا. لا يزال بإمكانك استعادة اسم المستخدم القديم خلال فترة التهدئة. +no_activity = لا يوجد نشاط حديث +generate_token_success = تم إنشاء الرمز الفريد الجديد الخاص بك. انسخه الآن لأنه لن يظهر مرة أخرى. +manage_access_token = رموز الوصول الفريدة +token_name = اسم الرمز الفريد +generate_token_name_duplicate = اسم التطبيق %s مُستخدم مسبقًا. يُرجى استخدام اسم جديد. +regenerate_token = إعادة التوليد +access_token_regeneration = إعادة توليد رمز وصول فريد +permission_write = قراءة وكتابة +delete_token_success = تم حذف الرمز الفريد. لم يعد بإمكان التطبيقات التي تستخدمه الوصول إلى حسابك. +gpg_key_matched_identities = الهويات المتطابقة: +tokens_desc = تمنح هذه الرموز الفريدة إمكانية الوصول إلى حسابك باستخدام واجهة برمجة تطبيقات Forgejo. +generate_token = توليد رمز فريد +access_token_deletion = حذف رمز الوصول الفريد +generate_new_token = توليد رمز جديد +access_token_deletion_desc = حذف الرمز الفريد سيسحب صلاحية الوصول إلى حسابك من التطبيقات التي تستخدمه. لا يمكن التراجع عن هذا الإجراء. تريد المتابعة؟ +access_token_desc = تقتصر صلاحيات الرمز المحددة على مسارات واجهة البرمجة (API) المقابلة فقط. اطلع على الوثائق لمزيد من المعلومات. +oauth2_application_remove_description = ستؤدي إزالة تطبيق OAuth2 إلى منعه من الوصول إلى حسابات المستخدمين المصرح لهم على هذا المثيل. المتابعة؟ +ssh_principal_deletion = إزالة الهوية الرئيسية لشهادة SSH +at_least_one_permission = يجب عليك تحديد صلاحية واحدة على الأقل لإنشاء رمز فريد +subkeys = المفاتيح الفرعية +ssh_principal_deletion_desc = إزالة هوية رئيسية لشهادة SSH ستسحب صلاحية وصولها إلى حسابك. تريد المتابعة؟ +principal_state_desc = استخدمت هذه الهوية في آخر 7 أيام +ssh_signonly = SSH معطّل حاليًا، لذا تُستخدم هذه المفاتيح فقط للتحقق من توقيع الإيداع. +ssh_externally_managed = يتم إدارة مفتاح SSH هذا خارجيًا لهذا المستخدم +access_token_regeneration_desc = سيؤدي إعادة إنشاء رمز فريد إلى إبطال الوصول إلى حسابك للتطبيقات التي تستخدمه. لا يمكن التراجع عن ذلك. المتابعة؟ +regenerate_token_success = تم إعادة إنشاء الرمز الغريد. لم يعد بإمكان التطبيقات التي تستخدمه الوصول إلى حسابك ويجب تحديثها بالرمز الجديد. +repo_and_org_access = الوصول إلى المستودع والمنظمة +add_principal_success = تمت إضافة الهوية الرئيسية لشهادة "SSH "%s. +ssh_principal_deletion_success = تم إزالة الهوية. +oauth2_applications_desc = تمكّن تطبيقات OAuth2 تطبيقات الطرف الثالث من مصادقة المستخدمين بأمان في مثيل Forgejo هذا. +oauth2_client_secret = سر العميل +oauth2_regenerate_secret = تجديد السر +oauth2_regenerate_secret_hint = فقدت سرك؟ +oauth2_client_id = معرف العميل +permission_no_access = لا وصول +remove_oauth2_application_desc = ستؤدي إزالة تطبيق OAuth2 إلى إبطال الوصول إلى جميع رموز الوصول الفريدة الموقعة. المتابعة؟ +oauth2_confidential_client = العميل السري. حدد للتطبيقات التي تحافظ على السرية، مثل تطبيقات الويب. لا تحدد للتطبيقات الأصلية بما في ذلك تطبيقات سطح المكتب وتطبيقات الأجهزة المحمولة. +oauth2_client_secret_hint = لن يظهر السر مرة أخرى بعد مغادرة هذه الصفحة أو تحديثها. يرجى التأكد من أنك قمت بحفظه. +oauth2_application_create_description = ‪تمنح تطبيقات OAuth2 تطبيقات الطرف الثالث حق الوصول إلى حسابات المستخدمين على هذا المثيل. +oauth2_application_locked = يقوم Forgejo بالتسجيل المسبق لبعض تطبيقات OAuth2 عند بدء التشغيل إذا تم تمكينها في التكوين. لمنع السلوك غير المتوقع، لا يمكن تحريرها أو إزالتها. يرجى الرجوع إلى وثائق OAuth2 لمزيد من المعلومات. +twofa_recovery_tip = إذا فقدت جهازك، ستتمكن من استخدام مفتاح الاسترداد للاستخدام مرة واحدة لاستعادة الوصول إلى حسابك. +twofa_not_enrolled = حسابك غير مسجّل حالياً في المصادقة الثنائية. +twofa_scratch_token_regenerate = إعادة إنشاء مفتاح الاسترداد للاستخدام مرة واحدة +regenerate_scratch_token_desc = إذا فقدت مفتاح الاسترداد الخاص بك في غير محله أو استخدمته بالفعل لتسجيل الدخول، يمكنك إعادة تعيينه هنا. +twofa_failed_get_secret = إخفاق في الحصول على سر. +manage_account_links_desc = هذه الحسابات الخارجية مرتبطة بحسابك في Forgejo. +revoke_oauth2_grant_description = سيؤدي إبطال الوصول لهذا التطبيق التابع لجهة خارجية إلى منع هذا التطبيق من الوصول إلى بياناتك. أنت متأكد؟ +revoke_oauth2_grant_success = تم سحب صلاحية الوصول بنجاح. +webauthn_alternative_tip = قد ترغب في تكوين أسلوب مصادقة إضافي. +webauthn_register_key = إضافة مفتاح تشفير +webauthn_nickname = الاسم المستعار +manage_account_links = الحسابات المرتبطة +revoke_oauth2_grant = سحب صلاحية الوصول +twofa_enroll = التسجيل في المصادقة الثنائية +twofa_is_enrolled = حسابك مسجّل حاليًا في المصادقة الثنائية. +twofa_scratch_token_regenerated = مفتاح الاسترداد للاستخدام مرة واحدة هو %s الآن. قم بتخزينه في مكان آمن، فلن يتم عرضه مجدداً. +twofa_enrolled = تم تسجيل حسابك بنجاح. قم بتخزين مفتاح الاسترداد للاستخدام لمرة واحدة (%s) في مكان آمن، فلن يتم عرضه مجدداً. +webauthn_desc = مفاتيح الأمان هي أجهزة فعلية تحوي على مفاتيح تشفير. يمكن استخدامها للتحقق بخطوتين. يجب أن تدعم مفاتيح الأمان معيار WebAuthn Authenticator. +remove_account_link_desc = ستؤدي إزالة حساب مرتبط إلى إلغاء وصوله إلى حساب Forgejo الخاص بك. المتابعة؟ +email_notifications.onmention = البريد الإلكتروني فقط عند الإشارة +email_notifications.andyourown = والإشعارات الخاصة بك +visibility = رؤية المستخدم +visibility.public_tooltip = مرئي للجميع +visibility.private_tooltip = مرئي فقط لأعضاء المؤسسات التي انضممت إليها +visibility.public = عام +delete_account_desc = هل أنت متأكد من رغبتك في حذف حساب المستخدم هذا نهائيًا؟ +user_block_yourself = لا يمكنك حظر نفسك. +delete_with_all_comments = حسابك أصغر من %s. لتجنب التعليقات الوهمية، سيتم حذف جميع تعليقات المشكلة/المسؤولية الشخصية معها. +visibility.limited_tooltip = مرئية فقط للمستخدمين الذين قاموا بتسجيل الدخول +visibility.limited = محدود +visibility.private = خاص +quota.applies_to_org = تنطبق قواعد الحصص التالية على هذه المنظمة +quota.rule.no_limit = غير محدود +quota.sizes.all = الكل +quota.sizes.repos.all = المستودعات +quota.sizes.repos.public = مستودعات عامة +quota.sizes.repos.private = مستودعات خاصة +quota.sizes.git.all = محتوى Git +quota.sizes.git.lfs = Git LFS +quota.sizes.assets.all = الأصول +quota.sizes.assets.attachments.all = المرفقات +quota.sizes.assets.attachments.issues = إصدار المرفقات +quota.sizes.assets.attachments.releases = تحرير المرفقات +quota.sizes.assets.artifacts = التحف الفنية +quota.sizes.assets.packages.all = الحزم +quota.rule.exceeded.helper = لقد تجاوز الحجم الإجمالي للكائنات لهذه القاعدة الحصة النسبية. +quota.rule.exceeded = تم تجاوزه +quota.applies_to_user = تنطبق قواعد الحصص التالية على حسابك +quota.sizes.wiki = الموسوعة [org] follow_blocked_user = لا يمكنك إتباع هذه المنظمة لأن هذه المنظمة حظرتك. @@ -632,7 +744,7 @@ pulls.blocked_by_user = لا يمكنك أن ترسل طلب سحب في هذا migrate.migrating_milestones = ترحيل الأهداف migrate_items_milestones = أهداف repo_size = حجم المستودع -object_format = صيغة الكائنات +object_format = تنسيق الكائنات use_template = استخدم هذا القالب migrate_items_merge_requests = طلبات الدمج repo_name = اسم المستودع @@ -640,11 +752,11 @@ template = القالب projects.modify = عدّل المشروع tree_path_not_found_commit = المسار %[1]s غير موجود في الإيداع %[2]s repo_lang = اللغة -fork_repo = اشتق المستودع +fork_repo = اشتقاق المستودع fork_no_valid_owners = لا يمكن اشتقاق هذا المستودع لعدم وجود مالك صالح. license = الترخيص fork_branch = الفرع الذي سيُستنسخ إلى الاشتقاق -template_helper = اجعل المستودع قالبا +template_helper = اجعل المستودع قالباً owner = المالك projects.deletion_success = تم حذف المشروع. projects.deletion = احذف المشروع @@ -654,14 +766,14 @@ projects.edit = عدّل المشروع template.avatar = الصورة الرمزية migrate_items_wiki = الموسوعة repo_desc = الوصف -template_select = اختر قالبا. +template_select = اختر قالبا repo_name_helper = الأسماء الحسنة للمستودعات تستخدم كلمات مفتاحية قصيرة وسهلة التذكر وفريدة. -default_branch = الفرع المبدئي +default_branch = الفرع الافتراضي all_branches = كل الفروع -migrate_items_issues = المسائل +migrate_items_issues = البلاغات projects.deletion_desc = حذف مشروع يحذف كل المسائل المرتبطة به. أتريد الاستمرار؟ -repo_desc_helper = أدخل وصفا قصيرا (اختياريا) -create_repo = أنشئ مستودعا +repo_desc_helper = أدخل وصفاً قصيراً (اختياري) +create_repo = إنشاء مستودع migrate_items_releases = الإصدارات already_forked = لقد اشتققت %s بالفعل license_helper = اختر ملف ترخيص. @@ -682,7 +794,7 @@ issues.remove_milestone_at = `أزال هذه المسألة من الهدف issues.filter_assginee_no_assignee = بلا مكلف issues.new.no_milestone = بلا هدف issues.new.projects = المشروعات -delete_preexisting_label = احذف +delete_preexisting_label = حذف issues.context.edit = عدّل branch.rename = غيّر اسم الفرع "%s" issue_labels = تصنيفات المسائل @@ -778,7 +890,7 @@ milestones.deletion_desc = حذف هدف يحذفه من كل المسائل ا issues.desc = نظّم إبلاغات العلل، والمهام، والأهداف. issues.choose.ignore_invalid_templates = أُهمِلت القوالب التالفة branch.renamed = غُيّر اسم الفرع %s إلى %s. -delete_preexisting = احذف الملفات الموجودة سابقا +delete_preexisting = حذف الملفات الموجودة مسبقاً branch.included_desc = هذا الفرع جزء من الفرع المبدئي trust_model_helper_collaborator_committer = مشترك+مودع: ثق بتوقيعات المشتركين التي تطابق المودع issues.reopened_at = `أعاد فتح هذه المسألة %s` @@ -852,7 +964,7 @@ issues.reopen_comment_issue = علّق وأعد فتحها issues.dependency.add = أضف اعتمادية… issues.label_deletion_desc = حذف تصنيف يحذفه من كل المسائل، أتريد الاستمرار؟ labels = التصنيفات -delete_preexisting_content = احذف الملفات في %s +delete_preexisting_content = حذف الملفات في %s milestones.deletion = احذف الهدف issues.comment_pull_merged_at = دمج الإيداع %[1]s إلى %[2]s %[3]s issues.new.closed_milestone = الأهداف التامة @@ -940,7 +1052,7 @@ issues.filter_assignee = مكلف issues.open_title = حالية download_file = نزّل الملف issues.attachment.download = `انقر لتنزيل "%s"` -download_archive = نزّل المستودع +download_archive = تنزيل المستودع download_tar = نزّل TAR.GZ download_zip = نزّل ZIP releases.desc = تتبع إصدارات المشروع وتنزيلاته. @@ -1349,6 +1461,172 @@ pulls.fast_forward_only_merge_pull_request = تسريع وحسب pulls.merge_conflict = تعذر الدمج: حدث نزاع خلال الدمج. مساعدة: جرب طريقة أخرى pulls.rebase_conflict = تعذر الدمج: حدث نزاع خلال إعادة تأسيس الإيداع: %[1]s. مساعدة: جرب طريقة أخرى pulls.has_merged = فشل: لقد تم دمج هذا الطلب، فلا يمكنك دمجه مجددا أو تغيير الفرع الهدف. +new_repo_helper = يحتوي المستودع على جميع ملفات المشروع، بما في ذلك سجل التعديلات. هل تستضيف واحدًا بالفعل على منصة أخرى؟ نقل المستودع. +new_from_template = استخدم قالباً +new_advanced = إعدادات مقتدمة +new_advanced_expand = انقر للتوسعة +new_from_template_description = يمكنك تحديد قالب مستودع موجود على هذا المثيل وتطبيق إعداداته. +owner_helper = قد لا تظهر بعض منتديات المجموعة في القائمة المنسدلة بسبب الحد الأقصى لعدد المستودعات. +fork_from = اشتق من +fork_visibility_helper = لا يمكن تغيير ظهور المستودع المشتّق. +generate_repo = توليد لمستودع +readme_helper_desc = هذا هو المكان الذي يمكنك فيه كتابة وصف كامل لمشروعك. +repo_gitignore_helper = حدد قوالب .gitignore +auto_init = تهيئة المستودع +default_branch_label = افتراضي +auto_init_description = ابدأ سجل Git بملف README، مع إمكانية إضافة ملفات الرخصة و.gitignore اختيارياً. +mirror_use_ssh.text = استخدم مصادقة SSH +mirror_address = استنساخ عبر URL +mirror_prune_desc = إزالة مراجع التتبع عن بُعد القديمة +mirror_interval_invalid = الفاصل الزمني للمرآة غير صالح. +readme_helper = حدد قالب ملف README +generate_from = التوليد من +mirror_use_ssh.not_available = المصادقة عبر SSH غير متاحة. +open_with_editor = افتح بـ %s +mirror_prune = تنقية +visibility_fork_helper = (سيؤثر تغيير ذلك على رؤية جميع المشتقات.) +clone_helper = تحتاج مساعدة في الاستنساخ؟ زُر المساعدة. +mirror_public_key = مفتاح SSH عام +size_format = %[1]s: %[2]s, %[3]s: %[4]s +visibility_description = فقط المالك أو أعضاء المؤسسة إذا كان لديهم حقوق، سيتمكنون من رؤيته. +license_helper_desc = تحدد الرخصة ما يمكن للآخرين فعله أو عدم فعله بشيفرة برمجيتك. لست متأكدًا من الرخصة المناسبة لمشروعك؟ طالع اختيار الرخصة. +mirror_denied_combination = لا يمكن استخدام المصادقة المستندة إلى المفتاح العام وكلمة المرور معاً. +repo_gitignore_helper_desc = اختر الملفات التي لا تريد تتبعها من قائمة القوالب الخاصة باللغات الشائعة. يتم تضمين القطع الأثرية النموذجية التي تم إنشاؤها بواسطة أدوات البناء الخاصة بكل لغة في .gitignore بشكل افتراضي. +stars = النجوم +default_branch_helper = الفرع الافتراضي هو الفرع الأساسي لطلبات السحب ،وعمليات إلإيداع. +mirror_use_ssh.helper = سيقوم Forgejo بعكس المستودع عبر Git عبر SSH وإنشاء زوج مفاتيح لك عند تحديد هذا الخيار. يجب عليك التأكد من أن المفتاح العام الذي تم إنشاؤه مخول للدفع إلى المستودع الوجهة. لا يمكنك استخدام التخويل المستند إلى كلمة المرور عند تحديد هذا الخيار. +desc.private = خاص +readme = README +mirror_interval = الفاصل الزمني للمرآة (وحدات الوقت الصحيحة هي 'h' ،'m' ،'s'). 0 لتعطيل المزامنة الدورية. (الحد الأدنى: %s) +desc.template = قالب +desc.public = عام +visibility = الرؤية +migrate_options_mirror_helper = سيكون هذا المستودع مرآة +adopt_preexisting_success = الملفات المعتمدة والمستودع الذي تم إنشاؤه من %s +archive.title_date = تمت أرشفة هذا المستودع على %s. يمكنك عرض الملفات واستنساخه، لكن لا يمكنك إجراء أي تغييرات على حالته، مثل دفع وإنشاء بلاغات أو طلبات سحب أو تعليقات جديدة. +migrate_options_lfs_endpoint.label = نقطة نهاية LFS +transfer.reject_desc = إلغاء النقل إلى ”%s“ +archive.title = تمت أرشفة هذا المستودع. يمكنك عرض الملفات واستنساخه، لكن لا يمكنك إجراء أي تغييرات على حالته، مثل دفع وإنشاء بلاغات أو طلبات سحب أو تعليقات جديدة. +stargazers = المميِّزون بنجمة +form.reach_limit_of_creation_n = لقد وصل المالك بالفعل إلى الحد الأقصى للمستودعات %d. +mirror_sync_on_commit = المزامنة عند دفع الإيداعات +mirror_lfs_desc = تنشيط النسخ المتطابق لبيانات LFS. +author_search_tooltip = عرض كحد أقصى 30 مستخدمًا +template.git_content = محتوى Git (الفرع الافتراضي) +need_auth = المصادقة +migrate_options_lfs_endpoint.description.local = يتم دعم مسار الخادم المحلي أيضاً. +template.one_item = يجب على الأقل تحديد عنصر قالب واحد +archive.pull.noreview = هذا المستودع مؤرشف. لا يمكنك مراجعة طلبات السحب. +migrate.clone_address = ترحيل / استنساخ من عنوان URL +migrate.repo_desc_helper = اتركه فارغاً لاستيراد الوصف الموجود +archive.nocomment = التعليق غير ممكن لأن المستودع تمت أرشفته. +mirror_address_protocol_invalid = عنوان URL المقدم غير صالح. يمكن استخدام مواقع http(s):// أو git:// فقط للنسخ المتطابق. +mirror_lfs_endpoint = نقطة نهاية LFS +mirror_lfs_endpoint_desc = ستحاول المزامنة استخدام عنوان url المستنسخ إلى تحديد خادم LFS. يمكنك أيضًا تحديد نقطة نهاية مخصصة إذا كانت بيانات LFS المستودع مخزنة في مكان آخر. +mirror_password_blank_placeholder = (بلا تعيين) +delete_preexisting_success = الملفات المحذوفة غير المعتمدة في %s +blame_prior = عرض النّقد قبل هذا التغيير +blame.ignore_revs = جاري تجاهل المراجعات في .git-blame-ignore-revs. انقر هنا لتجاوز وعرض واجهة blame العادية. +desc.archived = مؤرشف +template.issue_labels = وسوم الإبلاغات +sync_fork.branch_behind_one = هذا الفرع هو %[1]d إيداع خلف %[2]s +sync_fork.button = مزامنة +transfer.no_permission_to_reject = لا تملك الصلاحية لرفض هذا النقل. +form.string_too_long = السلسلة المحددة أطول من d حرفاً. +migrate_options = خيارات الترحيل +migrate_options_lfs = ترحيل ملفات LFS +migrate.clone_local_path = أو مسار خادم محلي +mirror_password_help = تغيير اسم المستخدم لمسح كلمة المرور المخزنة. +watchers = المراقبون +template.items = عناصر القالب +template.topics = المواضيع +migrate_options_lfs_endpoint.placeholder = إذا تُركت فارغة، سيتم اشتقاق نقطة النهاية من عنوان URL المستنسخ +migrate.clone_address_desc = رابط HTTP(S) أو Git لاستنساخ مستودع موجود +migrate.github_token_desc = يمكنك وضع رمز فريد أو أكثر هنا مفصول بفواصل لجعل الترحيل أسرع من خلال التحايل على حد معدل GitHub API. تحذير: قد يؤدي إساءة استخدام هذه الميزة إلى انتهاك سياسة مزود الخدمة وقد يؤدي إلى حظر حسابك (حساباتك). +transfer.no_permission_to_accept = لا تملك الصلاحية لقبول هذا النقل. +transfer.reject = رفض النقل +transfer.accept_desc = النقل إلى ”%s“ +desc.internal = داخلي +summary_card_alt = بطاقة ملخص المستودع %s +transfer.accept = قبول النقل +blame.ignore_revs.failed = فشل تجاهل المراجعات في .git-blame-ignore-revs. +form.name_pattern_not_allowed = النمط ”%s“ غير مسموح به في اسم المستودع. +migrate_options_lfs_endpoint.description = سيحاول الترحيل استخدام مسار Git البعيد (remote) لـ تحديد خادم LFS. يمكنك أيضًا تحديد نقطة نهاية مخصصة إذا كانت بيانات LFS للمستودع مخزنة في مكان آخر. +migrate_items = عناصر الترحيل +adopt_preexisting_content = إنشاء مستودع من %s +migrate_repo = ترحيل المستودع +mirror_password_placeholder = (لم يتم تعديله) +sync_fork.branch_behind_few = هذا الفرع هو %[1]d إيداعات خلف %[2]s +mirror_address_desc = ضع أي بيانات اعتماد مطلوبة في قسم المصادقة. +mirror_last_synced = آخر مزامنة +mirror_lfs = تخزين الملفات الكبيرة (LFS) +stars_remove_warning = سيؤدي ذلك إلى إزالة جميع النجوم من هذا المستودع. +reactions_more = و %d أكثر +template.invalid = يجب تحديد مستودع القوالب +adopt_search = أدخل اسم المستخدم للبحث عن مستودعات غير معتمدة... (اتركه فارغاً للعثور على الكل) +adopt_preexisting = اعتماد الملفات الموجودة مسبقاً +language_other = أُخرى +adopt_preexisting_label = اعتماد الملفات +form.reach_limit_of_creation_1 = لقد وصل المالك بالفعل إلى الحد الأقصى للمستودع %d. +form.name_reserved = تم حجز اسم المستودع ”%s“. +mirror_address_url_invalid = عنوان URL المقدم غير صالح. تأكد من تحرير مكونات عنوان URL بشكل صحيح. +migrate.migrate = الترحيل من %s +migrate.gogs.description = ترحيل البيانات من notabug.org أو مثيلات Gogs الأخرى. +migrate.onedev.description = ترحيل البيانات من code.onedev.io أو مثيلات OneDev الأخرى. +migrate.migrating_topics = ترحيل المواضيع +migrate.cancel_migrating_title = إلغاء الترحيل +generated_from = تم توليده من +star_guest_user = قم بتسجيل الدخول لإعطاء نجمة لهذا المستودع. +subscribe.pull.guest.tooltip = سجّل الدخول للاشتراك في طلب السحب هذا. +unwatch = إلغاء المشاهدة +quick_guide = دليل سريع +empty_message = لا يحتوي هذا المستودع على أي محتوى. +migrate.migrating_labels = ترحيل الوسوم +migrate.migrating_releases = ترحيل الإصدارات +watch_guest_user = سجّل الدخول لمشاهدة هذا المستودع. +star = نجمة +cite_this_repo = الاستشهاد بهذا المستودع +no_desc = لا يوجد وصف +migrate.github.description = ترحيل البيانات من github.com أو خادم GitHub Enterprise. +migrated_from_fake = +clone_this_repo = استنسخ هذا المستودع +fork_from_self = لا يمكنك اشتقاق مستودع تملكه. +fork_guest_user = سجّل الدخول لاشتقاق هذا المستودع. +subscribe.issue.guest.tooltip = سجّل الدخول للاشتراك في هذا البلاغ. +more_operations = المزيد من العمليات +push_exist_repo = دفع مستودع موجود من موجّه الأوامر +broken_message = لا يمكن قراءة بيانات Git التي يستند إليها هذا المستودع. اتصل بمسؤول هذا المثيل أو احذف هذا المستودع. +migrate.git.description = ترحيل مستودع فقط من أي خدمة Git. +watch = شاهد +migrate.migrating_git = ترحيل بيانات Git +migrate.gitea.description = ترحيل البيانات من gitea.com أو مثيلات Gitea الأخرى. +migrate.gitbucket.description = ترحيل البيانات من مثيلات GitBucket. +migrate.cancel_migrating_confirm = تريد إلغاء عملية الترحيل هذه؟ +migrate.permission_denied_blocked = لا يمكنك الاستيراد من مضيفين غير مسموح بهم، يُرجى الطلب من المسؤول التحقق من إعدادات ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS. +migrate.gitlab.description = ترحيل البيانات من gitlab.com أو مثيلات GitLab الأخرى. +migrate.migrating = الترحيل من %s … +migrate.migrating_failed.error = أخفق الترحيل: %s +migrate.codebase.description = ترحيل البيانات من codebasehq.com. +migrate.invalid_local_path = المسار المحلي غير صالح. فهو غير موجود أو ليس مجلداً. +migrate.permission_denied = لا يُسمح لك باستيراد المستودعات المحلية. +migrate.failed = أخفق الترحيل: %v +migrate.migrate_items_options = رمز الوصول الفريد مطلوب لترحيل العناصر الإضافية +migrated_from = تم الترحيل من %[2]s +mirror_from = مرآة لـ +forked_from = مشتقّ من +create_new_repo_command = إنشاء مستودع جديد على موجّه الأوامر +fork = اشتقاق +migrate.migrating_failed_no_addr = أخفق الترحيل. +unstar = إزالة النجمة +migrate.migrating_issues = ترحيل البلاغات +migrate.migrating_pulls = ترحيل طلبات السحب +code = الكود +migrate.invalid_lfs_endpoint = نقطة نهاية LFS غير صالحة. +migrate.migrating_failed = فشل الترحيل من %s. +branch = فرع +template.git_hooks_tooltip = يتعذر عليك حاليًا تعديل أو إزالة خطافات Git بمجرد إضافتها. حدد هذا فقط إذا كنت تثق بمستودع القالب. +code.desc = الوصول إلى الشيفرة المصدرية والملفات والالتزامات والفروع. +tree = شجرة [mail] admin.new_user.text = من فضلك اضغط هنا لإدارة هذا المستخدم من لوحة الإدارة. diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index c7770c5ea1..e80f2bcc65 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -340,7 +340,7 @@ no_reply_address=Skrytá e-mailová doména no_reply_address_helper=Název domény pro uživatele se skrytou e-mailovou adresou. Příklad: pokud je název skryté e-mailové domény nastaven na „noreply.example.org“, uživatelské jméno „joe“ bude zaznamenáno v Gitu jako „joe@noreply.example.org“. password_algorithm=Hashovací algoritmus hesla invalid_password_algorithm=Neplatný algoritmus hashe hesla -password_algorithm_helper=Nastavte algoritmus hashování hesla. Algoritmy mají odlišné požadavky a sílu. Algoritmus argon2 je poměrně bezpečný, ale používá spoustu paměti a může být nevhodný pro malé systémy. +password_algorithm_helper=Nastavte algoritmus hashování hesla. Algoritmy mají odlišné požadavky a síly. Algoritmus argon2 je poměrně bezpečný, ale používá spoustu paměti a může být nevhodný pro malé systémy. enable_update_checker=Povolit kontrolu aktualizací env_config_keys=Konfigurace prostředí env_config_keys_prompt=Následující proměnné prostředí budou také použity pro váš konfigurační soubor: @@ -468,7 +468,7 @@ email_domain_blacklisted=Nemůžete se registrovat s vaší e-mailovou adresou. authorize_application=Autorizovat aplikaci authorize_redirect_notice=Budete přesměrováni na %s, pokud autorizujete tuto aplikaci. authorize_application_created_by=Tuto aplikaci vytvořil %s. -authorize_application_description=Pokud povolíte přístup, bude moci přistupovat a zapisovat do všech vašich informací o účtu včetně soukromých repozitářů a organizací. +authorize_application_description=Pokud udělíte přístup, bude moci přistupovat a zapisovat do všech vašich informací o účtu včetně soukromých repozitářů a organizací. authorize_title=Autorizovat „%s“ pro přístup k vašemu účtu? authorization_failed=Autorizace selhala authorization_failed_desc=Autorizace selhala, protože jsme detekovali neplatný požadavek. Kontaktujte prosím správce aplikace, kterou jste se pokoušeli autorizovat. @@ -724,7 +724,7 @@ following_one = %d sledovaný followers.title.one = Sledující followers.title.few = Sledující following.title.one = Sleduje -following.title.few = Sleudje +following.title.few = Sleduje public_activity.visibility_hint.self_private = Vaše aktivita je viditelná pouze vám a správcům instance. Nastavení. public_activity.visibility_hint.admin_private = Tato aktivita je pro vás viditelná, protože jste administrátor, ale uživatel chce, aby zůstala soukromá. public_activity.visibility_hint.self_public = Vaše aktivita je viditelná všem, mimo interakcí v soukromých prostorech. Nastavení. @@ -828,7 +828,7 @@ activations_pending=Čekající aktivace can_not_add_email_activations_pending=Existuje čekající aktivace, zkuste to znovu za pár minut, pokud chcete přidat nový e-mail. delete_email=Smazat email_deletion=Odstranit e-mailovou adresu -email_deletion_desc=E-mailová adresa a přidružené informace budou z vašeho účtu odstraněny. Revize Gitu s touto e-mailovou adresou zůstanou nezměněny. Pokračovat? +email_deletion_desc=Tato e-mailová adresa a přidružené informace budou z vašeho účtu odstraněny. Revize Gitu s touto e-mailovou adresou zůstanou nezměněny. Pokračovat? email_deletion_success=E-mailová adresa byla odstraněna. theme_update_success=Váš motiv vzhledu byl aktualizován. theme_update_error=Vybraný motiv vzhledu neexistuje. @@ -1155,7 +1155,7 @@ mirror_interval_invalid=Interval zrcadlení není platný. mirror_sync_on_commit=Synchronizovat při nahrávání revizí mirror_address=Klonovat z URL mirror_address_desc=Zadejte požadované přístupové údaje do sekce Ověření. -mirror_address_url_invalid=Poskytnutá URL je neplatná. Všechny části musíte správně nahradit escape sekvencí. +mirror_address_url_invalid=Zadaná adresa URL je neplatná. Ujistěte se, že jsou všechny části adresy správně escapované. mirror_address_protocol_invalid=Zadaná URL je neplatná. Mohou být zrcadleny pouze umístění http(s):// nebo git://. mirror_lfs=Úložiště velkých souborů (LFS) mirror_lfs_desc=Aktivovat zrcadlení dat LFS. @@ -1243,7 +1243,7 @@ migrate_items_releases=Vydání migrate_repo=Migrovat repozitář migrate.clone_address=Migrovat / klonovat z URL migrate.clone_address_desc=HTTP(S) nebo URL Git „clone“ existujícího repozitáře -migrate.github_token_desc=Můžete sem vložit jeden nebo více tokenů oddělených čárkou, abyste urychlili migraci kvůli omezení rychlosti rozhraní GitHub API. VAROVÁNÍ: Zneužití této funkce může vést k porušení zásad poskytovatele služeb a zablokování účtu. +migrate.github_token_desc=Sem můžete vložit jeden nebo více tokenů oddělených čárkami, abyste urychlili migraci obejitím omezení rychlosti rozhraní GitHub API. VAROVÁNÍ: Zneužití této funkce může vést k porušení zásad poskytovatele služeb a zablokování účtu. migrate.clone_local_path=nebo místní cesta serveru migrate.permission_denied=Není dovoleno importovat místní repozitáře. migrate.permission_denied_blocked=Nelze importovat z nepovolených hostitelů, prosím požádejte správce, aby zkontroloval nastavení ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS. @@ -1875,7 +1875,7 @@ pulls.select_commit_hold_shift_for_range=Vyberte revizi. Podržte klávesu Shift pulls.review_only_possible_for_full_diff=Posouzení je možné pouze při zobrazení plného rozlišení pulls.filter_changes_by_commit=Filtrovat podle revize pulls.nothing_to_compare=Tyto větve jsou stejné. Není třeba vytvářet žádost o sloučení. -pulls.nothing_to_compare_have_tag = Vybraná větev a značka jsou shodné. +pulls.nothing_to_compare_have_tag = Vybrané větve a značky jsou shodné. pulls.nothing_to_compare_and_allow_empty_pr=Tyto větve jsou stejné. Tato žádost o sloučení bude prázdná. pulls.has_pull_request=`Žádost o sloučení mezi těmito větvemi již existuje: %[2]s#%[3]d` pulls.create=Vytvořit žádost o sloučení @@ -2023,7 +2023,7 @@ milestones.filter_sort.most_issues=Nejvíce problémů milestones.filter_sort.least_issues=Nejméně problémů signing.will_sign=Tato revize bude podepsána klíčem „%s“. -signing.wont_sign.error=Došlo k chybě při kontrole, zda může být revize podepsána. +signing.wont_sign.error=Při kontrole, zda může být revize podepsána, došlo k chybě. signing.wont_sign.nokey=Tato instance nemá žádný klíč k podepsání této revize. signing.wont_sign.never=Revize nebudou nikdy podepsány. signing.wont_sign.always=Revize budou vždy podepsány. @@ -3834,7 +3834,7 @@ owner.settings.cargo.initialize.error=Nepodařilo se inicializovat Cargo index: owner.settings.cargo.initialize.success=Index Cargo byl úspěšně vytvořen. owner.settings.cargo.rebuild=Znovu vytvořit index owner.settings.cargo.rebuild.error=Obnovení Cargo indexu se nezdařilo: %v -owner.settings.cargo.rebuild.success=Cargo Index byl úspěšně obnoven. +owner.settings.cargo.rebuild.success=Index Cargo byl úspěšně znovu sestaven. owner.settings.cleanuprules.title=Pravidla čištění owner.settings.cleanuprules.add=Přidat pravidlo pro čištění owner.settings.cleanuprules.edit=Upravit pravidlo pro čištění @@ -3991,7 +3991,7 @@ variables.update.success=Proměnná byla upravena. runners.none = Nejsou dostupné žádné runnery runs.workflow = Workflow runners = Runnery -runs.pushed_by = pushnuto uživatelem +runs.pushed_by = pushnuta uživatelem need_approval_desc = Potřebovat schválení pro spouštění workflowů pro žádosti o sloučení forků. runners.runner_manage_panel = Správa runnerů runs.no_job_without_needs = Workflow musí obsahovat alespoň jednu práci bez závislostí. diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 84bb4ccde1..8a87b4246a 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -830,7 +830,7 @@ activations_pending=Aktivierung ausstehend can_not_add_email_activations_pending=Es gibt eine ausstehende Aktivierung, versuche es in ein paar Minuten erneut, wenn du eine neue E-Mail hinzufügen möchtest. delete_email=Löschen email_deletion=E-Mail-Adresse löschen -email_deletion_desc=Die E-Mail-Adresse und die damit verbundenen Informationen werden von deinem Konto entfernt. Git-Commits von dieser E-Mail-Addresse bleiben unverändert. Fortfahren? +email_deletion_desc=Diese E-Mail-Adresse und die damit verbundenen Informationen werden von deinem Konto entfernt. Git-Commits von dieser E-Mail-Addresse bleiben unverändert. Fortfahren? email_deletion_success=Die E-Mail-Adresse wurde entfernt. theme_update_success=Deine Theme-Auswahl wurde gespeichert. theme_update_error=Das ausgewählte Theme existiert nicht. @@ -1154,7 +1154,7 @@ mirror_interval_invalid=Das Spiegel-Intervall ist ungültig. mirror_sync_on_commit=Synchronisieren, wenn Commits gepusht wurden mirror_address=Klonen via URL mirror_address_desc=Gib alle erforderlichen Anmeldedaten im Abschnitt „Authentifizierung“ ein. -mirror_address_url_invalid=Die angegebene URL ist ungültig. Achte darauf, alle Komponenten der URL korrekt zu maskieren. +mirror_address_url_invalid=Die angegebene URL ist ungültig. Achte darauf, dass alle Komponenten der URL korrekt escaped wurden. mirror_address_protocol_invalid=Die angegebene URL ist ungültig. Nur Orte mit „http(s)://“ oder „git://“ können fürs Spiegeln benutzt werden. mirror_lfs=Großdatei-Speicher (LFS) mirror_lfs_desc=Spiegeln von LFS-Dateien aktivieren. @@ -1243,7 +1243,7 @@ migrate_items_releases=Releases migrate_repo=Repository migrieren migrate.clone_address=Migrations-/Klon-URL migrate.clone_address_desc=Die HTTP(S)- oder „git clone“-URL eines bereits existierenden Repositorys -migrate.github_token_desc=Du kannst hier ein oder mehrere Token durch Komma getrennt eintippen, um die Migration aufgrund der GitHub-API-Ratenlimitierung zu beschleunigen. WARNUNG: Der Missbrauch dieser Funktion kann gegen die Richtlinien des Diensteanbieters verstoßen und zur Kontosperrung führen. +migrate.github_token_desc=Du kannst hier ein oder mehrere Tokens durch Komma getrennt eingeben, um die Migration schneller zu machen, indem die GitHub-API-Ratenlimitierung umgangen wird. WARNUNG: Der Missbrauch dieser Funktion kann gegen die Richtlinien des Diensteanbieters verstoßen und zur Sperrung deines Kontos bzw. deiner Konten führen. migrate.clone_local_path=oder ein lokaler Serverpfad migrate.permission_denied=Du hast keine Berechtigung zum Importieren lokaler Repositorys. migrate.permission_denied_blocked=Du kannst von keinen nicht erlaubten Hosts importieren. Bitte fragen deinen Administrator, die Einstellungen ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS zu überprüfen. @@ -2757,7 +2757,7 @@ generated = Erzeugt editor.invalid_commit_mail = Ungültige E-Mail für die Erstellung eines Commits. commits.renamed_from = Umbenannt von %s commits.browse_further = Weiter browsen -pulls.nothing_to_compare_have_tag = Der gewählte Branch/Tag ist gleich. +pulls.nothing_to_compare_have_tag = Die gewählten Branches/Tags sind 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 @@ -3124,7 +3124,7 @@ dashboard.resync_all_hooks=Die „pre-receive“-, „update“- und „post-rec dashboard.reinit_missing_repos=Alle Git-Repositorys neu einlesen, für die Einträge existieren dashboard.sync_external_users=Externe Benutzerdaten synchronisieren dashboard.cleanup_hook_task_table=Hook-Task-Tabelle bereinigen -dashboard.cleanup_packages=Veraltete Pakete löschen +dashboard.cleanup_packages=Veraltete Pakete bereinigen dashboard.cleanup_actions=Abgelaufene Logs und Artefakte von Actions bereinigen dashboard.server_uptime=Server-Uptime dashboard.current_goroutine=Aktuelle Goroutinen diff --git a/options/locale/locale_fil.ini b/options/locale/locale_fil.ini index 032b8b0435..85dfe8d4d9 100644 --- a/options/locale/locale_fil.ini +++ b/options/locale/locale_fil.ini @@ -313,7 +313,7 @@ no_reply_address = Domain ng nakatagong email no_reply_address_helper = Domain name para sa mga user na may nakatagong email address. Halimbawa, ang username na "kita" ay mala-log sa Git bilang "kita@noreply.example.org" kapag ang nakatagong email domain ay nakatakda sa "noreply.example.org". password_algorithm = Algorithm ng password hash invalid_password_algorithm = Hindi angkop na algorithm ng password hash -password_algorithm_helper = Itakda ang password hashing algorithm. Ang mga algorithm ay may magkakaibang mga kinakailangan at lakas. Ang algorithm ng Argon2 ay sa halip ay ligtas ngunit gumagamit ng maraming memory at maaaring hindi naaangkop para sa mga maliliit na sistema. +password_algorithm_helper = Itakda ang password hashing algorithm. Ang mga algorithm ay may magkakaibang mga kinakailangan at lakas. Ang algorithm na Argon2 ay sa halip ay ligtas ngunit gumagamit ng maraming memory at maaaring hindi naaangkop para sa mga maliliit na sistema. enable_update_checker = I-enable ang tagasuri ng update env_config_keys = Configuration ng Environment env_config_keys_prompt = Ang mga sumusunod na mga environment variable ay ilalapat rin sa iyong configuration file: @@ -760,7 +760,7 @@ comment_type_group_milestone = Milestone comment_type_group_issue_ref = Pagsangguni ng isyu keep_activity_private_popup = Makikita mo lang at mga tagapangasiwa ang iyong aktibidad can_not_add_email_activations_pending = Mayroong isang nakabinbing pag-activate, subukang muli sa loob ng ilang minuto kung nais mong magdagdag ng isang bagong email. -email_deletion_desc = Ang email address at mga kaugnay na impormasyon ay tatanggalin sa iyong account. Ang mga Git commit sa itong email address ay iiwanang hindi nabago. Magpatuloy? +email_deletion_desc = Ang email address na ito at mga kaugnay na impormasyon ay tatanggalin sa iyong account. Ang mga Git commit sa itong email address ay iiwanang hindi nabago. Magpatuloy? add_email = Idagdag ang email eddress gpg_token_code = echo "%s" | gpg -a --default-key %s --detach-sig delete_token_success = Nabura na ang token. Ang mga application na gumagamit nito ay hindi na maa-access ang iyong account. @@ -1115,7 +1115,7 @@ default_branch = Default na branch default_branch_label = default mirror_prune = Pungusan mirror_prune_desc = Tanggalin ang mga antikuwado na sangguni ng remote-tracking -mirror_address_url_invalid = Ang ibinigay na url ay hindi wasto. Kailangan mong i-escape ang lahat ng mga components ng URL ng tama. +mirror_address_url_invalid = Hindi wasto ang ibinigay na URL. Siguraduhin na ang mga component ng URL ay na-escape nang tama. mirror_address_protocol_invalid = Ang ibinigay na URL ay hindi wasto. Ang http(s):// o git:// na lokasyon lamang ay magagamit para sa pag-mirror. mirror_lfs = Imbakan ng Malaking File (LFS) mirror_lfs_desc = I-activate ang pag-mirror ng LFS data. @@ -1203,7 +1203,7 @@ template.avatar = Avatar migrate_options = Mga opsyon sa paglipat migrate.clone_address_desc = Ang HTTP(S) o Git "clone" URL ng umiiral na repositoryo need_auth = Awtorisasyon -migrate.github_token_desc = Maaari kang maglagay ng isa o higit pang mga token na hinihiwalay ng kuwit dito upang gawing mas-mabilis ang pagmigrate dahil sa rate limit ng GitHub API. BABALA: Ang pagabuso ng feature na ito ay maaaring maglabag sa patakaran ng tagapagbigay ng serbisyo at maaaring magdulot ng pag-block ng account. +migrate.github_token_desc = Maaari kang maglagay ng isa o higit pang mga token dito na hinihiwalay ng mga kuwit upang gawing mas-mabilis ang pag-migrate sa pamamagitan ng pag-iwas sa rate limit ng GitHub API. BABALA: Ang pagabuso ng feature na ito ay maaaring maglabag sa patakaran ng tagapagbigay ng serbisyo at maaaring magdulot ng pag-block ng iyong (mga) account. template.invalid = Kailangang pumili ng kahit isang template na repositoryo migrate_options_lfs_endpoint.description = Susubukan ng migration na gamitin ang iyong Git remote upang matukoy ang LFS server. Maaari mong magtiyak ng custom na endpoint kapag ang LFS data ng repositoryo ay nakalagay sa ibang lugar. blame.ignore_revs.failed = Nabigong hindi pansinin ang mga rebisyon sa .git-blame-ignore-revs. @@ -2225,7 +2225,7 @@ milestones.modify = I-update ang milestone milestones.filter_sort.earliest_due_data = Pinakamalapit na takdang petsa milestones.filter_sort.least_complete = Hindi bababa sa kumpleto signing.will_sign = Isa-sign ang commit gamit ang key na "%s". -signing.wont_sign.error = May error na naganap habang sinusuri kung masa-sign ang commit. +signing.wont_sign.error = May error na naganap habang sinusuri kung mailalagda ang commit. signing.wont_sign.always = Palaging naka-sign ang mga commit. signing.wont_sign.twofa = Kailangang naka-enable ang authentikasyong two factor para naka-sign ang mga commit. wiki.delete_page_notice_1 = Ang pagtanggal sa pahina ng wiki na "%s" ay hindi na mababawi. Magpatuloy? @@ -2864,7 +2864,7 @@ dashboard.resync_all_sshprincipals = I-update ang ".ssh/authorized_principals" f dashboard.resync_all_hooks = I-resychronize ang mga pre-receive, update at post-receive hook para sa lahat ng mga repositoryo dashboard.cleanup_hook_task_table = Linisin ang hook_task table dashboard.cleanup_packages = Linisin ang mga na-expire na package -dashboard.cleanup_actions = Linisin ang mga na-expire na log at artifact mula sa mga aksyon +dashboard.cleanup_actions = Linisin ang mga nag-expire na log at artifact mula sa mga aksyon dashboard.server_uptime = Uptime ng server dashboard.current_goroutine = Mga kasalukuyang goroutine dashboard.total_memory_allocated = Kabuuan na na-allocate na memory diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 0c9df0afa0..0e70102012 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -340,7 +340,7 @@ no_reply_address=Domaine pour les courriels cachés no_reply_address_helper=Nom de domaine pour les utilisateurs ayant une adresse courriel cachée. Par exemple, l’utilisateur « fred » sera associé à « fred@noreply.example.org » par Git si le domaine est « noreply.example.org ». password_algorithm=Algorithme de hachage du mot de passe invalid_password_algorithm=Algorithme de hachage du mot de passe invalide -password_algorithm_helper=Définissez l’algorithme de hachage du mot de passe. Les algorithmes ont des exigences matérielles et une résistance différentes. L’algorithme argon2 est bien sécurisé mais utilise beaucoup de mémoire et peut être inapproprié pour les systèmes limités en ressources. +password_algorithm_helper=Définissez l’algorithme de hachage du mot de passe. Les algorithmes ont des exigences et une résistance différentes. L’algorithme argon2 est bien sécurisé mais utilise beaucoup de mémoire et peut être inapproprié pour les systèmes limités en ressources. enable_update_checker=Activer la vérification des mises-à-jour env_config_keys=Configuration de l'environnement env_config_keys_prompt=Les variables d'environnement suivantes seront également ajoutées à votre fichier de configuration : diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index e8ee85c61a..6a4d50c11c 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -1152,7 +1152,7 @@ mirror_interval_invalid=Starplaiks starp spoguļošanu nav derīgs. mirror_sync_on_commit=Sinhronizēt, kad tiek aizgādāti iesūtījumi mirror_address=Klonēt no URL mirror_address_desc=Nepieciešamie pieslēgšanās dati jānorāda pilnvarošanas sadaļā. -mirror_address_url_invalid=Norādītais URL ir nederīgs. Visas URL daļas ir jānorāda pareizi. +mirror_address_url_invalid=Norādītais URL ir nederīgs. Jāpārliecinās, ka visas URL daļas ir pareizi norādītas. mirror_address_protocol_invalid=Norādītais URL ir nederīgs. Var spoguļot tikai no http(s):// vai git:// adresēm. mirror_lfs=Lielu datņu krātuve (LFS) mirror_lfs_desc=Aktivēt LFS datu spoguļošanu. @@ -1242,7 +1242,7 @@ migrate_items_releases=Laidienus migrate_repo=Pārcelt glabātavu migrate.clone_address=Pārcelt/klonēt no URL migrate.clone_address_desc=Esošas glabātavas HTTP(S) vai Git "clone" URL -migrate.github_token_desc=Šeit var pievienot vienu vai vairākas ar komatiem atdalītas pilnvaras, lai pārcelšana būtu ātrāka, ja tā tiek ierobežota no GitHub API puses. Uzmanību: šīs iespējas ļaunprātīga izmantošana var pārkāpt pakalpojumu sniedzēja noteikumus un novest pie piekļuves liegšanas kontam. +migrate.github_token_desc=Šeit var pievienot vienu vai vairākas ar komatiem atdalītas pilnvaras, lai padarītu pārcelšanu ātrāku ar GitHub API pieprasījumu biežuma ierobežojuma apiešanu. Uzmanību: šīs iespējas ļaunprātīga izmantošana var pārkāpt pakalpojumu sniedzēja noteikumus un var novest pie piekļuves liegšanas kontam/iem. migrate.clone_local_path=vai servera lokālais ceļš migrate.permission_denied=Nav ļauts ievietot vietējas glabātavas. migrate.permission_denied_blocked=Nav iespējams ievietot no neatļautiem saimniekdatoriem, lūgums vaicāt pārvaldītājam pārbaudīt ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS iestatījumus. diff --git a/options/locale/locale_nds.ini b/options/locale/locale_nds.ini index 791f1b84d3..849b3717a5 100644 --- a/options/locale/locale_nds.ini +++ b/options/locale/locale_nds.ini @@ -333,7 +333,7 @@ has_unconfirmed_mail = Moin %s, du hest eene nich utwiesen E-Mail-Adress (%s< non_local_account = Frömde Brukers könen hör Passwoord nich dör de Forgejo-Internett-Brukerschnittstee vernejen. openid_register_desc = De utköört OpenID-URI is unbekannt. Verbinn dat hier mit eenem nejen Konto. disable_forgot_password_mail = Konto-Torügghalen is utknipst, denn keene E-Mail is inricht. Bidde kuntakteer dienen Sied-Chef. -authorize_application_description = Wenn du de Togang verlöövst, kann dat all diene Konto-Informatioon lesen un schrieven, ok privaate Repos un Vereenigungen. +authorize_application_description = Wenn du Togang verlöövst, kann dat all diene Konto-Informatioon lesen un schrieven, ok privaate Repos un Vereenigungen. authorization_failed_desc = Dat Anmellen is fehlslagen, denn wi hebben eene ungültig Anfraag funnen. Bidde kuntakteer de Chef vun de Programm, wat du anmellen willst. twofa_scratch_used = Du hest dien Eenmaalpasswoord bruukt. Du büst to de Twee-Faktooren-Instellens-Sied umleit worden, waar du 2FA utknipsen of een nejes Eenmaalpasswoord maken kannst. oauth.signin.error.temporarily_unavailable = Anmellen fehlslagen, denn de Anmell-Server is jüüst nich verföögbaar. Bidde versöök dat naher noch eenmaal. @@ -843,7 +843,7 @@ profile_desc = Över di hidden_comment_types_description = Kommentaar-Arden, wat hier utköört sünd, worden in Gefall-Sieden nich wiest. Wenn du to’n Bispööl »Vermark« utköörst, worden all de »›Bruker‹ hett ›Vermark‹ hentoföögt/wegdaan«-Kommentaren wegdaan. email_desc = Diene Höövd-E-Mail-Adress word för Narichtens, Passwoord-Torügghalen un, wenn se nich verburgen is, Git-Aktioonen över ’t Internett bruukt. can_not_add_email_activations_pending = Een Aktiveren staht noch ut. Wenn du eene neje E-Mail-Adress hentofögen willst, versöök dat in een paar Menüten noch eenmaal. -email_deletion_desc = De E-Mail-Adress un daarmit verbunnen Informatioon word ut dienem Konto wegdaan. Git-Kommitterens vun deeser E-Mail-Adress worden nich ännert. Wiedermaken? +email_deletion_desc = Deese E-Mail-Adress un daarmit verbunnen Informatioon word ut dienem Konto wegdaan. Git-Kommitterens vun deeser E-Mail-Adress worden nich ännert. Wiedermaken? principal_desc = Deese SSH-Zertifikaat-Höövdmannen sünd mit dienem Konto verbunnen un geven kumpleten Togriep up diene Repositoriums. add_email_confirmation_sent = Eene Utwiesens-E-Mail is an »%s« schickt worden. Um diene E-Mail-Adress uttowiesen, kiek bidde in dienen E-Mail-Ingang un folg de Verwies daarin in de anner %s. ssh_desc = Deese publiken SSH-Slötels sünd mit dienem Konto verbunnen. De tohörig privaate Slötel gifft kumpleten Togriep up diene Repositoriums. SSH-Slötels, wat utwiest worden sünd, könen bruukt worden, um SSH-unnerschreven Git-Kommitterens uttowiesen. @@ -1638,7 +1638,7 @@ pulls.showing_specified_commit_range = Blots Ännerns vun Kommitterens %[1]s bit pulls.review_only_possible_for_full_diff = Nakieken gaht blots, wenn de hele Unnerscheed wiest word pulls.filter_changes_by_commit = Na Kommitteren filtern pulls.nothing_to_compare = Deese Twiegen sünd gliek. ’t is nich nödig, eenen Haalvörslag to maken. -pulls.nothing_to_compare_have_tag = De utköört Twieg/Mark sünd gliek. +pulls.nothing_to_compare_have_tag = De utköört Twiegen/Marken sünd gliek. pulls.create = Haalvörslag maken pulls.title_desc_one = will %[1]d Kommitteren vun %[2]s na %[3]s tosamenföhren pulls.merged_title_desc_one = hett %[1]d Kommitteren vun %[2]s na %[3]s %[4]s tosamenföhrt @@ -2547,12 +2547,12 @@ issues.label_exclusive_desc = Benööm de Vermark Rebeet/Ding, daar issues.label_exclusive_warning = Elkeen anner Vermark in de sülve Rebeet word wegdaan, wenn de Vermarkens vun eenem Gefall of Haalvörslag bewarkt worden. blame.ignore_revs.failed = Kunn de Versioonen in de .git-blame-ignore-revs nich minnachten. invisible_runes_line = `Deese Rieg hett verburgen Unicode-Bookstavens` -mirror_address_url_invalid = De angeven URL is ungültig. Du muttst all Delen vun de URL recht utkielen. +mirror_address_url_invalid = De angeven URL is ungültig. Wees wiss, dat de Delen vun de URL recht utkielt sünd. mirror_address_protocol_invalid = De angeven URL is ungültig. Blots Steden vun de Aarden »http(s)://« of »git://« könen tum Spegeln bruukt worden. mirror_use_ssh.helper = Forgejo spegelt dat Repositorium mit Git över SSH un maakt för di een Slötelpaar, wenn du deese Instellen utköörst. Du muttst wiss maken, dat de maakt publike Slötel dat Recht kriggt, to de Enn-Repositorium to schuven. Wenn du dat utköörst, kannst du keen Anmellen mit Passwoord bruken. migrate.permission_denied_blocked = Du kannst nich vun verboden Servers importeren; bidde fraag de Chef, of he de Instellens ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS överprüfen maag. blame.ignore_revs = Minnacht Versioonen in .git-blame-ignore-revs. Klick hier, um daar överwegtogahn un de normaale Schüld-Ansicht to wiesen. -migrate.github_token_desc = Du kannst hier een of mehr Tekens angeven, wat mit Kommas trennt sünd, um dat Umtrecken fixer to maken, um de GitHub-API-Togrieps-Begrenz. WAHRSCHAU: Wenn du dat missbruukst, kannst du de Richtlienjen vun de Deenstbedriev verletzen un dien Konto kann sperrt worden. +migrate.github_token_desc = Du kannst hier een of mehr Tekens angeven, wat mit Kommas trennt sünd, um de GitHub-API-Togrieps-Begrenz to umgahn un so dat Umtrecken fixer to maken. WAHRSCHAU: Wenn du dat missbruukst, kannst du de Richtlienjen vun de Deenstbedriev verletzen un diene Konten könen villicht sperrt worden. issues.edit.already_changed = Kann Ännerns an de Gefall nich sekern. Dat schient, dat de Inholl al vun een anner Bruker ännert worden is. Bidde laad de Sied neei un versöök, dat dann noch eenmaal to bewarken, daarmit du hör Ännerns nich överschriffst broken_message = De Git-Daten unner deesem Repositorium könen nich lesen worden. Kuntakteer de Chef vun deeser Instanz of löske dat Repositorium. ambiguous_runes_header = `Deese Datei enthollt verwesselbaare Unicode-Bookstavens` diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 242b915137..78b7479625 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -468,7 +468,7 @@ email_domain_blacklisted=Você não pode se cadastrar com seu endereço de e-mai authorize_application=Autorizar aplicativo authorize_redirect_notice=Você será redirecionado para %s se você autorizar este aplicativo. authorize_application_created_by=Este aplicativo foi criado por %s. -authorize_application_description=Se você conceder o acesso, isso permitirá acessar e alterar todas as informações da sua conta, incluindo repositórios privados e organizações. +authorize_application_description=Se você conceder acesso, isso permitirá acessar e alterar todas as informações da sua conta, incluindo repositórios privados e organizações. authorize_title=Autorizar "%s" para acessar sua conta? authorization_failed=Autorização falhou authorization_failed_desc=A autorização falhou porque detectamos uma solicitação inválida. Entre em contato com o responsável do aplicativo que você tentou autorizar. @@ -829,7 +829,7 @@ activations_pending=Ativações pendentes can_not_add_email_activations_pending=Há uma ativação pendente, tente novamente em alguns minutos se quiser adicionar um novo e-mail. delete_email=Remover email_deletion=Remover endereço de e-mail -email_deletion_desc=O endereço de e-mail e informações relacionadas serão removidos de sua conta. Commits aplicados por este endereço de e-mail permanecerão inalterados. Continuar? +email_deletion_desc=Este endereço de e-mail e informações relacionadas serão removidos de sua conta. Commits aplicados por este endereço de e-mail permanecerão inalterados. Continuar? email_deletion_success=O endereço de e-mail foi removido. theme_update_success=Seu tema foi atualizado. theme_update_error=O tema selecionado não existe. @@ -1151,7 +1151,7 @@ mirror_interval_invalid=O intervalo do espelhamento não é válido. mirror_sync_on_commit=Sincronizar quando commits forem enviados mirror_address=Clonar a partir de URL mirror_address_desc=Coloque todas as credenciais necessárias na seção de autorização. -mirror_address_url_invalid=A URL fornecida é inválida. Você deve escapar todos os componentes da URL corretamente. +mirror_address_url_invalid=A URL fornecida é inválida. Certifique-se de escapar os componentes da URL corretamente. mirror_address_protocol_invalid=O URL fornecido é inválido. Somente locais http(s):// ou git:// podem ser usados para espelhamento. mirror_lfs=Armazenamento de Arquivo Grande (LFS) mirror_lfs_desc=Ativar espelhamento de dados LFS. @@ -1235,7 +1235,7 @@ migrate_items_releases=Versões migrate_repo=Migrar repositório migrate.clone_address=Migrar / Clonar de URL migrate.clone_address_desc=URL HTTP(S) ou comando git "clone" de um repositório existente -migrate.github_token_desc=Você pode colocar aqui um ou mais tokens separados por vírgulas para tornar a migração mais rápida para compensar o limite de taxa de API do GitHub. AVISO: abusar desse recurso pode violar a política do provedor de serviços e levar ao bloqueio da conta. +migrate.github_token_desc=Você pode colocar aqui um ou mais tokens separados por vírgulas para tornar a migração mais rápida ao evitar o limite de taxa de API do GitHub. AVISO: abusar desse recurso pode violar a política do provedor de serviços e pode levar ao bloqueio da(s) conta(s). migrate.clone_local_path=ou um caminho de servidor local migrate.permission_denied=Você não pode importar repositórios locais. migrate.permission_denied_blocked=Você não pode importar dos hosts não permitidos, por favor peça ao administrador para verificar as configurações ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS. @@ -2773,7 +2773,7 @@ subscribe.issue.guest.tooltip = Faça login para receber notificações desta qu settings.federation_not_enabled = O recurso de federação não está habilitado em seu servidor. settings.trust_model.committer.desc = Uma assinatura de commit é considerada "confiável" caso corresponda ao autor do commit, caso contrário será definida como "discordante". Isso permite delegar a autoria de commits ao Forgejo, adicionando créditos ao autor original nos campos "Co-authored-by" e "Co-commited-by" no final do commit. A chave padrão do Forgejo deve corresponder à chave de um usuário no banco de dados. settings.wiki_branch_rename_success = O nome do ramo da wiki do repositório foi regularizado com sucesso. -pulls.nothing_to_compare_have_tag = O ramo/etiqueta escolhidos são iguais. +pulls.nothing_to_compare_have_tag = Os branches/etiquetas escolhidos são iguais. settings.sourcehut_builds.secrets = Segredos release.download_count_few = %s downloads release.hide_archive_links = Ocultar arquivos gerados automaticamente @@ -3603,7 +3603,7 @@ config.cache_test_slow = Teste de cache bem-sucedido, mas a resposta é lenta: % config.cache_test = Cache de Teste config.cache_test_failed = Falha ao sondar o cache: %v. self_check.database_collation_mismatch = Esperar que o banco de dados use o ordenamento: %s -dashboard.cleanup_actions = Limpar logs expirados e artefatos de ações +dashboard.cleanup_actions = Limpar logs expirados e artefatos de Actions emails.delete = Deletar email emails.delete_primary_email_error = Você não pode excluir o email principal. emails.deletion_success = O endereço de email foi excluído. diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index c7cccc012c..1d96b2d4c8 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -471,7 +471,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=Ошибка авторизации, обнаружен неверный запрос. Пожалуйста, свяжитесь с автором приложения, которое вы пытались авторизовать. @@ -1068,7 +1068,7 @@ change_username_redirect_prompt.with_cooldown.few = Прежнее имя буд keep_pronouns_private = Показывать местоимения только зарегистрированным пользователям keep_pronouns_private.description = Местоимения будут скрыты от пользователей, не имеющих учётных записей на сервере. quota.applies_to_user = Эти ограничения хранилища применяются к вашей учётной записи -quota.applies_to_org = Эти ограничения хранилища применяются к этой организации +quota.applies_to_org = К этой организации применяются следующие ограничения quota.sizes.repos.public = Общедоступные репозитории storage_overview = Использование места quota = Ограничения хранилища @@ -1232,7 +1232,7 @@ migrate_items_releases=Выпуски migrate_repo=Перенос репозитория migrate.clone_address=Перенос / Клонирование по URL migrate.clone_address_desc=HTTP/HTTPS или Git адрес существующего репозитория -migrate.github_token_desc=Вы можете указать один или несколько разделенных запятыми токенов, чтобы ускорить перенос за счёт обхода ограничений частоты обращений к API GitHub. ПРЕДУПРЕЖДЕНИЕ: злоупотребление этой функцией может нарушить условия предоставления услуг и привести к блокировке учётной записи. +migrate.github_token_desc=Вы можете поместить здесь один или несколько токенов, разделенных запятыми, чтобы ускорить миграцию за счет обхода ограничения скорости API GitHub. ПРЕДУПРЕЖДЕНИЕ: Злоупотребление этой функцией может нарушить политику поставщика услуг и привести к блокировке вашей учетной записи (ов). migrate.clone_local_path=или локальный путь на сервере migrate.permission_denied=У вас нет прав на импорт локальных репозиториев. migrate.permission_denied_blocked=Вы не можете импортировать с запрещённых хостов, пожалуйста, попросите администратора проверить настройки ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS. @@ -2698,7 +2698,7 @@ error.csv.invalid_field_count=Не удается отобразить этот mirror_address_protocol_invalid = Эта ссылка недействительна. Для зеркалирования можно использовать только расположения http(s):// и git:// . fork_no_valid_owners = Невозможно создать ответвление этого репозитория, т.к. здесь нет действующих владельцев. new_repo_helper = Репозиторий содержит все файлы проекта и историю изменений. Уже где-то есть репозиторий? Выполните перенос. -mirror_address_url_invalid = Эта ссылка недействительна. Необходимо правильно указать все части адреса. +mirror_address_url_invalid = Указанный URL-адрес недействителен. Убедитесь, что компоненты URL-адреса экранированы правильно. issues.comment.blocked_by_user = Вы не можете комментировать под этой задачей, т.к. вы заблокированы владельцем репозитория или автором задачи. pulls.blocked_by_user = Невозможно создать запрос на слияние в этом репозитории, т.к. вы заблокированы его владельцем. settings.add_collaborator_blocked_our = Невозможно добавить соучастника, т.к. он заблокирован в этом репозитории. @@ -2756,7 +2756,7 @@ ambiguous_runes_description = `Этот файл содержит символы editor.invalid_commit_mail = Неправильная почта для создания коммита. pulls.has_merged = Слияние не удалось: запрос уже был слит, изменение целевой ветви или повторное слияние невозможно. settings.enter_repo_name = Введите имя владельца и название репозитория как указано: -signing.wont_sign.error = Не удалось проверить возможность подписать коммит. +signing.wont_sign.error = Произошла ошибка при проверке возможности подписания коммита. signing.wont_sign.nokey = Сервер не предоставляет ключ для подписи коммита. settings.wiki_globally_editable = Разрешить редактирование вики всем пользователям settings.webhook.test_delivery_desc_disabled = Активируйте этот веб-хук для проверки тестовым событием. diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index e071fa76f4..332a855e88 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -320,7 +320,7 @@ sqlite3_not_available=Ця версія Forgejo не підтримує SQLite3. invalid_db_setting=Налаштування бази даних є некоректними: %v invalid_repo_path=Помилковий шлях до кореня репозиторію: %v invalid_app_data_path=Некоректний шлях до даних програми: %v -run_user_not_match=Ім'я в «Користувач, від якого запустити» не є ім'ям поточного користувача: %s -> %s +run_user_not_match=Ім'я в «Користувач, від якого запустити» не є ім'ям поточного користувача: %s → %s internal_token_failed=Не вдалося згенерувати внутрішній токен: %v secret_key_failed=Не вдалося згенерувати секретний ключ: %v save_config_failed=Не в змозі зберегти конфігурацію: %v @@ -792,7 +792,7 @@ activate_email=Надіслати активацію activations_pending=Активації в очікуванні delete_email=Видалити email_deletion=Видалити адресу електронної пошти -email_deletion_desc=Електронна адреса та пов'язана з нею інформація буде видалена з вашого облікового запису. Git коміти, здійснені через цю електронну адресу, залишиться без змін. Продовжити? +email_deletion_desc=Цю електронну адресу та пов'язану з нею інформацію буде видалено з вашого облікового запису. Коміти Git, здійснені через цю електронну адресу, залишаться без змін. Продовжити? email_deletion_success=Адресу електронної пошти було видалено. theme_update_success=Тему оновлено. theme_update_error=Вибрана тема не існує. @@ -908,7 +908,7 @@ oauth2_application_create_description=Програми OAuth2 надають в authorized_oauth2_applications=Авторизовані програми OAuth2 revoke_key=Відкликати -revoke_oauth2_grant=Скасувати доступ +revoke_oauth2_grant=Відкликати доступ revoke_oauth2_grant_description=Скасування доступу для цієї програми третьої сторони не дозволить їй отримувати доступ до ваших даних. Ви впевнені? twofa_desc=Двофакторна автентифікація підвищує безпеку вашого облікового запису. @@ -934,7 +934,7 @@ manage_account_links_desc=Ці зовнішні акаунти прив'язан account_links_not_available=Наразі немає зовнішніх облікових записів, пов'язаних із вашим обліковим записом Forgejo. link_account=Прив'язати обліковий запис remove_account_link=Видалити пов'язаний обліковий запис -remove_account_link_desc=Видалення пов'язаного облікового запису відкликає його доступ до вашого облікового запису Forgejo. Продовжити? +remove_account_link_desc=Видалення пов'язаного облікового запису скасує його доступ до вашого облікового запису Forgejo. Продовжити? remove_account_link_success=Зв'язаний обліковий запис видалено. @@ -1092,7 +1092,7 @@ template_description=Шаблонні репозиторії дозволяют visibility=Видимість visibility_description=Тільки власник або члени організації які мають віповідні права, зможуть побачити. visibility_helper_forced=Адміністратор вашого сайту налаштував параметри: всі нові репозиторії будуть приватними. -visibility_fork_helper=(Ці зміни вплинуть на всі форки.) +visibility_fork_helper=(Буде змінено видимість усіх форків.) clone_helper=Потрібна допомога у клонуванні? Відвідайте сторінку Допомога. fork_repo=Створити форк репозиторію fork_from=Форк з @@ -1157,9 +1157,9 @@ delete_preexisting_success=Видалено неприйняті файли в % blame_prior=Переглянути анотацію, що передує цій зміні -transfer.accept=Дозволити трансфер +transfer.accept=Прийняти передачу transfer.accept_desc=`Перемістити до "%s"` -transfer.reject=Відхилити трансфер +transfer.reject=Відхилити передачу transfer.reject_desc=`Скасувати переміщення до "%s"` desc.private=Приватний @@ -1957,7 +1957,7 @@ settings.transfer_notices_1=- Ви втратите доступ до репоз settings.transfer_notices_2=- Ви збережете доступ, якщо новим власником стане організація, власником якої ви є. settings.transfer_notices_3=- Якщо репозиторій є приватним і передається окремому користувачеві, ця дія гарантує, що користувач має хоча б дозвіл на читаня репозитарію (і при необхідності змінює права дозволів). settings.transfer_owner=Новий власник -settings.transfer_perform=Здійснити перенесення +settings.transfer_perform=Здійснити передачу settings.transfer_started=`Цей репозиторій чекає підтвердження перенесення від "%s"` settings.transfer_succeed=Репозиторій був перенесений. settings.signing_settings=Параметри перевірки підпису @@ -2335,7 +2335,7 @@ issues.filter_poster_no_select = Усі автори pulls.merged_info_text = Гілку %s тепер можна видалити. find_file.go_to_file = Знайти файл visibility_helper = Зробити репозиторій приватним -projects.card_type.desc = Попередній вигляд карток +projects.card_type.desc = Попередній перегляд карток projects.card_type.text_only = Лише текст projects.card_type.images_and_text = Зображення і текст issues.filter_poster = Автор @@ -2572,7 +2572,7 @@ new_repo_helper = Репозиторій містить усі файли про issues.reference_link = Посилання: %s object_format_helper = Формат об'єктів репозиторія. Змінити потім неможливо. SHA1 — найсумісніший. mirror_interval = Інтервал синхронізації дзеркала (часові одиниці — «h», «m», «s»). 0 вимикає синхронізацію. (Мінімальний інтервал: %s) -mirror_address_url_invalid = Вказано хибну URL-адресу. Замініть escape-послідовностями всі неоднозначні складники адреси. +mirror_address_url_invalid = Вказано хибну URL-адресу. Впевніться, що всі неоднозначні складники адреси замінено escape-послідовностями. mirror_address_protocol_invalid = Хибна URL-адреса. Лише адреси http(s):// чи git:// можна використовувати для віддзеркалення. stars_remove_warning = Це вилучить усі зірки репозиторія. mirror_use_ssh.not_available = SSH-вхід недоступний. @@ -2825,6 +2825,21 @@ settings.mirror_settings.docs.disabled_pull_mirror.instructions = Налашту issues.label_templates.fail_to_load_file = Не вдалося завантажити файл шаблону міток «%s»: %v migrate.github.description = Перенесіть дані з github.com або сервера GitHub Enterprise. migrate.cancel_migrating_confirm = Бажаєте скасувати перенесення? +transfer.no_permission_to_accept = У вас немає дозволу прийняти цю передачу. +transfer.no_permission_to_reject = У вас немає дозволу відхилити цю передачу. +issues.choose.ignore_invalid_templates = Недійсні шаблони проігноровано +issues.choose.invalid_templates = Знайдено %v недійсних шаблонів +settings.transfer_abort_success = Передачу репозиторію %s успішно скасовано. +pulls.cmd_instruction_checkout_title = Переключення гілок +pulls.cmd_instruction_checkout_desc = З репозиторію вашого проєкту переключіться на нову гілку і протестуйте зміни. +issues.review.pending.tooltip = Цей коментар наразі невидимий для інших користувачів. Щоб надіслати коментарі у черзі, виберіть «%s» → «%s/%s/%s» у верхній частині сторінки. +issues.dependency.issue_batch_close_blocked = Неможливо виконати пакетне закриття вибраних задач, оскільки задача #%d має відкриті залежності +commit.revert = Вивернути +commit.revert-header = Вивернути: %s +editor.revert = Вивернути %s на: +commit.revert-content = Оберіть гілку, на яку вивернути: +pulls.cmd_instruction_merge_warning = Увага: в цьому репозиторії не ввімкнено «Автовизначення ручного об'єднання», тож позначити цей запит як об'єднаний вручну вам доведеться самостійно. +topic.format_prompt = Теми повинні починатися з літери або цифри, можуть містити дефіси («-») і крапки («.») і мати довжину до 35 символів. Дозволено використання лише малих літер. [graphs] contributors.what = внески @@ -2956,6 +2971,10 @@ teams.invite.by = Вас запрошує %s teams.invite_team_member.list = Запрошення в очікуванні form.name_pattern_not_allowed = Вираз «%s» не може бути частиною назви організації. teams.add_nonexistent_repo = Репозиторій, який ви намагаєтеся додати, не існує. Спочатку створіть його. +settings.change_orgname_prompt = Зауважте, зміна назви організації також змінить URL-адресу організації і звільнить стару назву. +teams.none_access_helper = Опція «Немає доступу» впливає лише на приватні репозиторії. +teams.general_access_helper = Дозволи учасників будуть визначатися відповідно до наведеної нижче таблиці дозволів. +teams.general_access = Індивідуальний доступ [admin] dashboard=Панель управління @@ -3008,7 +3027,7 @@ dashboard.resync_all_sshprincipals=Оновити файл «.ssh/authorized_pri dashboard.resync_all_hooks=Пересинхронізувати хуки pre-receive, update та post-receive в усіх репозиторіях dashboard.reinit_missing_repos=Переініціалізувати усі репозитрії git-файли яких втрачено dashboard.sync_external_users=Синхронізувати дані зовнішніх користувачів -dashboard.cleanup_hook_task_table=Очистити hook_task таблицю +dashboard.cleanup_hook_task_table=Очистити таблицю hook_task dashboard.server_uptime=Час роботи сервера dashboard.current_goroutine=Поточна кількість Goroutines dashboard.current_memory_usage=Поточне використання пам'яті @@ -3030,16 +3049,16 @@ dashboard.mspan_structures_obtained=Отримано структур MSpan dashboard.mcache_structures_usage=Використання структур MCache dashboard.mcache_structures_obtained=Отримано структур MCache dashboard.profiling_bucket_hash_table_obtained=Отримано хеш-таблиць профілювання -dashboard.gc_metadata_obtained=Отримано метаданих збирача сміття (GC) +dashboard.gc_metadata_obtained=Отримано метаданих збирача сміття dashboard.other_system_allocation_obtained=Отримання інших виділень пам'яті -dashboard.next_gc_recycle=Наступний цикл збирача сміття (GC) -dashboard.last_gc_time=З останнього запуску збирача сміття (GC) +dashboard.next_gc_recycle=Наступний цикл збирача сміття +dashboard.last_gc_time=З останнього запуску збирача сміття dashboard.total_gc_time=Загальна пауза збирача сміття (GC) -dashboard.total_gc_pause=Загальна пауза збирача сміття (GC) -dashboard.last_gc_pause=Остання пауза збирача сміття (GC) -dashboard.gc_times=Кількість запусків збирача сміття (GC) -dashboard.delete_old_actions=Видалити всі старі дії з бази даних -dashboard.delete_old_actions.started=Видалення всіх старі дії з бази даних розпочато. +dashboard.total_gc_pause=Загальна пауза збирача сміття +dashboard.last_gc_pause=Остання пауза збирача сміття +dashboard.gc_times=Кількість запусків збирача сміття +dashboard.delete_old_actions=Видалити всі старі активності з бази даних +dashboard.delete_old_actions.started=Розпочато видалення всіх старих активностей з бази даних. users.user_manage_panel=Керування обліковими записами users.new_account=Створити обліковий запис @@ -3247,7 +3266,7 @@ config.git_version=Версія Git config.repo_root_path=Шлях до кореня репозиторію config.lfs_root_path=Кореневий шлях LFS config.log_file_root_path=Шлях до лог файлу -config.script_type=Тип скрипта +config.script_type=Тип скрипту config.reverse_auth_user=Користувач для авторизації на зворотному проксі config.ssh_config=Конфігурація SSH @@ -3296,7 +3315,7 @@ config.default_enable_timetracking=Увімкнути відстеження ч config.default_allow_only_contributors_to_track_time=Враховувати тільки учасників розробки в підрахунку часу config.no_reply_address=Домен прихованих адрес електронної пошти config.default_visibility_organization=Видимість за замовчуванням для нових організацій -config.default_enable_dependencies=Увімкнути залежності задачі за замовчуванням +config.default_enable_dependencies=Увімкнути залежності задач за замовчуванням config.webhook_config=Конфігурація вебхуків config.queue_length=Довжина черги @@ -3327,7 +3346,7 @@ config.session_config=Конфігурація сесії config.session_provider=Провайдер сесії config.provider_config=Конфігурація постачальника config.cookie_name=Назва файлу cookie -config.gc_interval_time=Інтервал запуску збирача сміття (GC) +config.gc_interval_time=Інтервал запуску збирача сміття config.session_life_time=Час життя сесії config.https_only=Тільки HTTPS config.cookie_life_time=Час життя файлу cookie @@ -3342,12 +3361,12 @@ config.git_disable_diff_highlight=Вимкнути підсвітку синта config.git_max_diff_lines=Максимум рядків на diff (на один файл) config.git_max_diff_line_characters=Максимум символів на diff (на одну строку) config.git_max_diff_files=Максимум diff-файлів (для показу) -config.git_gc_args=Аргументи збирача сміття (GC) +config.git_gc_args=Аргументи збирача сміття config.git_migrate_timeout=Тайм-аут міграції config.git_mirror_timeout=Тайм-аут оновлення дзеркала config.git_clone_timeout=Тайм-аут операції клонування -config.git_pull_timeout=Тайм-аут операції Pull -config.git_gc_timeout=Тайм-аут операції збирача сміття (GC) +config.git_pull_timeout=Тайм-аут операції отримання змін +config.git_gc_timeout=Тайм-аут операції збирача сміття config.log_config=Конфігурація журналу config.disabled_logger=Вимкнено @@ -3386,9 +3405,9 @@ monitor.queue.settings.submit=Оновити налаштування monitor.queue.settings.changed=Налаштування оновлено notices.system_notice_list=Сповіщення системи -notices.view_detail_header=Переглянути деталі повідомлення +notices.view_detail_header=Подробиці сповіщення notices.select_all=Вибрати все -notices.deselect_all=Скасувати виділення +notices.deselect_all=Скасувати вибір notices.inverse_selection=Інвертувати виділене notices.delete_selected=Видалити вибране notices.delete_all=Видалити всі cповіщення @@ -3481,6 +3500,11 @@ config.cache_test_slow = Перевірку кешу завершено успі config.cache_test_succeeded = Перевірку кешу завершено успішно, відповідь отримано через %s. config.cache_test = Перевірити кеш config.cache_test_failed = Не вдалося перевірити кеш: %v. +dashboard.rebuild_issue_indexer = Перебудувати індексатор задач +users.details = Дані користувача +auths.login_source_exist = Джерело автентифікації «%s» вже існує. +dashboard.delete_old_system_notices = Видалити всі старі сповіщення системи з бази даних +users.purge = Повністю видалити користувач_ку [action] @@ -3709,6 +3733,27 @@ maven.install2 = Запустити з командного рядка: npm.dependencies.bundle = Пакетні залежності npm.dependencies.peer = Однорангові залежності arch.pacman.repo.multi = %s має одну й ту саму версію в різних дистрибутивах. +owner.settings.cargo.rebuild = Перебудувати індекс +owner.settings.cleanuprules.none = Правил очистки ще немає. +owner.settings.cleanuprules.preview.none = Правило очистки не відповідає жодному пакунку. +owner.settings.cargo.initialize = Ініціалізувати індекс +owner.settings.cargo.initialize.description = Для реєстру Cargo потрібен спеціальний Git-репозиторій з індексом. Використання цієї опції (пере)створить репозиторій і автоматично його налаштує. +owner.settings.cargo.initialize.error = Не вдалося ініціалізувати індекс Cargo: %v +owner.settings.cargo.initialize.success = Індекс Cargo успішно створено. +owner.settings.cargo.rebuild.error = Не вдалося перебудувати індекс Cargo: %v +owner.settings.cargo.title = Індекс реєстру Cargo +owner.settings.cleanuprules.title = Правила очистки +owner.settings.cleanuprules.add = Додати правило очистки +owner.settings.cargo.rebuild.success = Індекс Cargo успішно перебудувано. +owner.settings.cleanuprules.success.update = Правило очистки оновлено. +owner.settings.cleanuprules.success.delete = Правило очистки видалено. +owner.settings.cleanuprules.edit = Редагувати правило очистки +owner.settings.cleanuprules.preview = Попередній перегляд правила очистки +owner.settings.cargo.rebuild.description = Перебудування може бути корисним, якщо індекс не синхронізовано зі збереженими пакунками Cargo. +rpm.distros.redhat = у дистрибутивах на основі RedHat +rpm.distros.suse = у дистрибутивах на основі SUSE +owner.settings.cargo.rebuild.no_index = Неможливо перебудувати, індекс не ініціалізовано. +alpine.registry.key = Завантажте відкритий RSA-ключ реєстру в папку /etc/apk/keys/ для перевірки підпису індексу: [secrets] deletion = Видалити секрет diff --git a/options/locale_next/locale_ar.json b/options/locale_next/locale_ar.json index eca76a5ba7..6cca2187a0 100644 --- a/options/locale_next/locale_ar.json +++ b/options/locale_next/locale_ar.json @@ -137,5 +137,9 @@ "moderation.report_abuse": "الإبلاغ عن إساءة الاستخدام", "feed.atom.link": "موجز Atom", "admin.config.moderation_config": "تهيئة الإشراف", - "mail.actions.successful_run_after_failure_subject": "تم استعادة سير العمل %[1]s في المستودع %[2]s" + "mail.actions.successful_run_after_failure_subject": "تم استعادة سير العمل %[1]s في المستودع %[2]s", + "discussion.sidebar.reference": "مرجع", + "admin.moderation.moderation_reports": "تقارير الإشراف", + "admin.moderation.reports": "التقارير", + "admin.moderation.no_open_reports": "لا يوجد حالياً أية تقارير مفتوحة." } diff --git a/options/locale_next/locale_cs-CZ.json b/options/locale_next/locale_cs-CZ.json index b47c594348..8de6c46ad8 100644 --- a/options/locale_next/locale_cs-CZ.json +++ b/options/locale_next/locale_cs-CZ.json @@ -34,9 +34,9 @@ "discussion.locked": "Tato diskuze byla uzamčena. Komentování je omezené na přispěvatele.", "relativetime.future": "v budoucnu", "relativetime.years": { - "one": "Před %d rokem", - "few": "Před %d lety", - "other": "Před %d lety" + "one": "před %d rokem", + "few": "před %d lety", + "other": "před %d lety" }, "relativetime.1day": "včera", "relativetime.2days": "před dvěma dny", @@ -47,30 +47,30 @@ "relativetime.1year": "minulý rok", "relativetime.2years": "před dvěma lety", "relativetime.weeks": { - "one": "Před %d týdnem", - "few": "Před %d týdny", - "other": "Před %d týdny" + "one": "před %d týdnem", + "few": "před %d týdny", + "other": "před %d týdny" }, "relativetime.days": { - "one": "Před %d dnem", - "few": "Před %d dny", - "other": "Před %d dny" + "one": "před %d dnem", + "few": "před %d dny", + "other": "před %d dny" }, "relativetime.mins": { - "one": "Před %d minutou", - "few": "Před %d minutami", - "other": "Před %d minutami" + "one": "před %d minutou", + "few": "před %d minutami", + "other": "před %d minutami" }, "relativetime.hours": { - "one": "Před %d hodinou", - "few": "Před %d hodinami", - "other": "Před %d hodinami" + "one": "před %d hodinou", + "few": "před %d hodinami", + "other": "před %d hodinami" }, "relativetime.now": "nyní", "relativetime.months": { - "one": "Před %d měsícem", - "few": "Před %d měsíci", - "other": "Před %d měsíci" + "one": "před %d měsícem", + "few": "před %d měsíci", + "other": "před %d měsíci" }, "moderation.report_content": "Nahlásit obsah", "moderation.report_abuse_form.details": "Tento formulář je určen k nahlašování uživatelů, kteří si vytvářejí spamové profily, repozitáře, problémy, komentáře nebo se chovají nevhodně.", @@ -101,7 +101,7 @@ "editor.textarea.tab_hint": "Řádek je již odsazen. Pro opuštění editoru stiskněte znovu Tab nebo Escape.", "editor.textarea.shift_tab_hint": "Na tomto řádku není žádné odsazení. Pro opuštění editoru stiskněte znovu Shift + Tab nebo Escape.", "admin.dashboard.cleanup_offline_runners": "Vymazat offline runnery", - "settings.visibility.description": "Viditelnost profilu ovlivňuje možnost ostatních přistupovat k vašim veřejným repozitářům. Zjistit více", + "settings.visibility.description": "Viditelnost profilu ovlivňuje možnost ostatních přistupovat k vašim veřejným repozitářům. Zjistit více.", "avatar.constraints_hint": "Velikost vlastního avataru nesmí překročit %[1]s nebo být větší než %[2]dx%[3]d pixelů", "repo.diff.commit.next-short": "Další", "repo.diff.commit.previous-short": "Předchozí", @@ -113,5 +113,10 @@ "og.repo.summary_card.alt_description": "Karta se souhrnem repozitáře %[1]s, popsaným jako: %[2]s", "mail.actions.run_info_sha": "Revize: %[1]s", "repo.settings.push_mirror.branch_filter.label": "Filtr větve (nepovinný)", - "repo.settings.push_mirror.branch_filter.description": "Větve, které mají být zrcadleny. Ponechte prázdné pro zrcadlení všech větví. Syntaxi naleznete v dokumentaci %[2]s. Příklady: main, release/*" + "repo.settings.push_mirror.branch_filter.description": "Větve, které mají být zrcadleny. Ponechte prázdné pro zrcadlení všech větví. Syntaxi naleznete v dokumentaci %[2]s. Příklady: main, release/*", + "discussion.sidebar.reference": "Reference", + "admin.moderation.moderation_reports": "Hlášení moderace", + "admin.moderation.reports": "Hlášení", + "admin.moderation.deleted_content_ref": "Nahlášený obsah s typem %[1]v a ID %[2]d již neexistuje", + "admin.moderation.no_open_reports": "Momentálně nejsou otevřena žádná hlášení." } diff --git a/options/locale_next/locale_de-DE.json b/options/locale_next/locale_de-DE.json index 5a3ceef7e5..e8b0976994 100644 --- a/options/locale_next/locale_de-DE.json +++ b/options/locale_next/locale_de-DE.json @@ -93,7 +93,7 @@ "editor.textarea.tab_hint": "Zeile bereits eingerückt. Drücke nochmals Tab oder Escape, um den Editor zu verlassen.", "editor.textarea.shift_tab_hint": "Keine Einrückung auf dieser Zeile. Drücke nochmals Shift + Tab oder Escape, um den Editor zu verlassen.", "admin.dashboard.cleanup_offline_runners": "Aufräumen der Offline-Runner", - "settings.visibility.description": "Die Profilsichtbarkeit beeinflusst die Möglichkeit anderer, auf deine nicht-privaten Repositorys zuzugreifen. Erfahre mehr", + "settings.visibility.description": "Die Profilsichtbarkeit beeinflusst die Möglichkeit anderer, auf deine nicht-privaten Repositorys zuzugreifen. Erfahre mehr.", "avatar.constraints_hint": "Individuelles Profilbild darf %[1]s in der Größe nicht überschreiten, und nicht größer als %[2]d×%[3]d Pixel sein", "repo.diff.commit.next-short": "Nächste", "repo.diff.commit.previous-short": "Vorherige", @@ -105,5 +105,10 @@ "og.repo.summary_card.alt_description": "Zusammenfassungskarte des Repositorys %[1]s, beschrieben als %[2]s", "mail.actions.run_info_sha": "Commit: %[1]s", "repo.settings.push_mirror.branch_filter.label": "Branch-Filter (optional)", - "repo.settings.push_mirror.branch_filter.description": "Zu spiegelnde Branches. Leer lassen, um alle Branches zu spiegeln. Siehe die „%[2]s“-Dokumentation für die Syntax. Beispiele: main, release/*" + "repo.settings.push_mirror.branch_filter.description": "Zu spiegelnde Branches. Leer lassen, um alle Branches zu spiegeln. Siehe die „%[2]s“-Dokumentation für die Syntax. Beispiele: main, release/*", + "discussion.sidebar.reference": "Referenz", + "admin.moderation.deleted_content_ref": "Gemeldeter Inhalt vom Typ %[1]v und ID %[2]d existiert nicht mehr", + "admin.moderation.moderation_reports": "Moderationsmeldungen", + "admin.moderation.reports": "Meldungen", + "admin.moderation.no_open_reports": "Es gibt momentan keine offenen Meldungen." } diff --git a/options/locale_next/locale_fil.json b/options/locale_next/locale_fil.json index 6ec601c538..6eb2039ab4 100644 --- a/options/locale_next/locale_fil.json +++ b/options/locale_next/locale_fil.json @@ -93,7 +93,7 @@ "editor.textarea.tab_hint": "Naka-indent na ang linya. Pindutin ulit ang Tab o Escape para umalis sa editor.", "editor.textarea.shift_tab_hint": "Walang indentation sa linyang ito. Pindutin ang Shift + Tab ulit o Escape para umalis sa editor.", "admin.dashboard.cleanup_offline_runners": "Linisin ang mga offline na runner", - "settings.visibility.description": "Maaapektuhan ng visibility ng profile ang kakayahan ng iba na i-access ang iyong mga hindi pribadong repositoryo. Matuto pa", + "settings.visibility.description": "Maaapektuhan ng visibility ng profile ang kakayahan ng iba na i-access ang iyong mga hindi pribadong repositoryo. Matuto pa.", "avatar.constraints_hint": "Hindi maaaring lumagpas sa laking %[1]s o mas malaki sa %[2]dx%[3]d pixel ang custom na avatar", "repo.diff.commit.next-short": "Susunod", "repo.diff.commit.previous-short": "Nakaraan", @@ -105,5 +105,10 @@ "og.repo.summary_card.alt_description": "Card ng pangkalahatang ideya ng repositoryong %[1]s, inilalarawan bilang: %[2]s", "mail.actions.run_info_sha": "Commit: %[1]s", "repo.settings.push_mirror.branch_filter.label": "Filter ng branch (opsyonal)", - "repo.settings.push_mirror.branch_filter.description": "Mga branch na imi-mirror. Iwanang walang laman para i-mirror ang lahat ng mga branch. Tignan ang dokumentasyon ng %[2]s para sa syntax. Halimbawa: main, your-reality, release/*" + "repo.settings.push_mirror.branch_filter.description": "Mga branch na imi-mirror. Iwanang walang laman para i-mirror ang lahat ng mga branch. Tignan ang dokumentasyon ng %[2]s para sa syntax. Halimbawa: main, your-reality, release/*", + "discussion.sidebar.reference": "Sangguni", + "admin.moderation.moderation_reports": "Mga ulat sa moderation", + "admin.moderation.no_open_reports": "Kasalukuyang walang mga nakabukas na ulat.", + "admin.moderation.reports": "Mga ulat", + "admin.moderation.deleted_content_ref": "Hindi na umiiral ang inulat na nilalaman na may uri na %[1]v at ID %[2]d" } diff --git a/options/locale_next/locale_fr-FR.json b/options/locale_next/locale_fr-FR.json index 438e0433d0..4a1a27ac0d 100644 --- a/options/locale_next/locale_fr-FR.json +++ b/options/locale_next/locale_fr-FR.json @@ -102,5 +102,6 @@ "settings.visibility.description": "La visibilité du profil affecte la capacité des autres à accéder à vos dépôts non-privés. Voir plus", "editor.textarea.shift_tab_hint": "Pas d'indentation sur cette ligne. Appuyez sur Maj + Tab une nouvelle fois ou sur Échap pour quitter l'éditeur.", "avatar.constraints_hint": "L'avatar personnalisé ne doit pas dépasser une taille de %[1]s ou être plus grand que %[2]dx%[3]d pixels", - "editor.textarea.tab_hint": "Ligne déjà indentée. Appuyez sur Tab une nouvelle fois ou sur Échap pour quitter l'éditeur." + "editor.textarea.tab_hint": "Ligne déjà indentée. Appuyez sur Tab une nouvelle fois ou sur Échap pour quitter l'éditeur.", + "discussion.sidebar.reference": "Référence" } diff --git a/options/locale_next/locale_hi.json b/options/locale_next/locale_hi.json index 0967ef424b..5eec8ae1e2 100644 --- a/options/locale_next/locale_hi.json +++ b/options/locale_next/locale_hi.json @@ -1 +1,81 @@ -{} +{ + "relativetime.2days": "दो दिन पहले", + "relativetime.1day": "कल", + "repo.form.cannot_create": "वो जगह जहाँ पे रिपॉजिटरी रखीं जातीं हैं वहां जगह ख़त्म", + "moderation.abuse_category.other_violations": "प्लेटफार्म का कोई रूल तोडा हैं", + "moderation.report_remarks": "टिप्पणी", + "repo.issue_indexer.title": "इशू ठौर", + "themes.names.forgejo-auto": "फॉरगेजो - सिस्टम थीम फॉलो करें", + "themes.names.forgejo-light": "फॉरगेजो लाइट", + "error.not_found.title": "पृष्ठ नहीं मिला", + "incorrect_root_url": "इस फॉरगेजो इंस्टैंस को %d सर्वर पे कॉन्फ़िगर किया गया है। आप फॉरगेजो को किसी अन्य url से देख रहे हैं, जिससे एप्लीकेशन टूटती है। अच्छा यूआरएल फॉरगेजो के एडमिन कण्ट्रोल करते हैं और रुट_यूआरएल जो की app. ini में है", + "themes.names.forgejo-dark": "फॉरगेजो डार्क", + "stars.list.none": "किसी ने भी चिन्हित/स्टार नहीं किया", + "watch.list.none": "कोई भी ये रिपॉजिटरी नहीं देख रहा", + "followers.incoming.list.self.none": "कोई भी प्रोफाइल फॉलो नहीं कर रहा", + "followers.incoming.list.none": "कोई भी यूजर को फॉलो नहीं कर रहा", + "followers.outgoing.list.self.none": "आप किसी को फॉलो ही नहीं कर रहे", + "followers.outgoing.list.none": "%s किसी को फॉलो नहीं कर रहे", + "relativetime.1week": "पिछले हफ्ते", + "relativetime.2weeks": "दो हफ्ते पहले", + "relativetime.1month": "पिछले महीने", + "relativetime.2months": "दो महीने पहले", + "relativetime.1year": "पिछले साल", + "relativetime.2years": "दो साल पहले", + "alert.asset_load_failed": "एसेट फाइल लोड नहीं हो पायी (path) ये पक्का करें की एसेट फाइल एक्सेस हो सकती है", + "alert.range_error": " एक अंक %d और %d के बीच में", + "search.milestone_kind": "माइलस्टोन ढूंढें…", + "home.welcome.no_activity": "गतिविधि नहीं", + "home.explore_repos": "रिपॉजिटरी निहारें", + "home.explore_users": "उसेर्स देखें", + "home.explore_orgs": "संस्थाएं देखें", + "relativetime.days": { + "one": "%d दिन पहले", + "other": "%d दिनों पहले" + }, + "repo.settings.push_mirror.branch_filter.label": "शाखा फ़िल्टर", + "repo.settings.push_mirror.branch_filter.description": "शाखा मिरर होनीं हैं। खली छोड़ने पर सब मिरर होंगी।", + "install.invalid_lfs_path": "LFS रुट नहीं बना पाया इस path पर", + "relativetime.years": { + "one": "%d साल पहले", + "other": "%d सालों पहले" + }, + "relativetime.weeks": { + "one": "%d हफ्ते पहले", + "other": "%d हफ़्तों पहले" + }, + "relativetime.months": { + "one": "%d महीने पहले", + "other": "%d महीनों पहले" + }, + "meta.last_line": "तीतर के दो पीछे तीतर तीतर के दो आगे तीतर बोलो कितने तीतर ?", + "relativetime.now": "अभी", + "avatar.constraints_hint": "कस्टम अवतार का फ़ाइल आकार 200 किलोबाइट से अधिक नहीं होना चाहिए और 125x125 पिक्सेल से बड़ा नहीं होना चाहिए", + "home.welcome.activity_hint": "आपकी फीड में अभी कुछ भी नहीं है। आपके कार्य और रिपॉजिटरी यहाँ दिखेंगे।", + "relativetime.future": "भविष्य में", + "moderation.report_abuse_form.details": "इस फॉर्म का प्रयोग वो करें जो बताना चाहते हैं स्पैम प्रोफाइल, रिपॉजिटरी, इशू, कमैंट्स या गलत पेशी", + "moderation.report_abuse_form.invalid": "इनवैलिड आर्गुमेंट", + "moderation.report_abuse_form.already_reported": "आप पहले शिकायत कर चुके हैं", + "moderation.abuse_category": "वर्ग", + "moderation.abuse_category.placeholder": "वर्ग चुनें", + "moderation.abuse_category.spam": "स्पैम", + "moderation.abuse_category.malware": "मैलवेयर", + "moderation.abuse_category.illegal_content": "गैर कानूनी कंटेंट", + "relativetime.mins": { + "one": "%d मिनट पहले", + "other": "" + }, + "profile.actions.tooltip": "और एक्शन्स", + "profile.edit.link": "प्रोफाइल बनाएं", + "feed.atom.link": "एटम फीड", + "keys.ssh.link": "SSH कीस", + "keys.gpg.link": "GPG कीस", + "admin.config.moderation_config": "सत्यापन कॉन्फ़िगरेशन", + "moderation.report_abuse": "कंप्लेंट करें", + "moderation.report_content": "कंप्लेंट करें", + "moderation.report_abuse_form.header": "कंप्लेंट करें एडमिनिस्ट्रेटर से", + "moderation.report_remarks.placeholder": "कुछ डिटेल्स बताओ जिस बारे में रिपोर्ट कर रहे हो", + "moderation.submit_report": "रिपोर्ट सबमिट करो", + "moderation.reporting_failed": "नयी रिपोर्ट सबमिट नहीं हो सकती", + "moderation.reported_thank_you": "रिपोर्ट के लिए शुक्रिया। एडमिन को बताया गया है" +} diff --git a/options/locale_next/locale_lv-LV.json b/options/locale_next/locale_lv-LV.json index 5503763dd3..0bf903f026 100644 --- a/options/locale_next/locale_lv-LV.json +++ b/options/locale_next/locale_lv-LV.json @@ -101,7 +101,7 @@ "editor.textarea.tab_hint": "Rinda jau ir ar atkāpi. Spied Tab vēlreiz vai Escape, lai izietu no redaktora!", "editor.textarea.shift_tab_hint": "Šajā rindā nav atkāpes. Spied Shift + Tab vēlreiz vai Escape, lai izietu no redaktora!", "admin.dashboard.cleanup_offline_runners": "Notīrīt bezsaistes izpildītājus", - "settings.visibility.description": "Profila redzamība ietekmē iespēju citiem piekļūt Tavām glabātavām, kas nav privātas. Uzzināt vairāk", + "settings.visibility.description": "Profila redzamība ietekmē iespēju citiem piekļūt Tavām glabātavām, kas nav privātas. Uzzināt vairāk.", "avatar.constraints_hint": "Pielāgots profila attēls nevar pārsniegt %[1]s vai būt lielāks par %[2]dx%[3]d pikseļiem", "repo.diff.commit.next-short": "Nāk.", "repo.diff.commit.previous-short": "Iepr.", @@ -113,5 +113,10 @@ "og.repo.summary_card.alt_description": "Glabātavas %[1]s kopsavilkuma kartīte, aprakstīta kā: %[2]s", "mail.actions.run_info_sha": "Iesūtījums: %[1]s", "repo.settings.push_mirror.branch_filter.description": "Zarus, kurus spoguļot. Atstāt tukšu, lai spoguļotu visus zarus. Pierakstu skatīt %[2]s dokumentācijā. Piemēri: main, release/*", - "repo.settings.push_mirror.branch_filter.label": "Zaru atlasītājs (izvēles)" + "repo.settings.push_mirror.branch_filter.label": "Zaru atlasītājs (izvēles)", + "discussion.sidebar.reference": "Atsauce", + "admin.moderation.no_open_reports": "Pašlaik nav atvērtu pārskatu.", + "admin.moderation.moderation_reports": "Satura pārraudzības pārskati", + "admin.moderation.reports": "Pārskati", + "admin.moderation.deleted_content_ref": "Saturs, par kuru ziņots, ar veidu %[1]v un Id %[2]d vairs nepastāv" } diff --git a/options/locale_next/locale_nds.json b/options/locale_next/locale_nds.json index 4a796aaee9..f51077c610 100644 --- a/options/locale_next/locale_nds.json +++ b/options/locale_next/locale_nds.json @@ -93,7 +93,7 @@ "editor.textarea.tab_hint": "Rieg al inschuven. Drück weer Tab of Esc, um de Bewarker to verlaten.", "editor.textarea.shift_tab_hint": "Keen Inschuuv in deeser Rieg. Drück weer Umschalt+Tab of Esc, um de Bewarker to verlaten.", "admin.dashboard.cleanup_offline_runners": "Nich verbunnen Lopers uprümen", - "settings.visibility.description": "De Profil-Sichtbaarkeid maakt daar wat an, of un wo anner Lüü diene nich-privaaten Repositoriums ankieken könen. Mehr unnerhören", + "settings.visibility.description": "De Profil-Sichtbaarkeid maakt daar wat an, of un wo anner Lüü diene nich-privaaten Repositoriums ankieken könen. Mehr unnerhören.", "avatar.constraints_hint": "Dat eegene Kontobill düür nich groter as %[1]s wesen of groter as %[2]d×%[3]d Billtüttels wesen", "repo.diff.commit.next-short": "Anner", "repo.diff.commit.previous-short": "Vörig", @@ -105,5 +105,10 @@ "og.repo.summary_card.alt_description": "Tosamenfatens-Kaart vun de Repositorium %[1]s, beschrieven as: %[2]s", "mail.actions.run_info_sha": "Kommitteren: %[1]s", "repo.settings.push_mirror.branch_filter.description": "Twiegen tum Spegeln. Laat dat leeg, um all Twiegen to spegeln. Lees de %[2]s-Dokumenteren för de Syntax. Bispölen: main, release/*", - "repo.settings.push_mirror.branch_filter.label": "Twieg-Filter (wenn du willst)" + "repo.settings.push_mirror.branch_filter.label": "Twieg-Filter (wenn du willst)", + "discussion.sidebar.reference": "Nömen", + "admin.moderation.moderation_reports": "Moderatioons-Berichten", + "admin.moderation.no_open_reports": "Dat gifft jüüst keene open Berichten.", + "admin.moderation.reports": "Berichten", + "admin.moderation.deleted_content_ref": "Mellt Inholl mit Aard %[1]v un Kennteken %[2]d gifft dat nich mehr" } diff --git a/options/locale_next/locale_pt-BR.json b/options/locale_next/locale_pt-BR.json index 80395b020b..67a9f79917 100644 --- a/options/locale_next/locale_pt-BR.json +++ b/options/locale_next/locale_pt-BR.json @@ -102,7 +102,7 @@ "editor.textarea.shift_tab_hint": "Sem indentação nesta linha. Pressione Shift + Tab novamente ou Esc para sair do editor.", "admin.dashboard.cleanup_offline_runners": "Limpar runners desconectados", "avatar.constraints_hint": "Imagem de perfil personalizada não pode exceder %[1]s em tamanho ou ser maior que %[2]dx%[3]d pixels", - "settings.visibility.description": "A visibilidade do perfil afeta a habilidade de acessarem seus repositórios não-privados. Saiba mais", + "settings.visibility.description": "A visibilidade do perfil afeta a habilidade de acessarem seus repositórios não-privados. Saiba mais.", "repo.diff.commit.next-short": "Próximo", "repo.diff.commit.previous-short": "Anterior", "profile.edit.link": "Editar perfil", @@ -113,5 +113,10 @@ "keys.ssh.link": "Chaves SSH", "mail.actions.run_info_sha": "Commit: %[1]s", "repo.settings.push_mirror.branch_filter.label": "Filtro de branches (opcional)", - "repo.settings.push_mirror.branch_filter.description": "Branches para espelhar. Deixe em branco para espelhar todos os branches. Veja %[2]s documentação sobre a sintaxe. Exemplos: main, release/*" + "repo.settings.push_mirror.branch_filter.description": "Branches para espelhar. Deixe em branco para espelhar todos os branches. Veja %[2]s documentação sobre a sintaxe. Exemplos: main, release/*", + "discussion.sidebar.reference": "Referência", + "admin.moderation.deleted_content_ref": "Conteúdo denunciado do tipo %[1]v e ID %[2]d não existe mais", + "admin.moderation.moderation_reports": "Denúncias para moderação", + "admin.moderation.reports": "Denúncias", + "admin.moderation.no_open_reports": "Não há denúncias abertas atualmente." } diff --git a/options/locale_next/locale_pt-PT.json b/options/locale_next/locale_pt-PT.json index 4710d3d868..c3b908ed07 100644 --- a/options/locale_next/locale_pt-PT.json +++ b/options/locale_next/locale_pt-PT.json @@ -113,5 +113,6 @@ "og.repo.summary_card.alt_description": "Cartão de resumo do repositório %[1]s, descrito como: %[2]s", "repo.settings.push_mirror.branch_filter.label": "Filtro de ramos (opcional)", "repo.settings.push_mirror.branch_filter.description": "Ramos a serem espelhados. Deixe em branco para espelhar todos os ramos. Veja a %[2]s documentação sobre a sintaxe. Exemplos: main, release/*", - "mail.actions.run_info_sha": "Cometimento: %[1]s" + "mail.actions.run_info_sha": "Cometimento: %[1]s", + "discussion.sidebar.reference": "Referência" } diff --git a/options/locale_next/locale_ru-RU.json b/options/locale_next/locale_ru-RU.json index ecd58b8b62..cc6d99ca80 100644 --- a/options/locale_next/locale_ru-RU.json +++ b/options/locale_next/locale_ru-RU.json @@ -113,5 +113,6 @@ "og.repo.summary_card.alt_description": "Карточка со сводкой о репозитории %s. Описание: %[2]s", "mail.actions.run_info_sha": "Коммит: %[1]s", "repo.settings.push_mirror.branch_filter.description": "Синхронизируемые ветви. Оставьте пустым, чтобы синхронизировать все. Ознакомьтесь с синтаксисом в документации %[2]s. Примеры: main, release/*", - "repo.settings.push_mirror.branch_filter.label": "Выбор ветвей (опционально)" + "repo.settings.push_mirror.branch_filter.label": "Выбор ветвей (опционально)", + "discussion.sidebar.reference": "Ссылка" } diff --git a/options/locale_next/locale_uk-UA.json b/options/locale_next/locale_uk-UA.json index f014a8dc66..046738e334 100644 --- a/options/locale_next/locale_uk-UA.json +++ b/options/locale_next/locale_uk-UA.json @@ -101,7 +101,7 @@ "editor.textarea.tab_hint": "У рядку вже є відступ. Натисніть Tab ще раз або Esc, щоб вийти з редактора.", "editor.textarea.shift_tab_hint": "У цьому рядку немає відступів. Натисніть Shift + Tab ще раз або Esc, щоб вийти з редактора.", "admin.dashboard.cleanup_offline_runners": "Очистити неактивні раннери", - "settings.visibility.description": "Видимість профілю впливає на можливість інших користувачів отримати доступ до ваших неприватних репозиторіїв. Дізнатися більше", + "settings.visibility.description": "Видимість профілю впливає на можливість інших користувачів отримати доступ до ваших неприватних репозиторіїв. Дізнатися більше.", "avatar.constraints_hint": "Розмір користувацького аватара не може перевищувати %[1]s або бути більшим за %[2]d×%[3]d пікселів", "repo.diff.commit.next-short": "Наступний", "repo.diff.commit.previous-short": "Попередній", @@ -113,5 +113,9 @@ "og.repo.summary_card.alt_description": "Підсумкова картка репозиторію %[1]s з описом: %[2]s", "mail.actions.run_info_sha": "Коміт: %[1]s", "repo.settings.push_mirror.branch_filter.description": "Гілки для дзеркалювання. Залиште порожнім, щоб віддзеркалити всі гілки. Дивіться синтаксис у документації %[2]s. Приклади: main, release/*", - "repo.settings.push_mirror.branch_filter.label": "Фільтр гілок (необов'язково)" + "repo.settings.push_mirror.branch_filter.label": "Фільтр гілок (необов'язково)", + "discussion.sidebar.reference": "Посилання", + "admin.moderation.no_open_reports": "Відкритих скарг наразі немає.", + "admin.moderation.reports": "Скарги", + "admin.moderation.deleted_content_ref": "Вміст типу %[1]v з ідентифікатором %[2]d, на який подано скаргу, більше не існує" } diff --git a/options/locale_next/locale_zh-CN.json b/options/locale_next/locale_zh-CN.json index 467c990d3a..a36a4c3ea4 100644 --- a/options/locale_next/locale_zh-CN.json +++ b/options/locale_next/locale_zh-CN.json @@ -81,5 +81,6 @@ "og.repo.summary_card.alt_description": "仓库 %[1]s 的摘要卡片,描述为:%[2]s", "repo.settings.push_mirror.branch_filter.label": "分支过滤器(可选)", "repo.settings.push_mirror.branch_filter.description": "欲镜像的分支。留空以镜像所有分支。关于语法的更多信息,请参见 %[2]s 文档。例如:main, release/*", - "mail.actions.run_info_sha": "提交:%[1]s" + "mail.actions.run_info_sha": "提交:%[1]s", + "discussion.sidebar.reference": "引用" } From e271c24100c8974e135ebc1d1b3eaa6cd2062b10 Mon Sep 17 00:00:00 2001 From: Michael Jerger Date: Fri, 25 Jul 2025 18:01:43 +0200 Subject: [PATCH 221/495] fix: assorted ActivityPub code only refactors (#8274) Fix parts of issue https://codeberg.org/forgejo/forgejo/issues/8221 and PR https://codeberg.org/forgejo/forgejo/pulls/4767 - PostgreSQL - TestActivityPubPerson/SignedRequestValidation ``` --- FAIL: TestActivityPubPerson/SignedRequestValidation (5.01s) api_activitypub_person_test.go:51: Error Trace: /workspace/forgejo/forgejo/tests/integration/api_activitypub_person_test.go:51 Error: Received unexpected error: Get "http://127.0.0.1:3002/api/v1/activitypub/user-id/2": context deadline exceeded (Client.Timeout exceeded while awaiting headers) Test: TestActivityPubPerson/SignedRequestValidation testlogger.go:411: 2025/06/24 00:12:27 ...eb/routing/logger.go:102:func1() [I] router: completed GET /api/v1/activitypub/user-id/2 for 127.0.0.1:50456, 200 OK in 5032.2ms @ activitypub/person.go:21(activitypub.Person) ``` Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8274 Reviewed-by: Earl Warren Co-authored-by: Michael Jerger Co-committed-by: Michael Jerger --- .deadcode-out | 3 + models/repo/repo_repository.go | 6 +- models/user/follow.go | 16 +- models/user/user_repository.go | 16 +- modules/activitypub/client.go | 7 +- routers/api/v1/activitypub/repository.go | 9 +- routers/api/v1/activitypub/reqsignature.go | 26 +-- routers/api/v1/activitypub/response.go | 34 ++++ routers/api/v1/api.go | 3 +- services/federation/error.go | 44 +++++ services/federation/federation_service.go | 19 +- ...{repo_like.go => repository_inbox_like.go} | 33 ++-- services/federation/repository_service.go | 19 ++ services/federation/result.go | 35 ++++ services/federation/signature_service.go | 11 +- .../integration/api_activitypub_actor_test.go | 77 ++++++++ .../api_activitypub_person_test.go | 113 +++++++++++ .../api_activitypub_repository_test.go | 176 ++++++++++++++++++ .../api_federation_httpsig_test.go | 82 ++++++++ .../integration/repo_star_federation_test.go | 81 ++++++++ 20 files changed, 741 insertions(+), 69 deletions(-) create mode 100644 services/federation/error.go rename services/federation/{repo_like.go => repository_inbox_like.go} (73%) create mode 100644 services/federation/repository_service.go create mode 100644 services/federation/result.go create mode 100644 tests/integration/api_activitypub_actor_test.go create mode 100644 tests/integration/api_activitypub_person_test.go create mode 100644 tests/integration/api_activitypub_repository_test.go create mode 100644 tests/integration/api_federation_httpsig_test.go create mode 100644 tests/integration/repo_star_federation_test.go diff --git a/.deadcode-out b/.deadcode-out index f9bee43043..31b04687dc 100644 --- a/.deadcode-out +++ b/.deadcode-out @@ -246,7 +246,10 @@ forgejo.org/services/context GetPrivateContext forgejo.org/services/federation + NewErrInternalf + ErrInternal.Error Init + NewServiceResultWithBytes forgejo.org/services/repository IsErrForkAlreadyExist diff --git a/models/repo/repo_repository.go b/models/repo/repo_repository.go index 0ba50e6614..9d586b8345 100644 --- a/models/repo/repo_repository.go +++ b/models/repo/repo_repository.go @@ -38,18 +38,18 @@ func StoreFollowingRepos(ctx context.Context, localRepoID int64, followingRepoLi } // Begin transaction - ctx, committer, err := db.TxContext((ctx)) + dbCtx, committer, err := db.TxContext((ctx)) if err != nil { return err } defer committer.Close() - _, err = db.GetEngine(ctx).Where("repo_id=?", localRepoID).Delete(FollowingRepo{}) + _, err = db.GetEngine(dbCtx).Where("repo_id=?", localRepoID).Delete(FollowingRepo{}) if err != nil { return err } for _, followingRepo := range followingRepoList { - _, err = db.GetEngine(ctx).Insert(followingRepo) + _, err = db.GetEngine(dbCtx).Insert(followingRepo) if err != nil { return err } diff --git a/models/user/follow.go b/models/user/follow.go index e32c226385..8663b2a943 100644 --- a/models/user/follow.go +++ b/models/user/follow.go @@ -39,21 +39,21 @@ func FollowUser(ctx context.Context, userID, followID int64) (err error) { return ErrBlockedByUser } - ctx, committer, err := db.TxContext(ctx) + dbCtx, committer, err := db.TxContext(ctx) if err != nil { return err } defer committer.Close() - if err = db.Insert(ctx, &Follow{UserID: userID, FollowID: followID}); err != nil { + if err = db.Insert(dbCtx, &Follow{UserID: userID, FollowID: followID}); err != nil { return err } - if _, err = db.Exec(ctx, "UPDATE `user` SET num_followers = num_followers + 1 WHERE id = ?", followID); err != nil { + if _, err = db.Exec(dbCtx, "UPDATE `user` SET num_followers = num_followers + 1 WHERE id = ?", followID); err != nil { return err } - if _, err = db.Exec(ctx, "UPDATE `user` SET num_following = num_following + 1 WHERE id = ?", userID); err != nil { + if _, err = db.Exec(dbCtx, "UPDATE `user` SET num_following = num_following + 1 WHERE id = ?", userID); err != nil { return err } return committer.Commit() @@ -65,21 +65,21 @@ func UnfollowUser(ctx context.Context, userID, followID int64) (err error) { return nil } - ctx, committer, err := db.TxContext(ctx) + dbCtx, committer, err := db.TxContext(ctx) if err != nil { return err } defer committer.Close() - if _, err = db.DeleteByBean(ctx, &Follow{UserID: userID, FollowID: followID}); err != nil { + if _, err = db.DeleteByBean(dbCtx, &Follow{UserID: userID, FollowID: followID}); err != nil { return err } - if _, err = db.Exec(ctx, "UPDATE `user` SET num_followers = num_followers - 1 WHERE id = ?", followID); err != nil { + if _, err = db.Exec(dbCtx, "UPDATE `user` SET num_followers = num_followers - 1 WHERE id = ?", followID); err != nil { return err } - if _, err = db.Exec(ctx, "UPDATE `user` SET num_following = num_following - 1 WHERE id = ?", userID); err != nil { + if _, err = db.Exec(dbCtx, "UPDATE `user` SET num_following = num_following - 1 WHERE id = ?", userID); err != nil { return err } return committer.Commit() diff --git a/models/user/user_repository.go b/models/user/user_repository.go index 85f44f1598..df864746e8 100644 --- a/models/user/user_repository.go +++ b/models/user/user_repository.go @@ -28,7 +28,7 @@ func CreateFederatedUser(ctx context.Context, user *User, federatedUser *Federat } // Begin transaction - ctx, committer, err := db.TxContext((ctx)) + txCtx, committer, err := db.TxContext(ctx) if err != nil { return err } @@ -39,7 +39,7 @@ func CreateFederatedUser(ctx context.Context, user *User, federatedUser *Federat } }() - if err := CreateUser(ctx, user, &overwrite); err != nil { + if err := CreateUser(txCtx, user, &overwrite); err != nil { return err } @@ -48,7 +48,7 @@ func CreateFederatedUser(ctx context.Context, user *User, federatedUser *Federat return err } - _, err = db.GetEngine(ctx).Insert(federatedUser) + _, err = db.GetEngine(txCtx).Insert(federatedUser) if err != nil { return err } @@ -70,7 +70,7 @@ func FindFederatedUser(ctx context.Context, externalID string, federationHostID if err != nil { return nil, nil, err } else if !has { - return nil, nil, fmt.Errorf("User %v for federated user is missing", federatedUser.UserID) + return nil, nil, fmt.Errorf("FederatedUser table contains entry for user ID %v, but no user with this ID exists", federatedUser.UserID) } if res, err := validation.IsValid(*user); !res { @@ -87,7 +87,7 @@ func GetFederatedUser(ctx context.Context, externalID string, federationHostID i if err != nil { return nil, nil, err } else if federatedUser == nil { - return nil, nil, fmt.Errorf("FederatedUser for externalId = %v and federationHostId = %v does not exist", externalID, federationHostID) + return nil, nil, fmt.Errorf("FederatedUser not found (given externalId: %v, federationHostId: %v)", externalID, federationHostID) } return user, federatedUser, nil } @@ -99,13 +99,13 @@ func GetFederatedUserByUserID(ctx context.Context, userID int64) (*User, *Federa if err != nil { return nil, nil, err } else if !has { - return nil, nil, fmt.Errorf("Federated user %v does not exist", federatedUser.UserID) + return nil, nil, fmt.Errorf("FederatedUser table does not contain entry for user ID: %v", federatedUser.UserID) } has, err = db.GetEngine(ctx).ID(federatedUser.UserID).Get(user) if err != nil { return nil, nil, err } else if !has { - return nil, nil, fmt.Errorf("User %v for federated user is missing", federatedUser.UserID) + return nil, nil, fmt.Errorf("FederatedUser table contains entry for user ID %v, but no user with this ID exists", federatedUser.UserID) } if res, err := validation.IsValid(*user); !res { @@ -130,7 +130,7 @@ func FindFederatedUserByKeyID(ctx context.Context, keyID string) (*User, *Federa if err != nil { return nil, nil, err } else if !has { - return nil, nil, fmt.Errorf("User %v for federated user is missing", federatedUser.UserID) + return nil, nil, fmt.Errorf("FederatedUser table contains entry for user ID %v, but no user with this ID exists", federatedUser.UserID) } if res, err := validation.IsValid(*user); !res { diff --git a/modules/activitypub/client.go b/modules/activitypub/client.go index fb6fa8b543..11a2fd94c3 100644 --- a/modules/activitypub/client.go +++ b/modules/activitypub/client.go @@ -66,6 +66,11 @@ type ClientFactory struct { // NewClient function func NewClientFactory() (c *ClientFactory, err error) { + return NewClientFactoryWithTimeout(5 * time.Second) +} + +// NewClient function +func NewClientFactoryWithTimeout(timeout time.Duration) (c *ClientFactory, err error) { if err = containsRequiredHTTPHeaders(http.MethodGet, setting.Federation.GetHeaders); err != nil { return nil, err } else if err = containsRequiredHTTPHeaders(http.MethodPost, setting.Federation.PostHeaders); err != nil { @@ -77,7 +82,7 @@ func NewClientFactory() (c *ClientFactory, err error) { Transport: &http.Transport{ Proxy: proxy.Proxy(), }, - Timeout: 5 * time.Second, + Timeout: timeout, }, algs: setting.HttpsigAlgs, digestAlg: httpsig.DigestAlgorithm(setting.Federation.DigestAlgorithm), diff --git a/routers/api/v1/activitypub/repository.go b/routers/api/v1/activitypub/repository.go index c506840f1c..3eaa6b82c5 100644 --- a/routers/api/v1/activitypub/repository.go +++ b/routers/api/v1/activitypub/repository.go @@ -71,10 +71,11 @@ func RepositoryInbox(ctx *context.APIContext) { repository := ctx.Repo.Repository log.Info("RepositoryInbox: repo: %v", repository) form := web.GetForm(ctx) - // TODO: Decide between like/undo{like} activity - httpStatus, title, err := federation.ProcessLikeActivity(ctx, form, repository.ID) + activity := form.(*ap.Activity) + result, err := federation.ProcessRepositoryInbox(ctx, activity, repository.ID) if err != nil { - ctx.Error(httpStatus, title, err) + ctx.Error(federation.HTTPStatus(err), "Processing Repository Inbox failed", result) + return } - ctx.Status(http.StatusNoContent) + responseServiceResult(ctx, result) } diff --git a/routers/api/v1/activitypub/reqsignature.go b/routers/api/v1/activitypub/reqsignature.go index 91274249ec..38cb067b89 100644 --- a/routers/api/v1/activitypub/reqsignature.go +++ b/routers/api/v1/activitypub/reqsignature.go @@ -8,13 +8,13 @@ import ( "forgejo.org/modules/log" "forgejo.org/modules/setting" - gitea_context "forgejo.org/services/context" + services_context "forgejo.org/services/context" "forgejo.org/services/federation" "github.com/42wim/httpsig" ) -func verifyHTTPUserOrInstanceSignature(ctx *gitea_context.APIContext) (authenticated bool, err error) { +func verifyHTTPUserOrInstanceSignature(ctx services_context.APIContext) (authenticated bool, err error) { if !setting.Federation.SignatureEnforced { return true, nil } @@ -28,9 +28,9 @@ func verifyHTTPUserOrInstanceSignature(ctx *gitea_context.APIContext) (authentic } signatureAlgorithm := httpsig.Algorithm(setting.Federation.SignatureAlgorithms[0]) - pubKey, err := federation.FindOrCreateFederatedUserKey(ctx.Base, v.KeyId()) + pubKey, err := federation.FindOrCreateFederatedUserKey(ctx, v.KeyId()) if err != nil || pubKey == nil { - pubKey, err = federation.FindOrCreateFederationHostKey(ctx.Base, v.KeyId()) + pubKey, err = federation.FindOrCreateFederationHostKey(ctx, v.KeyId()) if err != nil { return false, err } @@ -43,7 +43,7 @@ func verifyHTTPUserOrInstanceSignature(ctx *gitea_context.APIContext) (authentic return true, nil } -func verifyHTTPUserSignature(ctx *gitea_context.APIContext) (authenticated bool, err error) { +func verifyHTTPUserSignature(ctx services_context.APIContext) (authenticated bool, err error) { if !setting.Federation.SignatureEnforced { return true, nil } @@ -57,7 +57,7 @@ func verifyHTTPUserSignature(ctx *gitea_context.APIContext) (authenticated bool, } signatureAlgorithm := httpsig.Algorithm(setting.Federation.SignatureAlgorithms[0]) - pubKey, err := federation.FindOrCreateFederatedUserKey(ctx.Base, v.KeyId()) + pubKey, err := federation.FindOrCreateFederatedUserKey(ctx, v.KeyId()) if err != nil { return false, err } @@ -70,9 +70,9 @@ func verifyHTTPUserSignature(ctx *gitea_context.APIContext) (authenticated bool, } // ReqHTTPSignature function -func ReqHTTPUserOrInstanceSignature() func(ctx *gitea_context.APIContext) { - return func(ctx *gitea_context.APIContext) { - if authenticated, err := verifyHTTPUserOrInstanceSignature(ctx); err != nil { +func ReqHTTPUserOrInstanceSignature() func(ctx *services_context.APIContext) { + return func(ctx *services_context.APIContext) { + if authenticated, err := verifyHTTPUserOrInstanceSignature(*ctx); err != nil { log.Warn("verifyHttpSignatures failed: %v", err) ctx.Error(http.StatusBadRequest, "reqSignature", "request signature verification failed") } else if !authenticated { @@ -81,10 +81,10 @@ func ReqHTTPUserOrInstanceSignature() func(ctx *gitea_context.APIContext) { } } -// ReqHTTPSignature function -func ReqHTTPUserSignature() func(ctx *gitea_context.APIContext) { - return func(ctx *gitea_context.APIContext) { - if authenticated, err := verifyHTTPUserSignature(ctx); err != nil { +// ReqHTTPUserSignature function +func ReqHTTPUserSignature() func(ctx *services_context.APIContext) { + return func(ctx *services_context.APIContext) { + if authenticated, err := verifyHTTPUserSignature(*ctx); err != nil { log.Warn("verifyHttpSignatures failed: %v", err) ctx.Error(http.StatusBadRequest, "reqSignature", "request signature verification failed") } else if !authenticated { diff --git a/routers/api/v1/activitypub/response.go b/routers/api/v1/activitypub/response.go index a97f363cc2..64413cebb1 100644 --- a/routers/api/v1/activitypub/response.go +++ b/routers/api/v1/activitypub/response.go @@ -10,12 +10,46 @@ import ( "forgejo.org/modules/forgefed" "forgejo.org/modules/log" "forgejo.org/services/context" + "forgejo.org/services/federation" ap "github.com/go-ap/activitypub" "github.com/go-ap/jsonld" ) // Respond with an ActivityStreams object +func responseServiceResult(ctx *context.APIContext, result federation.ServiceResult) { + ctx.Resp.Header().Add("Content-Type", activitypub.ActivityStreamsContentType) + + switch { + case result.StatusOnly(): + ctx.Resp.WriteHeader(result.HTTPStatus) + return + case result.WithBytes(): + ctx.Resp.WriteHeader(result.HTTPStatus) + if _, err := ctx.Resp.Write(result.Bytes); err != nil { + log.Error("Error writing a response: %v", err) + ctx.Error(http.StatusInternalServerError, "Error writing a response", err) + return + } + case result.WithActivity(): + binary, err := jsonld.WithContext( + jsonld.IRI(ap.ActivityBaseURI), + jsonld.IRI(ap.SecurityContextURI), + jsonld.IRI(forgefed.ForgeFedNamespaceURI), + ).Marshal(result.Activity) + if err != nil { + ctx.ServerError("Marshal", err) + return + } + ctx.Resp.WriteHeader(result.HTTPStatus) + if _, err = ctx.Resp.Write(binary); err != nil { + log.Error("write to resp err: %v", err) + } + } +} + +// Respond with an ActivityStreams object +// Deprecated func response(ctx *context.APIContext, v any) { binary, err := jsonld.WithContext( jsonld.IRI(ap.ActivityBaseURI), diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 6a51f33bd8..2f806ba35d 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -81,7 +81,6 @@ import ( repo_model "forgejo.org/models/repo" "forgejo.org/models/unit" user_model "forgejo.org/models/user" - "forgejo.org/modules/forgefed" "forgejo.org/modules/log" "forgejo.org/modules/setting" api "forgejo.org/modules/structs" @@ -853,7 +852,7 @@ func Routes() *web.Route { m.Group("/repository-id/{repository-id}", func() { m.Get("", activitypub.ReqHTTPUserSignature(), activitypub.Repository) m.Post("/inbox", - bind(forgefed.ForgeLike{}), + bind(ap.Activity{}), activitypub.ReqHTTPUserSignature(), activitypub.RepositoryInbox) }, context.RepositoryIDAssignmentAPI()) diff --git a/services/federation/error.go b/services/federation/error.go new file mode 100644 index 0000000000..425035d0d5 --- /dev/null +++ b/services/federation/error.go @@ -0,0 +1,44 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package federation + +import ( + "fmt" + "net/http" +) + +type ErrNotAcceptable struct { + Message string +} + +func NewErrNotAcceptablef(format string, a ...any) ErrNotAcceptable { + message := fmt.Sprintf(format, a...) + return ErrNotAcceptable{Message: message} +} + +func (err ErrNotAcceptable) Error() string { + return fmt.Sprintf("NotAcceptable: %v", err.Message) +} + +type ErrInternal struct { + Message string +} + +func NewErrInternalf(format string, a ...any) ErrInternal { + message := fmt.Sprintf(format, a...) + return ErrInternal{Message: message} +} + +func (err ErrInternal) Error() string { + return fmt.Sprintf("InternalServerError: %v", err.Message) +} + +func HTTPStatus(err error) int { + switch err.(type) { + case ErrNotAcceptable: + return http.StatusNotAcceptable + default: + return http.StatusInternalServerError + } +} diff --git a/services/federation/federation_service.go b/services/federation/federation_service.go index b71d8d2575..36788e725a 100644 --- a/services/federation/federation_service.go +++ b/services/federation/federation_service.go @@ -18,7 +18,6 @@ import ( "forgejo.org/modules/log" "forgejo.org/modules/setting" "forgejo.org/modules/validation" - context_service "forgejo.org/services/context" "github.com/google/uuid" ) @@ -27,7 +26,7 @@ func Init() error { return nil } -func FindOrCreateFederationHost(ctx *context_service.Base, actorURI string) (*forgefed.FederationHost, error) { +func FindOrCreateFederationHost(ctx context.Context, actorURI string) (*forgefed.FederationHost, error) { rawActorID, err := fm.NewActorID(actorURI) if err != nil { return nil, err @@ -46,7 +45,7 @@ func FindOrCreateFederationHost(ctx *context_service.Base, actorURI string) (*fo return federationHost, nil } -func FindOrCreateFederatedUser(ctx *context_service.Base, actorURI string) (*user.User, *user.FederatedUser, *forgefed.FederationHost, error) { +func FindOrCreateFederatedUser(ctx context.Context, actorURI string) (*user.User, *user.FederatedUser, *forgefed.FederationHost, error) { user, federatedUser, federationHost, err := findFederatedUser(ctx, actorURI) if err != nil { return nil, nil, nil, err @@ -57,20 +56,21 @@ func FindOrCreateFederatedUser(ctx *context_service.Base, actorURI string) (*use } if user != nil { - log.Trace("Found local federatedUser: %#v", user) + log.Trace("Local ActivityPub user found (actorURI: %#v, user: %#v)", actorURI, user) } else { + log.Trace("Attempting to create new user and federatedUser for actorURI: %#v", actorURI) user, federatedUser, err = createUserFromAP(ctx, personID, federationHost.ID) if err != nil { return nil, nil, nil, err } - log.Trace("Created federatedUser from ap: %#v", user) + log.Trace("Created user %#v with federatedUser %#v from distant server", user, federatedUser) } log.Trace("Got user: %v", user.Name) return user, federatedUser, federationHost, nil } -func findFederatedUser(ctx *context_service.Base, actorURI string) (*user.User, *user.FederatedUser, *forgefed.FederationHost, error) { +func findFederatedUser(ctx context.Context, actorURI string) (*user.User, *user.FederatedUser, *forgefed.FederationHost, error) { federationHost, err := FindOrCreateFederationHost(ctx, actorURI) if err != nil { return nil, nil, nil, err @@ -90,6 +90,7 @@ func findFederatedUser(ctx *context_service.Base, actorURI string) (*user.User, func createFederationHostFromAP(ctx context.Context, actorID fm.ActorID) (*forgefed.FederationHost, error) { actionsUser := user.NewAPServerActor() + clientFactory, err := activitypub.GetClientFactory(ctx) if err != nil { return nil, err @@ -161,7 +162,7 @@ func fetchUserFromAP(ctx context.Context, personID fm.PersonID, federationHostID return nil, nil, err } - log.Info("Fetched valid person:%q", person) + log.Info("Fetched valid person from distant server: %q", person) localFqdn, err := url.ParseRequestURI(setting.AppURL) if err != nil { @@ -220,7 +221,7 @@ func fetchUserFromAP(ctx context.Context, personID fm.PersonID, federationHostID }, } - log.Info("Fetch federatedUser:%q", federatedUser) + log.Info("Fetched person's %q federatedUser from distant server: %q", person, federatedUser) return &newUser, &federatedUser, nil } @@ -234,6 +235,6 @@ func createUserFromAP(ctx context.Context, personID fm.PersonID, federationHostI return nil, nil, err } - log.Info("Created federatedUser:%q", federatedUser) + log.Info("Created federatedUser: %q", federatedUser) return newUser, federatedUser, nil } diff --git a/services/federation/repo_like.go b/services/federation/repository_inbox_like.go similarity index 73% rename from services/federation/repo_like.go rename to services/federation/repository_inbox_like.go index c1e6500c61..478a12d92c 100644 --- a/services/federation/repo_like.go +++ b/services/federation/repository_inbox_like.go @@ -5,7 +5,6 @@ package federation import ( "context" - "errors" "fmt" "net/http" "time" @@ -18,6 +17,8 @@ import ( "forgejo.org/modules/log" "forgejo.org/modules/validation" context_service "forgejo.org/services/context" + + ap "github.com/go-ap/activitypub" ) // ProcessLikeActivity receives a ForgeLike activity and does the following: @@ -27,32 +28,32 @@ import ( // Validation of incoming RepositoryID against Local RepositoryID // Star the repo if it wasn't already stared // Do some mitigation against out of order attacks -func ProcessLikeActivity(ctx *context_service.APIContext, form any, repositoryID int64) (int, string, error) { - activity := form.(*fm.ForgeLike) - if res, err := validation.IsValid(activity); !res { - return http.StatusNotAcceptable, "Invalid activity", err +func ProcessLikeActivity(ctx context.Context, activity *ap.Activity, repositoryID int64) (ServiceResult, error) { + constructorLikeActivity, _ := fm.NewForgeLike(activity.Actor.GetLink().String(), activity.Object.GetLink().String(), activity.StartTime) + if res, err := validation.IsValid(constructorLikeActivity); !res { + return ServiceResult{}, NewErrNotAcceptablef("Invalid activity: %v", err) } log.Trace("Activity validated: %#v", activity) // parse actorID (person) actorURI := activity.Actor.GetID().String() - user, _, federationHost, err := FindOrCreateFederatedUser(ctx.Base, actorURI) + user, _, federationHost, err := FindOrCreateFederatedUser(ctx, actorURI) if err != nil { - ctx.Error(http.StatusNotAcceptable, "Federated user not found", err) - return http.StatusInternalServerError, "FindOrCreateFederatedUser", err + log.Error("Federated user not found (%s): %v", actorURI, err) + return ServiceResult{}, NewErrNotAcceptablef("FindOrCreateFederatedUser failed: %v", err) } - if !activity.IsNewer(federationHost.LatestActivity) { - return http.StatusNotAcceptable, "Activity out of order.", errors.New("Activity already processed") + if !constructorLikeActivity.IsNewer(federationHost.LatestActivity) { + return ServiceResult{}, NewErrNotAcceptablef("LatestActivity: activity already processed: %v", err) } // parse objectID (repository) - objectID, err := fm.NewRepositoryID(activity.Object.GetID().String(), string(forgefed.ForgejoSourceType)) + objectID, err := fm.NewRepositoryID(constructorLikeActivity.Object.GetID().String(), string(forgefed.ForgejoSourceType)) if err != nil { - return http.StatusNotAcceptable, "Invalid objectId", err + return ServiceResult{}, NewErrNotAcceptablef("Parsing repo objectID failed: %v", err) } if objectID.ID != fmt.Sprint(repositoryID) { - return http.StatusNotAcceptable, "Invalid objectId", err + return ServiceResult{}, NewErrNotAcceptablef("Invalid repoId: %v", err) } log.Trace("Object accepted: %#v", objectID) @@ -61,16 +62,16 @@ func ProcessLikeActivity(ctx *context_service.APIContext, form any, repositoryID if !alreadyStared { err = repo.StarRepo(ctx, user.ID, repositoryID, true) if err != nil { - return http.StatusNotAcceptable, "Error staring", err + return ServiceResult{}, NewErrNotAcceptablef("Staring failed: %v", err) } } federationHost.LatestActivity = activity.StartTime err = forgefed.UpdateFederationHost(ctx, federationHost) if err != nil { - return http.StatusNotAcceptable, "Error updating federatedHost", err + return ServiceResult{}, NewErrNotAcceptablef("Updating federatedHost failed: %v", err) } - return 0, "", nil + return NewServiceResultStatusOnly(http.StatusNoContent), nil } // Create or update a list of FollowingRepo structs diff --git a/services/federation/repository_service.go b/services/federation/repository_service.go new file mode 100644 index 0000000000..7891d786e2 --- /dev/null +++ b/services/federation/repository_service.go @@ -0,0 +1,19 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package federation + +import ( + "context" + + ap "github.com/go-ap/activitypub" +) + +func ProcessRepositoryInbox(ctx context.Context, activity *ap.Activity, repositoryID int64) (ServiceResult, error) { + switch activity.Type { + case ap.LikeType: + return ProcessLikeActivity(ctx, activity, repositoryID) + default: + return ServiceResult{}, NewErrNotAcceptablef("Not a like activity: %v", activity.Type) + } +} diff --git a/services/federation/result.go b/services/federation/result.go new file mode 100644 index 0000000000..47afb2bdf6 --- /dev/null +++ b/services/federation/result.go @@ -0,0 +1,35 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package federation + +import "github.com/go-ap/activitypub" + +type ServiceResult struct { + HTTPStatus int + Bytes []byte + Activity activitypub.Activity + withBytes bool + withActivity bool + statusOnly bool +} + +func NewServiceResultStatusOnly(status int) ServiceResult { + return ServiceResult{HTTPStatus: status, statusOnly: true} +} + +func NewServiceResultWithBytes(status int, bytes []byte) ServiceResult { + return ServiceResult{HTTPStatus: status, Bytes: bytes, withBytes: true} +} + +func (serviceResult ServiceResult) WithBytes() bool { + return serviceResult.withBytes +} + +func (serviceResult ServiceResult) WithActivity() bool { + return serviceResult.withActivity +} + +func (serviceResult ServiceResult) StatusOnly() bool { + return serviceResult.statusOnly +} diff --git a/services/federation/signature_service.go b/services/federation/signature_service.go index e5102b89d8..fd8cbb39cd 100644 --- a/services/federation/signature_service.go +++ b/services/federation/signature_service.go @@ -4,6 +4,7 @@ package federation import ( + "context" "crypto/x509" "database/sql" "encoding/pem" @@ -15,13 +16,12 @@ import ( "forgejo.org/models/user" "forgejo.org/modules/activitypub" fm "forgejo.org/modules/forgefed" - context_service "forgejo.org/services/context" ap "github.com/go-ap/activitypub" ) // Factory function for ActorID. Created struct is asserted to be valid -func NewActorIDFromKeyID(ctx *context_service.Base, uri string) (fm.ActorID, error) { +func NewActorIDFromKeyID(ctx context.Context, uri string) (fm.ActorID, error) { parsedURI, err := url.Parse(uri) parsedURI.Fragment = "" if err != nil { @@ -54,7 +54,7 @@ func NewActorIDFromKeyID(ctx *context_service.Base, uri string) (fm.ActorID, err return result, err } -func FindOrCreateFederatedUserKey(ctx *context_service.Base, keyID string) (pubKey any, err error) { +func FindOrCreateFederatedUserKey(ctx context.Context, keyID string) (pubKey any, err error) { var federatedUser *user.FederatedUser var keyURL *url.URL @@ -122,7 +122,7 @@ func FindOrCreateFederatedUserKey(ctx *context_service.Base, keyID string) (pubK return nil, nil } -func FindOrCreateFederationHostKey(ctx *context_service.Base, keyID string) (pubKey any, err error) { +func FindOrCreateFederationHostKey(ctx context.Context, keyID string) (pubKey any, err error) { keyURL, err := url.Parse(keyID) if err != nil { return nil, err @@ -183,8 +183,9 @@ func FindOrCreateFederationHostKey(ctx *context_service.Base, keyID string) (pub return nil, nil } -func fetchKeyFromAp(ctx *context_service.Base, keyURL url.URL) (pubKey any, pubKeyBytes []byte, apPerson *ap.Person, err error) { +func fetchKeyFromAp(ctx context.Context, keyURL url.URL) (pubKey any, pubKeyBytes []byte, apPerson *ap.Person, err error) { actionsUser := user.NewAPServerActor() + clientFactory, err := activitypub.GetClientFactory(ctx) if err != nil { return nil, nil, nil, err diff --git a/tests/integration/api_activitypub_actor_test.go b/tests/integration/api_activitypub_actor_test.go new file mode 100644 index 0000000000..42232bd640 --- /dev/null +++ b/tests/integration/api_activitypub_actor_test.go @@ -0,0 +1,77 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package integration + +import ( + "fmt" + "net/http" + "net/url" + "strconv" + "testing" + + "forgejo.org/modules/forgefed" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" + "forgejo.org/routers" + "forgejo.org/services/contexttest" + "forgejo.org/services/federation" + "forgejo.org/tests" + + ap "github.com/go-ap/activitypub" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestActivityPubActor(t *testing.T) { + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + defer tests.PrepareTestEnv(t)() + + req := NewRequest(t, "GET", "/api/v1/activitypub/actor") + resp := MakeRequest(t, req, http.StatusOK) + assert.Contains(t, resp.Body.String(), "@context") + + var actor ap.Actor + err := actor.UnmarshalJSON(resp.Body.Bytes()) + require.NoError(t, err) + + assert.Equal(t, ap.ApplicationType, actor.Type) + assert.Equal(t, "ghost", actor.PreferredUsername.String()) + keyID := actor.GetID().String() + assert.Regexp(t, "activitypub/actor$", keyID) + assert.Regexp(t, "activitypub/actor/inbox$", actor.Inbox.GetID().String()) + + pubKey := actor.PublicKey + assert.NotNil(t, pubKey) + publicKeyID := keyID + "#main-key" + assert.Equal(t, pubKey.ID.String(), publicKeyID) + + pubKeyPem := pubKey.PublicKeyPem + assert.NotNil(t, pubKeyPem) + assert.Regexp(t, "^-----BEGIN PUBLIC KEY-----", pubKeyPem) +} + +func TestActorNewFromKeyId(t *testing.T) { + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + onGiteaRun(t, func(t *testing.T, u *url.URL) { + ctx, _ := contexttest.MockAPIContext(t, "/api/v1/activitypub/actor") + sut, err := federation.NewActorIDFromKeyID(ctx.Base, fmt.Sprintf("%sapi/v1/activitypub/actor#main-key", u)) + require.NoError(t, err) + + port, err := strconv.ParseUint(u.Port(), 10, 16) + require.NoError(t, err) + + assert.Equal(t, forgefed.ActorID{ + ID: "actor", + HostSchema: "http", + Path: "api/v1/activitypub", + Host: setting.Domain, + HostPort: uint16(port), + UnvalidatedInput: fmt.Sprintf("http://%s:%d/api/v1/activitypub/actor", setting.Domain, port), + IsPortSupplemented: false, + }, sut) + }) +} diff --git a/tests/integration/api_activitypub_person_test.go b/tests/integration/api_activitypub_person_test.go new file mode 100644 index 0000000000..277b150a1e --- /dev/null +++ b/tests/integration/api_activitypub_person_test.go @@ -0,0 +1,113 @@ +// Copyright 2022 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package integration + +import ( + "fmt" + "net/http" + "net/url" + "testing" + "time" + + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/activitypub" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" + "forgejo.org/routers" + "forgejo.org/services/contexttest" + "forgejo.org/tests" + + ap "github.com/go-ap/activitypub" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestActivityPubPerson(t *testing.T) { + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + mock := test.NewFederationServerMock() + federatedSrv := mock.DistantServer(t) + defer federatedSrv.Close() + + onGiteaRun(t, func(t *testing.T, localUrl *url.URL) { + defer test.MockVariableValue(&setting.AppURL, localUrl.String())() + + localUserID := 2 + localUserName := "user2" + localUserURL := fmt.Sprintf("%sapi/v1/activitypub/user-id/%d", localUrl, localUserID) + + // distantURL := federatedSrv.URL + // distantUser15URL := fmt.Sprintf("%s/api/v1/activitypub/user-id/15", distantURL) + + // Unsigned request + t.Run("UnsignedRequest", func(t *testing.T) { + req := NewRequest(t, "GET", localUserURL) + MakeRequest(t, req, http.StatusBadRequest) + }) + + // Signed request + t.Run("SignedRequestValidation", func(t *testing.T) { + ctx, _ := contexttest.MockAPIContext(t, localUserURL) + cf, err := activitypub.NewClientFactoryWithTimeout(60 * time.Second) + require.NoError(t, err) + + c, err := cf.WithKeysDirect(ctx, mock.Persons[0].PrivKey, + mock.Persons[0].KeyID(federatedSrv.URL)) + require.NoError(t, err) + + resp, err := c.GetBody(localUserURL) + require.NoError(t, err) + + var person ap.Person + err = person.UnmarshalJSON(resp) + require.NoError(t, err) + + assert.Equal(t, ap.PersonType, person.Type) + assert.Equal(t, localUserName, person.PreferredUsername.String()) + assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%d$", localUserID), person.GetID()) + assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%d/inbox$", localUserID), person.Inbox.GetID().String()) + + assert.NotNil(t, person.PublicKey) + assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%d#main-key$", localUserID), person.PublicKey.ID) + + assert.NotNil(t, person.PublicKey.PublicKeyPem) + assert.Regexp(t, "^-----BEGIN PUBLIC KEY-----", person.PublicKey.PublicKeyPem) + }) + }) +} + +func TestActivityPubMissingPerson(t *testing.T) { + defer tests.PrepareTestEnv(t)() + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + req := NewRequest(t, "GET", "/api/v1/activitypub/user-id/999999999") + resp := MakeRequest(t, req, http.StatusNotFound) + assert.Contains(t, resp.Body.String(), "user does not exist") +} + +func TestActivityPubPersonInbox(t *testing.T) { + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + onGiteaRun(t, func(t *testing.T, u *url.URL) { + defer test.MockVariableValue(&setting.AppURL, u.String())() + user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + + user1url := u.JoinPath("/api/v1/activitypub/user-id/1").String() + "#main-key" + user2inboxurl := u.JoinPath("/api/v1/activitypub/user-id/2/inbox").String() + ctx, _ := contexttest.MockAPIContext(t, user2inboxurl) + cf, err := activitypub.NewClientFactoryWithTimeout(60 * time.Second) + require.NoError(t, err) + c, err := cf.WithKeys(ctx, user1, user1url) + require.NoError(t, err) + + // Signed request "succeeds" + resp, err := c.Post([]byte{}, user2inboxurl) + require.NoError(t, err) + assert.Equal(t, http.StatusNoContent, resp.StatusCode) + }) +} diff --git a/tests/integration/api_activitypub_repository_test.go b/tests/integration/api_activitypub_repository_test.go new file mode 100644 index 0000000000..b4be0407b9 --- /dev/null +++ b/tests/integration/api_activitypub_repository_test.go @@ -0,0 +1,176 @@ +// Copyright 2024, 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package integration + +import ( + "fmt" + "net/http" + "net/url" + "testing" + "time" + + "forgejo.org/models/forgefed" + "forgejo.org/models/unittest" + "forgejo.org/models/user" + "forgejo.org/modules/activitypub" + forgefed_modules "forgejo.org/modules/forgefed" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" + "forgejo.org/routers" + "forgejo.org/services/contexttest" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestActivityPubRepository(t *testing.T) { + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + mock := test.NewFederationServerMock() + federatedSrv := mock.DistantServer(t) + defer federatedSrv.Close() + + onGiteaRun(t, func(t *testing.T, u *url.URL) { + repositoryID := 2 + + localRepository := fmt.Sprintf("%sapi/v1/activitypub/repository-id/%d", u, repositoryID) + + ctx, _ := contexttest.MockAPIContext(t, localRepository) + cf, err := activitypub.NewClientFactoryWithTimeout(60 * time.Second) + require.NoError(t, err) + + c, err := cf.WithKeysDirect(ctx, mock.Persons[0].PrivKey, + mock.Persons[0].KeyID(federatedSrv.URL)) + require.NoError(t, err) + + resp, err := c.GetBody(localRepository) + require.NoError(t, err) + assert.Contains(t, string(resp), "@context") + + var repository forgefed_modules.Repository + err = repository.UnmarshalJSON(resp) + require.NoError(t, err) + + assert.Regexp(t, fmt.Sprintf("activitypub/repository-id/%d$", repositoryID), repository.GetID().String()) + }) +} + +func TestActivityPubMissingRepository(t *testing.T) { + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&setting.Federation.SignatureEnforced, false)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + repositoryID := 9999999 + req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/activitypub/repository-id/%d", repositoryID)) + resp := MakeRequest(t, req, http.StatusNotFound) + assert.Contains(t, resp.Body.String(), "repository does not exist") +} + +func TestActivityPubRepositoryInboxValid(t *testing.T) { + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + mock := test.NewFederationServerMock() + federatedSrv := mock.DistantServer(t) + defer federatedSrv.Close() + + onGiteaRun(t, func(t *testing.T, u *url.URL) { + repositoryID := 2 + timeNow := time.Now().UTC() + localRepoInbox := u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d/inbox", repositoryID)).String() + + ctx, _ := contexttest.MockAPIContext(t, localRepoInbox) + cf, err := activitypub.NewClientFactoryWithTimeout(60 * time.Second) + require.NoError(t, err) + + c, err := cf.WithKeysDirect(ctx, mock.Persons[0].PrivKey, + mock.Persons[0].KeyID(federatedSrv.URL)) + require.NoError(t, err) + + activity1 := []byte(fmt.Sprintf( + `{"type":"Like",`+ + `"startTime":"%s",`+ + `"actor":"%s/api/v1/activitypub/user-id/15",`+ + `"object":"%s"}`, + timeNow.Format(time.RFC3339), + federatedSrv.URL, u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d", repositoryID)).String())) + t.Logf("activity: %s", activity1) + resp, err := c.Post(activity1, localRepoInbox) + + require.NoError(t, err) + assert.Equal(t, http.StatusNoContent, resp.StatusCode) + + federationHost := unittest.AssertExistsAndLoadBean(t, &forgefed.FederationHost{HostFqdn: "127.0.0.1"}) + federatedUser := unittest.AssertExistsAndLoadBean(t, &user.FederatedUser{ExternalID: "15", FederationHostID: federationHost.ID}) + unittest.AssertExistsAndLoadBean(t, &user.User{ID: federatedUser.UserID}) + + // A like activity by a different user of the same federated host. + activity2 := []byte(fmt.Sprintf( + `{"type":"Like",`+ + `"startTime":"%s",`+ + `"actor":"%s/api/v1/activitypub/user-id/30",`+ + `"object":"%s"}`, + // Make sure this activity happens later then the one before + timeNow.Add(time.Second).Format(time.RFC3339), + federatedSrv.URL, u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d", repositoryID)).String())) + t.Logf("activity: %s", activity2) + resp, err = c.Post(activity2, localRepoInbox) + + require.NoError(t, err) + assert.Equal(t, http.StatusNoContent, resp.StatusCode) + + federatedUser = unittest.AssertExistsAndLoadBean(t, &user.FederatedUser{ExternalID: "30", FederationHostID: federationHost.ID}) + unittest.AssertExistsAndLoadBean(t, &user.User{ID: federatedUser.UserID}) + + // The same user sends another like activity + otherRepositoryID := 3 + otherRepoInboxURL := u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d/inbox", otherRepositoryID)).String() + activity3 := []byte(fmt.Sprintf( + `{"type":"Like",`+ + `"startTime":"%s",`+ + `"actor":"%s/api/v1/activitypub/user-id/30",`+ + `"object":"%s"}`, + // Make sure this activity happens later then the ones before + timeNow.Add(time.Second*2).Format(time.RFC3339), + federatedSrv.URL, u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d", otherRepositoryID)).String())) + t.Logf("activity: %s", activity3) + resp, err = c.Post(activity3, otherRepoInboxURL) + + require.NoError(t, err) + assert.Equal(t, http.StatusNoContent, resp.StatusCode) + + federatedUser = unittest.AssertExistsAndLoadBean(t, &user.FederatedUser{ExternalID: "30", FederationHostID: federationHost.ID}) + unittest.AssertExistsAndLoadBean(t, &user.User{ID: federatedUser.UserID}) + + // Replay activity2. + resp, err = c.Post(activity2, localRepoInbox) + require.NoError(t, err) + assert.Equal(t, http.StatusNotAcceptable, resp.StatusCode) + }) +} + +func TestActivityPubRepositoryInboxInvalid(t *testing.T) { + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&setting.Federation.SignatureEnforced, false)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + onGiteaRun(t, func(t *testing.T, u *url.URL) { + apServerActor := user.NewAPServerActor() + repositoryID := 2 + localRepo2Inbox := u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d/inbox", repositoryID)).String() + + ctx, _ := contexttest.MockAPIContext(t, localRepo2Inbox) + cf, err := activitypub.NewClientFactoryWithTimeout(60 * time.Second) + require.NoError(t, err) + + c, err := cf.WithKeys(ctx, apServerActor, apServerActor.KeyID()) + require.NoError(t, err) + + activity := []byte(`{"type":"Wrong"}`) + resp, err := c.Post(activity, localRepo2Inbox) + require.NoError(t, err) + assert.Equal(t, http.StatusNotAcceptable, resp.StatusCode) + }) +} diff --git a/tests/integration/api_federation_httpsig_test.go b/tests/integration/api_federation_httpsig_test.go new file mode 100644 index 0000000000..a8deaa315f --- /dev/null +++ b/tests/integration/api_federation_httpsig_test.go @@ -0,0 +1,82 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package integration + +import ( + "fmt" + "net/http" + "net/url" + "testing" + + "forgejo.org/models/db" + "forgejo.org/models/forgefed" + "forgejo.org/models/unittest" + "forgejo.org/models/user" + "forgejo.org/modules/activitypub" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" + "forgejo.org/routers" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestFederationHttpSigValidation(t *testing.T) { + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + onGiteaRun(t, func(t *testing.T, u *url.URL) { + userID := 2 + userURL := fmt.Sprintf("%sapi/v1/activitypub/user-id/%d", u, userID) + + user1 := unittest.AssertExistsAndLoadBean(t, &user.User{ID: 1}) + + clientFactory, err := activitypub.GetClientFactory(db.DefaultContext) + require.NoError(t, err) + + apClient, err := clientFactory.WithKeys(db.DefaultContext, user1, user1.KeyID()) + require.NoError(t, err) + + // Unsigned request + t.Run("UnsignedRequest", func(t *testing.T) { + req := NewRequest(t, "GET", userURL) + MakeRequest(t, req, http.StatusBadRequest) + }) + + // Signed request + t.Run("SignedRequest", func(t *testing.T) { + resp, err := apClient.Get(userURL) + require.NoError(t, err) + assert.Equal(t, http.StatusOK, resp.StatusCode) + }) + + // HACK HACK HACK: the host part of the URL gets set to which IP forgejo is + // listening on, NOT localhost, which is the Domain given to forgejo which + // is then used for eg. the keyID all requests + applicationKeyID := fmt.Sprintf("%sapi/v1/activitypub/actor#main-key", setting.AppURL) + actorKeyID := fmt.Sprintf("%sapi/v1/activitypub/user-id/1#main-key", setting.AppURL) + + // Check for cached public keys + t.Run("ValidateCaches", func(t *testing.T) { + host, err := forgefed.FindFederationHostByKeyID(db.DefaultContext, applicationKeyID) + require.NoError(t, err) + assert.NotNil(t, host) + assert.True(t, host.PublicKey.Valid) + + _, user, err := user.FindFederatedUserByKeyID(db.DefaultContext, actorKeyID) + require.NoError(t, err) + assert.NotNil(t, user) + assert.True(t, user.PublicKey.Valid) + }) + + // Disable signature validation + defer test.MockVariableValue(&setting.Federation.SignatureEnforced, false)() + + // Unsigned request + t.Run("SignatureValidationDisabled", func(t *testing.T) { + req := NewRequest(t, "GET", userURL) + MakeRequest(t, req, http.StatusOK) + }) + }) +} diff --git a/tests/integration/repo_star_federation_test.go b/tests/integration/repo_star_federation_test.go new file mode 100644 index 0000000000..ae9a4e9f83 --- /dev/null +++ b/tests/integration/repo_star_federation_test.go @@ -0,0 +1,81 @@ +// Copyright 2024 The Forgejo Authors c/o Codeberg e.V.. All rights reserved. +// SPDX-License-Identifier: MIT + +package integration + +import ( + "fmt" + "net/http" + "strings" + "testing" + + "forgejo.org/models/forgefed" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + fm "forgejo.org/modules/forgefed" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" + "forgejo.org/modules/validation" + "forgejo.org/tests" +) + +func TestActivityPubRepoFollowing(t *testing.T) { + defer tests.PrepareTestEnv(t)() + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + + mock := test.NewFederationServerMock() + federatedSrv := mock.DistantServer(t) + defer federatedSrv.Close() + + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1, OwnerID: user.ID}) + session := loginUser(t, user.Name) + + t.Run("Add a following repo", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + link := fmt.Sprintf("/%s/settings", repo.FullName()) + + req := NewRequestWithValues(t, "POST", link, map[string]string{ + "_csrf": GetCSRF(t, session, link), + "action": "federation", + "following_repos": fmt.Sprintf("%s/api/v1/activitypub/repository-id/1", federatedSrv.URL), + }) + session.MakeRequest(t, req, http.StatusSeeOther) + + // Verify it was added. + federationHost := unittest.AssertExistsAndLoadBean(t, &forgefed.FederationHost{HostFqdn: "127.0.0.1"}) + unittest.AssertExistsAndLoadBean(t, &repo_model.FollowingRepo{ + ExternalID: "1", + FederationHostID: federationHost.ID, + }) + }) + + t.Run("Star a repo having a following repo", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + repoLink := fmt.Sprintf("/%s", repo.FullName()) + link := fmt.Sprintf("%s/action/star", repoLink) + req := NewRequestWithValues(t, "POST", link, map[string]string{ + "_csrf": GetCSRF(t, session, repoLink), + }) + + session.MakeRequest(t, req, http.StatusOK) + + // Verify distant server received a like activity + like := fm.ForgeLike{} + err := like.UnmarshalJSON([]byte(mock.LastPost)) + if err != nil { + t.Errorf("Error unmarshalling ForgeLike: %q", err) + } + if isValid, err := validation.IsValid(like); !isValid { + t.Errorf("ForgeLike is not valid: %q", err) + } + activityType := like.Type + object := like.Object.GetLink().String() + isLikeType := activityType == "Like" + isCorrectObject := strings.HasSuffix(object, "/api/v1/activitypub/repository-id/1") + if !isLikeType || !isCorrectObject { + t.Error("Activity is not a like for this repo") + } + }) +} From b1b418a939f5830f4938d2d02d3eae437c810045 Mon Sep 17 00:00:00 2001 From: Lynoure Braakman Date: Fri, 25 Jul 2025 22:21:37 +0200 Subject: [PATCH 222/495] RELEASE-NOTES.md to refer to the release notes directory on master [skip ci] (#8675) For any given version, the release notes in that version are lagging behind, so to reduce confusion of someone just wanting to see the release notes of this version they are looking at, changed the RELEASE-NOTES.md to refer to the release notes directory on the main branch. I'm not 100% happy with now having that point to the main branch, and the more specific links pointing relatively, but maybe it's good enough. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8675 Reviewed-by: Robert Wolff Co-authored-by: Lynoure Braakman Co-committed-by: Lynoure Braakman --- RELEASE-NOTES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 32f7b8c264..c688045d1c 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -4,7 +4,7 @@ A minor or major Forgejo release is published every [three months](https://forge A [patch or minor release](https://semver.org/spec/v2.0.0.html) (e.g. upgrading from v7.0.0 to v7.0.1 or v7.1.0) does not require manual intervention. But [major releases](https://semver.org/spec/v2.0.0.html#spec-item-8) where the first version number changes (e.g. upgrading from v1.21 to v7.0) contain breaking changes and the release notes explain how to deal with them. -The release notes of each release [are available in the release-notes-published directory of this repository](release-notes-published), starting with [Forgejo 7.0.7](release-notes-published/7.0.7.md) and [Forgejo 8.0.1](release-notes-published/8.0.1.md). +The release notes of each release [are available in the release-notes-published directory of this repository](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/release-notes-published), starting with [Forgejo 7.0.7](release-notes-published/7.0.7.md) and [Forgejo 8.0.1](release-notes-published/8.0.1.md). ## 9.0.2 From 24014c349ee4267424ebae5b779e5a40ac65153e Mon Sep 17 00:00:00 2001 From: Gusted Date: Sat, 26 Jul 2025 05:16:55 +0200 Subject: [PATCH 223/495] fix: store code challenge correctly in session (#8678) - Even though the test file contains some good extensive testing, it didn't bother to actually call `/login/oauth/access_token` to see if the received code actually resulted into a access token. - The fix itself is... well yeah self-explanatory. - Resolves forgejo/forgejo#8669 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8678 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- routers/web/auth/oauth.go | 2 +- tests/integration/oauth_test.go | 61 +++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/routers/web/auth/oauth.go b/routers/web/auth/oauth.go index f287e0e900..1119e1947b 100644 --- a/routers/web/auth/oauth.go +++ b/routers/web/auth/oauth.go @@ -489,7 +489,7 @@ func AuthorizeOAuth(ctx *context.Context) { }, form.RedirectURI) return } - if err := ctx.Session.Set("CodeChallengeMethod", form.CodeChallenge); err != nil { + if err := ctx.Session.Set("CodeChallenge", form.CodeChallenge); err != nil { handleAuthorizeError(ctx, AuthorizeError{ ErrorCode: ErrorCodeServerError, ErrorDescription: "cannot set code challenge", diff --git a/tests/integration/oauth_test.go b/tests/integration/oauth_test.go index 188b0426da..ebfd386ee0 100644 --- a/tests/integration/oauth_test.go +++ b/tests/integration/oauth_test.go @@ -1547,3 +1547,64 @@ func TestSignUpViaOAuth2FA(t *testing.T) { // Make sure user has to go through 2FA. assert.Equal(t, "/user/webauthn", test.RedirectURL(resp)) } + +func TestAccessTokenWithPKCE(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + var u *url.URL + t.Run("Grant", func(t *testing.T) { + session := loginUser(t, "user4") + req := NewRequestWithValues(t, "POST", "/login/oauth/grant", map[string]string{ + "_csrf": GetCSRF(t, session, "/login/oauth/authorize?client_id=ce5a1322-42a7-11ed-b878-0242ac120002&redirect_uri=b&response_type=code&code_challenge_method=plain&code_challenge=CODE&state=thestate"), + "client_id": "ce5a1322-42a7-11ed-b878-0242ac120002", + "redirect_uri": "b", + "state": "thestate", + "granted": "true", + }) + resp := session.MakeRequest(t, req, http.StatusSeeOther) + + var err error + u, err = url.Parse(test.RedirectURL(resp)) + require.NoError(t, err) + }) + + t.Run("Incorrect code verfifier", func(t *testing.T) { + req := NewRequestWithValues(t, "POST", "/login/oauth/access_token", map[string]string{ + "client_id": "ce5a1322-42a7-11ed-b878-0242ac120002", + "code": u.Query().Get("code"), + "code_verifier": "just a guess", + "grant_type": "authorization_code", + "redirect_uri": "b", + }) + resp := MakeRequest(t, req, http.StatusBadRequest) + + var respBody map[string]any + DecodeJSON(t, resp, &respBody) + + if assert.Len(t, respBody, 2) { + assert.Equal(t, "unauthorized_client", respBody["error"]) + assert.Equal(t, "failed PKCE code challenge", respBody["error_description"]) + } + }) + + t.Run("Get access token", func(t *testing.T) { + req := NewRequestWithValues(t, "POST", "/login/oauth/access_token", map[string]string{ + "client_id": "ce5a1322-42a7-11ed-b878-0242ac120002", + "code": u.Query().Get("code"), + "code_verifier": "CODE", + "grant_type": "authorization_code", + "redirect_uri": "b", + }) + resp := MakeRequest(t, req, http.StatusOK) + + var respBody map[string]any + DecodeJSON(t, resp, &respBody) + + if assert.Len(t, respBody, 4) { + assert.NotEmpty(t, respBody["access_token"]) + assert.NotEmpty(t, respBody["token_type"]) + assert.NotEmpty(t, respBody["expires_in"]) + assert.NotEmpty(t, respBody["refresh_token"]) + } + }) +} From 02de040a5e995dc45ed66470a45f31703f706991 Mon Sep 17 00:00:00 2001 From: Gusted Date: Sat, 26 Jul 2025 05:44:58 +0200 Subject: [PATCH 224/495] feat: add tracing logs after process is complete (#8680) - Add the written HTTP status after completing the HTTP response. This makes it easier to find that one request that returns a different status code (ref. https://codeberg.org/Codeberg/Community/issues/2049#issue-1972600) - Add the affected amount of rows and last insert ID after the SQL query is done, I have not yet a concrete use-case but this might help with debugging which ID corresponds to some SQL query that someone might want to take a closer look at and if some SQL query affects more than necessary amount of rows. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8680 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- models/db/engine.go | 9 +++++++++ routers/common/middleware.go | 6 +++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/models/db/engine.go b/models/db/engine.go index 76025f7d67..42b9150696 100755 --- a/models/db/engine.go +++ b/models/db/engine.go @@ -386,6 +386,15 @@ func (TracingHook) BeforeProcess(c *contexts.ContextHook) (context.Context, erro } func (TracingHook) AfterProcess(c *contexts.ContextHook) error { + if c.Result != nil { + if rowsAffected, err := c.Result.RowsAffected(); err == nil { + trace.Logf(c.Ctx, "rows affected", "%d", rowsAffected) + } + if lastID, err := c.Result.LastInsertId(); err == nil { + trace.Logf(c.Ctx, "last insert id", "%d", lastID) + } + } + c.Ctx.Value(sqlTask{}).(*trace.Task).End() return nil } diff --git a/routers/common/middleware.go b/routers/common/middleware.go index d44f046a1e..7bc4890a43 100644 --- a/routers/common/middleware.go +++ b/routers/common/middleware.go @@ -46,7 +46,11 @@ func ProtocolMiddlewares() (handlers []any) { defer finished() trace.Log(ctx, "method", req.Method) trace.Log(ctx, "url", req.RequestURI) - next.ServeHTTP(context.WrapResponseWriter(resp), req.WithContext(cache.WithCacheContext(ctx))) + + respWriter := context.WrapResponseWriter(resp) + next.ServeHTTP(respWriter, req.WithContext(cache.WithCacheContext(ctx))) + + trace.Logf(ctx, "status", "%d", respWriter.WrittenStatus()) }) }) From d22f9d1f3808da4a77827c0362a85fdaa08cea91 Mon Sep 17 00:00:00 2001 From: Gusted Date: Sat, 26 Jul 2025 05:47:06 +0200 Subject: [PATCH 225/495] fix: show mergebox when only manual merge is allowed (#8681) - If a repository only has the 'manual merge' strategy allowed, the mergebox should still be shown. - The condition that checks if all merge strategies are disabled didn't check for the manual merge strategy. - Add a integration test that demonstrates this fix is effective. Reported-by: apteryx Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8681 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- templates/repo/issue/view_content/pull.tmpl | 2 +- tests/integration/pull_test.go | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/templates/repo/issue/view_content/pull.tmpl b/templates/repo/issue/view_content/pull.tmpl index 58d85dbf1b..bc578a6f4c 100644 --- a/templates/repo/issue/view_content/pull.tmpl +++ b/templates/repo/issue/view_content/pull.tmpl @@ -199,7 +199,7 @@ {{if .AllowMerge}} {{/* user is allowed to merge */}} {{$prUnit := .Repository.MustGetUnit $.Context $.UnitTypePullRequests}} - {{if or $prUnit.PullRequestsConfig.AllowMerge $prUnit.PullRequestsConfig.AllowRebase $prUnit.PullRequestsConfig.AllowRebaseMerge $prUnit.PullRequestsConfig.AllowSquash $prUnit.PullRequestsConfig.AllowFastForwardOnly}} + {{if or $prUnit.PullRequestsConfig.AllowMerge $prUnit.PullRequestsConfig.AllowRebase $prUnit.PullRequestsConfig.AllowRebaseMerge $prUnit.PullRequestsConfig.AllowSquash $prUnit.PullRequestsConfig.AllowFastForwardOnly $prUnit.PullRequestsConfig.AllowManualMerge}} {{$hasPendingPullRequestMergeTip := ""}} {{if .HasPendingPullRequestMerge}} {{$createdPRMergeStr := DateUtils.TimeSince .PendingPullRequestMerge.CreatedUnix}} diff --git a/tests/integration/pull_test.go b/tests/integration/pull_test.go index fd9dbf8888..36daf35f7b 100644 --- a/tests/integration/pull_test.go +++ b/tests/integration/pull_test.go @@ -136,3 +136,24 @@ func TestPullCombinedReviewRequest(t *testing.T) { helper(t, "detach", "9", "removed review request for user11") helper(t, "detach", "2", "removed review requests for user11, user2") } + +func TestShowMergeForManualMerge(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + // Only allow manual merge strategy for this repository. + pullRepoUnit := unittest.AssertExistsAndLoadBean(t, &repo_model.RepoUnit{ID: 5, RepoID: 1, Type: unit.TypePullRequests}) + pullRepoUnit.Config = &repo_model.PullRequestsConfig{ + AllowManualMerge: true, + DefaultMergeStyle: repo_model.MergeStyleManuallyMerged, + } + repo_model.UpdateRepoUnit(t.Context(), pullRepoUnit) + + session := loginUser(t, "user2") + + req := NewRequest(t, "GET", "/user2/repo1/pulls/5") + resp := session.MakeRequest(t, req, http.StatusOK) + + // Assert that the mergebox is shown. + htmlDoc := NewHTMLParser(t, resp.Body) + htmlDoc.AssertElement(t, "#pull-request-merge-form", true) +} From ee35b617b799daa4c9efc43f7016c589be16a518 Mon Sep 17 00:00:00 2001 From: Gusted Date: Sat, 26 Jul 2025 16:14:42 +0200 Subject: [PATCH 226/495] chore: correctly prepare test env (#8686) - Ref forgejo/forgejo#8681 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8686 Co-authored-by: Gusted Co-committed-by: Gusted --- tests/integration/pull_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/pull_test.go b/tests/integration/pull_test.go index 36daf35f7b..8ff715a1b5 100644 --- a/tests/integration/pull_test.go +++ b/tests/integration/pull_test.go @@ -138,7 +138,7 @@ func TestPullCombinedReviewRequest(t *testing.T) { } func TestShowMergeForManualMerge(t *testing.T) { - defer tests.PrintCurrentTest(t)() + defer tests.PrepareTestEnv(t)() // Only allow manual merge strategy for this repository. pullRepoUnit := unittest.AssertExistsAndLoadBean(t, &repo_model.RepoUnit{ID: 5, RepoID: 1, Type: unit.TypePullRequests}) From 4694cbf95be9082196497006913117c6d7668c15 Mon Sep 17 00:00:00 2001 From: Antonin Delpeuch Date: Sun, 27 Jul 2025 10:05:55 +0200 Subject: [PATCH 227/495] fix: don't mark files in AGit PRs as editable (#8642) Fixes #8639. For your convenience this PR is made via AGit for you to see the issue directly in Codeberg ^^ ### Tests - I added test coverage for Go changes... - [ ] in their respective `*_test.go` for unit tests. - [x] in the `tests/integration` directory if it involves interactions with a live Forgejo server. I am not sure how to best write a unit test for this. It looks like there isn't any AGit PR in the default test database. The integration test in `test/integration/pull_review_test.go` creates one by manually running Git commands. I could just copy all that code to do the same in another test, but I feel bad about duplicating this. Can they be sensibly migrated to some helpers module that can be reused across tests? Or can we add an AGit PR to the test database? Or can we modify the `Flow` attribute of a PR in a test just for the sake of simulating that it's an AGit one? ### Documentation - [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [x] I do not want this change to show in the release notes. - [ ] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/.md` to be be used for the release notes instead of the title. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8642 Reviewed-by: Gusted Co-authored-by: Antonin Delpeuch Co-committed-by: Antonin Delpeuch --- routers/web/repo/pull.go | 2 +- tests/integration/pull_diff_test.go | 91 +++++++++++++++++++++++++++-- 2 files changed, 87 insertions(+), 6 deletions(-) diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index c9a2bb4e08..48e132df5c 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -1152,7 +1152,7 @@ func viewPullFiles(ctx *context.Context, specifiedStartCommit, specifiedEndCommi ctx.ServerError("GetUserRepoPermission", err) return } - ctx.Data["HeadBranchIsEditable"] = pull.HeadRepo.CanEnableEditor() && issues_model.CanMaintainerWriteToBranch(ctx, headRepoPerm, pull.HeadBranch, ctx.Doer) + ctx.Data["HeadBranchIsEditable"] = pull.HeadRepo.CanEnableEditor() && issues_model.CanMaintainerWriteToBranch(ctx, headRepoPerm, pull.HeadBranch, ctx.Doer) && pull.Flow != issues_model.PullRequestFlowAGit ctx.Data["SourceRepoLink"] = pull.HeadRepo.Link() ctx.Data["HeadBranch"] = pull.HeadBranch } diff --git a/tests/integration/pull_diff_test.go b/tests/integration/pull_diff_test.go index 6db9fc25d8..7442909aec 100644 --- a/tests/integration/pull_diff_test.go +++ b/tests/integration/pull_diff_test.go @@ -4,32 +4,45 @@ package integration import ( + "fmt" "net/http" + "net/url" + "os" + "path" + "strings" "testing" + "time" + issues_model "forgejo.org/models/issues" + unit_model "forgejo.org/models/unit" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/git" + files_service "forgejo.org/services/repository/files" "forgejo.org/tests" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestPullDiff_CompletePRDiff(t *testing.T) { - doTestPRDiff(t, "/user2/commitsonpr/pulls/1/files", []string{"test1.txt", "test10.txt", "test2.txt", "test3.txt", "test4.txt", "test5.txt", "test6.txt", "test7.txt", "test8.txt", "test9.txt"}) + doTestPRDiff(t, "/user2/commitsonpr/pulls/1/files", []string{"test1.txt", "test10.txt", "test2.txt", "test3.txt", "test4.txt", "test5.txt", "test6.txt", "test7.txt", "test8.txt", "test9.txt"}, true) } func TestPullDiff_SingleCommitPRDiff(t *testing.T) { - doTestPRDiff(t, "/user2/commitsonpr/pulls/1/commits/c5626fc9eff57eb1bb7b796b01d4d0f2f3f792a2", []string{"test3.txt"}) + doTestPRDiff(t, "/user2/commitsonpr/pulls/1/commits/c5626fc9eff57eb1bb7b796b01d4d0f2f3f792a2", []string{"test3.txt"}, true) } func TestPullDiff_CommitRangePRDiff(t *testing.T) { - doTestPRDiff(t, "/user2/commitsonpr/pulls/1/files/4ca8bcaf27e28504df7bf996819665986b01c847..23576dd018294e476c06e569b6b0f170d0558705", []string{"test2.txt", "test3.txt", "test4.txt"}) + doTestPRDiff(t, "/user2/commitsonpr/pulls/1/files/4ca8bcaf27e28504df7bf996819665986b01c847..23576dd018294e476c06e569b6b0f170d0558705", []string{"test2.txt", "test3.txt", "test4.txt"}, true) } func TestPullDiff_StartingFromBaseToCommitPRDiff(t *testing.T) { - doTestPRDiff(t, "/user2/commitsonpr/pulls/1/files/c5626fc9eff57eb1bb7b796b01d4d0f2f3f792a2", []string{"test1.txt", "test2.txt", "test3.txt"}) + doTestPRDiff(t, "/user2/commitsonpr/pulls/1/files/c5626fc9eff57eb1bb7b796b01d4d0f2f3f792a2", []string{"test1.txt", "test2.txt", "test3.txt"}, true) } -func doTestPRDiff(t *testing.T, prDiffURL string, expectedFilenames []string) { +func doTestPRDiff(t *testing.T, prDiffURL string, expectedFilenames []string, editable bool) { defer tests.PrepareTestEnv(t)() session := loginUser(t, "user2") @@ -51,5 +64,73 @@ func doTestPRDiff(t *testing.T, prDiffURL string, expectedFilenames []string) { fileContents.Each(func(i int, s *goquery.Selection) { filename, _ := s.Attr("data-old-filename") assert.Equal(t, expectedFilenames[i], filename) + doc.AssertElement(t, "h4.diff-file-header a.button[href=\"/user2/commitsonpr/_edit/branch1/"+filename+"\"]", editable) + }) +} + +func TestPullDiff_AGitNotEditable(t *testing.T) { + onGiteaRun(t, func(t *testing.T, u *url.URL) { + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + session := loginUser(t, user2.Name) + + // Create temporary repository. + repo, _, f := tests.CreateDeclarativeRepo(t, user2, "myrepo", + []unit_model.Type{unit_model.TypePullRequests}, nil, + []*files_service.ChangeRepoFile{ + { + Operation: "create", + TreePath: "FUNFACT", + ContentReader: strings.NewReader("Smithy was the runner up to be Forgejo's name"), + }, + }, + ) + defer f() + + clone := func(t *testing.T, clone string) string { + t.Helper() + + dstPath := t.TempDir() + cloneURL, _ := url.Parse(clone) + cloneURL.User = url.UserPassword("user2", userPassword) + require.NoError(t, git.CloneWithArgs(t.Context(), nil, cloneURL.String(), dstPath, git.CloneRepoOptions{})) + + return dstPath + } + + firstCommit := func(t *testing.T, dstPath string) { + t.Helper() + + require.NoError(t, os.WriteFile(path.Join(dstPath, "README.md"), []byte("## test content"), 0o600)) + require.NoError(t, git.AddChanges(dstPath, true)) + require.NoError(t, 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: "Add README.", + })) + } + dstPath := clone(t, fmt.Sprintf("%suser2/%s.git", u.String(), repo.Name)) + + // Create first commit. + firstCommit(t, dstPath) + + // Create agit PR. + require.NoError(t, git.NewCommand(t.Context(), "push", "origin", "HEAD:refs/for/main", "-o", "topic=agit-pr").Run(&git.RunOpts{Dir: dstPath})) + + pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{Index: 1, BaseRepoID: repo.ID}) + assert.Equal(t, issues_model.PullRequestFlowAGit, pr.Flow) + + resp := session.MakeRequest(t, NewRequest(t, "GET", fmt.Sprintf("/%s/pulls/%d/files", repo.FullName(), pr.Index)), http.StatusOK) + + doc := NewHTMLParser(t, resp.Body) + // There is no edit button on any changed file + doc.AssertElement(t, "h4.diff-file-header a.button[href^=\"/"+repo.FullName()+"/_edit\"]", false) }) } From 5624b9f094f57a74614d7dbefb5ede767db9e022 Mon Sep 17 00:00:00 2001 From: Robert Wolff Date: Sun, 27 Jul 2025 10:12:28 +0200 Subject: [PATCH 228/495] fix(ui): issue comment review request targets when aggregated (#8689) regression of !8239 ### Tests - I added test coverage for Go changes... - [ ] in their respective `*_test.go` for unit tests. - [x] in the `tests/integration` directory if it involves interactions with a live Forgejo server. - I added test coverage for JavaScript changes... - [ ] in `web_src/js/*.test.js` if it can be unit tested. - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)). ### Documentation - [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [x] I do not want this change to show in the release notes. - [ ] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/.md` to be be used for the release notes instead of the title. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8689 Reviewed-by: Earl Warren Co-authored-by: Robert Wolff Co-committed-by: Robert Wolff --- .../repo/issue/view_content/comments.tmpl | 6 +- tests/integration/issue_comment_test.go | 105 ++++++++++++++++++ 2 files changed, 108 insertions(+), 3 deletions(-) diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl index 454467a4d0..a212bb871a 100644 --- a/templates/repo/issue/view_content/comments.tmpl +++ b/templates/repo/issue/view_content/comments.tmpl @@ -759,11 +759,11 @@ {{if and (eq (len .RemovedRequestReview) 1) (eq (len .AddedRequestReview) 0) (eq ((index .RemovedRequestReview 0).ID) .PosterID) (eq ((index .RemovedRequestReview 0).Type) "user")}} {{ctx.Locale.Tr "repo.issues.review.remove_review_request_self" ""}} {{else if and .AddedRequestReview (not .RemovedRequestReview)}} - {{ctx.Locale.TrN (len .AddedRequestReview) "repo.issues.review.add_review_request" "repo.issues.review.add_review_requests" (RenderReviewRequest .AddedRequestReview) ""}} + {{ctx.Locale.TrN (len .AddedRequestReview) "repo.issues.review.add_review_request" "repo.issues.review.add_review_requests" (RenderReviewRequest $.Context .AddedRequestReview) ""}} {{else if and (not .AddedRequestReview) .RemovedRequestReview}} - {{ctx.Locale.TrN (len .RemovedRequestReview) "repo.issues.review.remove_review_request" "repo.issues.review.remove_review_requests" (RenderReviewRequest .RemovedRequestReview) ""}} + {{ctx.Locale.TrN (len .RemovedRequestReview) "repo.issues.review.remove_review_request" "repo.issues.review.remove_review_requests" (RenderReviewRequest $.Context .RemovedRequestReview) ""}} {{else}} - {{ctx.Locale.Tr "repo.issues.review.add_remove_review_requests" (RenderReviewRequest .AddedRequestReview) (RenderReviewRequest .RemovedRequestReview) ""}} + {{ctx.Locale.Tr "repo.issues.review.add_remove_review_requests" (RenderReviewRequest $.Context .AddedRequestReview) (RenderReviewRequest $.Context .RemovedRequestReview) ""}} {{end}} diff --git a/tests/integration/issue_comment_test.go b/tests/integration/issue_comment_test.go index eda643fa79..a604378479 100644 --- a/tests/integration/issue_comment_test.go +++ b/tests/integration/issue_comment_test.go @@ -315,6 +315,111 @@ func TestIssueCommentChangeReviewRequest(t *testing.T) { assert.Empty(t, htmlDoc.Find("#issuecomment-"+strconv.FormatInt(comment6.ID, 10)+" .text").Text()) } +func TestIssueCommentChangeReviewRequestAggregated(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + pull := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 6}) + require.NoError(t, pull.LoadIssue(db.DefaultContext)) + issue := pull.Issue + require.NoError(t, issue.LoadRepo(db.DefaultContext)) + + user1, err := user_model.GetUserByID(db.DefaultContext, 1) + require.NoError(t, err) + user2, err := user_model.GetUserByID(db.DefaultContext, 2) + require.NoError(t, err) + team1, err := org_model.GetTeamByID(db.DefaultContext, 2) + require.NoError(t, err) + assert.NotNil(t, team1) + label, err := issues_model.GetLabelByID(db.DefaultContext, 1) + require.NoError(t, err) + assert.NotNil(t, label) + + // Request from other + comment1, err := issues_model.AddReviewRequest(db.DefaultContext, issue, user2, user1) + require.NoError(t, err) + // Add label + issues_model.CreateComment(db.DefaultContext, &issues_model.CreateCommentOptions{ + Type: issues_model.CommentTypeLabel, + Doer: user1, + Issue: issue, + Label: label, + Repo: issue.Repo, + }) + + // Refuse review + comment2, err := issues_model.RemoveReviewRequest(db.DefaultContext, issue, user2, user2) + require.NoError(t, err) + // Remove label + issues_model.CreateComment(db.DefaultContext, &issues_model.CreateCommentOptions{ + Type: issues_model.CommentTypeLabel, + Doer: user2, + Issue: issue, + Label: label, + Repo: issue.Repo, + }) + + // Request from other + comment3, err := issues_model.AddReviewRequest(db.DefaultContext, issue, user2, user1) + require.NoError(t, err) + // Request from team + comment4, err := issues_model.AddTeamReviewRequest(db.DefaultContext, issue, team1, user1) + require.NoError(t, err) + // Add label + issues_model.CreateComment(db.DefaultContext, &issues_model.CreateCommentOptions{ + Type: issues_model.CommentTypeLabel, + Doer: user1, + Issue: issue, + Label: label, + Repo: issue.Repo, + }) + + // Remove request from team + comment5, err := issues_model.RemoveTeamReviewRequest(db.DefaultContext, issue, team1, user2) + require.NoError(t, err) + // Request from other + comment6, err := issues_model.AddReviewRequest(db.DefaultContext, issue, user1, user2) + require.NoError(t, err) + // Remove label + issues_model.CreateComment(db.DefaultContext, &issues_model.CreateCommentOptions{ + Type: issues_model.CommentTypeLabel, + Doer: user2, + Issue: issue, + Label: label, + Repo: issue.Repo, + }) + + session := loginUser(t, "user2") + req := NewRequest(t, "GET", "/org3/repo3/pulls/2") + resp := session.MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + + // Request from other + testIssueCommentChangeEvent(t, htmlDoc, strconv.FormatInt(comment1.ID, 10), + "octicon-eye", "User One", "/user1", + []string{"user1 requested review from user2"}, + []string{"/user1", "#issuecomment-" + strconv.FormatInt(comment1.ID, 10), "/org3/repo3/pulls?labels=1", "/user2"}) + + // Refuse review + testIssueCommentChangeEvent(t, htmlDoc, strconv.FormatInt(comment2.ID, 10), + "octicon-eye", "< Ur Tw ><", "/user2", + []string{"user2 refused to review"}, + []string{"/user2", "#issuecomment-" + strconv.FormatInt(comment2.ID, 10), "/org3/repo3/pulls?labels=1"}) + + // Request review from other and from team + testIssueCommentChangeEvent(t, htmlDoc, strconv.FormatInt(comment3.ID, 10), + "octicon-eye", "User One", "/user1", + []string{"user1 requested reviews from user2, team1"}, + []string{"/user1", "#issuecomment-" + strconv.FormatInt(comment3.ID, 10), "/org3/repo3/pulls?labels=1", "/user2", "/org/org3/teams/team1"}) + assert.Empty(t, htmlDoc.Find("#issuecomment-"+strconv.FormatInt(comment4.ID, 10)+" .text").Text()) + + // Remove and add request + testIssueCommentChangeEvent(t, htmlDoc, strconv.FormatInt(comment5.ID, 10), + "octicon-eye", "< Ur Tw ><", "/user2", + []string{"user2 requested reviews from user1 and removed review requests for team1"}, + []string{"/user2", "#issuecomment-" + strconv.FormatInt(comment5.ID, 10), "/org3/repo3/pulls?labels=1", "/user1", "/org/org3/teams/team1"}) + assert.Empty(t, htmlDoc.Find("#issuecomment-"+strconv.FormatInt(comment6.ID, 10)+" .text").Text()) +} + func TestIssueCommentChangeLock(t *testing.T) { defer tests.PrepareTestEnv(t)() From 421cfba3cfb46081c9b8c19d6049f1ad9d947b9d Mon Sep 17 00:00:00 2001 From: Gusted Date: Sun, 27 Jul 2025 10:17:33 +0200 Subject: [PATCH 229/495] fix: return error when user is not repo writer (#8690) - If the doer isn't a issue/pull writer, return a error. - Fixes a panic (NPE), because the callers of `prepareForReplaceOrAdd` simply checked if there was a error returned to see if the user was allowed. It didn't check if a statuscode was written. This is specifically a issue when the automatic token by Forgejo actions is used. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8690 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- routers/api/v1/repo/issue_label.go | 2 +- tests/integration/api_issue_label_test.go | 25 +++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/routers/api/v1/repo/issue_label.go b/routers/api/v1/repo/issue_label.go index 3b2935305c..f2e79ea417 100644 --- a/routers/api/v1/repo/issue_label.go +++ b/routers/api/v1/repo/issue_label.go @@ -384,7 +384,7 @@ func prepareForReplaceOrAdd(ctx *context.APIContext, form api.IssueLabelsOption) if !ctx.Repo.CanWriteIssuesOrPulls(issue.IsPull) { ctx.Status(http.StatusForbidden) - return nil, nil, nil + return nil, nil, errors.New("not issue/pull writer") } err = issue_service.SetIssueUpdateDate(ctx, issue, form.Updated, ctx.Doer) diff --git a/tests/integration/api_issue_label_test.go b/tests/integration/api_issue_label_test.go index 160774a7e5..665e4b2f2a 100644 --- a/tests/integration/api_issue_label_test.go +++ b/tests/integration/api_issue_label_test.go @@ -336,3 +336,28 @@ func TestAPIModifyOrgLabels(t *testing.T) { AddTokenAuth(token) MakeRequest(t, req, http.StatusNoContent) } + +func TestAPIReplaceIssueLabelsActionsToken(t *testing.T) { + require.NoError(t, unittest.LoadFixtures()) + + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: repo.ID}) + label := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{RepoID: repo.ID}) + owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) + + task := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionTask{ID: 47}) + task.RepoID = repo.ID + task.OwnerID = owner.ID + task.IsForkPullRequest = true // Read permission. + require.NoError(t, task.GenerateToken()) + + // Explicitly need "is_fork_pull_request". + require.NoError(t, actions_model.UpdateTask(t.Context(), task, "repo_id", "owner_id", "is_fork_pull_request", "token", "token_salt", "token_hash", "token_last_eight")) + + urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/labels", + owner.Name, repo.Name, issue.Index) + req := NewRequestWithJSON(t, "PUT", urlStr, &api.IssueLabelsOption{ + Labels: []any{label.Name}, + }).AddTokenAuth(task.Token) + MakeRequest(t, req, http.StatusForbidden) +} From 370b498e6dc1ad6e468d1fcad1b4ff9111b523e2 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 28 Jul 2025 08:14:35 +0200 Subject: [PATCH 230/495] Lock file maintenance (forgejo) (#8703) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Update | Change | |---|---| | lockFileMaintenance | All locks refreshed | 🔧 This Pull Request updates lock files to use the latest dependency versions. --- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8703 Reviewed-by: Earl Warren Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 564 ++++++++++++++--------------- web_src/fomantic/package-lock.json | 20 +- 2 files changed, 278 insertions(+), 306 deletions(-) diff --git a/package-lock.json b/package-lock.json index d69bddd887..12f7c404fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -231,18 +231,18 @@ } }, "node_modules/@babel/runtime": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", - "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.2.tgz", + "integrity": "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.28.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.1.tgz", - "integrity": "sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -525,21 +525,21 @@ } }, "node_modules/@emnapi/core": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.4.tgz", - "integrity": "sha512-A9CnAbC6ARNMKcIcrQwq6HeHCjpcBZ5wSx4U01WXCqEKlrzB9F9315WDNHkrs2xbx7YjjSxbUYxuN6EQzpcY2g==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.5.tgz", + "integrity": "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.0.3", + "@emnapi/wasi-threads": "1.0.4", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.4.tgz", - "integrity": "sha512-hHyapA4A3gPaDCNfiqyZUStTMqIkKRshqPIuDOXv1hcBnD4U3l8cP0T1HMCfGRxQ6V64TGCcoswChANyOAwbQg==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", + "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", "dev": true, "license": "MIT", "optional": true, @@ -548,9 +548,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.3.tgz", - "integrity": "sha512-8K5IFFsQqF9wQNJptGbS6FNKgUTsSRYnTqNCG1vPP8jFdjSv18n2mQfJpkt2Oibo9iBEzcDnDxNwKTzC7svlJw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz", + "integrity": "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==", "dev": true, "license": "MIT", "optional": true, @@ -559,9 +559,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.6.tgz", - "integrity": "sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz", + "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==", "cpu": [ "ppc64" ], @@ -575,9 +575,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.6.tgz", - "integrity": "sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.8.tgz", + "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==", "cpu": [ "arm" ], @@ -591,9 +591,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.6.tgz", - "integrity": "sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz", + "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==", "cpu": [ "arm64" ], @@ -607,9 +607,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.6.tgz", - "integrity": "sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.8.tgz", + "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==", "cpu": [ "x64" ], @@ -623,9 +623,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.6.tgz", - "integrity": "sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz", + "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==", "cpu": [ "arm64" ], @@ -639,9 +639,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.6.tgz", - "integrity": "sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz", + "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==", "cpu": [ "x64" ], @@ -655,9 +655,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.6.tgz", - "integrity": "sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz", + "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==", "cpu": [ "arm64" ], @@ -671,9 +671,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.6.tgz", - "integrity": "sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz", + "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==", "cpu": [ "x64" ], @@ -687,9 +687,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.6.tgz", - "integrity": "sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz", + "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==", "cpu": [ "arm" ], @@ -703,9 +703,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.6.tgz", - "integrity": "sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz", + "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==", "cpu": [ "arm64" ], @@ -719,9 +719,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.6.tgz", - "integrity": "sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz", + "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==", "cpu": [ "ia32" ], @@ -735,9 +735,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.6.tgz", - "integrity": "sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz", + "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==", "cpu": [ "loong64" ], @@ -751,9 +751,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.6.tgz", - "integrity": "sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz", + "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==", "cpu": [ "mips64el" ], @@ -767,9 +767,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.6.tgz", - "integrity": "sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz", + "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==", "cpu": [ "ppc64" ], @@ -783,9 +783,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.6.tgz", - "integrity": "sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz", + "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==", "cpu": [ "riscv64" ], @@ -799,9 +799,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.6.tgz", - "integrity": "sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz", + "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==", "cpu": [ "s390x" ], @@ -815,9 +815,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.6.tgz", - "integrity": "sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz", + "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==", "cpu": [ "x64" ], @@ -831,9 +831,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.6.tgz", - "integrity": "sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz", + "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==", "cpu": [ "arm64" ], @@ -847,9 +847,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.6.tgz", - "integrity": "sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz", + "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==", "cpu": [ "x64" ], @@ -863,9 +863,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.6.tgz", - "integrity": "sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz", + "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==", "cpu": [ "arm64" ], @@ -879,9 +879,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.6.tgz", - "integrity": "sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz", + "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==", "cpu": [ "x64" ], @@ -895,9 +895,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.6.tgz", - "integrity": "sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz", + "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==", "cpu": [ "arm64" ], @@ -911,9 +911,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.6.tgz", - "integrity": "sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz", + "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==", "cpu": [ "x64" ], @@ -927,9 +927,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.6.tgz", - "integrity": "sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz", + "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==", "cpu": [ "arm64" ], @@ -943,9 +943,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.6.tgz", - "integrity": "sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz", + "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==", "cpu": [ "ia32" ], @@ -959,9 +959,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.6.tgz", - "integrity": "sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz", + "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==", "cpu": [ "x64" ], @@ -1185,9 +1185,9 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz", - "integrity": "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", + "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1994,39 +1994,11 @@ } }, "node_modules/@keyv/serialize": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.0.3.tgz", - "integrity": "sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.0.tgz", + "integrity": "sha512-RlDgexML7Z63Q8BSaqhXdCYNBy/JQnqYIwxofUrNLGCblOMHp+xux2Q8nLMLlPpgHQPoU0Do8Z6btCpRBEqZ8g==", "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^6.0.3" - } - }, - "node_modules/@keyv/serialize/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } + "license": "MIT" }, "node_modules/@kurkle/color": { "version": "0.3.4", @@ -2101,9 +2073,9 @@ } }, "node_modules/@mermaid-js/parser": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.1.tgz", - "integrity": "sha512-lCQNpV8R4lgsGcjX5667UiuDLk2micCtjtxR1YKbBXvN5w2v+FeLYoHrTSSrjwXdMcDYvE4ZBPvKT31dfeSmmA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.2.tgz", + "integrity": "sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ==", "license": "MIT", "dependencies": { "langium": "3.3.1" @@ -2289,9 +2261,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.45.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.0.tgz", - "integrity": "sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.0.tgz", + "integrity": "sha512-9f3nSTFI2ivfxc7/tHBHcJ8pRnp8ROrELvsVprlQPVvcZ+j5zztYd+PTJGpyIOAdTvNwNrpCXswKSeoQcyGjMQ==", "cpu": [ "arm" ], @@ -2303,9 +2275,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.45.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.0.tgz", - "integrity": "sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.0.tgz", + "integrity": "sha512-tFZSEhqJ8Yrpe50TzOdeoYi72gi/jsnT7y8Qrozf3cNu28WX+s6I3XzEPUAqoaT9SAS8Xz9AzGTFlxxCH/w20w==", "cpu": [ "arm64" ], @@ -2317,9 +2289,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.45.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.0.tgz", - "integrity": "sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.0.tgz", + "integrity": "sha512-+DikIIs+p6yU2hF51UaWG8BnHbq90X0QIOt5zqSKSZxY+G3qqdLih214e9InJal21af2PuuxkDectetGfbVPJw==", "cpu": [ "arm64" ], @@ -2331,9 +2303,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.45.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.0.tgz", - "integrity": "sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.0.tgz", + "integrity": "sha512-5a+NofhdEB/WimSlFMskbFQn1vqz1FWryYpA99trmZGO6qEmiS0IsX6w4B3d91U878Q2ZQdiaFF1gxX4P147og==", "cpu": [ "x64" ], @@ -2345,9 +2317,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.45.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.0.tgz", - "integrity": "sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.0.tgz", + "integrity": "sha512-igr/RlKPS3OCy4jD3XBmAmo3UAcNZkJSubRsw1JeM8bAbwf15k/3eMZXD91bnjheijJiOJcga3kfCLKjV8IXNg==", "cpu": [ "arm64" ], @@ -2359,9 +2331,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.45.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.0.tgz", - "integrity": "sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.0.tgz", + "integrity": "sha512-MdigWzPSHlQzB1xZ+MdFDWTAH+kcn7UxjEBoOKuaso7z1DRlnAnrknB1mTtNOQ+GdPI8xgExAGwHeqQjntR0Cg==", "cpu": [ "x64" ], @@ -2373,9 +2345,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.45.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.0.tgz", - "integrity": "sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.0.tgz", + "integrity": "sha512-dmZseE0ZwA/4yy1+BwFrDqFTjjNg24GO9xSrb1weVbt6AFkhp5pz1gVS7IMtfIvoWy8yp6q/zN0bKnefRUImvQ==", "cpu": [ "arm" ], @@ -2387,9 +2359,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.45.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.0.tgz", - "integrity": "sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.0.tgz", + "integrity": "sha512-fzhfn6p9Cfm3W8UrWKIa4l7Wfjs/KGdgaswMBBE3KY3Ta43jg2XsPrAtfezHpsRk0Nx+TFuS3hZk/To2N5kFPQ==", "cpu": [ "arm" ], @@ -2401,9 +2373,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.45.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.0.tgz", - "integrity": "sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.0.tgz", + "integrity": "sha512-vVDD+iPDPmJQ5nAQ5Tifq3ywdv60FartglFI8VOCK+hcU9aoG0qlQTsDJP97O5yiTaTqlneZWoARMcVC5nyUoQ==", "cpu": [ "arm64" ], @@ -2415,9 +2387,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.45.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.0.tgz", - "integrity": "sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.0.tgz", + "integrity": "sha512-0d0jx08fzDHCzXqrtCMEEyxKU0SvJrWmUjUDE2/KDQ2UDJql0tfiwYvEx1oHELClKO8CNdE+AGJj+RqXscZpdQ==", "cpu": [ "arm64" ], @@ -2429,9 +2401,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.45.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.0.tgz", - "integrity": "sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.0.tgz", + "integrity": "sha512-XBYu9oW9eKJadWn8M7hkTZsD4yG+RrsTrVEgyKwb4L72cpJjRbRboTG9Lg9fec8MxJp/cfTHAocg4mnismQR8A==", "cpu": [ "loong64" ], @@ -2442,10 +2414,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.45.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.0.tgz", - "integrity": "sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw==", + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.0.tgz", + "integrity": "sha512-wJaRvcT17PoOK6Ggcfo3nouFlybHvARBS4jzT0PC/lg17fIJHcDS2fZz3sD+iA4nRlho2zE6OGbU0HvwATdokQ==", "cpu": [ "ppc64" ], @@ -2457,9 +2429,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.45.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.0.tgz", - "integrity": "sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.0.tgz", + "integrity": "sha512-GZ5bkMFteAGkcmh8x0Ok4LSa+L62Ez0tMsHPX6JtR0wl4Xc3bQcrFHDiR5DGLEDFtGrXih4Nd/UDaFqs968/wA==", "cpu": [ "riscv64" ], @@ -2471,9 +2443,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.45.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.0.tgz", - "integrity": "sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.0.tgz", + "integrity": "sha512-7CjPw6FflFsVOUfWOrVrREiV3IYXG4RzZ1ZQUaT3BtSK8YXN6x286o+sruPZJESIaPebYuFowmg54ZdrkVBYog==", "cpu": [ "riscv64" ], @@ -2485,9 +2457,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.45.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.0.tgz", - "integrity": "sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.0.tgz", + "integrity": "sha512-nmvnl0ZiuysltcB/cKjUh40Rx4FbSyueERDsl2FLvLYr6pCgSsvGr3SocUT84svSpmloS7f1DRWqtRha74Gi1w==", "cpu": [ "s390x" ], @@ -2499,9 +2471,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.45.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.0.tgz", - "integrity": "sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.0.tgz", + "integrity": "sha512-Cv+moII5C8RM6gZbR3cb21o6rquVDZrN2o81maROg1LFzBz2dZUwIQSxFA8GtGZ/F2KtsqQ2z3eFPBb6akvQNg==", "cpu": [ "x64" ], @@ -2513,9 +2485,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.45.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.0.tgz", - "integrity": "sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.0.tgz", + "integrity": "sha512-PHcMG8DZTM9RCIjp8QIfN0VYtX0TtBPnWOTRurFhoCDoi9zptUZL2k7pCs+5rgut7JAiUsYy+huyhVKPcmxoog==", "cpu": [ "x64" ], @@ -2527,9 +2499,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.45.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.0.tgz", - "integrity": "sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.0.tgz", + "integrity": "sha512-1SI/Rd47e8aQJeFWMDg16ET+fjvCcD/CzeaRmIEPmb05hx+3cCcwIF4ebUag4yTt/D1peE+Mgp0+Po3M358cAA==", "cpu": [ "arm64" ], @@ -2541,9 +2513,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.45.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.0.tgz", - "integrity": "sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.0.tgz", + "integrity": "sha512-JwOCYxmumFDfDhx4kNyz6kTVK3gWzBIvVdMNzQMRDubcoGRDniOOmo6DDNP42qwZx3Bp9/6vWJ+kNzNqXoHmeA==", "cpu": [ "ia32" ], @@ -2555,9 +2527,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.45.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.0.tgz", - "integrity": "sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.0.tgz", + "integrity": "sha512-IPMIfrfkG1GaEXi+JSsQEx8x9b4b+hRZXO7KYc2pKio3zO2/VDXDs6B9Ts/nnO+25Fk1tdAVtUn60HKKPPzDig==", "cpu": [ "x64" ], @@ -3520,9 +3492,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.19.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.7.tgz", - "integrity": "sha512-1GM9z6BJOv86qkPvzh2i6VW5+VVrXxCLknfmTkWEqz+6DqosiY28XUWCTmBcJ0ACzKqx/iwdIREfo1fwExIlkA==", + "version": "20.19.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.9.tgz", + "integrity": "sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -4727,9 +4699,9 @@ } }, "node_modules/acorn-import-phases": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.3.tgz", - "integrity": "sha512-jtKLnfoOzm28PazuQ4dVBcE9Jeo6ha1GAJvq3N0LlNOszmTfx+wSycBehn+FN0RnyeR77IBxN/qVYMw0Rlj0Xw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "license": "MIT", "engines": { "node": ">=10.13.0" @@ -5312,24 +5284,24 @@ } }, "node_modules/cacheable": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.1.tgz", - "integrity": "sha512-Fa2BZY0CS9F0PFc/6aVA6tgpOdw+hmv9dkZOlHXII5v5Hw+meJBIWDcPrG9q/dXxGcNbym5t77fzmawrBQfTmQ==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.3.tgz", + "integrity": "sha512-M6p10iJ/VT0wT7TLIGUnm958oVrU2cUK8pQAVU21Zu7h8rbk/PeRtRWrvHJBql97Bhzk3g1N6+2VKC+Rjxna9Q==", "dev": true, "license": "MIT", "dependencies": { "hookified": "^1.10.0", - "keyv": "^5.3.4" + "keyv": "^5.4.0" } }, "node_modules/cacheable/node_modules/keyv": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.3.4.tgz", - "integrity": "sha512-ypEvQvInNpUe+u+w8BIcPkQvEqXquyyibWE/1NB5T2BTzIpS5cGEV1LZskDzPSTvNAaT4+5FutvzlvnkxOSKlw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.4.0.tgz", + "integrity": "sha512-TMckyVjEoacG5IteUpUrOBsFORtheqziVyyY2dLUwg1jwTb8u48LX4TgmtogkNl9Y9unaEJ1luj10fGyjMGFOQ==", "dev": true, "license": "MIT", "dependencies": { - "@keyv/serialize": "^1.0.3" + "@keyv/serialize": "^1.1.0" } }, "node_modules/call-bind": { @@ -6971,9 +6943,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.182", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.182.tgz", - "integrity": "sha512-Lv65Btwv9W4J9pyODI6EWpdnhfvrve/us5h1WspW8B2Fb0366REPtY3hX7ounk1CkV/TBjWCEvCBBbYbmV0qCA==", + "version": "1.5.191", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.191.tgz", + "integrity": "sha512-xcwe9ELcuxYLUFqZZxL19Z6HVKcvNkIwhbHUz7L3us6u12yR+7uY89dSl570f/IqNthx8dAw3tojG7i4Ni4tDA==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -7225,9 +7197,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.6.tgz", - "integrity": "sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==", + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz", + "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -7237,32 +7209,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.6", - "@esbuild/android-arm": "0.25.6", - "@esbuild/android-arm64": "0.25.6", - "@esbuild/android-x64": "0.25.6", - "@esbuild/darwin-arm64": "0.25.6", - "@esbuild/darwin-x64": "0.25.6", - "@esbuild/freebsd-arm64": "0.25.6", - "@esbuild/freebsd-x64": "0.25.6", - "@esbuild/linux-arm": "0.25.6", - "@esbuild/linux-arm64": "0.25.6", - "@esbuild/linux-ia32": "0.25.6", - "@esbuild/linux-loong64": "0.25.6", - "@esbuild/linux-mips64el": "0.25.6", - "@esbuild/linux-ppc64": "0.25.6", - "@esbuild/linux-riscv64": "0.25.6", - "@esbuild/linux-s390x": "0.25.6", - "@esbuild/linux-x64": "0.25.6", - "@esbuild/netbsd-arm64": "0.25.6", - "@esbuild/netbsd-x64": "0.25.6", - "@esbuild/openbsd-arm64": "0.25.6", - "@esbuild/openbsd-x64": "0.25.6", - "@esbuild/openharmony-arm64": "0.25.6", - "@esbuild/sunos-x64": "0.25.6", - "@esbuild/win32-arm64": "0.25.6", - "@esbuild/win32-ia32": "0.25.6", - "@esbuild/win32-x64": "0.25.6" + "@esbuild/aix-ppc64": "0.25.8", + "@esbuild/android-arm": "0.25.8", + "@esbuild/android-arm64": "0.25.8", + "@esbuild/android-x64": "0.25.8", + "@esbuild/darwin-arm64": "0.25.8", + "@esbuild/darwin-x64": "0.25.8", + "@esbuild/freebsd-arm64": "0.25.8", + "@esbuild/freebsd-x64": "0.25.8", + "@esbuild/linux-arm": "0.25.8", + "@esbuild/linux-arm64": "0.25.8", + "@esbuild/linux-ia32": "0.25.8", + "@esbuild/linux-loong64": "0.25.8", + "@esbuild/linux-mips64el": "0.25.8", + "@esbuild/linux-ppc64": "0.25.8", + "@esbuild/linux-riscv64": "0.25.8", + "@esbuild/linux-s390x": "0.25.8", + "@esbuild/linux-x64": "0.25.8", + "@esbuild/netbsd-arm64": "0.25.8", + "@esbuild/netbsd-x64": "0.25.8", + "@esbuild/openbsd-arm64": "0.25.8", + "@esbuild/openbsd-x64": "0.25.8", + "@esbuild/openharmony-arm64": "0.25.8", + "@esbuild/sunos-x64": "0.25.8", + "@esbuild/win32-arm64": "0.25.8", + "@esbuild/win32-ia32": "0.25.8", + "@esbuild/win32-x64": "0.25.8" } }, "node_modules/esbuild-loader": { @@ -8740,9 +8712,9 @@ } }, "node_modules/hookified": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.10.0.tgz", - "integrity": "sha512-dJw0492Iddsj56U1JsSTm9E/0B/29a1AuoSLRAte8vQg/kaTGF3IgjEWT8c8yG4cC10+HisE1x5QAwR0Xwc+DA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.11.0.tgz", + "integrity": "sha512-aDdIN3GyU5I6wextPplYdfmWCo+aLmjjVbntmX6HLD5RCi/xKsivYEBhnRD+d9224zFf008ZpLMPlWF0ZodYZw==", "dev": true, "license": "MIT" }, @@ -10315,9 +10287,9 @@ "license": "MIT" }, "node_modules/loupe": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz", - "integrity": "sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.0.tgz", + "integrity": "sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==", "dev": true, "license": "MIT" }, @@ -11408,9 +11380,9 @@ } }, "node_modules/napi-postinstall": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.0.tgz", - "integrity": "sha512-M7NqKyhODKV1gRLdkwE7pDsZP2/SC2a2vHkOYh9MCpKMbWVfyVfUw5MaH83Fv6XMjxr5jryUp3IDDL9rlxsTeA==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.2.tgz", + "integrity": "sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==", "dev": true, "license": "MIT", "bin": { @@ -14019,23 +13991,23 @@ } }, "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.1.tgz", - "integrity": "sha512-zcmsHjg2B2zjuBgjdnB+9q0+cWcgWfykIcsDkWDB4GTPtl1eXUA+gTI6sO0u01AqK3cliHryTU55/b2Ow1hfZg==", + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.3.tgz", + "integrity": "sha512-D+w75Ub8T55yor7fPgN06rkCAUbAYw2vpxJmmjv/GDAcvCnv9g7IvHhIZoxzRZThrXPFI2maeY24pPbtyYU7Lg==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^6.1.10" + "flat-cache": "^6.1.12" } }, "node_modules/stylelint/node_modules/flat-cache": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.11.tgz", - "integrity": "sha512-zfOAns94mp7bHG/vCn9Ru2eDCmIxVQ5dELUHKjHfDEOJmHNzE+uGa6208kfkgmtym4a0FFjEuFksCXFacbVhSg==", + "version": "6.1.12", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.12.tgz", + "integrity": "sha512-U+HqqpZPPXP5d24bWuRzjGqVqUcw64k4nZAbruniDwdRg0H10tvN7H6ku1tjhA4rg5B9GS3siEvwO2qjJJ6f8Q==", "dev": true, "license": "MIT", "dependencies": { - "cacheable": "^1.10.1", + "cacheable": "^1.10.3", "flatted": "^3.3.3", "hookified": "^1.10.0" } @@ -14158,13 +14130,13 @@ } }, "node_modules/stylus/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "dev": true, "license": "BSD-3-Clause", "engines": { - "node": ">= 8" + "node": ">= 12" } }, "node_modules/sucrase": { @@ -14678,9 +14650,9 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -15174,15 +15146,15 @@ "license": "MIT" }, "node_modules/vite": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.4.tgz", - "integrity": "sha512-SkaSguuS7nnmV7mfJ8l81JGBFV7Gvzp8IzgE8A8t23+AxuNX61Q5H1Tpz5efduSN7NHC8nQXD3sKQKZAu5mNEA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz", + "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.6", - "picomatch": "^4.0.2", + "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.40.0", "tinyglobby": "^0.2.14" @@ -15316,9 +15288,9 @@ } }, "node_modules/vite/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -15358,9 +15330,9 @@ } }, "node_modules/vite/node_modules/rollup": { - "version": "4.45.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.45.0.tgz", - "integrity": "sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.0.tgz", + "integrity": "sha512-ONmkT3Ud3IfW15nl7l4qAZko5/2iZ5ALVBDh02ZSZ5IGVLJSYkRcRa3iB58VyEIyoofs9m2xdVrm+lTi97+3pw==", "dev": true, "license": "MIT", "dependencies": { @@ -15374,26 +15346,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.45.0", - "@rollup/rollup-android-arm64": "4.45.0", - "@rollup/rollup-darwin-arm64": "4.45.0", - "@rollup/rollup-darwin-x64": "4.45.0", - "@rollup/rollup-freebsd-arm64": "4.45.0", - "@rollup/rollup-freebsd-x64": "4.45.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.45.0", - "@rollup/rollup-linux-arm-musleabihf": "4.45.0", - "@rollup/rollup-linux-arm64-gnu": "4.45.0", - "@rollup/rollup-linux-arm64-musl": "4.45.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.45.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.45.0", - "@rollup/rollup-linux-riscv64-gnu": "4.45.0", - "@rollup/rollup-linux-riscv64-musl": "4.45.0", - "@rollup/rollup-linux-s390x-gnu": "4.45.0", - "@rollup/rollup-linux-x64-gnu": "4.45.0", - "@rollup/rollup-linux-x64-musl": "4.45.0", - "@rollup/rollup-win32-arm64-msvc": "4.45.0", - "@rollup/rollup-win32-ia32-msvc": "4.45.0", - "@rollup/rollup-win32-x64-msvc": "4.45.0", + "@rollup/rollup-android-arm-eabi": "4.46.0", + "@rollup/rollup-android-arm64": "4.46.0", + "@rollup/rollup-darwin-arm64": "4.46.0", + "@rollup/rollup-darwin-x64": "4.46.0", + "@rollup/rollup-freebsd-arm64": "4.46.0", + "@rollup/rollup-freebsd-x64": "4.46.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.46.0", + "@rollup/rollup-linux-arm-musleabihf": "4.46.0", + "@rollup/rollup-linux-arm64-gnu": "4.46.0", + "@rollup/rollup-linux-arm64-musl": "4.46.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.46.0", + "@rollup/rollup-linux-ppc64-gnu": "4.46.0", + "@rollup/rollup-linux-riscv64-gnu": "4.46.0", + "@rollup/rollup-linux-riscv64-musl": "4.46.0", + "@rollup/rollup-linux-s390x-gnu": "4.46.0", + "@rollup/rollup-linux-x64-gnu": "4.46.0", + "@rollup/rollup-linux-x64-musl": "4.46.0", + "@rollup/rollup-win32-arm64-msvc": "4.46.0", + "@rollup/rollup-win32-ia32-msvc": "4.46.0", + "@rollup/rollup-win32-x64-msvc": "4.46.0", "fsevents": "~2.3.2" } }, @@ -15481,9 +15453,9 @@ } }, "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { diff --git a/web_src/fomantic/package-lock.json b/web_src/fomantic/package-lock.json index 669363b7fa..073339afc6 100644 --- a/web_src/fomantic/package-lock.json +++ b/web_src/fomantic/package-lock.json @@ -494,9 +494,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.0.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.13.tgz", - "integrity": "sha512-Qm9OYVOFHFYg3wJoTSrz80hoec5Lia/dPp84do3X7dZvLikQvM1YpmvTBEdIr/e+U8HTkFjLHLnl78K/qjf+jQ==", + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz", + "integrity": "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==", "license": "MIT", "dependencies": { "undici-types": "~7.8.0" @@ -2005,9 +2005,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.182", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.182.tgz", - "integrity": "sha512-Lv65Btwv9W4J9pyODI6EWpdnhfvrve/us5h1WspW8B2Fb0366REPtY3hX7ounk1CkV/TBjWCEvCBBbYbmV0qCA==", + "version": "1.5.191", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.191.tgz", + "integrity": "sha512-xcwe9ELcuxYLUFqZZxL19Z6HVKcvNkIwhbHUz7L3us6u12yR+7uY89dSl570f/IqNthx8dAw3tojG7i4Ni4tDA==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -4638,12 +4638,12 @@ } }, "node_modules/is": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", - "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/is/-/is-3.3.2.tgz", + "integrity": "sha512-a2xr4E3s1PjDS8ORcGgXpWx6V+liNs+O3JRD2mb9aeugD7rtkkZ0zgLdYgw0tWsKhsdiezGYptSiMlVazCBTuQ==", "license": "MIT", "engines": { - "node": "*" + "node": ">= 0.4" } }, "node_modules/is-absolute": { From 6f1e4be0c1c796322a5c445f7b95b4c4268883e5 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 28 Jul 2025 09:27:32 +0200 Subject: [PATCH 231/495] Update dependency forgejo/release-notes-assistant to v1.3.5 (forgejo) (#8701) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Update | Change | |---|---|---| | [forgejo/release-notes-assistant](https://code.forgejo.org/forgejo/release-notes-assistant) | patch | `v1.3.3` -> `v1.3.5` | --- ### Release Notes
    forgejo/release-notes-assistant (forgejo/release-notes-assistant) ### [`v1.3.5`](https://code.forgejo.org/forgejo/release-notes-assistant/releases/tag/v1.3.5) [Compare Source](https://code.forgejo.org/forgejo/release-notes-assistant/compare/v1.3.4...v1.3.5) - bug fixes - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/98): fix: there can be more than one tag decorating a commit ### [`v1.3.4`](https://code.forgejo.org/forgejo/release-notes-assistant/releases/tag/v1.3.4) [Compare Source](https://code.forgejo.org/forgejo/release-notes-assistant/compare/v1.3.3...v1.3.4) - bug fixes - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/97): fix: %(decorate) is not supported by git 2.39
    --- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8701 Reviewed-by: Earl Warren Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- .forgejo/workflows/release-notes-assistant-milestones.yml | 2 +- .forgejo/workflows/release-notes-assistant.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/release-notes-assistant-milestones.yml b/.forgejo/workflows/release-notes-assistant-milestones.yml index 6c61774325..bf666dee6a 100644 --- a/.forgejo/workflows/release-notes-assistant-milestones.yml +++ b/.forgejo/workflows/release-notes-assistant-milestones.yml @@ -6,7 +6,7 @@ on: env: RNA_WORKDIR: /srv/rna - RNA_VERSION: v1.3.3 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org + RNA_VERSION: v1.3.5 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org jobs: release-notes: diff --git a/.forgejo/workflows/release-notes-assistant.yml b/.forgejo/workflows/release-notes-assistant.yml index b1acde6030..d813e5fc0f 100644 --- a/.forgejo/workflows/release-notes-assistant.yml +++ b/.forgejo/workflows/release-notes-assistant.yml @@ -8,7 +8,7 @@ on: - labeled env: - RNA_VERSION: v1.3.3 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org + RNA_VERSION: v1.3.5 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org jobs: release-notes: From 4f0c2ec25880bbafff4e7c99ba75045d4f0718e2 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 28 Jul 2025 10:33:09 +0200 Subject: [PATCH 232/495] Update renovate to v41.43.5 (forgejo) (#8700) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- .forgejo/workflows/renovate.yml | 2 +- Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/renovate.yml b/.forgejo/workflows/renovate.yml index ecc39e7c62..c2923f7d0e 100644 --- a/.forgejo/workflows/renovate.yml +++ b/.forgejo/workflows/renovate.yml @@ -28,7 +28,7 @@ jobs: runs-on: docker container: - image: data.forgejo.org/renovate/renovate:41.42.5 + image: data.forgejo.org/renovate/renovate:41.43.5 steps: - name: Load renovate repo cache diff --git a/Makefile b/Makefile index 06d71a51c1..b46b23a44a 100644 --- a/Makefile +++ b/Makefile @@ -47,7 +47,7 @@ GO_LICENSES_PACKAGE ?= github.com/google/go-licenses@v1.6.0 # renovate: datasour GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1 # renovate: datasource=go DEADCODE_PACKAGE ?= golang.org/x/tools/cmd/deadcode@v0.35.0 # renovate: datasource=go GOMOCK_PACKAGE ?= go.uber.org/mock/mockgen@v0.5.2 # renovate: datasource=go -RENOVATE_NPM_PACKAGE ?= renovate@41.42.5 # renovate: datasource=docker packageName=data.forgejo.org/renovate/renovate +RENOVATE_NPM_PACKAGE ?= renovate@41.43.5 # renovate: datasource=docker packageName=data.forgejo.org/renovate/renovate # https://github.com/disposable-email-domains/disposable-email-domains/commits/main/ DISPOSABLE_EMAILS_SHA ?= 0c27e671231d27cf66370034d7f6818037416989 # renovate: ... From b2c8a1cfd357b1f1c5bbc4a2c9abf3b15bb54f67 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Mon, 28 Jul 2025 10:55:04 +0200 Subject: [PATCH 233/495] Revert "fix: assorted ActivityPub code only refactors (#8274)" (#8705) This reverts commit e271c24100c8974e135ebc1d1b3eaa6cd2062b10. It was an experiment to verify that adding a delay to the test make a difference. But it does not so... reverting. @jerger before engaging in a refactor, it is necessary to get to the bottom of this: - Find the root cause of those failures - Fix it in a minimal way Refs https://codeberg.org/forgejo/forgejo/pulls/8274#issuecomment-5987215 --- - https://codeberg.org/forgejo/forgejo/actions/runs/92182/jobs/9 - https://codeberg.org/forgejo/forgejo/actions/runs/92182/jobs/10 ``` --- FAIL: TestFederationHttpSigValidation (11.34s) testlogger.go:411: 2025/07/28 00:23:46 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /workspace/forgejo/forgejo/tests/gitea-lfs-meta testlogger.go:411: 2025/07/28 00:23:52 ...ypub/reqsignature.go:76:func1() [W] verifyHttpSignatures failed: neither "Signature" nor "Authorization" have signature parameters testlogger.go:411: 2025/07/28 00:23:52 ...eb/routing/logger.go:102:func1() [I] router: completed GET http://127.0.0.1:3002/api/v1/activitypub/user-id/2 for test-mock:12345, 400 Bad Request in 5.3ms @ activitypub/reqsignature.go:74(activitypub.ReqHTTPUserOrInstanceSignature) testlogger.go:411: 2025/07/28 00:23:52 ...ces/auth/httpsign.go:70:Verify() [W] Failed authentication attempt from 127.0.0.1:43244 testlogger.go:411: 2025/07/28 00:23:55 ...eb/routing/logger.go:68:func1() [W] router: slow GET /api/v1/activitypub/user-id/2 for 127.0.0.1:43244, elapsed 3684.7ms @ activitypub/reqsignature.go:74(activitypub.ReqHTTPUserOrInstanceSignature) --- FAIL: TestFederationHttpSigValidation/SignedRequest (5.01s) api_federation_httpsig_test.go:50: Error Trace: /workspace/forgejo/forgejo/tests/integration/api_federation_httpsig_test.go:50 Error: Received unexpected error: Get "http://127.0.0.1:3002/api/v1/activitypub/user-id/2": context deadline exceeded (Client.Timeout exceeded while awaiting headers) Test: TestFederationHttpSigValidation/SignedRequest --- FAIL: TestFederationHttpSigValidation/ValidateCaches (0.00s) api_federation_httpsig_test.go:64: Error Trace: /workspace/forgejo/forgejo/tests/integration/api_federation_httpsig_test.go:64 Error: Expected value not to be nil. Test: TestFederationHttpSigValidation/ValidateCaches test_utils.go:247: PrepareTestEnv:Process "GET: /api/v1/activitypub/user-id/2" cancelled panic: runtime error: invalid memory address or nil pointer dereference [recovered] panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x4cc464a] ``` Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8705 Reviewed-by: jerger Co-authored-by: Earl Warren Co-committed-by: Earl Warren --- .deadcode-out | 3 - models/repo/repo_repository.go | 6 +- models/user/follow.go | 16 +- models/user/user_repository.go | 16 +- modules/activitypub/client.go | 7 +- routers/api/v1/activitypub/repository.go | 9 +- routers/api/v1/activitypub/reqsignature.go | 26 +-- routers/api/v1/activitypub/response.go | 34 ---- routers/api/v1/api.go | 3 +- services/federation/error.go | 44 ----- services/federation/federation_service.go | 19 +- ...{repository_inbox_like.go => repo_like.go} | 33 ++-- services/federation/repository_service.go | 19 -- services/federation/result.go | 35 ---- services/federation/signature_service.go | 11 +- .../integration/api_activitypub_actor_test.go | 77 -------- .../api_activitypub_person_test.go | 113 ----------- .../api_activitypub_repository_test.go | 176 ------------------ .../api_federation_httpsig_test.go | 82 -------- .../integration/repo_star_federation_test.go | 81 -------- 20 files changed, 69 insertions(+), 741 deletions(-) delete mode 100644 services/federation/error.go rename services/federation/{repository_inbox_like.go => repo_like.go} (73%) delete mode 100644 services/federation/repository_service.go delete mode 100644 services/federation/result.go delete mode 100644 tests/integration/api_activitypub_actor_test.go delete mode 100644 tests/integration/api_activitypub_person_test.go delete mode 100644 tests/integration/api_activitypub_repository_test.go delete mode 100644 tests/integration/api_federation_httpsig_test.go delete mode 100644 tests/integration/repo_star_federation_test.go diff --git a/.deadcode-out b/.deadcode-out index 31b04687dc..f9bee43043 100644 --- a/.deadcode-out +++ b/.deadcode-out @@ -246,10 +246,7 @@ forgejo.org/services/context GetPrivateContext forgejo.org/services/federation - NewErrInternalf - ErrInternal.Error Init - NewServiceResultWithBytes forgejo.org/services/repository IsErrForkAlreadyExist diff --git a/models/repo/repo_repository.go b/models/repo/repo_repository.go index 9d586b8345..0ba50e6614 100644 --- a/models/repo/repo_repository.go +++ b/models/repo/repo_repository.go @@ -38,18 +38,18 @@ func StoreFollowingRepos(ctx context.Context, localRepoID int64, followingRepoLi } // Begin transaction - dbCtx, committer, err := db.TxContext((ctx)) + ctx, committer, err := db.TxContext((ctx)) if err != nil { return err } defer committer.Close() - _, err = db.GetEngine(dbCtx).Where("repo_id=?", localRepoID).Delete(FollowingRepo{}) + _, err = db.GetEngine(ctx).Where("repo_id=?", localRepoID).Delete(FollowingRepo{}) if err != nil { return err } for _, followingRepo := range followingRepoList { - _, err = db.GetEngine(dbCtx).Insert(followingRepo) + _, err = db.GetEngine(ctx).Insert(followingRepo) if err != nil { return err } diff --git a/models/user/follow.go b/models/user/follow.go index 8663b2a943..e32c226385 100644 --- a/models/user/follow.go +++ b/models/user/follow.go @@ -39,21 +39,21 @@ func FollowUser(ctx context.Context, userID, followID int64) (err error) { return ErrBlockedByUser } - dbCtx, committer, err := db.TxContext(ctx) + ctx, committer, err := db.TxContext(ctx) if err != nil { return err } defer committer.Close() - if err = db.Insert(dbCtx, &Follow{UserID: userID, FollowID: followID}); err != nil { + if err = db.Insert(ctx, &Follow{UserID: userID, FollowID: followID}); err != nil { return err } - if _, err = db.Exec(dbCtx, "UPDATE `user` SET num_followers = num_followers + 1 WHERE id = ?", followID); err != nil { + if _, err = db.Exec(ctx, "UPDATE `user` SET num_followers = num_followers + 1 WHERE id = ?", followID); err != nil { return err } - if _, err = db.Exec(dbCtx, "UPDATE `user` SET num_following = num_following + 1 WHERE id = ?", userID); err != nil { + if _, err = db.Exec(ctx, "UPDATE `user` SET num_following = num_following + 1 WHERE id = ?", userID); err != nil { return err } return committer.Commit() @@ -65,21 +65,21 @@ func UnfollowUser(ctx context.Context, userID, followID int64) (err error) { return nil } - dbCtx, committer, err := db.TxContext(ctx) + ctx, committer, err := db.TxContext(ctx) if err != nil { return err } defer committer.Close() - if _, err = db.DeleteByBean(dbCtx, &Follow{UserID: userID, FollowID: followID}); err != nil { + if _, err = db.DeleteByBean(ctx, &Follow{UserID: userID, FollowID: followID}); err != nil { return err } - if _, err = db.Exec(dbCtx, "UPDATE `user` SET num_followers = num_followers - 1 WHERE id = ?", followID); err != nil { + if _, err = db.Exec(ctx, "UPDATE `user` SET num_followers = num_followers - 1 WHERE id = ?", followID); err != nil { return err } - if _, err = db.Exec(dbCtx, "UPDATE `user` SET num_following = num_following - 1 WHERE id = ?", userID); err != nil { + if _, err = db.Exec(ctx, "UPDATE `user` SET num_following = num_following - 1 WHERE id = ?", userID); err != nil { return err } return committer.Commit() diff --git a/models/user/user_repository.go b/models/user/user_repository.go index df864746e8..85f44f1598 100644 --- a/models/user/user_repository.go +++ b/models/user/user_repository.go @@ -28,7 +28,7 @@ func CreateFederatedUser(ctx context.Context, user *User, federatedUser *Federat } // Begin transaction - txCtx, committer, err := db.TxContext(ctx) + ctx, committer, err := db.TxContext((ctx)) if err != nil { return err } @@ -39,7 +39,7 @@ func CreateFederatedUser(ctx context.Context, user *User, federatedUser *Federat } }() - if err := CreateUser(txCtx, user, &overwrite); err != nil { + if err := CreateUser(ctx, user, &overwrite); err != nil { return err } @@ -48,7 +48,7 @@ func CreateFederatedUser(ctx context.Context, user *User, federatedUser *Federat return err } - _, err = db.GetEngine(txCtx).Insert(federatedUser) + _, err = db.GetEngine(ctx).Insert(federatedUser) if err != nil { return err } @@ -70,7 +70,7 @@ func FindFederatedUser(ctx context.Context, externalID string, federationHostID if err != nil { return nil, nil, err } else if !has { - return nil, nil, fmt.Errorf("FederatedUser table contains entry for user ID %v, but no user with this ID exists", federatedUser.UserID) + return nil, nil, fmt.Errorf("User %v for federated user is missing", federatedUser.UserID) } if res, err := validation.IsValid(*user); !res { @@ -87,7 +87,7 @@ func GetFederatedUser(ctx context.Context, externalID string, federationHostID i if err != nil { return nil, nil, err } else if federatedUser == nil { - return nil, nil, fmt.Errorf("FederatedUser not found (given externalId: %v, federationHostId: %v)", externalID, federationHostID) + return nil, nil, fmt.Errorf("FederatedUser for externalId = %v and federationHostId = %v does not exist", externalID, federationHostID) } return user, federatedUser, nil } @@ -99,13 +99,13 @@ func GetFederatedUserByUserID(ctx context.Context, userID int64) (*User, *Federa if err != nil { return nil, nil, err } else if !has { - return nil, nil, fmt.Errorf("FederatedUser table does not contain entry for user ID: %v", federatedUser.UserID) + return nil, nil, fmt.Errorf("Federated user %v does not exist", federatedUser.UserID) } has, err = db.GetEngine(ctx).ID(federatedUser.UserID).Get(user) if err != nil { return nil, nil, err } else if !has { - return nil, nil, fmt.Errorf("FederatedUser table contains entry for user ID %v, but no user with this ID exists", federatedUser.UserID) + return nil, nil, fmt.Errorf("User %v for federated user is missing", federatedUser.UserID) } if res, err := validation.IsValid(*user); !res { @@ -130,7 +130,7 @@ func FindFederatedUserByKeyID(ctx context.Context, keyID string) (*User, *Federa if err != nil { return nil, nil, err } else if !has { - return nil, nil, fmt.Errorf("FederatedUser table contains entry for user ID %v, but no user with this ID exists", federatedUser.UserID) + return nil, nil, fmt.Errorf("User %v for federated user is missing", federatedUser.UserID) } if res, err := validation.IsValid(*user); !res { diff --git a/modules/activitypub/client.go b/modules/activitypub/client.go index 11a2fd94c3..fb6fa8b543 100644 --- a/modules/activitypub/client.go +++ b/modules/activitypub/client.go @@ -66,11 +66,6 @@ type ClientFactory struct { // NewClient function func NewClientFactory() (c *ClientFactory, err error) { - return NewClientFactoryWithTimeout(5 * time.Second) -} - -// NewClient function -func NewClientFactoryWithTimeout(timeout time.Duration) (c *ClientFactory, err error) { if err = containsRequiredHTTPHeaders(http.MethodGet, setting.Federation.GetHeaders); err != nil { return nil, err } else if err = containsRequiredHTTPHeaders(http.MethodPost, setting.Federation.PostHeaders); err != nil { @@ -82,7 +77,7 @@ func NewClientFactoryWithTimeout(timeout time.Duration) (c *ClientFactory, err e Transport: &http.Transport{ Proxy: proxy.Proxy(), }, - Timeout: timeout, + Timeout: 5 * time.Second, }, algs: setting.HttpsigAlgs, digestAlg: httpsig.DigestAlgorithm(setting.Federation.DigestAlgorithm), diff --git a/routers/api/v1/activitypub/repository.go b/routers/api/v1/activitypub/repository.go index 3eaa6b82c5..c506840f1c 100644 --- a/routers/api/v1/activitypub/repository.go +++ b/routers/api/v1/activitypub/repository.go @@ -71,11 +71,10 @@ func RepositoryInbox(ctx *context.APIContext) { repository := ctx.Repo.Repository log.Info("RepositoryInbox: repo: %v", repository) form := web.GetForm(ctx) - activity := form.(*ap.Activity) - result, err := federation.ProcessRepositoryInbox(ctx, activity, repository.ID) + // TODO: Decide between like/undo{like} activity + httpStatus, title, err := federation.ProcessLikeActivity(ctx, form, repository.ID) if err != nil { - ctx.Error(federation.HTTPStatus(err), "Processing Repository Inbox failed", result) - return + ctx.Error(httpStatus, title, err) } - responseServiceResult(ctx, result) + ctx.Status(http.StatusNoContent) } diff --git a/routers/api/v1/activitypub/reqsignature.go b/routers/api/v1/activitypub/reqsignature.go index 38cb067b89..91274249ec 100644 --- a/routers/api/v1/activitypub/reqsignature.go +++ b/routers/api/v1/activitypub/reqsignature.go @@ -8,13 +8,13 @@ import ( "forgejo.org/modules/log" "forgejo.org/modules/setting" - services_context "forgejo.org/services/context" + gitea_context "forgejo.org/services/context" "forgejo.org/services/federation" "github.com/42wim/httpsig" ) -func verifyHTTPUserOrInstanceSignature(ctx services_context.APIContext) (authenticated bool, err error) { +func verifyHTTPUserOrInstanceSignature(ctx *gitea_context.APIContext) (authenticated bool, err error) { if !setting.Federation.SignatureEnforced { return true, nil } @@ -28,9 +28,9 @@ func verifyHTTPUserOrInstanceSignature(ctx services_context.APIContext) (authent } signatureAlgorithm := httpsig.Algorithm(setting.Federation.SignatureAlgorithms[0]) - pubKey, err := federation.FindOrCreateFederatedUserKey(ctx, v.KeyId()) + pubKey, err := federation.FindOrCreateFederatedUserKey(ctx.Base, v.KeyId()) if err != nil || pubKey == nil { - pubKey, err = federation.FindOrCreateFederationHostKey(ctx, v.KeyId()) + pubKey, err = federation.FindOrCreateFederationHostKey(ctx.Base, v.KeyId()) if err != nil { return false, err } @@ -43,7 +43,7 @@ func verifyHTTPUserOrInstanceSignature(ctx services_context.APIContext) (authent return true, nil } -func verifyHTTPUserSignature(ctx services_context.APIContext) (authenticated bool, err error) { +func verifyHTTPUserSignature(ctx *gitea_context.APIContext) (authenticated bool, err error) { if !setting.Federation.SignatureEnforced { return true, nil } @@ -57,7 +57,7 @@ func verifyHTTPUserSignature(ctx services_context.APIContext) (authenticated boo } signatureAlgorithm := httpsig.Algorithm(setting.Federation.SignatureAlgorithms[0]) - pubKey, err := federation.FindOrCreateFederatedUserKey(ctx, v.KeyId()) + pubKey, err := federation.FindOrCreateFederatedUserKey(ctx.Base, v.KeyId()) if err != nil { return false, err } @@ -70,9 +70,9 @@ func verifyHTTPUserSignature(ctx services_context.APIContext) (authenticated boo } // ReqHTTPSignature function -func ReqHTTPUserOrInstanceSignature() func(ctx *services_context.APIContext) { - return func(ctx *services_context.APIContext) { - if authenticated, err := verifyHTTPUserOrInstanceSignature(*ctx); err != nil { +func ReqHTTPUserOrInstanceSignature() func(ctx *gitea_context.APIContext) { + return func(ctx *gitea_context.APIContext) { + if authenticated, err := verifyHTTPUserOrInstanceSignature(ctx); err != nil { log.Warn("verifyHttpSignatures failed: %v", err) ctx.Error(http.StatusBadRequest, "reqSignature", "request signature verification failed") } else if !authenticated { @@ -81,10 +81,10 @@ func ReqHTTPUserOrInstanceSignature() func(ctx *services_context.APIContext) { } } -// ReqHTTPUserSignature function -func ReqHTTPUserSignature() func(ctx *services_context.APIContext) { - return func(ctx *services_context.APIContext) { - if authenticated, err := verifyHTTPUserSignature(*ctx); err != nil { +// ReqHTTPSignature function +func ReqHTTPUserSignature() func(ctx *gitea_context.APIContext) { + return func(ctx *gitea_context.APIContext) { + if authenticated, err := verifyHTTPUserSignature(ctx); err != nil { log.Warn("verifyHttpSignatures failed: %v", err) ctx.Error(http.StatusBadRequest, "reqSignature", "request signature verification failed") } else if !authenticated { diff --git a/routers/api/v1/activitypub/response.go b/routers/api/v1/activitypub/response.go index 64413cebb1..a97f363cc2 100644 --- a/routers/api/v1/activitypub/response.go +++ b/routers/api/v1/activitypub/response.go @@ -10,46 +10,12 @@ import ( "forgejo.org/modules/forgefed" "forgejo.org/modules/log" "forgejo.org/services/context" - "forgejo.org/services/federation" ap "github.com/go-ap/activitypub" "github.com/go-ap/jsonld" ) // Respond with an ActivityStreams object -func responseServiceResult(ctx *context.APIContext, result federation.ServiceResult) { - ctx.Resp.Header().Add("Content-Type", activitypub.ActivityStreamsContentType) - - switch { - case result.StatusOnly(): - ctx.Resp.WriteHeader(result.HTTPStatus) - return - case result.WithBytes(): - ctx.Resp.WriteHeader(result.HTTPStatus) - if _, err := ctx.Resp.Write(result.Bytes); err != nil { - log.Error("Error writing a response: %v", err) - ctx.Error(http.StatusInternalServerError, "Error writing a response", err) - return - } - case result.WithActivity(): - binary, err := jsonld.WithContext( - jsonld.IRI(ap.ActivityBaseURI), - jsonld.IRI(ap.SecurityContextURI), - jsonld.IRI(forgefed.ForgeFedNamespaceURI), - ).Marshal(result.Activity) - if err != nil { - ctx.ServerError("Marshal", err) - return - } - ctx.Resp.WriteHeader(result.HTTPStatus) - if _, err = ctx.Resp.Write(binary); err != nil { - log.Error("write to resp err: %v", err) - } - } -} - -// Respond with an ActivityStreams object -// Deprecated func response(ctx *context.APIContext, v any) { binary, err := jsonld.WithContext( jsonld.IRI(ap.ActivityBaseURI), diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 2f806ba35d..6a51f33bd8 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -81,6 +81,7 @@ import ( repo_model "forgejo.org/models/repo" "forgejo.org/models/unit" user_model "forgejo.org/models/user" + "forgejo.org/modules/forgefed" "forgejo.org/modules/log" "forgejo.org/modules/setting" api "forgejo.org/modules/structs" @@ -852,7 +853,7 @@ func Routes() *web.Route { m.Group("/repository-id/{repository-id}", func() { m.Get("", activitypub.ReqHTTPUserSignature(), activitypub.Repository) m.Post("/inbox", - bind(ap.Activity{}), + bind(forgefed.ForgeLike{}), activitypub.ReqHTTPUserSignature(), activitypub.RepositoryInbox) }, context.RepositoryIDAssignmentAPI()) diff --git a/services/federation/error.go b/services/federation/error.go deleted file mode 100644 index 425035d0d5..0000000000 --- a/services/federation/error.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2025 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package federation - -import ( - "fmt" - "net/http" -) - -type ErrNotAcceptable struct { - Message string -} - -func NewErrNotAcceptablef(format string, a ...any) ErrNotAcceptable { - message := fmt.Sprintf(format, a...) - return ErrNotAcceptable{Message: message} -} - -func (err ErrNotAcceptable) Error() string { - return fmt.Sprintf("NotAcceptable: %v", err.Message) -} - -type ErrInternal struct { - Message string -} - -func NewErrInternalf(format string, a ...any) ErrInternal { - message := fmt.Sprintf(format, a...) - return ErrInternal{Message: message} -} - -func (err ErrInternal) Error() string { - return fmt.Sprintf("InternalServerError: %v", err.Message) -} - -func HTTPStatus(err error) int { - switch err.(type) { - case ErrNotAcceptable: - return http.StatusNotAcceptable - default: - return http.StatusInternalServerError - } -} diff --git a/services/federation/federation_service.go b/services/federation/federation_service.go index 36788e725a..b71d8d2575 100644 --- a/services/federation/federation_service.go +++ b/services/federation/federation_service.go @@ -18,6 +18,7 @@ import ( "forgejo.org/modules/log" "forgejo.org/modules/setting" "forgejo.org/modules/validation" + context_service "forgejo.org/services/context" "github.com/google/uuid" ) @@ -26,7 +27,7 @@ func Init() error { return nil } -func FindOrCreateFederationHost(ctx context.Context, actorURI string) (*forgefed.FederationHost, error) { +func FindOrCreateFederationHost(ctx *context_service.Base, actorURI string) (*forgefed.FederationHost, error) { rawActorID, err := fm.NewActorID(actorURI) if err != nil { return nil, err @@ -45,7 +46,7 @@ func FindOrCreateFederationHost(ctx context.Context, actorURI string) (*forgefed return federationHost, nil } -func FindOrCreateFederatedUser(ctx context.Context, actorURI string) (*user.User, *user.FederatedUser, *forgefed.FederationHost, error) { +func FindOrCreateFederatedUser(ctx *context_service.Base, actorURI string) (*user.User, *user.FederatedUser, *forgefed.FederationHost, error) { user, federatedUser, federationHost, err := findFederatedUser(ctx, actorURI) if err != nil { return nil, nil, nil, err @@ -56,21 +57,20 @@ func FindOrCreateFederatedUser(ctx context.Context, actorURI string) (*user.User } if user != nil { - log.Trace("Local ActivityPub user found (actorURI: %#v, user: %#v)", actorURI, user) + log.Trace("Found local federatedUser: %#v", user) } else { - log.Trace("Attempting to create new user and federatedUser for actorURI: %#v", actorURI) user, federatedUser, err = createUserFromAP(ctx, personID, federationHost.ID) if err != nil { return nil, nil, nil, err } - log.Trace("Created user %#v with federatedUser %#v from distant server", user, federatedUser) + log.Trace("Created federatedUser from ap: %#v", user) } log.Trace("Got user: %v", user.Name) return user, federatedUser, federationHost, nil } -func findFederatedUser(ctx context.Context, actorURI string) (*user.User, *user.FederatedUser, *forgefed.FederationHost, error) { +func findFederatedUser(ctx *context_service.Base, actorURI string) (*user.User, *user.FederatedUser, *forgefed.FederationHost, error) { federationHost, err := FindOrCreateFederationHost(ctx, actorURI) if err != nil { return nil, nil, nil, err @@ -90,7 +90,6 @@ func findFederatedUser(ctx context.Context, actorURI string) (*user.User, *user. func createFederationHostFromAP(ctx context.Context, actorID fm.ActorID) (*forgefed.FederationHost, error) { actionsUser := user.NewAPServerActor() - clientFactory, err := activitypub.GetClientFactory(ctx) if err != nil { return nil, err @@ -162,7 +161,7 @@ func fetchUserFromAP(ctx context.Context, personID fm.PersonID, federationHostID return nil, nil, err } - log.Info("Fetched valid person from distant server: %q", person) + log.Info("Fetched valid person:%q", person) localFqdn, err := url.ParseRequestURI(setting.AppURL) if err != nil { @@ -221,7 +220,7 @@ func fetchUserFromAP(ctx context.Context, personID fm.PersonID, federationHostID }, } - log.Info("Fetched person's %q federatedUser from distant server: %q", person, federatedUser) + log.Info("Fetch federatedUser:%q", federatedUser) return &newUser, &federatedUser, nil } @@ -235,6 +234,6 @@ func createUserFromAP(ctx context.Context, personID fm.PersonID, federationHostI return nil, nil, err } - log.Info("Created federatedUser: %q", federatedUser) + log.Info("Created federatedUser:%q", federatedUser) return newUser, federatedUser, nil } diff --git a/services/federation/repository_inbox_like.go b/services/federation/repo_like.go similarity index 73% rename from services/federation/repository_inbox_like.go rename to services/federation/repo_like.go index 478a12d92c..c1e6500c61 100644 --- a/services/federation/repository_inbox_like.go +++ b/services/federation/repo_like.go @@ -5,6 +5,7 @@ package federation import ( "context" + "errors" "fmt" "net/http" "time" @@ -17,8 +18,6 @@ import ( "forgejo.org/modules/log" "forgejo.org/modules/validation" context_service "forgejo.org/services/context" - - ap "github.com/go-ap/activitypub" ) // ProcessLikeActivity receives a ForgeLike activity and does the following: @@ -28,32 +27,32 @@ import ( // Validation of incoming RepositoryID against Local RepositoryID // Star the repo if it wasn't already stared // Do some mitigation against out of order attacks -func ProcessLikeActivity(ctx context.Context, activity *ap.Activity, repositoryID int64) (ServiceResult, error) { - constructorLikeActivity, _ := fm.NewForgeLike(activity.Actor.GetLink().String(), activity.Object.GetLink().String(), activity.StartTime) - if res, err := validation.IsValid(constructorLikeActivity); !res { - return ServiceResult{}, NewErrNotAcceptablef("Invalid activity: %v", err) +func ProcessLikeActivity(ctx *context_service.APIContext, form any, repositoryID int64) (int, string, error) { + activity := form.(*fm.ForgeLike) + if res, err := validation.IsValid(activity); !res { + return http.StatusNotAcceptable, "Invalid activity", err } log.Trace("Activity validated: %#v", activity) // parse actorID (person) actorURI := activity.Actor.GetID().String() - user, _, federationHost, err := FindOrCreateFederatedUser(ctx, actorURI) + user, _, federationHost, err := FindOrCreateFederatedUser(ctx.Base, actorURI) if err != nil { - log.Error("Federated user not found (%s): %v", actorURI, err) - return ServiceResult{}, NewErrNotAcceptablef("FindOrCreateFederatedUser failed: %v", err) + ctx.Error(http.StatusNotAcceptable, "Federated user not found", err) + return http.StatusInternalServerError, "FindOrCreateFederatedUser", err } - if !constructorLikeActivity.IsNewer(federationHost.LatestActivity) { - return ServiceResult{}, NewErrNotAcceptablef("LatestActivity: activity already processed: %v", err) + if !activity.IsNewer(federationHost.LatestActivity) { + return http.StatusNotAcceptable, "Activity out of order.", errors.New("Activity already processed") } // parse objectID (repository) - objectID, err := fm.NewRepositoryID(constructorLikeActivity.Object.GetID().String(), string(forgefed.ForgejoSourceType)) + objectID, err := fm.NewRepositoryID(activity.Object.GetID().String(), string(forgefed.ForgejoSourceType)) if err != nil { - return ServiceResult{}, NewErrNotAcceptablef("Parsing repo objectID failed: %v", err) + return http.StatusNotAcceptable, "Invalid objectId", err } if objectID.ID != fmt.Sprint(repositoryID) { - return ServiceResult{}, NewErrNotAcceptablef("Invalid repoId: %v", err) + return http.StatusNotAcceptable, "Invalid objectId", err } log.Trace("Object accepted: %#v", objectID) @@ -62,16 +61,16 @@ func ProcessLikeActivity(ctx context.Context, activity *ap.Activity, repositoryI if !alreadyStared { err = repo.StarRepo(ctx, user.ID, repositoryID, true) if err != nil { - return ServiceResult{}, NewErrNotAcceptablef("Staring failed: %v", err) + return http.StatusNotAcceptable, "Error staring", err } } federationHost.LatestActivity = activity.StartTime err = forgefed.UpdateFederationHost(ctx, federationHost) if err != nil { - return ServiceResult{}, NewErrNotAcceptablef("Updating federatedHost failed: %v", err) + return http.StatusNotAcceptable, "Error updating federatedHost", err } - return NewServiceResultStatusOnly(http.StatusNoContent), nil + return 0, "", nil } // Create or update a list of FollowingRepo structs diff --git a/services/federation/repository_service.go b/services/federation/repository_service.go deleted file mode 100644 index 7891d786e2..0000000000 --- a/services/federation/repository_service.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2025 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package federation - -import ( - "context" - - ap "github.com/go-ap/activitypub" -) - -func ProcessRepositoryInbox(ctx context.Context, activity *ap.Activity, repositoryID int64) (ServiceResult, error) { - switch activity.Type { - case ap.LikeType: - return ProcessLikeActivity(ctx, activity, repositoryID) - default: - return ServiceResult{}, NewErrNotAcceptablef("Not a like activity: %v", activity.Type) - } -} diff --git a/services/federation/result.go b/services/federation/result.go deleted file mode 100644 index 47afb2bdf6..0000000000 --- a/services/federation/result.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2025 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package federation - -import "github.com/go-ap/activitypub" - -type ServiceResult struct { - HTTPStatus int - Bytes []byte - Activity activitypub.Activity - withBytes bool - withActivity bool - statusOnly bool -} - -func NewServiceResultStatusOnly(status int) ServiceResult { - return ServiceResult{HTTPStatus: status, statusOnly: true} -} - -func NewServiceResultWithBytes(status int, bytes []byte) ServiceResult { - return ServiceResult{HTTPStatus: status, Bytes: bytes, withBytes: true} -} - -func (serviceResult ServiceResult) WithBytes() bool { - return serviceResult.withBytes -} - -func (serviceResult ServiceResult) WithActivity() bool { - return serviceResult.withActivity -} - -func (serviceResult ServiceResult) StatusOnly() bool { - return serviceResult.statusOnly -} diff --git a/services/federation/signature_service.go b/services/federation/signature_service.go index fd8cbb39cd..e5102b89d8 100644 --- a/services/federation/signature_service.go +++ b/services/federation/signature_service.go @@ -4,7 +4,6 @@ package federation import ( - "context" "crypto/x509" "database/sql" "encoding/pem" @@ -16,12 +15,13 @@ import ( "forgejo.org/models/user" "forgejo.org/modules/activitypub" fm "forgejo.org/modules/forgefed" + context_service "forgejo.org/services/context" ap "github.com/go-ap/activitypub" ) // Factory function for ActorID. Created struct is asserted to be valid -func NewActorIDFromKeyID(ctx context.Context, uri string) (fm.ActorID, error) { +func NewActorIDFromKeyID(ctx *context_service.Base, uri string) (fm.ActorID, error) { parsedURI, err := url.Parse(uri) parsedURI.Fragment = "" if err != nil { @@ -54,7 +54,7 @@ func NewActorIDFromKeyID(ctx context.Context, uri string) (fm.ActorID, error) { return result, err } -func FindOrCreateFederatedUserKey(ctx context.Context, keyID string) (pubKey any, err error) { +func FindOrCreateFederatedUserKey(ctx *context_service.Base, keyID string) (pubKey any, err error) { var federatedUser *user.FederatedUser var keyURL *url.URL @@ -122,7 +122,7 @@ func FindOrCreateFederatedUserKey(ctx context.Context, keyID string) (pubKey any return nil, nil } -func FindOrCreateFederationHostKey(ctx context.Context, keyID string) (pubKey any, err error) { +func FindOrCreateFederationHostKey(ctx *context_service.Base, keyID string) (pubKey any, err error) { keyURL, err := url.Parse(keyID) if err != nil { return nil, err @@ -183,9 +183,8 @@ func FindOrCreateFederationHostKey(ctx context.Context, keyID string) (pubKey an return nil, nil } -func fetchKeyFromAp(ctx context.Context, keyURL url.URL) (pubKey any, pubKeyBytes []byte, apPerson *ap.Person, err error) { +func fetchKeyFromAp(ctx *context_service.Base, keyURL url.URL) (pubKey any, pubKeyBytes []byte, apPerson *ap.Person, err error) { actionsUser := user.NewAPServerActor() - clientFactory, err := activitypub.GetClientFactory(ctx) if err != nil { return nil, nil, nil, err diff --git a/tests/integration/api_activitypub_actor_test.go b/tests/integration/api_activitypub_actor_test.go deleted file mode 100644 index 42232bd640..0000000000 --- a/tests/integration/api_activitypub_actor_test.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2024 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package integration - -import ( - "fmt" - "net/http" - "net/url" - "strconv" - "testing" - - "forgejo.org/modules/forgefed" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/routers" - "forgejo.org/services/contexttest" - "forgejo.org/services/federation" - "forgejo.org/tests" - - ap "github.com/go-ap/activitypub" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestActivityPubActor(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - defer tests.PrepareTestEnv(t)() - - req := NewRequest(t, "GET", "/api/v1/activitypub/actor") - resp := MakeRequest(t, req, http.StatusOK) - assert.Contains(t, resp.Body.String(), "@context") - - var actor ap.Actor - err := actor.UnmarshalJSON(resp.Body.Bytes()) - require.NoError(t, err) - - assert.Equal(t, ap.ApplicationType, actor.Type) - assert.Equal(t, "ghost", actor.PreferredUsername.String()) - keyID := actor.GetID().String() - assert.Regexp(t, "activitypub/actor$", keyID) - assert.Regexp(t, "activitypub/actor/inbox$", actor.Inbox.GetID().String()) - - pubKey := actor.PublicKey - assert.NotNil(t, pubKey) - publicKeyID := keyID + "#main-key" - assert.Equal(t, pubKey.ID.String(), publicKeyID) - - pubKeyPem := pubKey.PublicKeyPem - assert.NotNil(t, pubKeyPem) - assert.Regexp(t, "^-----BEGIN PUBLIC KEY-----", pubKeyPem) -} - -func TestActorNewFromKeyId(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - - onGiteaRun(t, func(t *testing.T, u *url.URL) { - ctx, _ := contexttest.MockAPIContext(t, "/api/v1/activitypub/actor") - sut, err := federation.NewActorIDFromKeyID(ctx.Base, fmt.Sprintf("%sapi/v1/activitypub/actor#main-key", u)) - require.NoError(t, err) - - port, err := strconv.ParseUint(u.Port(), 10, 16) - require.NoError(t, err) - - assert.Equal(t, forgefed.ActorID{ - ID: "actor", - HostSchema: "http", - Path: "api/v1/activitypub", - Host: setting.Domain, - HostPort: uint16(port), - UnvalidatedInput: fmt.Sprintf("http://%s:%d/api/v1/activitypub/actor", setting.Domain, port), - IsPortSupplemented: false, - }, sut) - }) -} diff --git a/tests/integration/api_activitypub_person_test.go b/tests/integration/api_activitypub_person_test.go deleted file mode 100644 index 277b150a1e..0000000000 --- a/tests/integration/api_activitypub_person_test.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2022 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package integration - -import ( - "fmt" - "net/http" - "net/url" - "testing" - "time" - - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/activitypub" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/routers" - "forgejo.org/services/contexttest" - "forgejo.org/tests" - - ap "github.com/go-ap/activitypub" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestActivityPubPerson(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - - mock := test.NewFederationServerMock() - federatedSrv := mock.DistantServer(t) - defer federatedSrv.Close() - - onGiteaRun(t, func(t *testing.T, localUrl *url.URL) { - defer test.MockVariableValue(&setting.AppURL, localUrl.String())() - - localUserID := 2 - localUserName := "user2" - localUserURL := fmt.Sprintf("%sapi/v1/activitypub/user-id/%d", localUrl, localUserID) - - // distantURL := federatedSrv.URL - // distantUser15URL := fmt.Sprintf("%s/api/v1/activitypub/user-id/15", distantURL) - - // Unsigned request - t.Run("UnsignedRequest", func(t *testing.T) { - req := NewRequest(t, "GET", localUserURL) - MakeRequest(t, req, http.StatusBadRequest) - }) - - // Signed request - t.Run("SignedRequestValidation", func(t *testing.T) { - ctx, _ := contexttest.MockAPIContext(t, localUserURL) - cf, err := activitypub.NewClientFactoryWithTimeout(60 * time.Second) - require.NoError(t, err) - - c, err := cf.WithKeysDirect(ctx, mock.Persons[0].PrivKey, - mock.Persons[0].KeyID(federatedSrv.URL)) - require.NoError(t, err) - - resp, err := c.GetBody(localUserURL) - require.NoError(t, err) - - var person ap.Person - err = person.UnmarshalJSON(resp) - require.NoError(t, err) - - assert.Equal(t, ap.PersonType, person.Type) - assert.Equal(t, localUserName, person.PreferredUsername.String()) - assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%d$", localUserID), person.GetID()) - assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%d/inbox$", localUserID), person.Inbox.GetID().String()) - - assert.NotNil(t, person.PublicKey) - assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%d#main-key$", localUserID), person.PublicKey.ID) - - assert.NotNil(t, person.PublicKey.PublicKeyPem) - assert.Regexp(t, "^-----BEGIN PUBLIC KEY-----", person.PublicKey.PublicKeyPem) - }) - }) -} - -func TestActivityPubMissingPerson(t *testing.T) { - defer tests.PrepareTestEnv(t)() - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - - req := NewRequest(t, "GET", "/api/v1/activitypub/user-id/999999999") - resp := MakeRequest(t, req, http.StatusNotFound) - assert.Contains(t, resp.Body.String(), "user does not exist") -} - -func TestActivityPubPersonInbox(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - - onGiteaRun(t, func(t *testing.T, u *url.URL) { - defer test.MockVariableValue(&setting.AppURL, u.String())() - user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) - - user1url := u.JoinPath("/api/v1/activitypub/user-id/1").String() + "#main-key" - user2inboxurl := u.JoinPath("/api/v1/activitypub/user-id/2/inbox").String() - ctx, _ := contexttest.MockAPIContext(t, user2inboxurl) - cf, err := activitypub.NewClientFactoryWithTimeout(60 * time.Second) - require.NoError(t, err) - c, err := cf.WithKeys(ctx, user1, user1url) - require.NoError(t, err) - - // Signed request "succeeds" - resp, err := c.Post([]byte{}, user2inboxurl) - require.NoError(t, err) - assert.Equal(t, http.StatusNoContent, resp.StatusCode) - }) -} diff --git a/tests/integration/api_activitypub_repository_test.go b/tests/integration/api_activitypub_repository_test.go deleted file mode 100644 index b4be0407b9..0000000000 --- a/tests/integration/api_activitypub_repository_test.go +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright 2024, 2025 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package integration - -import ( - "fmt" - "net/http" - "net/url" - "testing" - "time" - - "forgejo.org/models/forgefed" - "forgejo.org/models/unittest" - "forgejo.org/models/user" - "forgejo.org/modules/activitypub" - forgefed_modules "forgejo.org/modules/forgefed" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/routers" - "forgejo.org/services/contexttest" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestActivityPubRepository(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - - mock := test.NewFederationServerMock() - federatedSrv := mock.DistantServer(t) - defer federatedSrv.Close() - - onGiteaRun(t, func(t *testing.T, u *url.URL) { - repositoryID := 2 - - localRepository := fmt.Sprintf("%sapi/v1/activitypub/repository-id/%d", u, repositoryID) - - ctx, _ := contexttest.MockAPIContext(t, localRepository) - cf, err := activitypub.NewClientFactoryWithTimeout(60 * time.Second) - require.NoError(t, err) - - c, err := cf.WithKeysDirect(ctx, mock.Persons[0].PrivKey, - mock.Persons[0].KeyID(federatedSrv.URL)) - require.NoError(t, err) - - resp, err := c.GetBody(localRepository) - require.NoError(t, err) - assert.Contains(t, string(resp), "@context") - - var repository forgefed_modules.Repository - err = repository.UnmarshalJSON(resp) - require.NoError(t, err) - - assert.Regexp(t, fmt.Sprintf("activitypub/repository-id/%d$", repositoryID), repository.GetID().String()) - }) -} - -func TestActivityPubMissingRepository(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&setting.Federation.SignatureEnforced, false)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - - repositoryID := 9999999 - req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/activitypub/repository-id/%d", repositoryID)) - resp := MakeRequest(t, req, http.StatusNotFound) - assert.Contains(t, resp.Body.String(), "repository does not exist") -} - -func TestActivityPubRepositoryInboxValid(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - - mock := test.NewFederationServerMock() - federatedSrv := mock.DistantServer(t) - defer federatedSrv.Close() - - onGiteaRun(t, func(t *testing.T, u *url.URL) { - repositoryID := 2 - timeNow := time.Now().UTC() - localRepoInbox := u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d/inbox", repositoryID)).String() - - ctx, _ := contexttest.MockAPIContext(t, localRepoInbox) - cf, err := activitypub.NewClientFactoryWithTimeout(60 * time.Second) - require.NoError(t, err) - - c, err := cf.WithKeysDirect(ctx, mock.Persons[0].PrivKey, - mock.Persons[0].KeyID(federatedSrv.URL)) - require.NoError(t, err) - - activity1 := []byte(fmt.Sprintf( - `{"type":"Like",`+ - `"startTime":"%s",`+ - `"actor":"%s/api/v1/activitypub/user-id/15",`+ - `"object":"%s"}`, - timeNow.Format(time.RFC3339), - federatedSrv.URL, u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d", repositoryID)).String())) - t.Logf("activity: %s", activity1) - resp, err := c.Post(activity1, localRepoInbox) - - require.NoError(t, err) - assert.Equal(t, http.StatusNoContent, resp.StatusCode) - - federationHost := unittest.AssertExistsAndLoadBean(t, &forgefed.FederationHost{HostFqdn: "127.0.0.1"}) - federatedUser := unittest.AssertExistsAndLoadBean(t, &user.FederatedUser{ExternalID: "15", FederationHostID: federationHost.ID}) - unittest.AssertExistsAndLoadBean(t, &user.User{ID: federatedUser.UserID}) - - // A like activity by a different user of the same federated host. - activity2 := []byte(fmt.Sprintf( - `{"type":"Like",`+ - `"startTime":"%s",`+ - `"actor":"%s/api/v1/activitypub/user-id/30",`+ - `"object":"%s"}`, - // Make sure this activity happens later then the one before - timeNow.Add(time.Second).Format(time.RFC3339), - federatedSrv.URL, u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d", repositoryID)).String())) - t.Logf("activity: %s", activity2) - resp, err = c.Post(activity2, localRepoInbox) - - require.NoError(t, err) - assert.Equal(t, http.StatusNoContent, resp.StatusCode) - - federatedUser = unittest.AssertExistsAndLoadBean(t, &user.FederatedUser{ExternalID: "30", FederationHostID: federationHost.ID}) - unittest.AssertExistsAndLoadBean(t, &user.User{ID: federatedUser.UserID}) - - // The same user sends another like activity - otherRepositoryID := 3 - otherRepoInboxURL := u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d/inbox", otherRepositoryID)).String() - activity3 := []byte(fmt.Sprintf( - `{"type":"Like",`+ - `"startTime":"%s",`+ - `"actor":"%s/api/v1/activitypub/user-id/30",`+ - `"object":"%s"}`, - // Make sure this activity happens later then the ones before - timeNow.Add(time.Second*2).Format(time.RFC3339), - federatedSrv.URL, u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d", otherRepositoryID)).String())) - t.Logf("activity: %s", activity3) - resp, err = c.Post(activity3, otherRepoInboxURL) - - require.NoError(t, err) - assert.Equal(t, http.StatusNoContent, resp.StatusCode) - - federatedUser = unittest.AssertExistsAndLoadBean(t, &user.FederatedUser{ExternalID: "30", FederationHostID: federationHost.ID}) - unittest.AssertExistsAndLoadBean(t, &user.User{ID: federatedUser.UserID}) - - // Replay activity2. - resp, err = c.Post(activity2, localRepoInbox) - require.NoError(t, err) - assert.Equal(t, http.StatusNotAcceptable, resp.StatusCode) - }) -} - -func TestActivityPubRepositoryInboxInvalid(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&setting.Federation.SignatureEnforced, false)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - - onGiteaRun(t, func(t *testing.T, u *url.URL) { - apServerActor := user.NewAPServerActor() - repositoryID := 2 - localRepo2Inbox := u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d/inbox", repositoryID)).String() - - ctx, _ := contexttest.MockAPIContext(t, localRepo2Inbox) - cf, err := activitypub.NewClientFactoryWithTimeout(60 * time.Second) - require.NoError(t, err) - - c, err := cf.WithKeys(ctx, apServerActor, apServerActor.KeyID()) - require.NoError(t, err) - - activity := []byte(`{"type":"Wrong"}`) - resp, err := c.Post(activity, localRepo2Inbox) - require.NoError(t, err) - assert.Equal(t, http.StatusNotAcceptable, resp.StatusCode) - }) -} diff --git a/tests/integration/api_federation_httpsig_test.go b/tests/integration/api_federation_httpsig_test.go deleted file mode 100644 index a8deaa315f..0000000000 --- a/tests/integration/api_federation_httpsig_test.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2025 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package integration - -import ( - "fmt" - "net/http" - "net/url" - "testing" - - "forgejo.org/models/db" - "forgejo.org/models/forgefed" - "forgejo.org/models/unittest" - "forgejo.org/models/user" - "forgejo.org/modules/activitypub" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/routers" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestFederationHttpSigValidation(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - - onGiteaRun(t, func(t *testing.T, u *url.URL) { - userID := 2 - userURL := fmt.Sprintf("%sapi/v1/activitypub/user-id/%d", u, userID) - - user1 := unittest.AssertExistsAndLoadBean(t, &user.User{ID: 1}) - - clientFactory, err := activitypub.GetClientFactory(db.DefaultContext) - require.NoError(t, err) - - apClient, err := clientFactory.WithKeys(db.DefaultContext, user1, user1.KeyID()) - require.NoError(t, err) - - // Unsigned request - t.Run("UnsignedRequest", func(t *testing.T) { - req := NewRequest(t, "GET", userURL) - MakeRequest(t, req, http.StatusBadRequest) - }) - - // Signed request - t.Run("SignedRequest", func(t *testing.T) { - resp, err := apClient.Get(userURL) - require.NoError(t, err) - assert.Equal(t, http.StatusOK, resp.StatusCode) - }) - - // HACK HACK HACK: the host part of the URL gets set to which IP forgejo is - // listening on, NOT localhost, which is the Domain given to forgejo which - // is then used for eg. the keyID all requests - applicationKeyID := fmt.Sprintf("%sapi/v1/activitypub/actor#main-key", setting.AppURL) - actorKeyID := fmt.Sprintf("%sapi/v1/activitypub/user-id/1#main-key", setting.AppURL) - - // Check for cached public keys - t.Run("ValidateCaches", func(t *testing.T) { - host, err := forgefed.FindFederationHostByKeyID(db.DefaultContext, applicationKeyID) - require.NoError(t, err) - assert.NotNil(t, host) - assert.True(t, host.PublicKey.Valid) - - _, user, err := user.FindFederatedUserByKeyID(db.DefaultContext, actorKeyID) - require.NoError(t, err) - assert.NotNil(t, user) - assert.True(t, user.PublicKey.Valid) - }) - - // Disable signature validation - defer test.MockVariableValue(&setting.Federation.SignatureEnforced, false)() - - // Unsigned request - t.Run("SignatureValidationDisabled", func(t *testing.T) { - req := NewRequest(t, "GET", userURL) - MakeRequest(t, req, http.StatusOK) - }) - }) -} diff --git a/tests/integration/repo_star_federation_test.go b/tests/integration/repo_star_federation_test.go deleted file mode 100644 index ae9a4e9f83..0000000000 --- a/tests/integration/repo_star_federation_test.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2024 The Forgejo Authors c/o Codeberg e.V.. All rights reserved. -// SPDX-License-Identifier: MIT - -package integration - -import ( - "fmt" - "net/http" - "strings" - "testing" - - "forgejo.org/models/forgefed" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - fm "forgejo.org/modules/forgefed" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/modules/validation" - "forgejo.org/tests" -) - -func TestActivityPubRepoFollowing(t *testing.T) { - defer tests.PrepareTestEnv(t)() - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - - mock := test.NewFederationServerMock() - federatedSrv := mock.DistantServer(t) - defer federatedSrv.Close() - - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1, OwnerID: user.ID}) - session := loginUser(t, user.Name) - - t.Run("Add a following repo", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - link := fmt.Sprintf("/%s/settings", repo.FullName()) - - req := NewRequestWithValues(t, "POST", link, map[string]string{ - "_csrf": GetCSRF(t, session, link), - "action": "federation", - "following_repos": fmt.Sprintf("%s/api/v1/activitypub/repository-id/1", federatedSrv.URL), - }) - session.MakeRequest(t, req, http.StatusSeeOther) - - // Verify it was added. - federationHost := unittest.AssertExistsAndLoadBean(t, &forgefed.FederationHost{HostFqdn: "127.0.0.1"}) - unittest.AssertExistsAndLoadBean(t, &repo_model.FollowingRepo{ - ExternalID: "1", - FederationHostID: federationHost.ID, - }) - }) - - t.Run("Star a repo having a following repo", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - repoLink := fmt.Sprintf("/%s", repo.FullName()) - link := fmt.Sprintf("%s/action/star", repoLink) - req := NewRequestWithValues(t, "POST", link, map[string]string{ - "_csrf": GetCSRF(t, session, repoLink), - }) - - session.MakeRequest(t, req, http.StatusOK) - - // Verify distant server received a like activity - like := fm.ForgeLike{} - err := like.UnmarshalJSON([]byte(mock.LastPost)) - if err != nil { - t.Errorf("Error unmarshalling ForgeLike: %q", err) - } - if isValid, err := validation.IsValid(like); !isValid { - t.Errorf("ForgeLike is not valid: %q", err) - } - activityType := like.Type - object := like.Object.GetLink().String() - isLikeType := activityType == "Like" - isCorrectObject := strings.HasSuffix(object, "/api/v1/activitypub/repository-id/1") - if !isLikeType || !isCorrectObject { - t.Error("Activity is not a like for this repo") - } - }) -} From 29eaab5ff420c7ee97441689bba0a3d9f659ddc1 Mon Sep 17 00:00:00 2001 From: Leni Kadali Date: Mon, 28 Jul 2025 14:52:13 +0200 Subject: [PATCH 234/495] feat: add configurable timeout for automatically removing resolved reports (#7940) Supersedes [this PR](https://codeberg.org/lenikadali/forgejo/pulls/1) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7940 Reviewed-by: Otto Reviewed-by: Gusted Co-authored-by: Leni Kadali Co-committed-by: Leni Kadali --- custom/conf/app.example.ini | 5 ++ models/forgejo_migrations/migrate.go | 3 + models/forgejo_migrations/v38.go | 19 ++++++ models/moderation/abuse_report.go | 21 ++++++ modules/setting/moderation.go | 21 +++++- modules/setting/setting.go | 5 +- services/cron/tasks_extended.go | 22 ++++++ services/moderation/main_test.go | 17 +++++ services/moderation/reporting.go | 41 +++++++++++ services/moderation/reporting_test.go | 97 +++++++++++++++++++++++++++ 10 files changed, 247 insertions(+), 4 deletions(-) create mode 100644 models/forgejo_migrations/v38.go create mode 100644 services/moderation/main_test.go create mode 100644 services/moderation/reporting_test.go diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index 71598663b2..8f7c4658ce 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -1586,6 +1586,11 @@ LEVEL = Info ;; If enabled it will be possible for users to report abusive content (new actions are added in the UI and /report_abuse route will be enabled) and a new Moderation section will be added to Admin settings where the reports can be reviewed. ;ENABLED = false +;; How long to keep resolved abuse reports for. +;; Applies to reports that have been marked as ignored or handled +;; Can be 1 hour, 7 days etc +;KEEP_RESOLVED_REPORTS_FOR = 0 + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;[openid] diff --git a/models/forgejo_migrations/migrate.go b/models/forgejo_migrations/migrate.go index 384f382c82..a22d35dd21 100644 --- a/models/forgejo_migrations/migrate.go +++ b/models/forgejo_migrations/migrate.go @@ -111,7 +111,10 @@ var migrations = []*Migration{ NewMigration("Noop because of https://codeberg.org/forgejo/forgejo/issues/8373", NoopAddIndexToActionRunStopped), // v35 -> v36 NewMigration("Fix wiki unit default permission", FixWikiUnitDefaultPermission), + // v36 -> v37 NewMigration("Add `branch_filter` to `push_mirror` table", AddPushMirrorBranchFilter), + // v37 -> v38 + NewMigration("Add `resolved_unix` column to `abuse_report` table", AddResolvedUnixToAbuseReport), } // GetCurrentDBVersion returns the current Forgejo database version. diff --git a/models/forgejo_migrations/v38.go b/models/forgejo_migrations/v38.go new file mode 100644 index 0000000000..24240f15a0 --- /dev/null +++ b/models/forgejo_migrations/v38.go @@ -0,0 +1,19 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package forgejo_migrations + +import ( + "forgejo.org/modules/timeutil" + + "xorm.io/xorm" +) + +func AddResolvedUnixToAbuseReport(x *xorm.Engine) error { + type AbuseReport struct { + ID int64 `xorm:"pk autoincr"` + ResolvedUnix timeutil.TimeStamp `xorm:"DEFAULT NULL"` + } + + return x.Sync(&AbuseReport{}) +} diff --git a/models/moderation/abuse_report.go b/models/moderation/abuse_report.go index 9852268910..0bf8aab174 100644 --- a/models/moderation/abuse_report.go +++ b/models/moderation/abuse_report.go @@ -8,6 +8,7 @@ import ( "database/sql" "errors" "slices" + "time" "forgejo.org/models/db" "forgejo.org/modules/log" @@ -111,6 +112,7 @@ type AbuseReport struct { // The ID of the corresponding shadow-copied content when exists; otherwise null. ShadowCopyID sql.NullInt64 `xorm:"DEFAULT NULL"` CreatedUnix timeutil.TimeStamp `xorm:"created NOT NULL"` + ResolvedUnix timeutil.TimeStamp `xorm:"DEFAULT NULL"` } var ErrSelfReporting = errors.New("reporting yourself is not allowed") @@ -161,6 +163,25 @@ func ReportAbuse(ctx context.Context, report *AbuseReport) error { return err } +// GetResolvedReports gets all resolved reports +func GetResolvedReports(ctx context.Context, keepReportsFor time.Duration) ([]*AbuseReport, error) { + cond := builder.And( + builder.Or( + builder.Eq{"`status`": ReportStatusTypeHandled}, + builder.Eq{"`status`": ReportStatusTypeIgnored}, + ), + ) + + if keepReportsFor > 0 { + cond = cond.And(builder.Lt{"resolved_unix": time.Now().Add(-keepReportsFor).Unix()}) + } + + abuseReports := make([]*AbuseReport, 0, 30) + return abuseReports, db.GetEngine(ctx). + Where(cond). + Find(&abuseReports) +} + /* // MarkAsHandled will change the status to 'Handled' for all reports linked to the same item (user, repository, issue or comment). func MarkAsHandled(ctx context.Context, contentType ReportedContentType, contentID int64) error { diff --git a/modules/setting/moderation.go b/modules/setting/moderation.go index 5f35a284d6..799efed761 100644 --- a/modules/setting/moderation.go +++ b/modules/setting/moderation.go @@ -3,13 +3,28 @@ package setting +import ( + "fmt" + "time" +) + // Moderation settings var Moderation = struct { - Enabled bool `ini:"ENABLED"` + Enabled bool `ini:"ENABLED"` + KeepResolvedReportsFor time.Duration `ini:"KEEP_RESOLVED_REPORTS_FOR"` }{ Enabled: false, } -func loadModerationFrom(rootCfg ConfigProvider) { - mustMapSetting(rootCfg, "moderation", &Moderation) +func loadModerationFrom(rootCfg ConfigProvider) error { + sec := rootCfg.Section("moderation") + err := sec.MapTo(&Moderation) + if err != nil { + return fmt.Errorf("failed to map Moderation settings: %v", err) + } + + // keep reports for one week by default. Since time.Duration stops at the unit of an hour + // we are using the value of 24 (hours) * 7 (days) which gives us the value of 168 + Moderation.KeepResolvedReportsFor = sec.Key("KEEP_RESOLVED_REPORTS_FOR").MustDuration(168 * time.Hour) + return nil } diff --git a/modules/setting/setting.go b/modules/setting/setting.go index 75c24580b2..9644d9b83b 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -140,6 +140,10 @@ func loadCommonSettingsFrom(cfg ConfigProvider) error { if err := loadActionsFrom(cfg); err != nil { return err } + if err := loadModerationFrom(cfg); err != nil { + return err + } + loadUIFrom(cfg) loadAdminFrom(cfg) loadAPIFrom(cfg) @@ -221,7 +225,6 @@ func LoadSettings() { loadProjectFrom(CfgProvider) loadMimeTypeMapFrom(CfgProvider) loadF3From(CfgProvider) - loadModerationFrom(CfgProvider) } // LoadSettingsForInstall initializes the settings for install diff --git a/services/cron/tasks_extended.go b/services/cron/tasks_extended.go index 322fe27ca0..3006601366 100644 --- a/services/cron/tasks_extended.go +++ b/services/cron/tasks_extended.go @@ -15,6 +15,7 @@ import ( issue_indexer "forgejo.org/modules/indexer/issues" "forgejo.org/modules/setting" "forgejo.org/modules/updatechecker" + moderation_service "forgejo.org/services/moderation" repo_service "forgejo.org/services/repository" archiver_service "forgejo.org/services/repository/archiver" user_service "forgejo.org/services/user" @@ -225,6 +226,24 @@ func registerRebuildIssueIndexer() { }) } +func registerRemoveResolvedReports() { + type ReportConfig struct { + BaseConfig + ConfigKeepResolvedReportsFor time.Duration + } + RegisterTaskFatal("remove_resolved_reports", &ReportConfig{ + BaseConfig: BaseConfig{ + Enabled: false, + RunAtStart: false, + Schedule: "@every 24h", + }, + ConfigKeepResolvedReportsFor: setting.Moderation.KeepResolvedReportsFor, + }, func(ctx context.Context, _ *user_model.User, config Config) error { + reportConfig := config.(*ReportConfig) + return moderation_service.RemoveResolvedReports(ctx, reportConfig.ConfigKeepResolvedReportsFor) + }) +} + func initExtendedTasks() { registerDeleteInactiveUsers() registerDeleteRepositoryArchives() @@ -240,4 +259,7 @@ func initExtendedTasks() { registerDeleteOldSystemNotices() registerGCLFS() registerRebuildIssueIndexer() + if setting.Moderation.Enabled { + registerRemoveResolvedReports() + } } diff --git a/services/moderation/main_test.go b/services/moderation/main_test.go new file mode 100644 index 0000000000..3a268260d2 --- /dev/null +++ b/services/moderation/main_test.go @@ -0,0 +1,17 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package moderation + +import ( + "testing" + + "forgejo.org/models/unittest" + + _ "forgejo.org/models/forgefed" + _ "forgejo.org/models/moderation" +) + +func TestMain(m *testing.M) { + unittest.MainTest(m) +} diff --git a/services/moderation/reporting.go b/services/moderation/reporting.go index e01156dc11..3d1bb5b32c 100644 --- a/services/moderation/reporting.go +++ b/services/moderation/reporting.go @@ -4,8 +4,11 @@ package moderation import ( + stdCtx "context" "errors" + "time" + "forgejo.org/models/db" "forgejo.org/models/issues" "forgejo.org/models/moderation" "forgejo.org/models/perm" @@ -127,3 +130,41 @@ func CanReport(ctx context.Context, doer *user.User, contentType moderation.Repo return hasAccess, nil } + +// RemoveResolvedReports removes resolved reports +func RemoveResolvedReports(ctx stdCtx.Context, keepReportsFor time.Duration) error { + log.Trace("Doing: RemoveResolvedReports") + + if keepReportsFor <= 0 { + return nil + } + + err := db.WithTx(ctx, func(ctx stdCtx.Context) error { + resolvedReports, err := moderation.GetResolvedReports(ctx, keepReportsFor) + if err != nil { + return err + } + + for _, report := range resolvedReports { + _, err := db.GetEngine(ctx).ID(report.ID).Delete(&moderation.AbuseReport{}) + if err != nil { + return err + } + + if report.ShadowCopyID.Valid { + _, err := db.GetEngine(ctx).ID(report.ShadowCopyID).Delete(&moderation.AbuseReportShadowCopy{}) + if err != nil { + return err + } + } + } + + return nil + }) + if err != nil { + return err + } + + log.Trace("Finished: RemoveResolvedReports") + return nil +} diff --git a/services/moderation/reporting_test.go b/services/moderation/reporting_test.go new file mode 100644 index 0000000000..70925bf184 --- /dev/null +++ b/services/moderation/reporting_test.go @@ -0,0 +1,97 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package moderation + +import ( + "testing" + "time" + + "forgejo.org/models/db" + report_model "forgejo.org/models/moderation" + "forgejo.org/models/unittest" + "forgejo.org/modules/timeutil" + + "github.com/stretchr/testify/require" +) + +func TestRemoveResolvedReportsWhenNoTimeSet(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + // reportAge needs to be an int64 to match what timeutil.Day expects so we cast the value + reportAge := int64(20) + resolvedReport := &report_model.AbuseReport{ + Status: report_model.ReportStatusTypeHandled, + ReporterID: 1, ContentType: report_model.ReportedContentTypeRepository, + ContentID: 2, Category: report_model.AbuseCategoryTypeOther, + CreatedUnix: timeutil.TimeStampNow(), + ResolvedUnix: timeutil.TimeStamp(time.Now().Unix() - timeutil.Day*reportAge), + } + _, err := db.GetEngine(db.DefaultContext).NoAutoTime().Insert(resolvedReport) + require.NoError(t, err) + + // No reports should be deleted when the default time to keep is 0 + err = RemoveResolvedReports(db.DefaultContext, time.Second*0) + require.NoError(t, err) + unittest.AssertExistsIf(t, true, resolvedReport) +} + +func TestRemoveResolvedReportsWhenMatchTimeSet(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + // keepReportsFor needs to an int64 to match what timeutil.Day expects so we cast the value + keepReportsFor := int64(4) + resolvedReport := &report_model.AbuseReport{ + Status: report_model.ReportStatusTypeHandled, + ReporterID: 1, ContentType: report_model.ReportedContentTypeRepository, + ContentID: 2, Category: report_model.AbuseCategoryTypeOther, + CreatedUnix: timeutil.TimeStampNow(), + ResolvedUnix: timeutil.TimeStamp(time.Now().Unix() - timeutil.Day*keepReportsFor), + } + + _, err := db.GetEngine(db.DefaultContext).NoAutoTime().Insert(resolvedReport) + require.NoError(t, err) + + // Report should be deleted when older than the default time to keep + err = RemoveResolvedReports(db.DefaultContext, time.Second*4) + require.NoError(t, err) + unittest.AssertExistsIf(t, false, resolvedReport) +} + +func TestRemoveResolvedReportsWhenTimeSetButReportNew(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + resolvedReport := &report_model.AbuseReport{ + Status: report_model.ReportStatusTypeHandled, + ReporterID: 1, ContentType: report_model.ReportedContentTypeRepository, + ContentID: 2, Category: report_model.AbuseCategoryTypeOther, + CreatedUnix: timeutil.TimeStampNow(), + ResolvedUnix: timeutil.TimeStampNow(), + } + _, err := db.GetEngine(db.DefaultContext).NoAutoTime().Insert(resolvedReport) + require.NoError(t, err) + + // Report should not be deleted when newer than the default time to keep + err = RemoveResolvedReports(db.DefaultContext, time.Second*4) + require.NoError(t, err) + unittest.AssertExistsIf(t, true, resolvedReport) +} + +func TestDoesNotRemoveOpenReports(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + // keepReportsFor needs to an int64 to match what timeutil.Day expects so we cast the value + keepReportsFor := int64(4) + resolvedReport := &report_model.AbuseReport{ + Status: report_model.ReportStatusTypeOpen, + ReporterID: 1, ContentType: report_model.ReportedContentTypeRepository, + ContentID: 2, Category: report_model.AbuseCategoryTypeOther, + CreatedUnix: timeutil.TimeStampNow(), + ResolvedUnix: timeutil.TimeStamp(time.Now().Unix() - timeutil.Day*keepReportsFor), + } + + _, err := db.GetEngine(db.DefaultContext).NoAutoTime().Insert(resolvedReport) + require.NoError(t, err) + + // Report should not be deleted when open + // and older than the default time to keep + err = RemoveResolvedReports(db.DefaultContext, time.Second*4) + require.NoError(t, err) + unittest.AssertExistsIf(t, true, resolvedReport) +} From 106707b40fbcb168f3bad05155227fec24b59c48 Mon Sep 17 00:00:00 2001 From: Antonin Delpeuch Date: Mon, 28 Jul 2025 15:16:27 +0200 Subject: [PATCH 235/495] feat(ui): pretty-print commit counts and other numbers (#8704) Currently on https://codeberg.org/forgejo/forgejo for instance, the commit count is shown as "23378 commits", instead of "23,378 commits". This makes sure such numbers are printed with thousands separators if they are big enough. Preview: - https://codeberg.org/attachments/681add48-337b-42c0-a0ae-ac5ad4671b39 - https://codeberg.org/attachments/8b5d4e40-bdd6-4942-905f-6ddeac8509a9 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8704 Reviewed-by: Gusted Reviewed-by: 0ko <0ko@noreply.codeberg.org> Co-authored-by: Antonin Delpeuch Co-committed-by: Antonin Delpeuch --- templates/repo/commits_table.tmpl | 2 +- templates/repo/sub_menu.tmpl | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/templates/repo/commits_table.tmpl b/templates/repo/commits_table.tmpl index 621fc44bf5..c0e4f5ca46 100644 --- a/templates/repo/commits_table.tmpl +++ b/templates/repo/commits_table.tmpl @@ -1,7 +1,7 @@

    {{if or .PageIsCommits (gt .CommitCount 0)}} - {{ctx.Locale.TrN .CommitCount "repo.n_commit_one" "repo.n_commit_few" (StringUtils.ToString .CommitCount)}} + {{ctx.Locale.TrN .CommitCount "repo.n_commit_one" "repo.n_commit_few" (ctx.Locale.PrettyNumber .CommitCount)}} {{else if .IsNothingToCompare}} {{ctx.Locale.Tr "repo.commits.nothing_to_compare"}} {{else}} diff --git a/templates/repo/sub_menu.tmpl b/templates/repo/sub_menu.tmpl index ee1b959a7c..6216ad6191 100644 --- a/templates/repo/sub_menu.tmpl +++ b/templates/repo/sub_menu.tmpl @@ -3,14 +3,14 @@
    {{if and (.Permission.CanRead $.UnitTypeCode) (not .IsEmptyRepo)}} - {{svg "octicon-history"}} {{ctx.Locale.TrN .CommitsCount "repo.n_commit_one" "repo.n_commit_few" (printf "%d" .CommitsCount | SafeHTML)}} + {{svg "octicon-history"}} {{ctx.Locale.TrN .CommitsCount "repo.n_commit_one" "repo.n_commit_few" (printf "%s" (ctx.Locale.PrettyNumber .CommitsCount) | SafeHTML)}} - {{svg "octicon-git-branch"}} {{ctx.Locale.TrN .BranchesCount "repo.n_branch_one" "repo.n_branch_few" (printf "%d" .BranchesCount | SafeHTML)}} + {{svg "octicon-git-branch"}} {{ctx.Locale.TrN .BranchesCount "repo.n_branch_one" "repo.n_branch_few" (printf "%s" (ctx.Locale.PrettyNumber .BranchesCount) | SafeHTML)}} {{if $.Permission.CanRead $.UnitTypeCode}} - {{svg "octicon-tag"}} {{ctx.Locale.TrN .NumTags "repo.n_tag_one" "repo.n_tag_few" (printf "%d" .NumTags | SafeHTML)}} + {{svg "octicon-tag"}} {{ctx.Locale.TrN .NumTags "repo.n_tag_one" "repo.n_tag_few" (printf "%s" (ctx.Locale.PrettyNumber .NumTags) | SafeHTML)}} {{end}} From 388e4eb44b8154cd75c99d7c58611f0d43e382b5 Mon Sep 17 00:00:00 2001 From: Michael Jerger Date: Mon, 28 Jul 2025 15:17:29 +0200 Subject: [PATCH 236/495] fix: assorted ActivityPub code only refactors (#8708) Fix parts of issue #8221 and part of PR #4767 Is linked to https://codeberg.org/forgejo/forgejo/pulls/8274 The commit 555f6e57ad fixes timeout forgejo/forgejo#8274 (Kommentar) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8708 Reviewed-by: Earl Warren Co-authored-by: Michael Jerger Co-committed-by: Michael Jerger --- .deadcode-out | 3 + models/repo/repo_repository.go | 6 +- models/user/follow.go | 16 +- models/user/user_repository.go | 16 +- modules/activitypub/client.go | 7 +- routers/api/v1/activitypub/repository.go | 9 +- routers/api/v1/activitypub/reqsignature.go | 26 +-- routers/api/v1/activitypub/response.go | 34 ++++ routers/api/v1/api.go | 3 +- services/federation/error.go | 44 +++++ services/federation/federation_service.go | 19 +- ...{repo_like.go => repository_inbox_like.go} | 33 ++-- services/federation/repository_service.go | 19 ++ services/federation/result.go | 35 ++++ services/federation/signature_service.go | 11 +- .../integration/api_activitypub_actor_test.go | 77 ++++++++ .../api_activitypub_person_test.go | 113 +++++++++++ .../api_activitypub_repository_test.go | 176 ++++++++++++++++++ .../api_federation_httpsig_test.go | 85 +++++++++ .../integration/repo_star_federation_test.go | 81 ++++++++ 20 files changed, 744 insertions(+), 69 deletions(-) create mode 100644 services/federation/error.go rename services/federation/{repo_like.go => repository_inbox_like.go} (73%) create mode 100644 services/federation/repository_service.go create mode 100644 services/federation/result.go create mode 100644 tests/integration/api_activitypub_actor_test.go create mode 100644 tests/integration/api_activitypub_person_test.go create mode 100644 tests/integration/api_activitypub_repository_test.go create mode 100644 tests/integration/api_federation_httpsig_test.go create mode 100644 tests/integration/repo_star_federation_test.go diff --git a/.deadcode-out b/.deadcode-out index f9bee43043..31b04687dc 100644 --- a/.deadcode-out +++ b/.deadcode-out @@ -246,7 +246,10 @@ forgejo.org/services/context GetPrivateContext forgejo.org/services/federation + NewErrInternalf + ErrInternal.Error Init + NewServiceResultWithBytes forgejo.org/services/repository IsErrForkAlreadyExist diff --git a/models/repo/repo_repository.go b/models/repo/repo_repository.go index 0ba50e6614..9d586b8345 100644 --- a/models/repo/repo_repository.go +++ b/models/repo/repo_repository.go @@ -38,18 +38,18 @@ func StoreFollowingRepos(ctx context.Context, localRepoID int64, followingRepoLi } // Begin transaction - ctx, committer, err := db.TxContext((ctx)) + dbCtx, committer, err := db.TxContext((ctx)) if err != nil { return err } defer committer.Close() - _, err = db.GetEngine(ctx).Where("repo_id=?", localRepoID).Delete(FollowingRepo{}) + _, err = db.GetEngine(dbCtx).Where("repo_id=?", localRepoID).Delete(FollowingRepo{}) if err != nil { return err } for _, followingRepo := range followingRepoList { - _, err = db.GetEngine(ctx).Insert(followingRepo) + _, err = db.GetEngine(dbCtx).Insert(followingRepo) if err != nil { return err } diff --git a/models/user/follow.go b/models/user/follow.go index e32c226385..8663b2a943 100644 --- a/models/user/follow.go +++ b/models/user/follow.go @@ -39,21 +39,21 @@ func FollowUser(ctx context.Context, userID, followID int64) (err error) { return ErrBlockedByUser } - ctx, committer, err := db.TxContext(ctx) + dbCtx, committer, err := db.TxContext(ctx) if err != nil { return err } defer committer.Close() - if err = db.Insert(ctx, &Follow{UserID: userID, FollowID: followID}); err != nil { + if err = db.Insert(dbCtx, &Follow{UserID: userID, FollowID: followID}); err != nil { return err } - if _, err = db.Exec(ctx, "UPDATE `user` SET num_followers = num_followers + 1 WHERE id = ?", followID); err != nil { + if _, err = db.Exec(dbCtx, "UPDATE `user` SET num_followers = num_followers + 1 WHERE id = ?", followID); err != nil { return err } - if _, err = db.Exec(ctx, "UPDATE `user` SET num_following = num_following + 1 WHERE id = ?", userID); err != nil { + if _, err = db.Exec(dbCtx, "UPDATE `user` SET num_following = num_following + 1 WHERE id = ?", userID); err != nil { return err } return committer.Commit() @@ -65,21 +65,21 @@ func UnfollowUser(ctx context.Context, userID, followID int64) (err error) { return nil } - ctx, committer, err := db.TxContext(ctx) + dbCtx, committer, err := db.TxContext(ctx) if err != nil { return err } defer committer.Close() - if _, err = db.DeleteByBean(ctx, &Follow{UserID: userID, FollowID: followID}); err != nil { + if _, err = db.DeleteByBean(dbCtx, &Follow{UserID: userID, FollowID: followID}); err != nil { return err } - if _, err = db.Exec(ctx, "UPDATE `user` SET num_followers = num_followers - 1 WHERE id = ?", followID); err != nil { + if _, err = db.Exec(dbCtx, "UPDATE `user` SET num_followers = num_followers - 1 WHERE id = ?", followID); err != nil { return err } - if _, err = db.Exec(ctx, "UPDATE `user` SET num_following = num_following - 1 WHERE id = ?", userID); err != nil { + if _, err = db.Exec(dbCtx, "UPDATE `user` SET num_following = num_following - 1 WHERE id = ?", userID); err != nil { return err } return committer.Commit() diff --git a/models/user/user_repository.go b/models/user/user_repository.go index 85f44f1598..df864746e8 100644 --- a/models/user/user_repository.go +++ b/models/user/user_repository.go @@ -28,7 +28,7 @@ func CreateFederatedUser(ctx context.Context, user *User, federatedUser *Federat } // Begin transaction - ctx, committer, err := db.TxContext((ctx)) + txCtx, committer, err := db.TxContext(ctx) if err != nil { return err } @@ -39,7 +39,7 @@ func CreateFederatedUser(ctx context.Context, user *User, federatedUser *Federat } }() - if err := CreateUser(ctx, user, &overwrite); err != nil { + if err := CreateUser(txCtx, user, &overwrite); err != nil { return err } @@ -48,7 +48,7 @@ func CreateFederatedUser(ctx context.Context, user *User, federatedUser *Federat return err } - _, err = db.GetEngine(ctx).Insert(federatedUser) + _, err = db.GetEngine(txCtx).Insert(federatedUser) if err != nil { return err } @@ -70,7 +70,7 @@ func FindFederatedUser(ctx context.Context, externalID string, federationHostID if err != nil { return nil, nil, err } else if !has { - return nil, nil, fmt.Errorf("User %v for federated user is missing", federatedUser.UserID) + return nil, nil, fmt.Errorf("FederatedUser table contains entry for user ID %v, but no user with this ID exists", federatedUser.UserID) } if res, err := validation.IsValid(*user); !res { @@ -87,7 +87,7 @@ func GetFederatedUser(ctx context.Context, externalID string, federationHostID i if err != nil { return nil, nil, err } else if federatedUser == nil { - return nil, nil, fmt.Errorf("FederatedUser for externalId = %v and federationHostId = %v does not exist", externalID, federationHostID) + return nil, nil, fmt.Errorf("FederatedUser not found (given externalId: %v, federationHostId: %v)", externalID, federationHostID) } return user, federatedUser, nil } @@ -99,13 +99,13 @@ func GetFederatedUserByUserID(ctx context.Context, userID int64) (*User, *Federa if err != nil { return nil, nil, err } else if !has { - return nil, nil, fmt.Errorf("Federated user %v does not exist", federatedUser.UserID) + return nil, nil, fmt.Errorf("FederatedUser table does not contain entry for user ID: %v", federatedUser.UserID) } has, err = db.GetEngine(ctx).ID(federatedUser.UserID).Get(user) if err != nil { return nil, nil, err } else if !has { - return nil, nil, fmt.Errorf("User %v for federated user is missing", federatedUser.UserID) + return nil, nil, fmt.Errorf("FederatedUser table contains entry for user ID %v, but no user with this ID exists", federatedUser.UserID) } if res, err := validation.IsValid(*user); !res { @@ -130,7 +130,7 @@ func FindFederatedUserByKeyID(ctx context.Context, keyID string) (*User, *Federa if err != nil { return nil, nil, err } else if !has { - return nil, nil, fmt.Errorf("User %v for federated user is missing", federatedUser.UserID) + return nil, nil, fmt.Errorf("FederatedUser table contains entry for user ID %v, but no user with this ID exists", federatedUser.UserID) } if res, err := validation.IsValid(*user); !res { diff --git a/modules/activitypub/client.go b/modules/activitypub/client.go index fb6fa8b543..11a2fd94c3 100644 --- a/modules/activitypub/client.go +++ b/modules/activitypub/client.go @@ -66,6 +66,11 @@ type ClientFactory struct { // NewClient function func NewClientFactory() (c *ClientFactory, err error) { + return NewClientFactoryWithTimeout(5 * time.Second) +} + +// NewClient function +func NewClientFactoryWithTimeout(timeout time.Duration) (c *ClientFactory, err error) { if err = containsRequiredHTTPHeaders(http.MethodGet, setting.Federation.GetHeaders); err != nil { return nil, err } else if err = containsRequiredHTTPHeaders(http.MethodPost, setting.Federation.PostHeaders); err != nil { @@ -77,7 +82,7 @@ func NewClientFactory() (c *ClientFactory, err error) { Transport: &http.Transport{ Proxy: proxy.Proxy(), }, - Timeout: 5 * time.Second, + Timeout: timeout, }, algs: setting.HttpsigAlgs, digestAlg: httpsig.DigestAlgorithm(setting.Federation.DigestAlgorithm), diff --git a/routers/api/v1/activitypub/repository.go b/routers/api/v1/activitypub/repository.go index c506840f1c..3eaa6b82c5 100644 --- a/routers/api/v1/activitypub/repository.go +++ b/routers/api/v1/activitypub/repository.go @@ -71,10 +71,11 @@ func RepositoryInbox(ctx *context.APIContext) { repository := ctx.Repo.Repository log.Info("RepositoryInbox: repo: %v", repository) form := web.GetForm(ctx) - // TODO: Decide between like/undo{like} activity - httpStatus, title, err := federation.ProcessLikeActivity(ctx, form, repository.ID) + activity := form.(*ap.Activity) + result, err := federation.ProcessRepositoryInbox(ctx, activity, repository.ID) if err != nil { - ctx.Error(httpStatus, title, err) + ctx.Error(federation.HTTPStatus(err), "Processing Repository Inbox failed", result) + return } - ctx.Status(http.StatusNoContent) + responseServiceResult(ctx, result) } diff --git a/routers/api/v1/activitypub/reqsignature.go b/routers/api/v1/activitypub/reqsignature.go index 91274249ec..38cb067b89 100644 --- a/routers/api/v1/activitypub/reqsignature.go +++ b/routers/api/v1/activitypub/reqsignature.go @@ -8,13 +8,13 @@ import ( "forgejo.org/modules/log" "forgejo.org/modules/setting" - gitea_context "forgejo.org/services/context" + services_context "forgejo.org/services/context" "forgejo.org/services/federation" "github.com/42wim/httpsig" ) -func verifyHTTPUserOrInstanceSignature(ctx *gitea_context.APIContext) (authenticated bool, err error) { +func verifyHTTPUserOrInstanceSignature(ctx services_context.APIContext) (authenticated bool, err error) { if !setting.Federation.SignatureEnforced { return true, nil } @@ -28,9 +28,9 @@ func verifyHTTPUserOrInstanceSignature(ctx *gitea_context.APIContext) (authentic } signatureAlgorithm := httpsig.Algorithm(setting.Federation.SignatureAlgorithms[0]) - pubKey, err := federation.FindOrCreateFederatedUserKey(ctx.Base, v.KeyId()) + pubKey, err := federation.FindOrCreateFederatedUserKey(ctx, v.KeyId()) if err != nil || pubKey == nil { - pubKey, err = federation.FindOrCreateFederationHostKey(ctx.Base, v.KeyId()) + pubKey, err = federation.FindOrCreateFederationHostKey(ctx, v.KeyId()) if err != nil { return false, err } @@ -43,7 +43,7 @@ func verifyHTTPUserOrInstanceSignature(ctx *gitea_context.APIContext) (authentic return true, nil } -func verifyHTTPUserSignature(ctx *gitea_context.APIContext) (authenticated bool, err error) { +func verifyHTTPUserSignature(ctx services_context.APIContext) (authenticated bool, err error) { if !setting.Federation.SignatureEnforced { return true, nil } @@ -57,7 +57,7 @@ func verifyHTTPUserSignature(ctx *gitea_context.APIContext) (authenticated bool, } signatureAlgorithm := httpsig.Algorithm(setting.Federation.SignatureAlgorithms[0]) - pubKey, err := federation.FindOrCreateFederatedUserKey(ctx.Base, v.KeyId()) + pubKey, err := federation.FindOrCreateFederatedUserKey(ctx, v.KeyId()) if err != nil { return false, err } @@ -70,9 +70,9 @@ func verifyHTTPUserSignature(ctx *gitea_context.APIContext) (authenticated bool, } // ReqHTTPSignature function -func ReqHTTPUserOrInstanceSignature() func(ctx *gitea_context.APIContext) { - return func(ctx *gitea_context.APIContext) { - if authenticated, err := verifyHTTPUserOrInstanceSignature(ctx); err != nil { +func ReqHTTPUserOrInstanceSignature() func(ctx *services_context.APIContext) { + return func(ctx *services_context.APIContext) { + if authenticated, err := verifyHTTPUserOrInstanceSignature(*ctx); err != nil { log.Warn("verifyHttpSignatures failed: %v", err) ctx.Error(http.StatusBadRequest, "reqSignature", "request signature verification failed") } else if !authenticated { @@ -81,10 +81,10 @@ func ReqHTTPUserOrInstanceSignature() func(ctx *gitea_context.APIContext) { } } -// ReqHTTPSignature function -func ReqHTTPUserSignature() func(ctx *gitea_context.APIContext) { - return func(ctx *gitea_context.APIContext) { - if authenticated, err := verifyHTTPUserSignature(ctx); err != nil { +// ReqHTTPUserSignature function +func ReqHTTPUserSignature() func(ctx *services_context.APIContext) { + return func(ctx *services_context.APIContext) { + if authenticated, err := verifyHTTPUserSignature(*ctx); err != nil { log.Warn("verifyHttpSignatures failed: %v", err) ctx.Error(http.StatusBadRequest, "reqSignature", "request signature verification failed") } else if !authenticated { diff --git a/routers/api/v1/activitypub/response.go b/routers/api/v1/activitypub/response.go index a97f363cc2..64413cebb1 100644 --- a/routers/api/v1/activitypub/response.go +++ b/routers/api/v1/activitypub/response.go @@ -10,12 +10,46 @@ import ( "forgejo.org/modules/forgefed" "forgejo.org/modules/log" "forgejo.org/services/context" + "forgejo.org/services/federation" ap "github.com/go-ap/activitypub" "github.com/go-ap/jsonld" ) // Respond with an ActivityStreams object +func responseServiceResult(ctx *context.APIContext, result federation.ServiceResult) { + ctx.Resp.Header().Add("Content-Type", activitypub.ActivityStreamsContentType) + + switch { + case result.StatusOnly(): + ctx.Resp.WriteHeader(result.HTTPStatus) + return + case result.WithBytes(): + ctx.Resp.WriteHeader(result.HTTPStatus) + if _, err := ctx.Resp.Write(result.Bytes); err != nil { + log.Error("Error writing a response: %v", err) + ctx.Error(http.StatusInternalServerError, "Error writing a response", err) + return + } + case result.WithActivity(): + binary, err := jsonld.WithContext( + jsonld.IRI(ap.ActivityBaseURI), + jsonld.IRI(ap.SecurityContextURI), + jsonld.IRI(forgefed.ForgeFedNamespaceURI), + ).Marshal(result.Activity) + if err != nil { + ctx.ServerError("Marshal", err) + return + } + ctx.Resp.WriteHeader(result.HTTPStatus) + if _, err = ctx.Resp.Write(binary); err != nil { + log.Error("write to resp err: %v", err) + } + } +} + +// Respond with an ActivityStreams object +// Deprecated func response(ctx *context.APIContext, v any) { binary, err := jsonld.WithContext( jsonld.IRI(ap.ActivityBaseURI), diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 6a51f33bd8..2f806ba35d 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -81,7 +81,6 @@ import ( repo_model "forgejo.org/models/repo" "forgejo.org/models/unit" user_model "forgejo.org/models/user" - "forgejo.org/modules/forgefed" "forgejo.org/modules/log" "forgejo.org/modules/setting" api "forgejo.org/modules/structs" @@ -853,7 +852,7 @@ func Routes() *web.Route { m.Group("/repository-id/{repository-id}", func() { m.Get("", activitypub.ReqHTTPUserSignature(), activitypub.Repository) m.Post("/inbox", - bind(forgefed.ForgeLike{}), + bind(ap.Activity{}), activitypub.ReqHTTPUserSignature(), activitypub.RepositoryInbox) }, context.RepositoryIDAssignmentAPI()) diff --git a/services/federation/error.go b/services/federation/error.go new file mode 100644 index 0000000000..425035d0d5 --- /dev/null +++ b/services/federation/error.go @@ -0,0 +1,44 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package federation + +import ( + "fmt" + "net/http" +) + +type ErrNotAcceptable struct { + Message string +} + +func NewErrNotAcceptablef(format string, a ...any) ErrNotAcceptable { + message := fmt.Sprintf(format, a...) + return ErrNotAcceptable{Message: message} +} + +func (err ErrNotAcceptable) Error() string { + return fmt.Sprintf("NotAcceptable: %v", err.Message) +} + +type ErrInternal struct { + Message string +} + +func NewErrInternalf(format string, a ...any) ErrInternal { + message := fmt.Sprintf(format, a...) + return ErrInternal{Message: message} +} + +func (err ErrInternal) Error() string { + return fmt.Sprintf("InternalServerError: %v", err.Message) +} + +func HTTPStatus(err error) int { + switch err.(type) { + case ErrNotAcceptable: + return http.StatusNotAcceptable + default: + return http.StatusInternalServerError + } +} diff --git a/services/federation/federation_service.go b/services/federation/federation_service.go index b71d8d2575..36788e725a 100644 --- a/services/federation/federation_service.go +++ b/services/federation/federation_service.go @@ -18,7 +18,6 @@ import ( "forgejo.org/modules/log" "forgejo.org/modules/setting" "forgejo.org/modules/validation" - context_service "forgejo.org/services/context" "github.com/google/uuid" ) @@ -27,7 +26,7 @@ func Init() error { return nil } -func FindOrCreateFederationHost(ctx *context_service.Base, actorURI string) (*forgefed.FederationHost, error) { +func FindOrCreateFederationHost(ctx context.Context, actorURI string) (*forgefed.FederationHost, error) { rawActorID, err := fm.NewActorID(actorURI) if err != nil { return nil, err @@ -46,7 +45,7 @@ func FindOrCreateFederationHost(ctx *context_service.Base, actorURI string) (*fo return federationHost, nil } -func FindOrCreateFederatedUser(ctx *context_service.Base, actorURI string) (*user.User, *user.FederatedUser, *forgefed.FederationHost, error) { +func FindOrCreateFederatedUser(ctx context.Context, actorURI string) (*user.User, *user.FederatedUser, *forgefed.FederationHost, error) { user, federatedUser, federationHost, err := findFederatedUser(ctx, actorURI) if err != nil { return nil, nil, nil, err @@ -57,20 +56,21 @@ func FindOrCreateFederatedUser(ctx *context_service.Base, actorURI string) (*use } if user != nil { - log.Trace("Found local federatedUser: %#v", user) + log.Trace("Local ActivityPub user found (actorURI: %#v, user: %#v)", actorURI, user) } else { + log.Trace("Attempting to create new user and federatedUser for actorURI: %#v", actorURI) user, federatedUser, err = createUserFromAP(ctx, personID, federationHost.ID) if err != nil { return nil, nil, nil, err } - log.Trace("Created federatedUser from ap: %#v", user) + log.Trace("Created user %#v with federatedUser %#v from distant server", user, federatedUser) } log.Trace("Got user: %v", user.Name) return user, federatedUser, federationHost, nil } -func findFederatedUser(ctx *context_service.Base, actorURI string) (*user.User, *user.FederatedUser, *forgefed.FederationHost, error) { +func findFederatedUser(ctx context.Context, actorURI string) (*user.User, *user.FederatedUser, *forgefed.FederationHost, error) { federationHost, err := FindOrCreateFederationHost(ctx, actorURI) if err != nil { return nil, nil, nil, err @@ -90,6 +90,7 @@ func findFederatedUser(ctx *context_service.Base, actorURI string) (*user.User, func createFederationHostFromAP(ctx context.Context, actorID fm.ActorID) (*forgefed.FederationHost, error) { actionsUser := user.NewAPServerActor() + clientFactory, err := activitypub.GetClientFactory(ctx) if err != nil { return nil, err @@ -161,7 +162,7 @@ func fetchUserFromAP(ctx context.Context, personID fm.PersonID, federationHostID return nil, nil, err } - log.Info("Fetched valid person:%q", person) + log.Info("Fetched valid person from distant server: %q", person) localFqdn, err := url.ParseRequestURI(setting.AppURL) if err != nil { @@ -220,7 +221,7 @@ func fetchUserFromAP(ctx context.Context, personID fm.PersonID, federationHostID }, } - log.Info("Fetch federatedUser:%q", federatedUser) + log.Info("Fetched person's %q federatedUser from distant server: %q", person, federatedUser) return &newUser, &federatedUser, nil } @@ -234,6 +235,6 @@ func createUserFromAP(ctx context.Context, personID fm.PersonID, federationHostI return nil, nil, err } - log.Info("Created federatedUser:%q", federatedUser) + log.Info("Created federatedUser: %q", federatedUser) return newUser, federatedUser, nil } diff --git a/services/federation/repo_like.go b/services/federation/repository_inbox_like.go similarity index 73% rename from services/federation/repo_like.go rename to services/federation/repository_inbox_like.go index c1e6500c61..478a12d92c 100644 --- a/services/federation/repo_like.go +++ b/services/federation/repository_inbox_like.go @@ -5,7 +5,6 @@ package federation import ( "context" - "errors" "fmt" "net/http" "time" @@ -18,6 +17,8 @@ import ( "forgejo.org/modules/log" "forgejo.org/modules/validation" context_service "forgejo.org/services/context" + + ap "github.com/go-ap/activitypub" ) // ProcessLikeActivity receives a ForgeLike activity and does the following: @@ -27,32 +28,32 @@ import ( // Validation of incoming RepositoryID against Local RepositoryID // Star the repo if it wasn't already stared // Do some mitigation against out of order attacks -func ProcessLikeActivity(ctx *context_service.APIContext, form any, repositoryID int64) (int, string, error) { - activity := form.(*fm.ForgeLike) - if res, err := validation.IsValid(activity); !res { - return http.StatusNotAcceptable, "Invalid activity", err +func ProcessLikeActivity(ctx context.Context, activity *ap.Activity, repositoryID int64) (ServiceResult, error) { + constructorLikeActivity, _ := fm.NewForgeLike(activity.Actor.GetLink().String(), activity.Object.GetLink().String(), activity.StartTime) + if res, err := validation.IsValid(constructorLikeActivity); !res { + return ServiceResult{}, NewErrNotAcceptablef("Invalid activity: %v", err) } log.Trace("Activity validated: %#v", activity) // parse actorID (person) actorURI := activity.Actor.GetID().String() - user, _, federationHost, err := FindOrCreateFederatedUser(ctx.Base, actorURI) + user, _, federationHost, err := FindOrCreateFederatedUser(ctx, actorURI) if err != nil { - ctx.Error(http.StatusNotAcceptable, "Federated user not found", err) - return http.StatusInternalServerError, "FindOrCreateFederatedUser", err + log.Error("Federated user not found (%s): %v", actorURI, err) + return ServiceResult{}, NewErrNotAcceptablef("FindOrCreateFederatedUser failed: %v", err) } - if !activity.IsNewer(federationHost.LatestActivity) { - return http.StatusNotAcceptable, "Activity out of order.", errors.New("Activity already processed") + if !constructorLikeActivity.IsNewer(federationHost.LatestActivity) { + return ServiceResult{}, NewErrNotAcceptablef("LatestActivity: activity already processed: %v", err) } // parse objectID (repository) - objectID, err := fm.NewRepositoryID(activity.Object.GetID().String(), string(forgefed.ForgejoSourceType)) + objectID, err := fm.NewRepositoryID(constructorLikeActivity.Object.GetID().String(), string(forgefed.ForgejoSourceType)) if err != nil { - return http.StatusNotAcceptable, "Invalid objectId", err + return ServiceResult{}, NewErrNotAcceptablef("Parsing repo objectID failed: %v", err) } if objectID.ID != fmt.Sprint(repositoryID) { - return http.StatusNotAcceptable, "Invalid objectId", err + return ServiceResult{}, NewErrNotAcceptablef("Invalid repoId: %v", err) } log.Trace("Object accepted: %#v", objectID) @@ -61,16 +62,16 @@ func ProcessLikeActivity(ctx *context_service.APIContext, form any, repositoryID if !alreadyStared { err = repo.StarRepo(ctx, user.ID, repositoryID, true) if err != nil { - return http.StatusNotAcceptable, "Error staring", err + return ServiceResult{}, NewErrNotAcceptablef("Staring failed: %v", err) } } federationHost.LatestActivity = activity.StartTime err = forgefed.UpdateFederationHost(ctx, federationHost) if err != nil { - return http.StatusNotAcceptable, "Error updating federatedHost", err + return ServiceResult{}, NewErrNotAcceptablef("Updating federatedHost failed: %v", err) } - return 0, "", nil + return NewServiceResultStatusOnly(http.StatusNoContent), nil } // Create or update a list of FollowingRepo structs diff --git a/services/federation/repository_service.go b/services/federation/repository_service.go new file mode 100644 index 0000000000..7891d786e2 --- /dev/null +++ b/services/federation/repository_service.go @@ -0,0 +1,19 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package federation + +import ( + "context" + + ap "github.com/go-ap/activitypub" +) + +func ProcessRepositoryInbox(ctx context.Context, activity *ap.Activity, repositoryID int64) (ServiceResult, error) { + switch activity.Type { + case ap.LikeType: + return ProcessLikeActivity(ctx, activity, repositoryID) + default: + return ServiceResult{}, NewErrNotAcceptablef("Not a like activity: %v", activity.Type) + } +} diff --git a/services/federation/result.go b/services/federation/result.go new file mode 100644 index 0000000000..47afb2bdf6 --- /dev/null +++ b/services/federation/result.go @@ -0,0 +1,35 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package federation + +import "github.com/go-ap/activitypub" + +type ServiceResult struct { + HTTPStatus int + Bytes []byte + Activity activitypub.Activity + withBytes bool + withActivity bool + statusOnly bool +} + +func NewServiceResultStatusOnly(status int) ServiceResult { + return ServiceResult{HTTPStatus: status, statusOnly: true} +} + +func NewServiceResultWithBytes(status int, bytes []byte) ServiceResult { + return ServiceResult{HTTPStatus: status, Bytes: bytes, withBytes: true} +} + +func (serviceResult ServiceResult) WithBytes() bool { + return serviceResult.withBytes +} + +func (serviceResult ServiceResult) WithActivity() bool { + return serviceResult.withActivity +} + +func (serviceResult ServiceResult) StatusOnly() bool { + return serviceResult.statusOnly +} diff --git a/services/federation/signature_service.go b/services/federation/signature_service.go index e5102b89d8..fd8cbb39cd 100644 --- a/services/federation/signature_service.go +++ b/services/federation/signature_service.go @@ -4,6 +4,7 @@ package federation import ( + "context" "crypto/x509" "database/sql" "encoding/pem" @@ -15,13 +16,12 @@ import ( "forgejo.org/models/user" "forgejo.org/modules/activitypub" fm "forgejo.org/modules/forgefed" - context_service "forgejo.org/services/context" ap "github.com/go-ap/activitypub" ) // Factory function for ActorID. Created struct is asserted to be valid -func NewActorIDFromKeyID(ctx *context_service.Base, uri string) (fm.ActorID, error) { +func NewActorIDFromKeyID(ctx context.Context, uri string) (fm.ActorID, error) { parsedURI, err := url.Parse(uri) parsedURI.Fragment = "" if err != nil { @@ -54,7 +54,7 @@ func NewActorIDFromKeyID(ctx *context_service.Base, uri string) (fm.ActorID, err return result, err } -func FindOrCreateFederatedUserKey(ctx *context_service.Base, keyID string) (pubKey any, err error) { +func FindOrCreateFederatedUserKey(ctx context.Context, keyID string) (pubKey any, err error) { var federatedUser *user.FederatedUser var keyURL *url.URL @@ -122,7 +122,7 @@ func FindOrCreateFederatedUserKey(ctx *context_service.Base, keyID string) (pubK return nil, nil } -func FindOrCreateFederationHostKey(ctx *context_service.Base, keyID string) (pubKey any, err error) { +func FindOrCreateFederationHostKey(ctx context.Context, keyID string) (pubKey any, err error) { keyURL, err := url.Parse(keyID) if err != nil { return nil, err @@ -183,8 +183,9 @@ func FindOrCreateFederationHostKey(ctx *context_service.Base, keyID string) (pub return nil, nil } -func fetchKeyFromAp(ctx *context_service.Base, keyURL url.URL) (pubKey any, pubKeyBytes []byte, apPerson *ap.Person, err error) { +func fetchKeyFromAp(ctx context.Context, keyURL url.URL) (pubKey any, pubKeyBytes []byte, apPerson *ap.Person, err error) { actionsUser := user.NewAPServerActor() + clientFactory, err := activitypub.GetClientFactory(ctx) if err != nil { return nil, nil, nil, err diff --git a/tests/integration/api_activitypub_actor_test.go b/tests/integration/api_activitypub_actor_test.go new file mode 100644 index 0000000000..42232bd640 --- /dev/null +++ b/tests/integration/api_activitypub_actor_test.go @@ -0,0 +1,77 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package integration + +import ( + "fmt" + "net/http" + "net/url" + "strconv" + "testing" + + "forgejo.org/modules/forgefed" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" + "forgejo.org/routers" + "forgejo.org/services/contexttest" + "forgejo.org/services/federation" + "forgejo.org/tests" + + ap "github.com/go-ap/activitypub" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestActivityPubActor(t *testing.T) { + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + defer tests.PrepareTestEnv(t)() + + req := NewRequest(t, "GET", "/api/v1/activitypub/actor") + resp := MakeRequest(t, req, http.StatusOK) + assert.Contains(t, resp.Body.String(), "@context") + + var actor ap.Actor + err := actor.UnmarshalJSON(resp.Body.Bytes()) + require.NoError(t, err) + + assert.Equal(t, ap.ApplicationType, actor.Type) + assert.Equal(t, "ghost", actor.PreferredUsername.String()) + keyID := actor.GetID().String() + assert.Regexp(t, "activitypub/actor$", keyID) + assert.Regexp(t, "activitypub/actor/inbox$", actor.Inbox.GetID().String()) + + pubKey := actor.PublicKey + assert.NotNil(t, pubKey) + publicKeyID := keyID + "#main-key" + assert.Equal(t, pubKey.ID.String(), publicKeyID) + + pubKeyPem := pubKey.PublicKeyPem + assert.NotNil(t, pubKeyPem) + assert.Regexp(t, "^-----BEGIN PUBLIC KEY-----", pubKeyPem) +} + +func TestActorNewFromKeyId(t *testing.T) { + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + onGiteaRun(t, func(t *testing.T, u *url.URL) { + ctx, _ := contexttest.MockAPIContext(t, "/api/v1/activitypub/actor") + sut, err := federation.NewActorIDFromKeyID(ctx.Base, fmt.Sprintf("%sapi/v1/activitypub/actor#main-key", u)) + require.NoError(t, err) + + port, err := strconv.ParseUint(u.Port(), 10, 16) + require.NoError(t, err) + + assert.Equal(t, forgefed.ActorID{ + ID: "actor", + HostSchema: "http", + Path: "api/v1/activitypub", + Host: setting.Domain, + HostPort: uint16(port), + UnvalidatedInput: fmt.Sprintf("http://%s:%d/api/v1/activitypub/actor", setting.Domain, port), + IsPortSupplemented: false, + }, sut) + }) +} diff --git a/tests/integration/api_activitypub_person_test.go b/tests/integration/api_activitypub_person_test.go new file mode 100644 index 0000000000..277b150a1e --- /dev/null +++ b/tests/integration/api_activitypub_person_test.go @@ -0,0 +1,113 @@ +// Copyright 2022 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package integration + +import ( + "fmt" + "net/http" + "net/url" + "testing" + "time" + + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/activitypub" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" + "forgejo.org/routers" + "forgejo.org/services/contexttest" + "forgejo.org/tests" + + ap "github.com/go-ap/activitypub" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestActivityPubPerson(t *testing.T) { + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + mock := test.NewFederationServerMock() + federatedSrv := mock.DistantServer(t) + defer federatedSrv.Close() + + onGiteaRun(t, func(t *testing.T, localUrl *url.URL) { + defer test.MockVariableValue(&setting.AppURL, localUrl.String())() + + localUserID := 2 + localUserName := "user2" + localUserURL := fmt.Sprintf("%sapi/v1/activitypub/user-id/%d", localUrl, localUserID) + + // distantURL := federatedSrv.URL + // distantUser15URL := fmt.Sprintf("%s/api/v1/activitypub/user-id/15", distantURL) + + // Unsigned request + t.Run("UnsignedRequest", func(t *testing.T) { + req := NewRequest(t, "GET", localUserURL) + MakeRequest(t, req, http.StatusBadRequest) + }) + + // Signed request + t.Run("SignedRequestValidation", func(t *testing.T) { + ctx, _ := contexttest.MockAPIContext(t, localUserURL) + cf, err := activitypub.NewClientFactoryWithTimeout(60 * time.Second) + require.NoError(t, err) + + c, err := cf.WithKeysDirect(ctx, mock.Persons[0].PrivKey, + mock.Persons[0].KeyID(federatedSrv.URL)) + require.NoError(t, err) + + resp, err := c.GetBody(localUserURL) + require.NoError(t, err) + + var person ap.Person + err = person.UnmarshalJSON(resp) + require.NoError(t, err) + + assert.Equal(t, ap.PersonType, person.Type) + assert.Equal(t, localUserName, person.PreferredUsername.String()) + assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%d$", localUserID), person.GetID()) + assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%d/inbox$", localUserID), person.Inbox.GetID().String()) + + assert.NotNil(t, person.PublicKey) + assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%d#main-key$", localUserID), person.PublicKey.ID) + + assert.NotNil(t, person.PublicKey.PublicKeyPem) + assert.Regexp(t, "^-----BEGIN PUBLIC KEY-----", person.PublicKey.PublicKeyPem) + }) + }) +} + +func TestActivityPubMissingPerson(t *testing.T) { + defer tests.PrepareTestEnv(t)() + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + req := NewRequest(t, "GET", "/api/v1/activitypub/user-id/999999999") + resp := MakeRequest(t, req, http.StatusNotFound) + assert.Contains(t, resp.Body.String(), "user does not exist") +} + +func TestActivityPubPersonInbox(t *testing.T) { + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + onGiteaRun(t, func(t *testing.T, u *url.URL) { + defer test.MockVariableValue(&setting.AppURL, u.String())() + user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + + user1url := u.JoinPath("/api/v1/activitypub/user-id/1").String() + "#main-key" + user2inboxurl := u.JoinPath("/api/v1/activitypub/user-id/2/inbox").String() + ctx, _ := contexttest.MockAPIContext(t, user2inboxurl) + cf, err := activitypub.NewClientFactoryWithTimeout(60 * time.Second) + require.NoError(t, err) + c, err := cf.WithKeys(ctx, user1, user1url) + require.NoError(t, err) + + // Signed request "succeeds" + resp, err := c.Post([]byte{}, user2inboxurl) + require.NoError(t, err) + assert.Equal(t, http.StatusNoContent, resp.StatusCode) + }) +} diff --git a/tests/integration/api_activitypub_repository_test.go b/tests/integration/api_activitypub_repository_test.go new file mode 100644 index 0000000000..b4be0407b9 --- /dev/null +++ b/tests/integration/api_activitypub_repository_test.go @@ -0,0 +1,176 @@ +// Copyright 2024, 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package integration + +import ( + "fmt" + "net/http" + "net/url" + "testing" + "time" + + "forgejo.org/models/forgefed" + "forgejo.org/models/unittest" + "forgejo.org/models/user" + "forgejo.org/modules/activitypub" + forgefed_modules "forgejo.org/modules/forgefed" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" + "forgejo.org/routers" + "forgejo.org/services/contexttest" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestActivityPubRepository(t *testing.T) { + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + mock := test.NewFederationServerMock() + federatedSrv := mock.DistantServer(t) + defer federatedSrv.Close() + + onGiteaRun(t, func(t *testing.T, u *url.URL) { + repositoryID := 2 + + localRepository := fmt.Sprintf("%sapi/v1/activitypub/repository-id/%d", u, repositoryID) + + ctx, _ := contexttest.MockAPIContext(t, localRepository) + cf, err := activitypub.NewClientFactoryWithTimeout(60 * time.Second) + require.NoError(t, err) + + c, err := cf.WithKeysDirect(ctx, mock.Persons[0].PrivKey, + mock.Persons[0].KeyID(federatedSrv.URL)) + require.NoError(t, err) + + resp, err := c.GetBody(localRepository) + require.NoError(t, err) + assert.Contains(t, string(resp), "@context") + + var repository forgefed_modules.Repository + err = repository.UnmarshalJSON(resp) + require.NoError(t, err) + + assert.Regexp(t, fmt.Sprintf("activitypub/repository-id/%d$", repositoryID), repository.GetID().String()) + }) +} + +func TestActivityPubMissingRepository(t *testing.T) { + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&setting.Federation.SignatureEnforced, false)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + repositoryID := 9999999 + req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/activitypub/repository-id/%d", repositoryID)) + resp := MakeRequest(t, req, http.StatusNotFound) + assert.Contains(t, resp.Body.String(), "repository does not exist") +} + +func TestActivityPubRepositoryInboxValid(t *testing.T) { + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + mock := test.NewFederationServerMock() + federatedSrv := mock.DistantServer(t) + defer federatedSrv.Close() + + onGiteaRun(t, func(t *testing.T, u *url.URL) { + repositoryID := 2 + timeNow := time.Now().UTC() + localRepoInbox := u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d/inbox", repositoryID)).String() + + ctx, _ := contexttest.MockAPIContext(t, localRepoInbox) + cf, err := activitypub.NewClientFactoryWithTimeout(60 * time.Second) + require.NoError(t, err) + + c, err := cf.WithKeysDirect(ctx, mock.Persons[0].PrivKey, + mock.Persons[0].KeyID(federatedSrv.URL)) + require.NoError(t, err) + + activity1 := []byte(fmt.Sprintf( + `{"type":"Like",`+ + `"startTime":"%s",`+ + `"actor":"%s/api/v1/activitypub/user-id/15",`+ + `"object":"%s"}`, + timeNow.Format(time.RFC3339), + federatedSrv.URL, u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d", repositoryID)).String())) + t.Logf("activity: %s", activity1) + resp, err := c.Post(activity1, localRepoInbox) + + require.NoError(t, err) + assert.Equal(t, http.StatusNoContent, resp.StatusCode) + + federationHost := unittest.AssertExistsAndLoadBean(t, &forgefed.FederationHost{HostFqdn: "127.0.0.1"}) + federatedUser := unittest.AssertExistsAndLoadBean(t, &user.FederatedUser{ExternalID: "15", FederationHostID: federationHost.ID}) + unittest.AssertExistsAndLoadBean(t, &user.User{ID: federatedUser.UserID}) + + // A like activity by a different user of the same federated host. + activity2 := []byte(fmt.Sprintf( + `{"type":"Like",`+ + `"startTime":"%s",`+ + `"actor":"%s/api/v1/activitypub/user-id/30",`+ + `"object":"%s"}`, + // Make sure this activity happens later then the one before + timeNow.Add(time.Second).Format(time.RFC3339), + federatedSrv.URL, u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d", repositoryID)).String())) + t.Logf("activity: %s", activity2) + resp, err = c.Post(activity2, localRepoInbox) + + require.NoError(t, err) + assert.Equal(t, http.StatusNoContent, resp.StatusCode) + + federatedUser = unittest.AssertExistsAndLoadBean(t, &user.FederatedUser{ExternalID: "30", FederationHostID: federationHost.ID}) + unittest.AssertExistsAndLoadBean(t, &user.User{ID: federatedUser.UserID}) + + // The same user sends another like activity + otherRepositoryID := 3 + otherRepoInboxURL := u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d/inbox", otherRepositoryID)).String() + activity3 := []byte(fmt.Sprintf( + `{"type":"Like",`+ + `"startTime":"%s",`+ + `"actor":"%s/api/v1/activitypub/user-id/30",`+ + `"object":"%s"}`, + // Make sure this activity happens later then the ones before + timeNow.Add(time.Second*2).Format(time.RFC3339), + federatedSrv.URL, u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d", otherRepositoryID)).String())) + t.Logf("activity: %s", activity3) + resp, err = c.Post(activity3, otherRepoInboxURL) + + require.NoError(t, err) + assert.Equal(t, http.StatusNoContent, resp.StatusCode) + + federatedUser = unittest.AssertExistsAndLoadBean(t, &user.FederatedUser{ExternalID: "30", FederationHostID: federationHost.ID}) + unittest.AssertExistsAndLoadBean(t, &user.User{ID: federatedUser.UserID}) + + // Replay activity2. + resp, err = c.Post(activity2, localRepoInbox) + require.NoError(t, err) + assert.Equal(t, http.StatusNotAcceptable, resp.StatusCode) + }) +} + +func TestActivityPubRepositoryInboxInvalid(t *testing.T) { + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&setting.Federation.SignatureEnforced, false)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + onGiteaRun(t, func(t *testing.T, u *url.URL) { + apServerActor := user.NewAPServerActor() + repositoryID := 2 + localRepo2Inbox := u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d/inbox", repositoryID)).String() + + ctx, _ := contexttest.MockAPIContext(t, localRepo2Inbox) + cf, err := activitypub.NewClientFactoryWithTimeout(60 * time.Second) + require.NoError(t, err) + + c, err := cf.WithKeys(ctx, apServerActor, apServerActor.KeyID()) + require.NoError(t, err) + + activity := []byte(`{"type":"Wrong"}`) + resp, err := c.Post(activity, localRepo2Inbox) + require.NoError(t, err) + assert.Equal(t, http.StatusNotAcceptable, resp.StatusCode) + }) +} diff --git a/tests/integration/api_federation_httpsig_test.go b/tests/integration/api_federation_httpsig_test.go new file mode 100644 index 0000000000..f5c4c78648 --- /dev/null +++ b/tests/integration/api_federation_httpsig_test.go @@ -0,0 +1,85 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package integration + +import ( + "fmt" + "net/http" + "net/url" + "testing" + "time" + + "forgejo.org/models/db" + "forgejo.org/models/forgefed" + "forgejo.org/models/unittest" + "forgejo.org/models/user" + "forgejo.org/modules/activitypub" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" + "forgejo.org/routers" + "forgejo.org/services/contexttest" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestFederationHttpSigValidation(t *testing.T) { + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + onGiteaRun(t, func(t *testing.T, u *url.URL) { + userID := 2 + userURL := fmt.Sprintf("%sapi/v1/activitypub/user-id/%d", u, userID) + + user1 := unittest.AssertExistsAndLoadBean(t, &user.User{ID: 1}) + + ctx, _ := contexttest.MockAPIContext(t, userURL) + clientFactory, err := activitypub.NewClientFactoryWithTimeout(60 * time.Second) + require.NoError(t, err) + + apClient, err := clientFactory.WithKeys(ctx, user1, user1.KeyID()) + require.NoError(t, err) + + // Unsigned request + t.Run("UnsignedRequest", func(t *testing.T) { + req := NewRequest(t, "GET", userURL) + MakeRequest(t, req, http.StatusBadRequest) + }) + + // Signed request + t.Run("SignedRequest", func(t *testing.T) { + resp, err := apClient.Get(userURL) + require.NoError(t, err) + assert.Equal(t, http.StatusOK, resp.StatusCode) + }) + + // HACK HACK HACK: the host part of the URL gets set to which IP forgejo is + // listening on, NOT localhost, which is the Domain given to forgejo which + // is then used for eg. the keyID all requests + applicationKeyID := fmt.Sprintf("%sapi/v1/activitypub/actor#main-key", setting.AppURL) + actorKeyID := fmt.Sprintf("%sapi/v1/activitypub/user-id/1#main-key", setting.AppURL) + + // Check for cached public keys + t.Run("ValidateCaches", func(t *testing.T) { + host, err := forgefed.FindFederationHostByKeyID(db.DefaultContext, applicationKeyID) + require.NoError(t, err) + assert.NotNil(t, host) + assert.True(t, host.PublicKey.Valid) + + _, user, err := user.FindFederatedUserByKeyID(db.DefaultContext, actorKeyID) + require.NoError(t, err) + assert.NotNil(t, user) + assert.True(t, user.PublicKey.Valid) + }) + + // Disable signature validation + defer test.MockVariableValue(&setting.Federation.SignatureEnforced, false)() + + // Unsigned request + t.Run("SignatureValidationDisabled", func(t *testing.T) { + req := NewRequest(t, "GET", userURL) + MakeRequest(t, req, http.StatusOK) + }) + }) +} diff --git a/tests/integration/repo_star_federation_test.go b/tests/integration/repo_star_federation_test.go new file mode 100644 index 0000000000..ae9a4e9f83 --- /dev/null +++ b/tests/integration/repo_star_federation_test.go @@ -0,0 +1,81 @@ +// Copyright 2024 The Forgejo Authors c/o Codeberg e.V.. All rights reserved. +// SPDX-License-Identifier: MIT + +package integration + +import ( + "fmt" + "net/http" + "strings" + "testing" + + "forgejo.org/models/forgefed" + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + fm "forgejo.org/modules/forgefed" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" + "forgejo.org/modules/validation" + "forgejo.org/tests" +) + +func TestActivityPubRepoFollowing(t *testing.T) { + defer tests.PrepareTestEnv(t)() + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + + mock := test.NewFederationServerMock() + federatedSrv := mock.DistantServer(t) + defer federatedSrv.Close() + + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1, OwnerID: user.ID}) + session := loginUser(t, user.Name) + + t.Run("Add a following repo", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + link := fmt.Sprintf("/%s/settings", repo.FullName()) + + req := NewRequestWithValues(t, "POST", link, map[string]string{ + "_csrf": GetCSRF(t, session, link), + "action": "federation", + "following_repos": fmt.Sprintf("%s/api/v1/activitypub/repository-id/1", federatedSrv.URL), + }) + session.MakeRequest(t, req, http.StatusSeeOther) + + // Verify it was added. + federationHost := unittest.AssertExistsAndLoadBean(t, &forgefed.FederationHost{HostFqdn: "127.0.0.1"}) + unittest.AssertExistsAndLoadBean(t, &repo_model.FollowingRepo{ + ExternalID: "1", + FederationHostID: federationHost.ID, + }) + }) + + t.Run("Star a repo having a following repo", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + repoLink := fmt.Sprintf("/%s", repo.FullName()) + link := fmt.Sprintf("%s/action/star", repoLink) + req := NewRequestWithValues(t, "POST", link, map[string]string{ + "_csrf": GetCSRF(t, session, repoLink), + }) + + session.MakeRequest(t, req, http.StatusOK) + + // Verify distant server received a like activity + like := fm.ForgeLike{} + err := like.UnmarshalJSON([]byte(mock.LastPost)) + if err != nil { + t.Errorf("Error unmarshalling ForgeLike: %q", err) + } + if isValid, err := validation.IsValid(like); !isValid { + t.Errorf("ForgeLike is not valid: %q", err) + } + activityType := like.Type + object := like.Object.GetLink().String() + isLikeType := activityType == "Like" + isCorrectObject := strings.HasSuffix(object, "/api/v1/activitypub/repository-id/1") + if !isLikeType || !isCorrectObject { + t.Error("Activity is not a like for this repo") + } + }) +} From bc0d14119c9ee12f8c17fd97d4b9614dafe0d638 Mon Sep 17 00:00:00 2001 From: Gusted Date: Mon, 28 Jul 2025 17:27:12 +0200 Subject: [PATCH 237/495] chore: add missing translation (#8709) Ref: forgejo/forgejo#7940 > Unable to register cron task remove_resolved_reports Error: translation is missing for task "remove_resolved_reports", please add translation for "admin.dashboard.remove_resolved_reports" Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8709 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- options/locale_next/locale_en-US.json | 1 + 1 file changed, 1 insertion(+) diff --git a/options/locale_next/locale_en-US.json b/options/locale_next/locale_en-US.json index c2c682a4db..d861c42d66 100644 --- a/options/locale_next/locale_en-US.json +++ b/options/locale_next/locale_en-US.json @@ -107,6 +107,7 @@ "editor.textarea.tab_hint": "Line already indented. Press Tab again or Escape to leave the editor.", "editor.textarea.shift_tab_hint": "No indentation on this line. Press Shift + Tab again or Escape to leave the editor.", "admin.dashboard.cleanup_offline_runners": "Cleanup offline runners", + "admin.dashboard.remove_resolved_reports": "Remove resolved reports", "settings.visibility.description": "Profile visibility affects others' ability to access your non-private repositories. Learn more.", "avatar.constraints_hint": "Custom avatar may not exceed %[1]s in size or be larger than %[2]dx%[3]d pixels", "og.repo.summary_card.alt_description": "Summary card of repository %[1]s, described as: %[2]s", From 13e48ead92516d1122b3a30a5a8fc73ee45dec10 Mon Sep 17 00:00:00 2001 From: Gusted Date: Tue, 29 Jul 2025 01:03:36 +0200 Subject: [PATCH 238/495] feat: migrate action secrets to `keying` to store them more securely (#8692) - Use the keying module, that was introduced in forgejo/forgejo#5041, to store action secrets safely and securely in the database. - Introduce a central function that sets the secret, `SetSecret` and let the caller do the update call. This is similar to how the twofactor (TOTP) models does it. Ref. https://codeberg.org/forgejo/forgejo/pulls/6074 - Add a relaxed migration, that is run inside a transaction. If it cannot decrypt a action secret, then it's deleted. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8692 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- models/forgejo_migrations/migrate.go | 2 + models/forgejo_migrations/v39.go | 78 +++++++++++++ models/forgejo_migrations/v39_test.go | 52 +++++++++ .../secret.yml | 14 +++ models/secret/main_test.go | 17 +++ models/secret/secret.go | 46 ++++---- models/secret/secret_test.go | 103 ++++++++++++++++++ modules/keying/keying.go | 2 + services/secrets/secrets.go | 12 +- 9 files changed, 293 insertions(+), 33 deletions(-) create mode 100644 models/forgejo_migrations/v39.go create mode 100644 models/forgejo_migrations/v39_test.go create mode 100644 models/migrations/fixtures/Test_MigrateActionSecretToKeying/secret.yml create mode 100644 models/secret/main_test.go create mode 100644 models/secret/secret_test.go diff --git a/models/forgejo_migrations/migrate.go b/models/forgejo_migrations/migrate.go index a22d35dd21..c5553388ea 100644 --- a/models/forgejo_migrations/migrate.go +++ b/models/forgejo_migrations/migrate.go @@ -115,6 +115,8 @@ var migrations = []*Migration{ NewMigration("Add `branch_filter` to `push_mirror` table", AddPushMirrorBranchFilter), // v37 -> v38 NewMigration("Add `resolved_unix` column to `abuse_report` table", AddResolvedUnixToAbuseReport), + // v38 -> v39 + NewMigration("Migrate `data` column of `secret` table to store keying material", MigrateActionSecretsToKeying), } // GetCurrentDBVersion returns the current Forgejo database version. diff --git a/models/forgejo_migrations/v39.go b/models/forgejo_migrations/v39.go new file mode 100644 index 0000000000..9af1c250b3 --- /dev/null +++ b/models/forgejo_migrations/v39.go @@ -0,0 +1,78 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package forgejo_migrations + +import ( + "context" + "fmt" + + "forgejo.org/models/db" + secret_model "forgejo.org/models/secret" + "forgejo.org/modules/log" + "forgejo.org/modules/secret" + "forgejo.org/modules/setting" + + "xorm.io/xorm" + "xorm.io/xorm/schemas" +) + +func MigrateActionSecretsToKeying(x *xorm.Engine) error { + return db.WithTx(db.DefaultContext, func(ctx context.Context) error { + sess := db.GetEngine(ctx) + + switch x.Dialect().URI().DBType { + case schemas.MYSQL: + if _, err := sess.Exec("ALTER TABLE `secret` MODIFY `data` BLOB"); err != nil { + return err + } + case schemas.SQLITE: + if _, err := sess.Exec("ALTER TABLE `secret` RENAME COLUMN `data` TO `data_backup`"); err != nil { + return err + } + if _, err := sess.Exec("ALTER TABLE `secret` ADD COLUMN `data` BLOB"); err != nil { + return err + } + if _, err := sess.Exec("UPDATE `secret` SET `data` = `data_backup`"); err != nil { + return err + } + if _, err := sess.Exec("ALTER TABLE `secret` DROP COLUMN `data_backup`"); err != nil { + return err + } + case schemas.POSTGRES: + if _, err := sess.Exec("ALTER TABLE `secret` ALTER COLUMN `data` SET DATA TYPE bytea USING data::text::bytea"); err != nil { + return err + } + } + + oldEncryptionKey := setting.SecretKey + + messages := make([]string, 0, 100) + ids := make([]int64, 0, 100) + + err := db.Iterate(ctx, nil, func(ctx context.Context, bean *secret_model.Secret) error { + secretBytes, err := secret.DecryptSecret(oldEncryptionKey, string(bean.Data)) + if err != nil { + messages = append(messages, fmt.Sprintf("secret.id=%d, secret.name=%q, secret.repo_id=%d, secret.owner_id=%d: secret.DecryptSecret(): %v", bean.ID, bean.Name, bean.RepoID, bean.OwnerID, err)) + ids = append(ids, bean.ID) + return nil + } + + bean.SetSecret(secretBytes) + _, err = sess.Cols("data").ID(bean.ID).Update(bean) + return err + }) + + if err == nil { + if len(ids) > 0 { + log.Error("Forgejo migration[37]: The following action secrets were found to be corrupted and removed from the database.") + for _, message := range messages { + log.Error("Forgejo migration[37]: %s", message) + } + + _, err = sess.In("id", ids).NoAutoCondition().NoAutoTime().Delete(&secret_model.Secret{}) + } + } + return err + }) +} diff --git a/models/forgejo_migrations/v39_test.go b/models/forgejo_migrations/v39_test.go new file mode 100644 index 0000000000..42934d912f --- /dev/null +++ b/models/forgejo_migrations/v39_test.go @@ -0,0 +1,52 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package forgejo_migrations + +import ( + "testing" + + migration_tests "forgejo.org/models/migrations/test" + "forgejo.org/models/secret" + "forgejo.org/modules/keying" + "forgejo.org/modules/timeutil" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_MigrateActionSecretToKeying(t *testing.T) { + type Secret struct { + ID int64 + OwnerID int64 `xorm:"INDEX UNIQUE(owner_repo_name) NOT NULL"` + RepoID int64 `xorm:"INDEX UNIQUE(owner_repo_name) NOT NULL DEFAULT 0"` + Name string `xorm:"UNIQUE(owner_repo_name) NOT NULL"` + Data string `xorm:"LONGTEXT"` // encrypted data + CreatedUnix timeutil.TimeStamp `xorm:"created NOT NULL"` + } + + // Prepare and load the testing database + x, deferable := migration_tests.PrepareTestEnv(t, 0, new(Secret)) + defer deferable() + if x == nil || t.Failed() { + return + } + + cnt, err := x.Table("secret").Count() + require.NoError(t, err) + assert.EqualValues(t, 2, cnt) + + require.NoError(t, MigrateActionSecretsToKeying(x)) + + cnt, err = x.Table("secret").Count() + require.NoError(t, err) + assert.EqualValues(t, 1, cnt) + + var secret secret.Secret + _, err = x.Table("secret").ID(1).Get(&secret) + require.NoError(t, err) + + secretBytes, err := keying.DeriveKey(keying.ContextActionSecret).Decrypt(secret.Data, keying.ColumnAndID("data", secret.ID)) + require.NoError(t, err) + assert.Equal(t, []byte("A deep dark secret"), secretBytes) +} diff --git a/models/migrations/fixtures/Test_MigrateActionSecretToKeying/secret.yml b/models/migrations/fixtures/Test_MigrateActionSecretToKeying/secret.yml new file mode 100644 index 0000000000..908b428321 --- /dev/null +++ b/models/migrations/fixtures/Test_MigrateActionSecretToKeying/secret.yml @@ -0,0 +1,14 @@ +- + id: 1 + owner_id: 2 + repo_id: 1 + name: SECRET_1 + data: 02458e5f341b2d5081a31283559843b6b7543ab98ed213d2b15b5cef94385fa348afa7e0875122e9 + created_unix: 1753556968 +- + id: 2 + owner_id: 2 + repo_id: 1 + name: BADBAD + data: badbad + created_unix: 1753556968 diff --git a/models/secret/main_test.go b/models/secret/main_test.go new file mode 100644 index 0000000000..85bfec0c4f --- /dev/null +++ b/models/secret/main_test.go @@ -0,0 +1,17 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package secret_test + +import ( + "testing" + + "forgejo.org/models/unittest" + + _ "forgejo.org/models" + _ "forgejo.org/models/activities" +) + +func TestMain(m *testing.M) { + unittest.MainTest(m) +} diff --git a/models/secret/secret.go b/models/secret/secret.go index 7be7f454a1..6f6867db52 100644 --- a/models/secret/secret.go +++ b/models/secret/secret.go @@ -11,9 +11,8 @@ import ( actions_model "forgejo.org/models/actions" "forgejo.org/models/db" actions_module "forgejo.org/modules/actions" + "forgejo.org/modules/keying" "forgejo.org/modules/log" - secret_module "forgejo.org/modules/secret" - "forgejo.org/modules/setting" "forgejo.org/modules/timeutil" "forgejo.org/modules/util" @@ -39,7 +38,7 @@ type Secret struct { OwnerID int64 `xorm:"INDEX UNIQUE(owner_repo_name) NOT NULL"` RepoID int64 `xorm:"INDEX UNIQUE(owner_repo_name) NOT NULL DEFAULT 0"` Name string `xorm:"UNIQUE(owner_repo_name) NOT NULL"` - Data string `xorm:"LONGTEXT"` // encrypted data + Data []byte `xorm:"BLOB"` // encrypted data CreatedUnix timeutil.TimeStamp `xorm:"created NOT NULL"` } @@ -67,17 +66,21 @@ func InsertEncryptedSecret(ctx context.Context, ownerID, repoID int64, name, dat return nil, fmt.Errorf("%w: ownerID and repoID cannot be both zero, global secrets are not supported", util.ErrInvalidArgument) } - encrypted, err := secret_module.EncryptSecret(setting.SecretKey, data) - if err != nil { - return nil, err - } secret := &Secret{ OwnerID: ownerID, RepoID: repoID, Name: strings.ToUpper(name), - Data: encrypted, } - return secret, db.Insert(ctx, secret) + + return secret, db.WithTx(ctx, func(ctx context.Context) error { + if err := db.Insert(ctx, secret); err != nil { + return err + } + + secret.SetSecret(data) + _, err := db.GetEngine(ctx).ID(secret.ID).Cols("data").Update(secret) + return err + }) } func init() { @@ -113,21 +116,9 @@ func (opts FindSecretsOptions) ToConds() builder.Cond { return cond } -// UpdateSecret changes org or user reop secret. -func UpdateSecret(ctx context.Context, secretID int64, data string) error { - encrypted, err := secret_module.EncryptSecret(setting.SecretKey, data) - if err != nil { - return err - } - - s := &Secret{ - Data: encrypted, - } - affected, err := db.GetEngine(ctx).ID(secretID).Cols("data").Update(s) - if affected != 1 { - return ErrSecretNotFound{} - } - return err +func (s *Secret) SetSecret(data string) { + key := keying.DeriveKey(keying.ContextActionSecret) + s.Data = key.Encrypt([]byte(data), keying.ColumnAndID("data", s.ID)) } func GetSecretsOfTask(ctx context.Context, task *actions_model.ActionTask) (map[string]string, error) { @@ -155,13 +146,14 @@ func GetSecretsOfTask(ctx context.Context, task *actions_model.ActionTask) (map[ return nil, err } + key := keying.DeriveKey(keying.ContextActionSecret) for _, secret := range append(ownerSecrets, repoSecrets...) { - v, err := secret_module.DecryptSecret(setting.SecretKey, secret.Data) + v, err := key.Decrypt(secret.Data, keying.ColumnAndID("data", secret.ID)) if err != nil { - log.Error("decrypt secret %v %q: %v", secret.ID, secret.Name, err) + log.Error("unable to decrypt secret[id=%d,name=%q]: %v", secret.ID, secret.Name, err) return nil, err } - secrets[secret.Name] = v + secrets[secret.Name] = string(v) } return secrets, nil diff --git a/models/secret/secret_test.go b/models/secret/secret_test.go new file mode 100644 index 0000000000..15142d207b --- /dev/null +++ b/models/secret/secret_test.go @@ -0,0 +1,103 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package secret + +import ( + "testing" + + "forgejo.org/models/actions" + "forgejo.org/models/repo" + "forgejo.org/models/unittest" + "forgejo.org/modules/keying" + "forgejo.org/modules/util" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestInsertEncryptedSecret(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + t.Run("Global secret", func(t *testing.T) { + secret, err := InsertEncryptedSecret(t.Context(), 0, 0, "GLOBAL_SECRET", "some common secret") + require.ErrorIs(t, err, util.ErrInvalidArgument) + assert.Nil(t, secret) + }) + + key := keying.DeriveKey(keying.ContextActionSecret) + + t.Run("Insert repository secret", func(t *testing.T) { + secret, err := InsertEncryptedSecret(t.Context(), 0, 1, "REPO_SECRET", "some repository secret") + require.NoError(t, err) + assert.NotNil(t, secret) + assert.Equal(t, "REPO_SECRET", secret.Name) + assert.EqualValues(t, 1, secret.RepoID) + assert.NotEmpty(t, secret.Data) + + // Assert the secret is stored in the database. + unittest.AssertExistsAndLoadBean(t, &Secret{RepoID: 1, Name: "REPO_SECRET", Data: secret.Data}) + + t.Run("Keying", func(t *testing.T) { + // Cannot decrypt with different ID. + plainText, err := key.Decrypt(secret.Data, keying.ColumnAndID("data", secret.ID+1)) + require.Error(t, err) + assert.Nil(t, plainText) + + // Cannot decrypt with different column. + plainText, err = key.Decrypt(secret.Data, keying.ColumnAndID("metadata", secret.ID)) + require.Error(t, err) + assert.Nil(t, plainText) + + // Can decrypt with correct column and ID. + plainText, err = key.Decrypt(secret.Data, keying.ColumnAndID("data", secret.ID)) + require.NoError(t, err) + assert.EqualValues(t, "some repository secret", plainText) + }) + }) + + t.Run("Insert owner secret", func(t *testing.T) { + secret, err := InsertEncryptedSecret(t.Context(), 2, 0, "OWNER_SECRET", "some owner secret") + require.NoError(t, err) + assert.NotNil(t, secret) + assert.Equal(t, "OWNER_SECRET", secret.Name) + assert.EqualValues(t, 2, secret.OwnerID) + assert.NotEmpty(t, secret.Data) + + // Assert the secret is stored in the database. + unittest.AssertExistsAndLoadBean(t, &Secret{OwnerID: 2, Name: "OWNER_SECRET", Data: secret.Data}) + + t.Run("Keying", func(t *testing.T) { + // Cannot decrypt with different ID. + plainText, err := key.Decrypt(secret.Data, keying.ColumnAndID("data", secret.ID+1)) + require.Error(t, err) + assert.Nil(t, plainText) + + // Cannot decrypt with different column. + plainText, err = key.Decrypt(secret.Data, keying.ColumnAndID("metadata", secret.ID)) + require.Error(t, err) + assert.Nil(t, plainText) + + // Can decrypt with correct column and ID. + plainText, err = key.Decrypt(secret.Data, keying.ColumnAndID("data", secret.ID)) + require.NoError(t, err) + assert.EqualValues(t, "some owner secret", plainText) + }) + }) + + t.Run("Get secrets", func(t *testing.T) { + secrets, err := GetSecretsOfTask(t.Context(), &actions.ActionTask{ + Job: &actions.ActionRunJob{ + Run: &actions.ActionRun{ + RepoID: 1, + Repo: &repo.Repository{ + OwnerID: 2, + }, + }, + }, + }) + require.NoError(t, err) + assert.Equal(t, "some owner secret", secrets["OWNER_SECRET"]) + assert.Equal(t, "some repository secret", secrets["REPO_SECRET"]) + }) +} diff --git a/modules/keying/keying.go b/modules/keying/keying.go index c859e30e9f..f39e16aeed 100644 --- a/modules/keying/keying.go +++ b/modules/keying/keying.go @@ -58,6 +58,8 @@ var ( ContextPushMirror Context = "pushmirror" // Used for the `two_factor` table. ContextTOTP Context = "totp" + // Used for the `secret` table. + ContextActionSecret Context = "action_secret" ) // Derive *the* key for a given context, this is a deterministic function. diff --git a/services/secrets/secrets.go b/services/secrets/secrets.go index 2d5aebdbc1..2de83ef5a2 100644 --- a/services/secrets/secrets.go +++ b/services/secrets/secrets.go @@ -15,16 +15,16 @@ func CreateOrUpdateSecret(ctx context.Context, ownerID, repoID int64, name, data return nil, false, err } - s, err := db.Find[secret_model.Secret](ctx, secret_model.FindSecretsOptions{ + s, exists, err := db.Get[secret_model.Secret](ctx, secret_model.FindSecretsOptions{ OwnerID: ownerID, RepoID: repoID, Name: name, - }) + }.ToConds()) if err != nil { return nil, false, err } - if len(s) == 0 { + if !exists { s, err := secret_model.InsertEncryptedSecret(ctx, ownerID, repoID, name, data) if err != nil { return nil, false, err @@ -32,11 +32,11 @@ func CreateOrUpdateSecret(ctx context.Context, ownerID, repoID int64, name, data return s, true, nil } - if err := secret_model.UpdateSecret(ctx, s[0].ID, data); err != nil { + s.SetSecret(data) + if _, err := db.GetEngine(ctx).Cols("data").ID(s.ID).Update(s); err != nil { return nil, false, err } - - return s[0], false, nil + return s, false, nil } func DeleteSecretByID(ctx context.Context, ownerID, repoID, secretID int64) error { From e2dbbbfbc608347a5c58daa222e6071aae3155b8 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 29 Jul 2025 03:54:22 +0200 Subject: [PATCH 239/495] Update dependency webpack to v5.101.0 (forgejo) (#8717) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8717 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 12f7c404fb..eface926ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,7 +56,7 @@ "vue-chartjs": "5.3.1", "vue-loader": "17.4.2", "vue3-calendar-heatmap": "2.0.5", - "webpack": "5.100.2", + "webpack": "5.101.0", "webpack-cli": "6.0.1", "wrap-ansi": "9.0.0" }, @@ -15639,9 +15639,9 @@ "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.100.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.100.2.tgz", - "integrity": "sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw==", + "version": "5.101.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.0.tgz", + "integrity": "sha512-B4t+nJqytPeuZlHuIKTbalhljIFXeNRqrUGAQgTGlfOl2lXXKXw+yZu6bicycP+PUlM44CxBjCFD6aciKFT3LQ==", "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", diff --git a/package.json b/package.json index 466f8fbb01..b0dc05c6d1 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "vue-chartjs": "5.3.1", "vue-loader": "17.4.2", "vue3-calendar-heatmap": "2.0.5", - "webpack": "5.100.2", + "webpack": "5.101.0", "webpack-cli": "6.0.1", "wrap-ansi": "9.0.0" }, From b2469c2a9ce4f682c1e63beb8e185fb1e60d0fcc Mon Sep 17 00:00:00 2001 From: Gusted Date: Tue, 29 Jul 2025 08:17:17 +0200 Subject: [PATCH 240/495] fix: allow admins to always rename users (#8715) Do not apply the rename restriction of non-local users if the doer is an admin (changes via the admin interface). This is a conscious choice and the admin knows better if they make such changes. Regression of c59a057297 Resolves forgejo/forgejo#3657 ## Release notes - Bug fixes - [PR](https://codeberg.org/forgejo/forgejo/pulls/8715): allow admins to always rename users Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8715 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- services/user/user.go | 3 ++- services/user/user_test.go | 8 +++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/services/user/user.go b/services/user/user.go index d90fbac978..d682d5a434 100644 --- a/services/user/user.go +++ b/services/user/user.go @@ -47,7 +47,8 @@ func renameUser(ctx context.Context, u *user_model.User, newUserName string, doe } // Non-local users are not allowed to change their username. - if !u.IsOrganization() && !u.IsLocal() { + // If the doer is an admin, then allow the rename - they know better. + if !doerIsAdmin && !u.IsOrganization() && !u.IsLocal() { return user_model.ErrUserIsNotLocal{ UID: u.ID, Name: u.Name, diff --git a/services/user/user_test.go b/services/user/user_test.go index 36f2776ad8..f1cab60a6d 100644 --- a/services/user/user_test.go +++ b/services/user/user_test.go @@ -145,10 +145,16 @@ func TestRenameUser(t *testing.T) { t.Run("Non-Local", func(t *testing.T) { u := &user_model.User{ + ID: 2, + Name: "old-name", Type: user_model.UserTypeIndividual, LoginType: auth.OAuth2, } - require.ErrorIs(t, RenameUser(db.DefaultContext, u, "user_rename"), user_model.ErrUserIsNotLocal{}) + require.ErrorIs(t, RenameUser(db.DefaultContext, u, "user_rename2"), user_model.ErrUserIsNotLocal{UID: 2, Name: "old-name"}) + + t.Run("Admin", func(t *testing.T) { + require.NoError(t, AdminRenameUser(t.Context(), u, "user_rename2")) + }) }) t.Run("Same username", func(t *testing.T) { From 01f1f4ac75df65d22e55c01b7c19c888b6b4c582 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Tue, 29 Jul 2025 10:18:58 +0200 Subject: [PATCH 241/495] chore: revert release-notes-assistant to v1.3.3 (#8722) to reduce the number of requests to the API to obtain each pull request to the minimum. tests are not needed because this version has been working fine over the past year Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8722 Reviewed-by: Michael Kriese Co-authored-by: Earl Warren Co-committed-by: Earl Warren --- .forgejo/workflows/release-notes-assistant.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/release-notes-assistant.yml b/.forgejo/workflows/release-notes-assistant.yml index d813e5fc0f..b1acde6030 100644 --- a/.forgejo/workflows/release-notes-assistant.yml +++ b/.forgejo/workflows/release-notes-assistant.yml @@ -8,7 +8,7 @@ on: - labeled env: - RNA_VERSION: v1.3.5 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org + RNA_VERSION: v1.3.3 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org jobs: release-notes: From d3ca92df79555007f102f930e721a68d96eb29cf Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 29 Jul 2025 23:43:21 +0200 Subject: [PATCH 242/495] Update dependency forgejo/release-notes-assistant to v1.3.6 (forgejo) (#8726) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Update | Change | |---|---|---| | [forgejo/release-notes-assistant](https://code.forgejo.org/forgejo/release-notes-assistant) | patch | `v1.3.3` -> `v1.3.6` | | [forgejo/release-notes-assistant](https://code.forgejo.org/forgejo/release-notes-assistant) | patch | `v1.3.5` -> `v1.3.6` | --- ### Release Notes
    forgejo/release-notes-assistant (forgejo/release-notes-assistant) ### [`v1.3.6`](https://code.forgejo.org/forgejo/release-notes-assistant/releases/tag/v1.3.6) [Compare Source](https://code.forgejo.org/forgejo/release-notes-assistant/compare/v1.3.5...v1.3.6) - bug fixes - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/100): fix: convert EOL \r\n to \n when getting a single pull request - other - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/96): Update https://data.forgejo.org/actions/forgejo-release action to v2.7.0 ### [`v1.3.5`](https://code.forgejo.org/forgejo/release-notes-assistant/releases/tag/v1.3.5) [Compare Source](https://code.forgejo.org/forgejo/release-notes-assistant/compare/v1.3.4...v1.3.5) - bug fixes - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/98): fix: there can be more than one tag decorating a commit ### [`v1.3.4`](https://code.forgejo.org/forgejo/release-notes-assistant/releases/tag/v1.3.4) [Compare Source](https://code.forgejo.org/forgejo/release-notes-assistant/compare/v1.3.3...v1.3.4) - bug fixes - [PR](https://placeholder:ca61bc9776c376e293039231cd01158c2c2f0a4f@code.forgejo.org/forgejo/release-notes-assistant/pulls/97): fix: %(decorate) is not supported by git 2.39
    --- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8726 Reviewed-by: Earl Warren Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- .forgejo/workflows/release-notes-assistant-milestones.yml | 2 +- .forgejo/workflows/release-notes-assistant.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/release-notes-assistant-milestones.yml b/.forgejo/workflows/release-notes-assistant-milestones.yml index bf666dee6a..ff2afe7303 100644 --- a/.forgejo/workflows/release-notes-assistant-milestones.yml +++ b/.forgejo/workflows/release-notes-assistant-milestones.yml @@ -6,7 +6,7 @@ on: env: RNA_WORKDIR: /srv/rna - RNA_VERSION: v1.3.5 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org + RNA_VERSION: v1.3.6 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org jobs: release-notes: diff --git a/.forgejo/workflows/release-notes-assistant.yml b/.forgejo/workflows/release-notes-assistant.yml index b1acde6030..f47fc59422 100644 --- a/.forgejo/workflows/release-notes-assistant.yml +++ b/.forgejo/workflows/release-notes-assistant.yml @@ -8,7 +8,7 @@ on: - labeled env: - RNA_VERSION: v1.3.3 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org + RNA_VERSION: v1.3.6 # renovate: datasource=gitea-releases depName=forgejo/release-notes-assistant registryUrl=https://code.forgejo.org jobs: release-notes: From 93b13e4d5243d7b76e49ef64aab7f8d5a59b5b4d Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Wed, 30 Jul 2025 13:12:17 +0200 Subject: [PATCH 243/495] chore(ci): send mail when daily integration tests fail (#8727) ## Testing - 24h after this is merged - push a commit to https://codeberg.org/forgejo-integration/forgejo/src/branch/forgejo with an error - cancel all workflows except for https://codeberg.org/forgejo-integration/forgejo/actions?workflow=testing-integration.yml&actor=0&status=0 - verify a notification was sent to forgejo-integration-actions@forgejo.org about the error - update the user research discussion at https://codeberg.org/forgejo/user-research/issues/64 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8727 Reviewed-by: Michael Kriese Co-authored-by: Earl Warren Co-committed-by: Earl Warren --- .forgejo/workflows/testing-integration.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.forgejo/workflows/testing-integration.yml b/.forgejo/workflows/testing-integration.yml index 102a2d9774..518b56c463 100644 --- a/.forgejo/workflows/testing-integration.yml +++ b/.forgejo/workflows/testing-integration.yml @@ -1,7 +1,8 @@ # # Additional integration tests designed to run once a day when # `mirror.yml` pushes to https://codeberg.org/forgejo-integration/forgejo -# and send a notification via email should they fail. +# and send a notification via email to the contact email of the +# organization should they fail. # # For debug purposes: # @@ -22,6 +23,8 @@ on: - 'forgejo' - 'v*/forgejo' +enable-email-notifications: true + jobs: test-unit: # if: vars.ROLE == 'forgejo-coding' From 1761dae2db70288878e31f95ee433de629347723 Mon Sep 17 00:00:00 2001 From: Michael Kriese Date: Wed, 30 Jul 2025 15:40:12 +0200 Subject: [PATCH 244/495] test: add logger settings tests (#8729) fully cover existing behavior - ref #8667 I used Github Copilot for some code autocompletions. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8729 Reviewed-by: Earl Warren Co-authored-by: Michael Kriese Co-committed-by: Michael Kriese --- modules/setting/log_test.go | 182 +++++++++++++++++++++++++++++++++++- 1 file changed, 177 insertions(+), 5 deletions(-) diff --git a/modules/setting/log_test.go b/modules/setting/log_test.go index 223bd68285..528921c669 100644 --- a/modules/setting/log_test.go +++ b/modules/setting/log_test.go @@ -10,16 +10,13 @@ import ( "forgejo.org/modules/json" "forgejo.org/modules/log" + "forgejo.org/modules/test" "github.com/stretchr/testify/require" ) func initLoggersByConfig(t *testing.T, config string) (*log.LoggerManager, func()) { - oldLogConfig := Log - Log = LogGlobalConfig{} - defer func() { - Log = oldLogConfig - }() + defer test.MockVariableValue(&Log, LogGlobalConfig{})() cfg, err := NewConfigProviderFromData(config) require.NoError(t, err) @@ -29,6 +26,17 @@ func initLoggersByConfig(t *testing.T, config string) (*log.LoggerManager, func( return manager, manager.Close } +func initLoggerConfig(t *testing.T, config string) ConfigProvider { + defer test.MockVariableValue(&Log, LogGlobalConfig{})() + + cfg, err := NewConfigProviderFromData(config) + require.NoError(t, err) + + prepareLoggerConfig(cfg) + + return cfg +} + func toJSON(v any) string { b, _ := json.MarshalIndent(v, "", "\t") return string(b) @@ -395,3 +403,167 @@ COMPRESSION_LEVEL = 4 expected = strings.ReplaceAll(expected, "$FILENAME-1", tempPath("file-xxx.log")) require.JSONEq(t, expected, toJSON(dump)) } + +func TestLegacyLoggerMigrations(t *testing.T) { + type Cases = []struct { + name string + cfg string + exp string + } + + runCases := func(t *testing.T, key string, cases Cases) { + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + cfg := initLoggerConfig(t, c.cfg) + require.Equal(t, c.exp, cfg.Section("log").Key(key).String()) + }) + } + } + + t.Run("default", func(t *testing.T) { + runCases(t, "logger.default.MODE", Cases{ + { + "uses default value for default logger", + "", + ",", + }, + { + "uses logger.default.MODE for default logger", + `[log] +logger.default.MODE = file +`, + "file", + }, + }) + }) + + t.Run("access", func(t *testing.T) { + runCases(t, "logger.access.MODE", Cases{ + { + "uses default value for access logger", + "", + "", + }, + { + "uses ACCESS for access logger", + `[log] +ACCESS = file +`, + "file", + }, + { + "ENABLE_ACCESS_LOG=true doesn't change access logger", + `[log] +ENABLE_ACCESS_LOG = true +logger.access.MODE = console +`, + "console", + }, + { + "ENABLE_ACCESS_LOG=false disables access logger", + `[log] +ENABLE_ACCESS_LOG = false +logger.access.MODE = console +`, + "", + }, + { + "logger.access.MODE has precedence over ACCESS for access logger", + `[log] +ACCESS = file +logger.access.MODE = console +`, + "console", + }, + { + "ENABLE_ACCESS_LOG doesn't enable access logger", + `[log] +ENABLE_ACCESS_LOG = true +`, + "", // should be `,` + }, + }) + }) + + t.Run("router", func(t *testing.T) { + runCases(t, "logger.router.MODE", Cases{ + { + "uses default value for router logger", + "", + ",", + }, + { + "uses ROUTER for router logger", + `[log] +ROUTER = file +`, + "file", + }, + { + "DISABLE_ROUTER_LOG=false doesn't change router logger", + `[log] +ROUTER = file +DISABLE_ROUTER_LOG = false +`, + "file", + }, + { + "DISABLE_ROUTER_LOG=true disables router logger", + `[log] +DISABLE_ROUTER_LOG = true +logger.router.MODE = console +`, + "", + }, + { + "logger.router.MODE as precedence over ROUTER for router logger", + `[log] +ROUTER = file +logger.router.MODE = console +`, + "console", + }, + }) + }) + + t.Run("xorm", func(t *testing.T) { + runCases(t, "logger.xorm.MODE", Cases{ + { + "uses default value for xorm logger", + "", + ",", + }, + { + "uses XORM for xorm logger", + `[log] +XORM = file +`, + "file", + }, + { + "ENABLE_XORM_LOG=true doesn't change xorm logger", + `[log] +ENABLE_XORM_LOG = true +logger.xorm.MODE = console +`, + "console", + }, + { + "ENABLE_XORM_LOG=false disables xorm logger", + `[log] +ENABLE_XORM_LOG = false +logger.xorm.MODE = console +`, + "", + }, + { + "logger.xorm.MODE has precedence over XORM for xorm logger", + `[log] +XORM = file +logger.xorm.MODE = console +`, + "console", + }, + }) + }) +} From 98e2a64e2d6a7d045d986280225fa5fc9bfdb4f6 Mon Sep 17 00:00:00 2001 From: pkpkpkpk Date: Wed, 30 Jul 2025 18:02:46 +0200 Subject: [PATCH 245/495] fix: allow double digit epoch for Debian packages (#8671) Debian packages were capped for a single digit epoch, relax that requirement to a double digit epoch. This is allowed by Debian. Resolves forgejo/forgejo#8649 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8671 Reviewed-by: Gusted Co-authored-by: pkpkpkpk Co-committed-by: pkpkpkpk --- modules/packages/debian/metadata.go | 2 +- modules/packages/debian/metadata_test.go | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/modules/packages/debian/metadata.go b/modules/packages/debian/metadata.go index e44801654b..1729a2206e 100644 --- a/modules/packages/debian/metadata.go +++ b/modules/packages/debian/metadata.go @@ -46,7 +46,7 @@ var ( // https://www.debian.org/doc/debian-policy/ch-controlfields.html#source namePattern = regexp.MustCompile(`\A[a-z0-9][a-z0-9+-.]+\z`) // https://www.debian.org/doc/debian-policy/ch-controlfields.html#version - versionPattern = regexp.MustCompile(`\A(?:[0-9]:)?[a-zA-Z0-9.+~]+(?:-[a-zA-Z0-9.+-~]+)?\z`) + versionPattern = regexp.MustCompile(`\A(?:[1-9]?[0-9]:)?[a-zA-Z0-9.+~]+(?:-[a-zA-Z0-9.+-~]+)?\z`) ) type Package struct { diff --git a/modules/packages/debian/metadata_test.go b/modules/packages/debian/metadata_test.go index cfcbc57ee0..079b9c19c8 100644 --- a/modules/packages/debian/metadata_test.go +++ b/modules/packages/debian/metadata_test.go @@ -167,6 +167,14 @@ func TestParseControlFile(t *testing.T) { require.ErrorIs(t, err, ErrInvalidArchitecture) }) + t.Run("ValidVersionEpoch", func(t *testing.T) { + for _, version := range []string{"0:1.2.3-test", "1:1.2.3-test", "9:1.2.3-test", "10:1.2.3-test", "37:1.2.3-test", "99:1.2.3-test"} { + p, err := ParseControlFile(buildContent(packageName, version, packageArchitecture)) + require.NoError(t, err) + assert.NotNil(t, p) + } + }) + t.Run("Valid", func(t *testing.T) { content := buildContent(packageName, packageVersion, packageArchitecture) full := content.String() From 022ab86988202ffcaed19000ccb9f751403b245c Mon Sep 17 00:00:00 2001 From: 0ko <0ko@noreply.codeberg.org> Date: Wed, 30 Jul 2025 18:08:28 +0200 Subject: [PATCH 246/495] chore(api): update swagger method descripitons (#8728) Speaking from personal experience, when exploring the API I find myself trying to parse the exact meaning of many descriptions for a while, and I also have to get used to many different kinds of inconsistencies and grammar issues. This PR improves a few of these. Some I tried to reword to make them easier to understand, for others I just improved consistency a little, like capitalization. This area needs more work, this PR just makes some progress. Anything that is improved in this one can be improved further in later PRs, so in review please focus on regressions if you find any. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8728 Reviewed-by: Earl Warren Co-authored-by: 0ko <0ko@noreply.codeberg.org> Co-committed-by: 0ko <0ko@noreply.codeberg.org> --- models/repo/topic.go | 2 +- routers/api/v1/admin/email.go | 4 +- routers/api/v1/admin/hooks.go | 4 +- routers/api/v1/admin/user.go | 14 ++--- routers/api/v1/org/action.go | 22 ++++---- routers/api/v1/org/avatar.go | 8 +-- routers/api/v1/org/org.go | 2 +- routers/api/v1/repo/avatar.go | 8 +-- routers/api/v1/repo/mirror.go | 8 +-- routers/api/v1/repo/pull_review.go | 4 +- routers/api/v1/repo/topic.go | 6 +-- routers/api/v1/user/app.go | 22 ++++---- routers/api/v1/user/avatar.go | 8 +-- routers/api/v1/user/email.go | 12 ++--- routers/api/v1/user/gpg_key.go | 8 +-- routers/api/v1/user/settings.go | 8 +-- routers/api/v1/user/user.go | 4 +- templates/swagger/v1_json.tmpl | 82 +++++++++++++++--------------- 18 files changed, 113 insertions(+), 113 deletions(-) diff --git a/models/repo/topic.go b/models/repo/topic.go index 4a3bdc7d8c..9086f17627 100644 --- a/models/repo/topic.go +++ b/models/repo/topic.go @@ -164,7 +164,7 @@ func FindTopics(ctx context.Context, opts *FindTopicOptions) ([]*Topic, int64, e orderBy := "topic.repo_count DESC" if opts.RepoID > 0 { sess.Join("INNER", "repo_topic", "repo_topic.topic_id = topic.id") - orderBy = "topic.name" // when render topics for a repo, it's better to sort them by name, to get consistent result + orderBy = "topic.name" // When rendering topics for a repo, it's better to sort them by name to get consistent results } if opts.PageSize > 0 { sess = db.SetSessionPagination(sess, opts) diff --git a/routers/api/v1/admin/email.go b/routers/api/v1/admin/email.go index 906780a44b..9f6ef0fedf 100644 --- a/routers/api/v1/admin/email.go +++ b/routers/api/v1/admin/email.go @@ -17,7 +17,7 @@ import ( func GetAllEmails(ctx *context.APIContext) { // swagger:operation GET /admin/emails admin adminGetAllEmails // --- - // summary: List all emails + // summary: List all users' email addresses // produces: // - application/json // parameters: @@ -60,7 +60,7 @@ func GetAllEmails(ctx *context.APIContext) { func SearchEmail(ctx *context.APIContext) { // swagger:operation GET /admin/emails/search admin adminSearchEmails // --- - // summary: Search all emails + // summary: Search users' email addresses // produces: // - application/json // parameters: diff --git a/routers/api/v1/admin/hooks.go b/routers/api/v1/admin/hooks.go index b3db2eb5e3..36ca6831e6 100644 --- a/routers/api/v1/admin/hooks.go +++ b/routers/api/v1/admin/hooks.go @@ -17,11 +17,11 @@ import ( webhook_service "forgejo.org/services/webhook" ) -// ListHooks list system's webhooks +// ListHooks list system webhooks func ListHooks(ctx *context.APIContext) { // swagger:operation GET /admin/hooks admin adminListHooks // --- - // summary: List system's webhooks + // summary: List global (system) webhooks // produces: // - application/json // parameters: diff --git a/routers/api/v1/admin/user.go b/routers/api/v1/admin/user.go index de54f21d94..f3e321a047 100644 --- a/routers/api/v1/admin/user.go +++ b/routers/api/v1/admin/user.go @@ -51,11 +51,11 @@ func parseAuthSource(ctx *context.APIContext, u *user_model.User, sourceID int64 u.LoginSource = source.ID } -// CreateUser create a user +// CreateUser create a user account func CreateUser(ctx *context.APIContext) { // swagger:operation POST /admin/users admin adminCreateUser // --- - // summary: Create a user + // summary: Create a user account // consumes: // - application/json // produces: @@ -274,7 +274,7 @@ func EditUser(ctx *context.APIContext) { func DeleteUser(ctx *context.APIContext) { // swagger:operation DELETE /admin/users/{username} admin adminDeleteUser // --- - // summary: Delete a user + // summary: Delete user account // produces: // - application/json // parameters: @@ -324,11 +324,11 @@ func DeleteUser(ctx *context.APIContext) { ctx.Status(http.StatusNoContent) } -// CreatePublicKey api for creating a public key to a user +// CreatePublicKey adds an SSH public key to user's account func CreatePublicKey(ctx *context.APIContext) { // swagger:operation POST /admin/users/{username}/keys admin adminCreatePublicKey // --- - // summary: Add a public key on behalf of a user + // summary: Add an SSH public key to user's account // consumes: // - application/json // produces: @@ -356,11 +356,11 @@ func CreatePublicKey(ctx *context.APIContext) { user.CreateUserPublicKey(ctx, *form, ctx.ContextUser.ID) } -// DeleteUserPublicKey api for deleting a user's public key +// DeleteUserPublicKey removes an SSH public key from user's account func DeleteUserPublicKey(ctx *context.APIContext) { // swagger:operation DELETE /admin/users/{username}/keys/{id} admin adminDeleteUserPublicKey // --- - // summary: Delete a user's public key + // summary: Remove a public key from user's account // produces: // - application/json // parameters: diff --git a/routers/api/v1/org/action.go b/routers/api/v1/org/action.go index 0d8550a019..8b330aa752 100644 --- a/routers/api/v1/org/action.go +++ b/routers/api/v1/org/action.go @@ -20,11 +20,11 @@ import ( secret_service "forgejo.org/services/secrets" ) -// ListActionsSecrets list an organization's actions secrets +// ListActionsSecrets lists actions secrets of an organization func (Action) ListActionsSecrets(ctx *context.APIContext) { // swagger:operation GET /orgs/{org}/actions/secrets organization orgListActionsSecrets // --- - // summary: List an organization's actions secrets + // summary: List actions secrets of an organization // produces: // - application/json // parameters: @@ -218,7 +218,7 @@ func (Action) SearchActionRunJobs(ctx *context.APIContext) { func (Action) ListVariables(ctx *context.APIContext) { // swagger:operation GET /orgs/{org}/actions/variables organization getOrgVariablesList // --- - // summary: Get an org-level variables list + // summary: List variables of an organization // produces: // - application/json // parameters: @@ -266,11 +266,11 @@ func (Action) ListVariables(ctx *context.APIContext) { ctx.JSON(http.StatusOK, variables) } -// GetVariable get an org-level variable +// GetVariable gives organization's variable func (Action) GetVariable(ctx *context.APIContext) { // swagger:operation GET /orgs/{org}/actions/variables/{variablename} organization getOrgVariable // --- - // summary: Get an org-level variable + // summary: Get organization's variable by name // produces: // - application/json // parameters: @@ -315,11 +315,11 @@ func (Action) GetVariable(ctx *context.APIContext) { ctx.JSON(http.StatusOK, variable) } -// DeleteVariable delete an org-level variable +// DeleteVariable deletes an organization's variable func (Action) DeleteVariable(ctx *context.APIContext) { // swagger:operation DELETE /orgs/{org}/actions/variables/{variablename} organization deleteOrgVariable // --- - // summary: Delete an org-level variable + // summary: Delete organization's variable by name // produces: // - application/json // parameters: @@ -359,11 +359,11 @@ func (Action) DeleteVariable(ctx *context.APIContext) { ctx.Status(http.StatusNoContent) } -// CreateVariable create an org-level variable +// CreateVariable creates a new variable in organization func (Action) CreateVariable(ctx *context.APIContext) { // swagger:operation POST /orgs/{org}/actions/variables/{variablename} organization createOrgVariable // --- - // summary: Create an org-level variable + // summary: Create a new variable in organization // consumes: // - application/json // produces: @@ -423,11 +423,11 @@ func (Action) CreateVariable(ctx *context.APIContext) { ctx.Status(http.StatusNoContent) } -// UpdateVariable update an org-level variable +// UpdateVariable updates variable in organization func (Action) UpdateVariable(ctx *context.APIContext) { // swagger:operation PUT /orgs/{org}/actions/variables/{variablename} organization updateOrgVariable // --- - // summary: Update an org-level variable + // summary: Update variable in organization // consumes: // - application/json // produces: diff --git a/routers/api/v1/org/avatar.go b/routers/api/v1/org/avatar.go index 824a9f3495..043da3186f 100644 --- a/routers/api/v1/org/avatar.go +++ b/routers/api/v1/org/avatar.go @@ -13,11 +13,11 @@ import ( user_service "forgejo.org/services/user" ) -// UpdateAvatarupdates the Avatar of an Organisation +// UpdateAvatar updates an organization's avatar func UpdateAvatar(ctx *context.APIContext) { // swagger:operation POST /orgs/{org}/avatar organization orgUpdateAvatar // --- - // summary: Update Avatar + // summary: Update an organization's avatar // produces: // - application/json // parameters: @@ -52,11 +52,11 @@ func UpdateAvatar(ctx *context.APIContext) { ctx.Status(http.StatusNoContent) } -// DeleteAvatar deletes the Avatar of an Organisation +// DeleteAvatar deletes an organization's avatar func DeleteAvatar(ctx *context.APIContext) { // swagger:operation DELETE /orgs/{org}/avatar organization orgDeleteAvatar // --- - // summary: Delete Avatar + // summary: Delete an organization's avatar. It will be replaced by a default one // produces: // - application/json // parameters: diff --git a/routers/api/v1/org/org.go b/routers/api/v1/org/org.go index 87bc27be63..a4ea924979 100644 --- a/routers/api/v1/org/org.go +++ b/routers/api/v1/org/org.go @@ -180,7 +180,7 @@ func GetUserOrgsPermissions(ctx *context.APIContext) { func GetAll(ctx *context.APIContext) { // swagger:operation Get /orgs organization orgGetAll // --- - // summary: Get list of organizations + // summary: List all organizations // produces: // - application/json // parameters: diff --git a/routers/api/v1/repo/avatar.go b/routers/api/v1/repo/avatar.go index 84aafe764d..12308ce2df 100644 --- a/routers/api/v1/repo/avatar.go +++ b/routers/api/v1/repo/avatar.go @@ -13,11 +13,11 @@ import ( repo_service "forgejo.org/services/repository" ) -// UpdateVatar updates the Avatar of an Repo +// UpdateVatar updates repo avatar func UpdateAvatar(ctx *context.APIContext) { // swagger:operation POST /repos/{owner}/{repo}/avatar repository repoUpdateAvatar // --- - // summary: Update avatar + // summary: Update a repository's avatar // produces: // - application/json // parameters: @@ -56,11 +56,11 @@ func UpdateAvatar(ctx *context.APIContext) { ctx.Status(http.StatusNoContent) } -// UpdateAvatar deletes the Avatar of an Repo +// DeleteAvatar deletes repo avatar func DeleteAvatar(ctx *context.APIContext) { // swagger:operation DELETE /repos/{owner}/{repo}/avatar repository repoDeleteAvatar // --- - // summary: Delete avatar + // summary: Delete a repository's avatar // produces: // - application/json // parameters: diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go index f08867dee4..08ef68cbfc 100644 --- a/routers/api/v1/repo/mirror.go +++ b/routers/api/v1/repo/mirror.go @@ -251,11 +251,11 @@ func GetPushMirrorByName(ctx *context.APIContext) { ctx.JSON(http.StatusOK, m) } -// AddPushMirror adds a push mirror to a repository +// AddPushMirror sets up a new push mirror in a repository func AddPushMirror(ctx *context.APIContext) { // swagger:operation POST /repos/{owner}/{repo}/push_mirrors repository repoAddPushMirror // --- - // summary: add a push mirror to the repository + // summary: Set up a new push mirror in a repository // consumes: // - application/json // produces: @@ -296,11 +296,11 @@ func AddPushMirror(ctx *context.APIContext) { CreatePushMirror(ctx, pushMirror) } -// DeletePushMirrorByRemoteName deletes a push mirror from a repository by remoteName +// DeletePushMirrorByRemoteName removes a push mirror from a repository by remoteName func DeletePushMirrorByRemoteName(ctx *context.APIContext) { // swagger:operation DELETE /repos/{owner}/{repo}/push_mirrors/{name} repository repoDeletePushMirror // --- - // summary: deletes a push mirror from a repository by remoteName + // summary: Remove a push mirror from a repository by remoteName // produces: // - application/json // parameters: diff --git a/routers/api/v1/repo/pull_review.go b/routers/api/v1/repo/pull_review.go index 830a62bf54..06b47fef70 100644 --- a/routers/api/v1/repo/pull_review.go +++ b/routers/api/v1/repo/pull_review.go @@ -716,7 +716,7 @@ func prepareSingleReview(ctx *context.APIContext) (*issues_model.Review, *issues func CreateReviewRequests(ctx *context.APIContext) { // swagger:operation POST /repos/{owner}/{repo}/pulls/{index}/requested_reviewers repository repoCreatePullReviewRequests // --- - // summary: create review requests for a pull request + // summary: Create review requests for a pull request // produces: // - application/json // parameters: @@ -757,7 +757,7 @@ func CreateReviewRequests(ctx *context.APIContext) { func DeleteReviewRequests(ctx *context.APIContext) { // swagger:operation DELETE /repos/{owner}/{repo}/pulls/{index}/requested_reviewers repository repoDeletePullReviewRequests // --- - // summary: cancel review requests for a pull request + // summary: Cancel review requests for a pull request // produces: // - application/json // parameters: diff --git a/routers/api/v1/repo/topic.go b/routers/api/v1/repo/topic.go index daa637936e..8829e37bc3 100644 --- a/routers/api/v1/repo/topic.go +++ b/routers/api/v1/repo/topic.go @@ -253,17 +253,17 @@ func DeleteTopic(ctx *context.APIContext) { ctx.Status(http.StatusNoContent) } -// TopicSearch search for creating topic +// TopicSearch searches known topics, i.e. when adding a topic to a repository func TopicSearch(ctx *context.APIContext) { // swagger:operation GET /topics/search repository topicSearch // --- - // summary: search topics via keyword + // summary: Search for topics by keyword // produces: // - application/json // parameters: // - name: q // in: query - // description: keywords to search + // description: keyword to search for // required: true // type: string // - name: page diff --git a/routers/api/v1/user/app.go b/routers/api/v1/user/app.go index 138ad5a1d2..65955913fd 100644 --- a/routers/api/v1/user/app.go +++ b/routers/api/v1/user/app.go @@ -71,11 +71,11 @@ func ListAccessTokens(ctx *context.APIContext) { ctx.JSON(http.StatusOK, &apiTokens) } -// CreateAccessToken create access tokens +// CreateAccessToken creates an access token for doer func CreateAccessToken(ctx *context.APIContext) { // swagger:operation POST /users/{username}/tokens user userCreateToken // --- - // summary: Create an access token + // summary: Generate an access token for the current user // consumes: // - application/json // produces: @@ -141,11 +141,11 @@ func CreateAccessToken(ctx *context.APIContext) { }) } -// DeleteAccessToken delete access tokens +// DeleteAccessToken deletes an access token from doer's account func DeleteAccessToken(ctx *context.APIContext) { // swagger:operation DELETE /users/{username}/tokens/{token} user userDeleteAccessToken // --- - // summary: delete an access token + // summary: Delete an access token from current user's account // produces: // - application/json // parameters: @@ -214,7 +214,7 @@ func DeleteAccessToken(ctx *context.APIContext) { func CreateOauth2Application(ctx *context.APIContext) { // swagger:operation POST /user/applications/oauth2 user userCreateOAuth2Application // --- - // summary: creates a new OAuth2 application + // summary: Creates a new OAuth2 application // produces: // - application/json // parameters: @@ -298,11 +298,11 @@ func ListOauth2Applications(ctx *context.APIContext) { ctx.JSON(http.StatusOK, &apiApps) } -// DeleteOauth2Application delete OAuth2 Application +// DeleteOauth2Application delete OAuth2 application func DeleteOauth2Application(ctx *context.APIContext) { // swagger:operation DELETE /user/applications/oauth2/{id} user userDeleteOAuth2Application // --- - // summary: delete an OAuth2 Application + // summary: Delete an OAuth2 application // produces: // - application/json // parameters: @@ -334,11 +334,11 @@ func DeleteOauth2Application(ctx *context.APIContext) { ctx.Status(http.StatusNoContent) } -// GetOauth2Application get OAuth2 Application +// GetOauth2Application returns an OAuth2 application func GetOauth2Application(ctx *context.APIContext) { // swagger:operation GET /user/applications/oauth2/{id} user userGetOAuth2Application // --- - // summary: get an OAuth2 Application + // summary: Get an OAuth2 application // produces: // - application/json // parameters: @@ -377,11 +377,11 @@ func GetOauth2Application(ctx *context.APIContext) { ctx.JSON(http.StatusOK, convert.ToOAuth2Application(app)) } -// UpdateOauth2Application update OAuth2 Application +// UpdateOauth2Application updates an OAuth2 application func UpdateOauth2Application(ctx *context.APIContext) { // swagger:operation PATCH /user/applications/oauth2/{id} user userUpdateOAuth2Application // --- - // summary: update an OAuth2 Application, this includes regenerating the client secret + // summary: Update an OAuth2 application, this includes regenerating the client secret // produces: // - application/json // parameters: diff --git a/routers/api/v1/user/avatar.go b/routers/api/v1/user/avatar.go index 453682a37b..2b0659c251 100644 --- a/routers/api/v1/user/avatar.go +++ b/routers/api/v1/user/avatar.go @@ -13,11 +13,11 @@ import ( user_service "forgejo.org/services/user" ) -// UpdateAvatar updates the Avatar of an User +// UpdateAvatar updates doer's avatar func UpdateAvatar(ctx *context.APIContext) { // swagger:operation POST /user/avatar user userUpdateAvatar // --- - // summary: Update Avatar + // summary: Update avatar of the current user // produces: // - application/json // parameters: @@ -49,11 +49,11 @@ func UpdateAvatar(ctx *context.APIContext) { ctx.Status(http.StatusNoContent) } -// DeleteAvatar deletes the Avatar of an User +// DeleteAvatar deletes doer's avatar func DeleteAvatar(ctx *context.APIContext) { // swagger:operation DELETE /user/avatar user userDeleteAvatar // --- - // summary: Delete Avatar + // summary: Delete avatar of the current user. It will be replaced by a default one // produces: // - application/json // responses: diff --git a/routers/api/v1/user/email.go b/routers/api/v1/user/email.go index 03d8d14b90..38da23442d 100644 --- a/routers/api/v1/user/email.go +++ b/routers/api/v1/user/email.go @@ -16,12 +16,12 @@ import ( user_service "forgejo.org/services/user" ) -// ListEmails list all of the authenticated user's email addresses +// ListEmails lists doer's all email addresses // see https://github.com/gogits/go-gogs-client/wiki/Users-Emails#list-email-addresses-for-a-user func ListEmails(ctx *context.APIContext) { // swagger:operation GET /user/emails user userListEmails // --- - // summary: List the authenticated user's email addresses + // summary: List all email addresses of the current user // produces: // - application/json // responses: @@ -44,11 +44,11 @@ func ListEmails(ctx *context.APIContext) { ctx.JSON(http.StatusOK, &apiEmails) } -// AddEmail add an email address +// AddEmail adds an email address to doer's account func AddEmail(ctx *context.APIContext) { // swagger:operation POST /user/emails user userAddEmail // --- - // summary: Add email addresses + // summary: Add an email addresses to the current user's account // produces: // - application/json // parameters: @@ -102,11 +102,11 @@ func AddEmail(ctx *context.APIContext) { ctx.JSON(http.StatusCreated, apiEmails) } -// DeleteEmail delete email +// DeleteEmail deletes an email address from doer's account func DeleteEmail(ctx *context.APIContext) { // swagger:operation DELETE /user/emails user userDeleteEmail // --- - // summary: Delete email addresses + // summary: Delete email addresses from the current user's account // produces: // - application/json // parameters: diff --git a/routers/api/v1/user/gpg_key.go b/routers/api/v1/user/gpg_key.go index 886e33b205..bb7f3d3522 100644 --- a/routers/api/v1/user/gpg_key.go +++ b/routers/api/v1/user/gpg_key.go @@ -249,11 +249,11 @@ type swaggerUserCurrentPostGPGKey struct { Form api.CreateGPGKeyOption } -// CreateGPGKey create a GPG key belonging to the authenticated user +// CreateGPGKey adds a GPG public key doer's account func CreateGPGKey(ctx *context.APIContext) { // swagger:operation POST /user/gpg_keys user userCurrentPostGPGKey // --- - // summary: Create a GPG key + // summary: Add a GPG public key to current user's account // consumes: // - application/json // produces: @@ -274,11 +274,11 @@ func CreateGPGKey(ctx *context.APIContext) { CreateUserGPGKey(ctx, *form, ctx.Doer.ID) } -// DeleteGPGKey remove a GPG key belonging to the authenticated user +// DeleteGPGKey removes a GPG public key from doer's account func DeleteGPGKey(ctx *context.APIContext) { // swagger:operation DELETE /user/gpg_keys/{id} user userCurrentDeleteGPGKey // --- - // summary: Remove a GPG key + // summary: Remove a GPG public key from current user's account // produces: // - application/json // parameters: diff --git a/routers/api/v1/user/settings.go b/routers/api/v1/user/settings.go index 134b448718..53455bcd75 100644 --- a/routers/api/v1/user/settings.go +++ b/routers/api/v1/user/settings.go @@ -14,11 +14,11 @@ import ( user_service "forgejo.org/services/user" ) -// GetUserSettings returns user settings +// GetUserSettings returns doer's account settings func GetUserSettings(ctx *context.APIContext) { // swagger:operation GET /user/settings user getUserSettings // --- - // summary: Get user settings + // summary: Get current user's account settings // produces: // - application/json // responses: @@ -31,11 +31,11 @@ func GetUserSettings(ctx *context.APIContext) { ctx.JSON(http.StatusOK, convert.User2UserSettings(ctx.Doer)) } -// UpdateUserSettings returns user settings +// UpdateUserSettings updates settings in doer's account func UpdateUserSettings(ctx *context.APIContext) { // swagger:operation PATCH /user/settings user updateUserSettings // --- - // summary: Update user settings + // summary: Update settings in current user's account // parameters: // - name: body // in: body diff --git a/routers/api/v1/user/user.go b/routers/api/v1/user/user.go index 19f7440047..2bd2829d09 100644 --- a/routers/api/v1/user/user.go +++ b/routers/api/v1/user/user.go @@ -266,7 +266,7 @@ func ListBlockedUsers(ctx *context.APIContext) { func BlockUser(ctx *context.APIContext) { // swagger:operation PUT /user/block/{username} user userBlockUser // --- - // summary: Blocks a user from the doer. + // summary: Blocks a user from the doer // produces: // - application/json // parameters: @@ -299,7 +299,7 @@ func BlockUser(ctx *context.APIContext) { func UnblockUser(ctx *context.APIContext) { // swagger:operation PUT /user/unblock/{username} user userUnblockUser // --- - // summary: Unblocks a user from the doer. + // summary: Unblocks a user from the doer // produces: // - application/json // parameters: diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index e03f5d57c1..a610620eab 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -239,7 +239,7 @@ "tags": [ "admin" ], - "summary": "List all emails", + "summary": "List all users' email addresses", "operationId": "adminGetAllEmails", "parameters": [ { @@ -273,7 +273,7 @@ "tags": [ "admin" ], - "summary": "Search all emails", + "summary": "Search users' email addresses", "operationId": "adminSearchEmails", "parameters": [ { @@ -313,7 +313,7 @@ "tags": [ "admin" ], - "summary": "List system's webhooks", + "summary": "List global (system) webhooks", "operationId": "adminListHooks", "parameters": [ { @@ -1220,7 +1220,7 @@ "tags": [ "admin" ], - "summary": "Create a user", + "summary": "Create a user account", "operationId": "adminCreateUser", "parameters": [ { @@ -1255,7 +1255,7 @@ "tags": [ "admin" ], - "summary": "Delete a user", + "summary": "Delete user account", "operationId": "adminDeleteUser", "parameters": [ { @@ -1342,7 +1342,7 @@ "tags": [ "admin" ], - "summary": "Add a public key on behalf of a user", + "summary": "Add an SSH public key to user's account", "operationId": "adminCreatePublicKey", "parameters": [ { @@ -1381,7 +1381,7 @@ "tags": [ "admin" ], - "summary": "Delete a user's public key", + "summary": "Remove a public key from user's account", "operationId": "adminDeleteUserPublicKey", "parameters": [ { @@ -2158,7 +2158,7 @@ "tags": [ "organization" ], - "summary": "Get list of organizations", + "summary": "List all organizations", "operationId": "orgGetAll", "parameters": [ { @@ -2381,7 +2381,7 @@ "tags": [ "organization" ], - "summary": "List an organization's actions secrets", + "summary": "List actions secrets of an organization", "operationId": "orgListActionsSecrets", "parameters": [ { @@ -2514,7 +2514,7 @@ "tags": [ "organization" ], - "summary": "Get an org-level variables list", + "summary": "List variables of an organization", "operationId": "getOrgVariablesList", "parameters": [ { @@ -2558,7 +2558,7 @@ "tags": [ "organization" ], - "summary": "Get an org-level variable", + "summary": "Get organization's variable by name", "operationId": "getOrgVariable", "parameters": [ { @@ -2598,7 +2598,7 @@ "tags": [ "organization" ], - "summary": "Update an org-level variable", + "summary": "Update variable in organization", "operationId": "updateOrgVariable", "parameters": [ { @@ -2648,7 +2648,7 @@ "tags": [ "organization" ], - "summary": "Create an org-level variable", + "summary": "Create a new variable in organization", "operationId": "createOrgVariable", "parameters": [ { @@ -2695,7 +2695,7 @@ "tags": [ "organization" ], - "summary": "Delete an org-level variable", + "summary": "Delete organization's variable by name", "operationId": "deleteOrgVariable", "parameters": [ { @@ -2788,7 +2788,7 @@ "tags": [ "organization" ], - "summary": "Update Avatar", + "summary": "Update an organization's avatar", "operationId": "orgUpdateAvatar", "parameters": [ { @@ -2822,7 +2822,7 @@ "tags": [ "organization" ], - "summary": "Delete Avatar", + "summary": "Delete an organization's avatar. It will be replaced by a default one", "operationId": "orgDeleteAvatar", "parameters": [ { @@ -5730,7 +5730,7 @@ "tags": [ "repository" ], - "summary": "Update avatar", + "summary": "Update a repository's avatar", "operationId": "repoUpdateAvatar", "parameters": [ { @@ -5771,7 +5771,7 @@ "tags": [ "repository" ], - "summary": "Delete avatar", + "summary": "Delete a repository's avatar", "operationId": "repoDeleteAvatar", "parameters": [ { @@ -13690,7 +13690,7 @@ "tags": [ "repository" ], - "summary": "create review requests for a pull request", + "summary": "Create review requests for a pull request", "operationId": "repoCreatePullReviewRequests", "parameters": [ { @@ -13743,7 +13743,7 @@ "tags": [ "repository" ], - "summary": "cancel review requests for a pull request", + "summary": "Cancel review requests for a pull request", "operationId": "repoDeletePullReviewRequests", "parameters": [ { @@ -14558,7 +14558,7 @@ "tags": [ "repository" ], - "summary": "add a push mirror to the repository", + "summary": "Set up a new push mirror in a repository", "operationId": "repoAddPushMirror", "parameters": [ { @@ -14702,7 +14702,7 @@ "tags": [ "repository" ], - "summary": "deletes a push mirror from a repository by remoteName", + "summary": "Remove a push mirror from a repository by remoteName", "operationId": "repoDeletePushMirror", "parameters": [ { @@ -18026,12 +18026,12 @@ "tags": [ "repository" ], - "summary": "search topics via keyword", + "summary": "Search for topics by keyword", "operationId": "topicSearch", "parameters": [ { "type": "string", - "description": "keywords to search", + "description": "keyword to search for", "name": "q", "in": "query", "required": true @@ -18490,7 +18490,7 @@ "tags": [ "user" ], - "summary": "creates a new OAuth2 application", + "summary": "Creates a new OAuth2 application", "operationId": "userCreateOAuth2Application", "parameters": [ { @@ -18526,7 +18526,7 @@ "tags": [ "user" ], - "summary": "get an OAuth2 Application", + "summary": "Get an OAuth2 application", "operationId": "userGetOAuth2Application", "parameters": [ { @@ -18560,7 +18560,7 @@ "tags": [ "user" ], - "summary": "delete an OAuth2 Application", + "summary": "Delete an OAuth2 application", "operationId": "userDeleteOAuth2Application", "parameters": [ { @@ -18594,7 +18594,7 @@ "tags": [ "user" ], - "summary": "update an OAuth2 Application, this includes regenerating the client secret", + "summary": "Update an OAuth2 application, this includes regenerating the client secret", "operationId": "userUpdateOAuth2Application", "parameters": [ { @@ -18638,7 +18638,7 @@ "tags": [ "user" ], - "summary": "Update Avatar", + "summary": "Update avatar of the current user", "operationId": "userUpdateAvatar", "parameters": [ { @@ -18668,7 +18668,7 @@ "tags": [ "user" ], - "summary": "Delete Avatar", + "summary": "Delete avatar of the current user. It will be replaced by a default one", "operationId": "userDeleteAvatar", "responses": { "204": { @@ -18691,7 +18691,7 @@ "tags": [ "user" ], - "summary": "Blocks a user from the doer.", + "summary": "Blocks a user from the doer", "operationId": "userBlockUser", "parameters": [ { @@ -18729,7 +18729,7 @@ "tags": [ "user" ], - "summary": "List the authenticated user's email addresses", + "summary": "List all email addresses of the current user", "operationId": "userListEmails", "responses": { "200": { @@ -18750,7 +18750,7 @@ "tags": [ "user" ], - "summary": "Add email addresses", + "summary": "Add an email addresses to the current user's account", "operationId": "userAddEmail", "parameters": [ { @@ -18783,7 +18783,7 @@ "tags": [ "user" ], - "summary": "Delete email addresses", + "summary": "Delete email addresses from the current user's account", "operationId": "userDeleteEmail", "parameters": [ { @@ -19080,7 +19080,7 @@ "tags": [ "user" ], - "summary": "Create a GPG key", + "summary": "Add a GPG public key to current user's account", "operationId": "userCurrentPostGPGKey", "parameters": [ { @@ -19152,7 +19152,7 @@ "tags": [ "user" ], - "summary": "Remove a GPG key", + "summary": "Remove a GPG public key from current user's account", "operationId": "userCurrentDeleteGPGKey", "parameters": [ { @@ -19862,7 +19862,7 @@ "tags": [ "user" ], - "summary": "Get user settings", + "summary": "Get current user's account settings", "operationId": "getUserSettings", "responses": { "200": { @@ -19883,7 +19883,7 @@ "tags": [ "user" ], - "summary": "Update user settings", + "summary": "Update settings in current user's account", "operationId": "updateUserSettings", "parameters": [ { @@ -20230,7 +20230,7 @@ "tags": [ "user" ], - "summary": "Unblocks a user from the doer.", + "summary": "Unblocks a user from the doer", "operationId": "userUnblockUser", "parameters": [ { @@ -20903,7 +20903,7 @@ "tags": [ "user" ], - "summary": "Create an access token", + "summary": "Generate an access token for the current user", "operationId": "userCreateToken", "parameters": [ { @@ -20945,7 +20945,7 @@ "tags": [ "user" ], - "summary": "delete an access token", + "summary": "Delete an access token from current user's account", "operationId": "userDeleteAccessToken", "parameters": [ { From 79af994eae32214f0137ce33aa1439108692de78 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Thu, 31 Jul 2025 13:41:59 +0200 Subject: [PATCH 247/495] chore: github.com/nektos/act is now at code.forgejo.org/forgejo/runner/v9 (#8742) Refs: https://code.forgejo.org/forgejo/runner/releases/tag/v9.0.1 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8742 Reviewed-by: Michael Kriese Co-authored-by: Earl Warren Co-committed-by: Earl Warren --- assets/go-licenses.json | 10 +++++----- go.mod | 8 +++----- go.sum | 12 ++++++------ models/actions/run.go | 2 +- models/actions/task.go | 2 +- modules/actions/workflows.go | 6 +++--- renovate.json | 2 -- routers/web/repo/actions/actions.go | 2 +- routers/web/repo/view.go | 2 +- services/actions/commit_status.go | 2 +- services/actions/job_emitter.go | 2 +- services/actions/notifier_helper.go | 4 ++-- services/actions/schedule_tasks.go | 4 ++-- services/actions/workflows.go | 4 ++-- 14 files changed, 29 insertions(+), 33 deletions(-) diff --git a/assets/go-licenses.json b/assets/go-licenses.json index c3b261320c..59d933a6d6 100644 --- a/assets/go-licenses.json +++ b/assets/go-licenses.json @@ -34,6 +34,11 @@ "path": "code.forgejo.org/forgejo/reply/LICENSE", "licenseText": "MIT License\n\nCopyright (c) The Forgejo Authors\nCopyright (c) Discourse\nCopyright (c) Claudemiro\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n" }, + { + "name": "code.forgejo.org/forgejo/runner/v9/act", + "path": "code.forgejo.org/forgejo/runner/v9/act/LICENSE", + "licenseText": "Copyright (c) 2023-2025 The Forgejo Authors\nCopyright (c) 2022 The Gitea Authors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n" + }, { "name": "code.forgejo.org/go-chi/binding", "path": "code.forgejo.org/go-chi/binding/LICENSE", @@ -764,11 +769,6 @@ "path": "github.com/munnerz/goautoneg/LICENSE", "licenseText": "Copyright (c) 2011, Open Knowledge Foundation Ltd.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n\n Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in\n the documentation and/or other materials provided with the\n distribution.\n\n Neither the name of the Open Knowledge Foundation Ltd. nor the\n names of its contributors may be used to endorse or promote\n products derived from this software without specific prior written\n permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" }, - { - "name": "github.com/nektos/act/pkg", - "path": "github.com/nektos/act/pkg/LICENSE", - "licenseText": "MIT License\n\nCopyright (c) 2022 The Gitea Authors\nCopyright (c) 2019\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n" - }, { "name": "github.com/niklasfasching/go-org/org", "path": "github.com/niklasfasching/go-org/org/LICENSE", diff --git a/go.mod b/go.mod index 9cf9183b8e..167fe117c1 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( code.forgejo.org/forgejo/go-rpmutils v1.0.0 code.forgejo.org/forgejo/levelqueue v1.0.0 code.forgejo.org/forgejo/reply v1.0.2 + code.forgejo.org/forgejo/runner/v9 v9.0.1 code.forgejo.org/go-chi/binding v1.0.1 code.forgejo.org/go-chi/cache v1.0.1 code.forgejo.org/go-chi/captcha v1.0.2 @@ -77,7 +78,6 @@ require ( github.com/microcosm-cc/bluemonday v1.0.27 github.com/minio/minio-go/v7 v7.0.94 github.com/msteinert/pam/v2 v2.1.0 - github.com/nektos/act v0.2.52 github.com/niklasfasching/go-org v1.9.1 github.com/olivere/elastic/v7 v7.0.32 github.com/opencontainers/go-digest v1.0.0 @@ -105,7 +105,7 @@ require ( golang.org/x/sync v0.16.0 golang.org/x/sys v0.34.0 golang.org/x/text v0.27.0 - google.golang.org/protobuf v1.36.4 + google.golang.org/protobuf v1.36.6 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df gopkg.in/ini.v1 v1.67.0 gopkg.in/yaml.v3 v3.0.1 @@ -236,7 +236,7 @@ require ( go.uber.org/zap v1.27.0 // indirect go.uber.org/zap/exp v0.3.0 // indirect golang.org/x/mod v0.26.0 // indirect - golang.org/x/time v0.11.0 // indirect + golang.org/x/time v0.12.0 // indirect golang.org/x/tools v0.35.0 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/warnings.v0 v0.1.2 // indirect @@ -244,8 +244,6 @@ require ( replace github.com/hashicorp/go-version => github.com/6543/go-version v1.3.1 -replace github.com/nektos/act => code.forgejo.org/forgejo/act v1.33.0 - replace github.com/mholt/archiver/v3 => code.forgejo.org/forgejo/archiver/v3 v3.5.1 replace github.com/gliderlabs/ssh => code.forgejo.org/forgejo/ssh v0.0.0-20241211213324-5fc306ca0616 diff --git a/go.sum b/go.sum index 1367fc8d10..a8af308a15 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,6 @@ code.forgejo.org/f3/gof3/v3 v3.11.0 h1:f/xToKwqTgxG6PYxvewywjDQyCcyHEEJ6sZqUitFs code.forgejo.org/f3/gof3/v3 v3.11.0/go.mod h1:4FaRUNSQGBiD1M0DuB0yNv+Z2wMtlOeckgygHSSq4KQ= code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251 h1:HTZl3CBk3ABNYtFI6TPLvJgGKFIhKT5CBk0sbOtkDKU= code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251/go.mod h1:PphB88CPbx601QrWPMZATeorACeVmQlyv3u+uUMbSaM= -code.forgejo.org/forgejo/act v1.33.0 h1:ayQTXkpk+Vj5/yQMNZagA0xpQgGVeSbcrPXcIS3K1kY= -code.forgejo.org/forgejo/act v1.33.0/go.mod h1:WkmxVBteC4zoyQGYp8ZFZY7Xb+jat+b7ChvqW6TxqF8= code.forgejo.org/forgejo/archiver/v3 v3.5.1 h1:UmmbA7D5550uf71SQjarmrn6yKwOGxtEjb3jaYYtmSE= code.forgejo.org/forgejo/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4= code.forgejo.org/forgejo/go-rpmutils v1.0.0 h1:RZGGeKt70p/WaIEL97pyT6uiiEIoN8/aLmS5Z6WmX0M= @@ -16,6 +14,8 @@ code.forgejo.org/forgejo/levelqueue v1.0.0 h1:9krYpU6BM+j/1Ntj6m+VCAIu0UNnne1/Uf code.forgejo.org/forgejo/levelqueue v1.0.0/go.mod h1:fmG6zhVuqim2rxSFOoasgXO8V2W/k9U31VVYqLIRLhQ= code.forgejo.org/forgejo/reply v1.0.2 h1:dMhQCHV6/O3L5CLWNTol+dNzDAuyCK88z4J/lCdgFuQ= code.forgejo.org/forgejo/reply v1.0.2/go.mod h1:RyZUfzQLc+fuLIGjTSQWDAJWPiL4WtKXB/FifT5fM7U= +code.forgejo.org/forgejo/runner/v9 v9.0.1 h1:Qdg7c0yvqgjXj9NMQ+Vsq+GuUoGshHFHGYF79Bz+/2g= +code.forgejo.org/forgejo/runner/v9 v9.0.1/go.mod h1:b6JWcpwHnBwLuWeQERM4pCRzFbnsEvC9gagQfxbZeJw= code.forgejo.org/forgejo/ssh v0.0.0-20241211213324-5fc306ca0616 h1:kEZL84+02jY9RxXM4zHBWZ3Fml0B09cmP1LGkDsCfIA= code.forgejo.org/forgejo/ssh v0.0.0-20241211213324-5fc306ca0616/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= code.forgejo.org/go-chi/binding v1.0.1 h1:coKNI+X1NzRN7X85LlrpvBRqk0TXpJ+ja28vusQWEuY= @@ -679,8 +679,8 @@ golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= -golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= -golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -700,8 +700,8 @@ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM= -google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/models/actions/run.go b/models/actions/run.go index 69592120e9..6e0c70f8cf 100644 --- a/models/actions/run.go +++ b/models/actions/run.go @@ -21,7 +21,7 @@ import ( "forgejo.org/modules/util" webhook_module "forgejo.org/modules/webhook" - "github.com/nektos/act/pkg/jobparser" + "code.forgejo.org/forgejo/runner/v9/act/jobparser" "xorm.io/builder" ) diff --git a/models/actions/task.go b/models/actions/task.go index 7c85ffc232..88b30196e3 100644 --- a/models/actions/task.go +++ b/models/actions/task.go @@ -17,8 +17,8 @@ import ( "forgejo.org/modules/timeutil" "forgejo.org/modules/util" + "code.forgejo.org/forgejo/runner/v9/act/jobparser" lru "github.com/hashicorp/golang-lru/v2" - "github.com/nektos/act/pkg/jobparser" "xorm.io/builder" ) diff --git a/modules/actions/workflows.go b/modules/actions/workflows.go index b04f97df0f..26d862ac4a 100644 --- a/modules/actions/workflows.go +++ b/modules/actions/workflows.go @@ -13,10 +13,10 @@ import ( api "forgejo.org/modules/structs" webhook_module "forgejo.org/modules/webhook" + "code.forgejo.org/forgejo/runner/v9/act/jobparser" + "code.forgejo.org/forgejo/runner/v9/act/model" + "code.forgejo.org/forgejo/runner/v9/act/workflowpattern" "github.com/gobwas/glob" - "github.com/nektos/act/pkg/jobparser" - "github.com/nektos/act/pkg/model" - "github.com/nektos/act/pkg/workflowpattern" "gopkg.in/yaml.v3" ) diff --git a/renovate.json b/renovate.json index e0d7bd5456..d76b6c7d23 100644 --- a/renovate.json +++ b/renovate.json @@ -28,8 +28,6 @@ "matchPackageNames": [ "docker.io/bitnami/minio", "github.com/go-ap/activitypub", - "github.com/nektos/act", - "gitea.com/gitea/act" ], "dependencyDashboardApproval": true }, diff --git a/routers/web/repo/actions/actions.go b/routers/web/repo/actions/actions.go index 6f1f19b107..0c07e1968e 100644 --- a/routers/web/repo/actions/actions.go +++ b/routers/web/repo/actions/actions.go @@ -27,7 +27,7 @@ import ( "forgejo.org/services/context" "forgejo.org/services/convert" - "github.com/nektos/act/pkg/model" + "code.forgejo.org/forgejo/runner/v9/act/model" ) const ( diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go index 8e1028968e..36791fc770 100644 --- a/routers/web/repo/view.go +++ b/routers/web/repo/view.go @@ -56,7 +56,7 @@ import ( repo_service "forgejo.org/services/repository" files_service "forgejo.org/services/repository/files" - "github.com/nektos/act/pkg/model" + "code.forgejo.org/forgejo/runner/v9/act/model" _ "golang.org/x/image/bmp" // for processing bmp images _ "golang.org/x/image/webp" // for processing webp images diff --git a/services/actions/commit_status.go b/services/actions/commit_status.go index b054f2036c..d588c0f178 100644 --- a/services/actions/commit_status.go +++ b/services/actions/commit_status.go @@ -19,7 +19,7 @@ import ( webhook_module "forgejo.org/modules/webhook" commitstatus_service "forgejo.org/services/repository/commitstatus" - "github.com/nektos/act/pkg/jobparser" + "code.forgejo.org/forgejo/runner/v9/act/jobparser" ) // CreateCommitStatus creates a commit status for the given job. diff --git a/services/actions/job_emitter.go b/services/actions/job_emitter.go index 8178d210ce..03428736b8 100644 --- a/services/actions/job_emitter.go +++ b/services/actions/job_emitter.go @@ -13,7 +13,7 @@ import ( "forgejo.org/modules/graceful" "forgejo.org/modules/queue" - "github.com/nektos/act/pkg/jobparser" + "code.forgejo.org/forgejo/runner/v9/act/jobparser" "xorm.io/builder" ) diff --git a/services/actions/notifier_helper.go b/services/actions/notifier_helper.go index e31817a5e2..2b4273df31 100644 --- a/services/actions/notifier_helper.go +++ b/services/actions/notifier_helper.go @@ -30,8 +30,8 @@ import ( webhook_module "forgejo.org/modules/webhook" "forgejo.org/services/convert" - "github.com/nektos/act/pkg/jobparser" - "github.com/nektos/act/pkg/model" + "code.forgejo.org/forgejo/runner/v9/act/jobparser" + "code.forgejo.org/forgejo/runner/v9/act/model" ) type methodCtx struct{} diff --git a/services/actions/schedule_tasks.go b/services/actions/schedule_tasks.go index d275837cbb..fb9c5094c5 100644 --- a/services/actions/schedule_tasks.go +++ b/services/actions/schedule_tasks.go @@ -18,8 +18,8 @@ import ( "forgejo.org/modules/timeutil" webhook_module "forgejo.org/modules/webhook" - "github.com/nektos/act/pkg/jobparser" - act_model "github.com/nektos/act/pkg/model" + "code.forgejo.org/forgejo/runner/v9/act/jobparser" + act_model "code.forgejo.org/forgejo/runner/v9/act/model" "xorm.io/builder" ) diff --git a/services/actions/workflows.go b/services/actions/workflows.go index 22417d4e32..b5875a7a50 100644 --- a/services/actions/workflows.go +++ b/services/actions/workflows.go @@ -24,8 +24,8 @@ import ( "forgejo.org/modules/webhook" "forgejo.org/services/convert" - "github.com/nektos/act/pkg/jobparser" - act_model "github.com/nektos/act/pkg/model" + "code.forgejo.org/forgejo/runner/v9/act/jobparser" + act_model "code.forgejo.org/forgejo/runner/v9/act/model" ) type InputRequiredErr struct { From be7b87c1c26540873ec18539e93091bdc368b9d7 Mon Sep 17 00:00:00 2001 From: Codeberg Translate Date: Thu, 31 Jul 2025 13:00:55 +0000 Subject: [PATCH 248/495] i18n: update of translations from Codeberg Translate Co-authored-by: 0ko <0ko@noreply.codeberg.org> Co-authored-by: Benedikt Straub Co-authored-by: BlackSpirits Co-authored-by: Codeberg Translate Co-authored-by: Edgarsons Co-authored-by: Hiraku Co-authored-by: Juno Takano Co-authored-by: Lzebulon Co-authored-by: SomeTr Co-authored-by: Vyxie Co-authored-by: Wuzzy Co-authored-by: adf19 Co-authored-by: amv-bamboo Co-authored-by: dobrovolskyi Co-authored-by: earl-warren Co-authored-by: justbispo Co-authored-by: retarded-beast Co-authored-by: xtex Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/ar/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/de/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/fil/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/fr/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/lv/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/nds/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/pt_BR/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/pt_PT/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/ru/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/uk/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/ar/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/be/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/de/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/fr/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/pt_PT/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/ru/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/sv/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/uk/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/zh_Hans/ Translation: Forgejo/forgejo Translation: Forgejo/forgejo-next --- options/locale/locale_ar.ini | 62 +++++++++++--- options/locale/locale_be.ini | 14 +++- options/locale/locale_de-DE.ini | 26 +++--- options/locale/locale_fr-FR.ini | 4 +- options/locale/locale_pt-PT.ini | 12 +-- options/locale/locale_ru-RU.ini | 22 ++--- options/locale/locale_sv-SE.ini | 6 ++ options/locale/locale_uk-UA.ini | 112 ++++++++++++++++---------- options/locale/locale_zh-CN.ini | 6 +- options/locale_next/locale_ar.json | 3 +- options/locale_next/locale_de-DE.json | 3 +- options/locale_next/locale_fil.json | 3 +- options/locale_next/locale_fr-FR.json | 11 ++- options/locale_next/locale_lv-LV.json | 3 +- options/locale_next/locale_nds.json | 3 +- options/locale_next/locale_pt-BR.json | 3 +- options/locale_next/locale_pt-PT.json | 9 ++- options/locale_next/locale_ru-RU.json | 9 ++- options/locale_next/locale_uk-UA.json | 4 +- 19 files changed, 211 insertions(+), 104 deletions(-) diff --git a/options/locale/locale_ar.ini b/options/locale/locale_ar.ini index 0b81b9cc03..d41677d540 100644 --- a/options/locale/locale_ar.ini +++ b/options/locale/locale_ar.ini @@ -1006,7 +1006,7 @@ issues.dependency.issue_no_dependencies = بلا اعتمادية. issues.filter_sort.mostcomment = الأكثر تعليقات issues.label.filter_sort.reverse_by_size = الأكبر حجما release.message = صِف هذا الإصدار -editor.cancel_lower = ألغِ +editor.cancel_lower = إلغاء issues.label.filter_sort.reverse_alphabetically = أبجديا معكوسا trust_model_helper = اختر نموذج الثقة للتحقق من التوقيعات. الخيارات المتاحة هي: issues.unlock_error = لا يمكن فك قفل مسألة غير مقفلة. @@ -1040,7 +1040,7 @@ issues.label_archive = أرشف التصنيف issues.choose.blank_about = أنشئ مسألة من القالب المبدئي. issues.filter_poster = منشئ release.delete_release = احذف الإصدار -editor.cancel = ألغِ +editor.cancel = إلغاء issues.change_title_at = `غيّر العنوان من %s إلى %s %s` branch.new_branch_from = أنشئ فرعًا جديدًا من "%s" issues.due_date_form_edit = "عدّل" @@ -1065,15 +1065,15 @@ projects.desc = أدر المسائل وطلبات الدمج في لوحات م ambiguous_runes_header = `يحتوي هذا الملف على محارف يونيكود غامضة` executable_file = ملف تنفيذي settings.webhook.response = الاستجابة -editor.delete = احذف %s -file_view_raw = أظهر المجرد +editor.delete = حذف %s +file_view_raw = أظهر الخام settings.add_webhook = أضف خطاف ويب settings.slack_channel = قناة commits = إيداعات commit = إيداع -editor.upload_file = ارفع ملفا +editor.upload_file = رفع ملف settings.webhook.headers = الترويسات -org_labels_desc_manage = أدرها +org_labels_desc_manage = إدارة editor.patch = طبّق الرقعة editor.must_have_write_access = يجب أن يكون لديك إمكانية الكتابة حتى تعدّل هذا الملف أو تقترح تعديلات. template.webhooks = خطاطيف الويب @@ -1097,12 +1097,12 @@ settings.webhook.payload = المحتوى invisible_runes_header = `يحتوي هذا الملف على محارف يونيكود غير مرئية` editor.filename_help = أضف مجلدا بكتابة اسمه ثم شرطة مائلة ('/'). احذف مجلدا بضغط زر Backspace أول شيء في خانة الاسم. editor.commit_changes = أودع التعديلات -editor.add_file = أضف ملفا +editor.add_file = إضافة ملف settings.githook_name = اسم الخطاف editor.fork_before_edit = يجب أن تشتق هذا المستودع حتى تعدّل هذا الملف أو تقترح تعديلات. projects.description_placeholder = الوصف tag = وسم -file_raw = مجرد +file_raw = خام projects.create = أنشئ مشروعا settings.update_webhook = حدّث خطاف الويب editor.push_rejected_no_message = لقد رفض الخادوم التعديل بغير رسالة. نرجو مراجعة خطاطيف جت. @@ -1121,7 +1121,7 @@ editor.no_changes_to_show = لا توجد تعديلات لعرضها. settings.webhook.test_delivery = اختبار التوصيل commit_graph.hide_pr_refs = أخفِ طلبات الدمج editor.new_file = ملف جديد -file_view_source = أظهر المصدر +file_view_source = عرض المصدر settings.webhook_deletion_success = أزيل خطاف الويب. projects.title = العنوان settings.slack_domain = النطاق @@ -1150,11 +1150,11 @@ settings.add_hook_success = أضيف خطاف الويب. commit.revert-header = إرجاع: %s editor.file_already_exists = يوجد فعلا في هذا المستودع ملف باسم "%s". settings.web_hook_name_matrix = متركس -editor.filename_cannot_be_empty = لا يمكن ترك اسم الملف فارغا. +editor.filename_cannot_be_empty = لا يمكن ترك اسم الملف فارغاً. editor.add_tmpl = أضف '<%s>' editor.new_branch_name_desc = اسم الفرع الجديد… release = إصدار -editor.delete_this_file = احذف الملف +editor.delete_this_file = حذف الملف editor.or = أو editor.push_rejected_summary = رسالة الرفض الكاملة: settings.webhook_deletion = أزل خطاف الويب @@ -1588,7 +1588,7 @@ star = نجمة cite_this_repo = الاستشهاد بهذا المستودع no_desc = لا يوجد وصف migrate.github.description = ترحيل البيانات من github.com أو خادم GitHub Enterprise. -migrated_from_fake = +migrated_from_fake =تم الترحيل من %[1]s clone_this_repo = استنسخ هذا المستودع fork_from_self = لا يمكنك اشتقاق مستودع تملكه. fork_guest_user = سجّل الدخول لاشتقاق هذا المستودع. @@ -1627,6 +1627,44 @@ branch = فرع template.git_hooks_tooltip = يتعذر عليك حاليًا تعديل أو إزالة خطافات Git بمجرد إضافتها. حدد هذا فقط إذا كنت تثق بمستودع القالب. code.desc = الوصول إلى الشيفرة المصدرية والملفات والالتزامات والفروع. tree = شجرة +clear_ref = 'مسح المرجع الحالي' +project = المشارييع +filter_branch_and_tag = تصفية الفرع أو العلامة +find_tag = البحث عن علامة +commit_graph = الرسم البياني للإيداع +editor.edit_this_file = عدل الملف +editor.signoff_desc = أضف مقطورة موقّعة من قِبل المُجرّد في نهاية رسالة سجل الدخول. +n_release_one = %s إصدار +symbolic_link = رابط رمزي +editor.cannot_edit_lfs_files = لا يمكن تحرير ملفات LFS في واجهة الويب. +editor.this_file_locked = الملف مقفل +n_commit_few = %s إيداعات +editor.file_delete_success = تم حذف الملف "%s". +editor.edit_file = عدّل الملف +commit.contained_in_default_branch = هذا الإيداع جزء من الفرع الافتراضي +line = سطر +lines = أسطر +normal_view = عرض عادي +n_branch_one = %s فرع +n_commit_one = %s إيداع +view_git_blame = عرض مسؤول تعديل git +editor.add_tmpl.filename = اسم الملف +editor.name_your_file = اسم ملفك… +editor.propose_file_change = اقتراح تغيير الملف +editor.new_branch_name = تسمية الفرع الجديد لهذا الإيداع +from_comment = (تعليق) +no_eol.text = لا EOL +no_eol.tooltip = هذا الملف لا يحتوي على نهاية لخط الشخصية. +stored_lfs = مخزن مع Git LFS +commit.contained_in = هذا الإيداع موجود في: +file_view_rendered = عرض المُخرج النهائي +n_branch_few = %s فروع +n_tag_one = %s علامة +n_tag_few = ‪%s علامات +n_release_few = %s إصدارات +file.title = %s عند %s +vendored = مضمن +file_follow = متابعة الروابط الرمزية [mail] admin.new_user.text = من فضلك اضغط هنا لإدارة هذا المستخدم من لوحة الإدارة. diff --git a/options/locale/locale_be.ini b/options/locale/locale_be.ini index fe04dadc3e..25aff3019c 100644 --- a/options/locale/locale_be.ini +++ b/options/locale/locale_be.ini @@ -7,10 +7,20 @@ sign_in = Увайсці sign_in_or = або sign_out = Выйсці sign_up = Зарэгістравацца -link_account = Звязаць Уліковы запіс +link_account = Звязаць уліковы запіс register = Рэгістрацыя version = Версія powered_by = Працуе на ℅s page = Старонка home = Галоўная Старонка -sign_in_with_provider = Увайсці з %s \ No newline at end of file +sign_in_with_provider = Увайсці з %s +template = Шаблон +language = Мова +notifications = Апавяшчэнні +create_new = Стварыць… +user_profile_and_more = Профіль і налады… +signed_in_as = Увайшоў як +enable_javascript = Гэты вэб-сайт патрабуе JavaScript. +toc = Змест +licenses = Ліцэнзіі +return_to_forgejo = Вярнуцца да Forgejo \ No newline at end of file diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 8a87b4246a..790cacf3e7 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -633,7 +633,7 @@ repository_files_already_exist=Dateien für dieses Repository sind bereits vorha repository_files_already_exist.adopt=Dateien für dieses Repository existieren bereits und können nur übernommen werden. repository_files_already_exist.delete=Dateien für dieses Repository sind bereits vorhanden. Du must sie löschen. repository_files_already_exist.adopt_or_delete=Dateien für dieses Repository existieren bereits. Du musst sie entweder übernehmen oder löschen. -visit_rate_limit=Das Rate-Limit bei der Gegenseite wurde erreicht. +visit_rate_limit=Die Ratenbegrenzung bei der Gegenseite wurde erreicht. 2fa_auth_required=Die Gegenseite benötigt Zweifaktorauthentifikation. org_name_been_taken=Der Organisationsname ist bereits vergeben. team_name_been_taken=Der Teamname ist bereits vergeben. @@ -1243,7 +1243,7 @@ migrate_items_releases=Releases migrate_repo=Repository migrieren migrate.clone_address=Migrations-/Klon-URL migrate.clone_address_desc=Die HTTP(S)- oder „git clone“-URL eines bereits existierenden Repositorys -migrate.github_token_desc=Du kannst hier ein oder mehrere Tokens durch Komma getrennt eingeben, um die Migration schneller zu machen, indem die GitHub-API-Ratenlimitierung umgangen wird. WARNUNG: Der Missbrauch dieser Funktion kann gegen die Richtlinien des Diensteanbieters verstoßen und zur Sperrung deines Kontos bzw. deiner Konten führen. +migrate.github_token_desc=Du kannst hier ein oder mehrere Tokens durch Komma getrennt eingeben, um die Migration schneller zu machen, indem die GitHub-API-Ratenbegrenzung umgangen wird. WARNUNG: Der Missbrauch dieser Funktion kann gegen die Richtlinien des Diensteanbieters verstoßen und zur Sperrung deines Kontos bzw. deiner Konten führen. migrate.clone_local_path=oder ein lokaler Serverpfad migrate.permission_denied=Du hast keine Berechtigung zum Importieren lokaler Repositorys. migrate.permission_denied_blocked=Du kannst von keinen nicht erlaubten Hosts importieren. Bitte fragen deinen Administrator, die Einstellungen ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS zu überprüfen. @@ -1515,7 +1515,7 @@ issues.filter_assignees=Verantwortliche filtern issues.filter_milestones=Meilenstein filtern issues.filter_projects=Projekt filtern issues.filter_labels=Label filtern -issues.filter_reviewers=Sichter filtern +issues.filter_reviewers=Prüfer filtern issues.new=Neues Issue issues.new.title_empty=Der Titel kann nicht leer sein issues.new.labels=Labels @@ -1535,7 +1535,7 @@ issues.new.closed_milestone=Geschlossene Meilensteine issues.new.assignees=Zuständige issues.new.clear_assignees=Zuständige entfernen issues.new.no_assignees=Niemand zuständig -issues.new.no_reviewers=Keine Sichter +issues.new.no_reviewers=Keine Prüfer issues.choose.get_started=Los geht's issues.choose.open_external_link=Öffnen issues.choose.blank=Standard @@ -1599,7 +1599,7 @@ issues.filter_type.assigned_to_you=Dir zugewiesen issues.filter_type.created_by_you=Von dir erstellt issues.filter_type.mentioning_you=Hat dich erwähnt issues.filter_type.review_requested=Sichtung angefordert -issues.filter_type.reviewed_by_you=Von dir gesichtet +issues.filter_type.reviewed_by_you=Von dir überprüft issues.filter_sort=Sortieren issues.filter_sort.latest=Neueste issues.filter_sort.oldest=Älteste @@ -1809,7 +1809,7 @@ issues.dependency.add_error_dep_not_same_repo=Beide Issues müssen sich im selbe issues.review.self.approval=Du kannst nicht dein eigenen Pull-Request genehmigen. issues.review.self.rejection=Du kannst keine Änderungen an deinem eigenen Pull-Request anfragen. issues.review.approve=hat die Änderungen %s genehmigt -issues.review.comment=hat %s gesichtet +issues.review.comment=hat %s überprüft issues.review.dismissed=verwarf %ss Review %s issues.review.dismissed_label=Verworfen issues.review.left_comment=hat einen Kommentar hinterlassen @@ -1822,7 +1822,7 @@ issues.review.remove_review_request_self=hat die Sichtung %s verweigert issues.review.pending=Ausstehend issues.review.pending.tooltip=Dieser Kommentar ist derzeit nicht für andere Benutzer sichtbar. Um deine ausstehenden Kommentare einzureichen, wähle „%s“ -> „%s/%s/%s“ oben auf der Seite. issues.review.review=Review -issues.review.reviewers=Sichter +issues.review.reviewers=Prüfer issues.review.outdated=Veraltet issues.review.outdated_description=Der Inhalt hat sich geändert, seit dieser Kommentar abgegeben wurde issues.review.option.show_outdated_comments=Veraltete Kommentare anzeigen @@ -1905,8 +1905,8 @@ pulls.required_status_check_failed=Einige erforderliche Prüfungen waren nicht e pulls.required_status_check_missing=Einige erforderliche Prüfungen fehlen. pulls.required_status_check_administrator=Als Administrator kannst du diesen Pull-Request weiterhin zusammenführen. pulls.blocked_by_approvals=Dieser Pull-Request hat noch nicht genügend Genehmigungen. %d von %d Genehmigungen erteilt. -pulls.blocked_by_rejection=Dieser Pull-Request hat Änderungen, die von einem offiziellen Sichter angefragt wurden. -pulls.blocked_by_official_review_requests=Dieser Pull-Request ist blockiert, weil ihm die Genehmigung von einem oder mehreren offiziellen Sichtern fehlt. +pulls.blocked_by_rejection=Dieser Pull-Request hat Änderungen, die von einem offiziellen Prüfer angefragt wurden. +pulls.blocked_by_official_review_requests=Dieser Pull-Request ist blockiert, weil ihm die Genehmigung von einem oder mehreren offiziellen Prüfern fehlt. pulls.blocked_by_outdated_branch=Dieser Pull-Request ist blockiert, da er veraltet ist. pulls.blocked_by_changed_protected_files_1=Dieser Pull-Request ist blockiert, weil er eine geschützte Datei ändert: pulls.blocked_by_changed_protected_files_n=Dieser Pull-Request ist blockiert, weil er geschützte Dateien ändert: @@ -2470,8 +2470,8 @@ settings.protect_required_approvals=Erforderliche Genehmigungen settings.protect_required_approvals_desc=Erlaube das Zusammenführen des Pull-Requests nur mit genügend positiven Sichtungen. settings.protect_approvals_whitelist_enabled=Genehmigungen auf Benutzer oder Teams auf der Positivliste beschränken settings.protect_approvals_whitelist_enabled_desc=Nur Sichtungen von Benutzern oder Teams auf der Positivliste zählen zu den erforderlichen Genehmigungen. Existiert keine Positivliste, so zählen Sichtungen von jedem mit Schreibzugriff zu den erforderlichen Genehmigungen. -settings.protect_approvals_whitelist_users=Nutzer, die sichten dürfen -settings.protect_approvals_whitelist_teams=Teams, die sichten dürfen +settings.protect_approvals_whitelist_users=Autorisierte Prüfer +settings.protect_approvals_whitelist_teams=Teams, autorisiert zum Prüfen settings.dismiss_stale_approvals=Entferne alte Genehmigungen settings.dismiss_stale_approvals_desc=Wenn neue Commits gepusht werden, die den Inhalt des Pull-Requests ändern, werden alte Genehmigungen entfernt. settings.require_signed_commits=Signierte Commits erforderlich @@ -2490,7 +2490,7 @@ settings.remove_protected_branch_failed=Entfernen der Branchschutzregel „%s“ settings.protected_branch_deletion=Branch-Schutz löschen settings.protected_branch_deletion_desc=Wenn du den Branch-Schutz deaktivierst, können alle Nutzer mit Schreibrechten auf den Branch pushen. Fortfahren? settings.block_rejected_reviews=Zusammenführung bei abgelehnten Sichtungen blockieren -settings.block_rejected_reviews_desc=Merge ist nicht möglich, wenn Änderungen durch offizielle Sichter angefragt werden, auch wenn genügend Genehmigungen existieren. +settings.block_rejected_reviews_desc=Merge ist nicht möglich, wenn Änderungen durch offizielle Prüfer angefragt werden, auch wenn genügend Genehmigungen existieren. settings.block_on_official_review_requests=Merge bei offiziellen Sichtungsanfragen blockieren settings.block_on_official_review_requests_desc=Merge ist nicht möglich, wenn offizielle Sichtungsanfrangen vorliegen, selbst wenn genügend Genehmigungen existieren. settings.block_outdated_branch=Merge blockieren, wenn der Pull-Request veraltet ist @@ -2902,7 +2902,7 @@ issues.reaction.alt_add = Füge %[1]s Reaktion zum Kommentar hinzu. issues.reaction.alt_remove = Entferne %[1]s Reaktion von diesem Kommentar. summary_card_alt = Zusammenfassungskarte des Repositorys %s release.summary_card_alt = Übersichtskarte eines Releases mit dem Titel „%s“ im Repository %s -archive.pull.noreview = Dieses Repository ist archiviert. Pull-Requests können nicht gesichtet werden. +archive.pull.noreview = Dieses Repository ist archiviert. Pull-Requests können nicht überprüft werden. editor.commit_email = Commit-E-Mail commits.view_single_diff = Änderungen an dieser Datei, die in diesem Commit eingeführt wurden, betrachten pulls.editable = Bearbeitbar diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 0e70102012..90b7048df7 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -1154,7 +1154,7 @@ mirror_sync = synchronisé mirror_sync_on_commit=Synchroniser quand les révisions sont soumis mirror_address=Cloner depuis une URL mirror_address_desc=Insérez tous les identifiants requis dans la section Autorisation. -mirror_address_url_invalid=L’URL fournie est invalide. Vous devez échapper tous les composants de l'URL correctement. +mirror_address_url_invalid=L’URL fournie est invalide. Assurez vous que tous les composants de l'URL sont correctement échappés. mirror_address_protocol_invalid=L'URL fournie est invalide. Seuls les protocoles http(s):// ou git:// peuvent référencer un miroir. mirror_lfs=Stockage de fichiers volumineux (LFS) mirror_lfs_desc=Activer la mise en miroir des données LFS. @@ -2757,7 +2757,7 @@ issues.comment.blocked_by_user = Vous ne pouvez pas créer un commentaire sur ce editor.invalid_commit_mail = Courriel invalide pour la création d'un commit. commits.browse_further = Continuer la navigation commits.renamed_from = Renommé depuis %s -pulls.nothing_to_compare_have_tag = La branche ou le tag sélectionné sont identiques. +pulls.nothing_to_compare_have_tag = La branche/tag sélectionné sont identiques. issues.blocked_by_user = Vous ne pouvez pas créer de tickets sur ce dépôt car vous avez été bloqué par son propriétaire. pulls.blocked_by_user = Vous ne pouvez pas créer une pull request sur ce dépôt car vous êtes bloqué par son propriétaire. wiki.cancel = Annuler diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index 6dbc92e1f5..98a85e8e79 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -341,7 +341,7 @@ no_reply_address=Domínio dos emails ocultos no_reply_address_helper=Nome de domínio para utilizadores com um endereço de email oculto. Por exemplo, o nome de utilizador "silva" será registado no Git como "silva@semresposta.exemplo.org" se o domínio de email oculto estiver definido como "semresposta.exemplo.org". password_algorithm=Algoritmo de Hash da palavra-passe invalid_password_algorithm=Algoritmo de hash da senha inválido -password_algorithm_helper=Definir o algoritmo de hash da senha. Os algoritmos têm requisitos e resistência distintos. `argon2` é bastante seguro, mas usa muita memória e pode ser inapropriado para sistemas pequenos. +password_algorithm_helper=Defina o algoritmo de hash da palavra-passe. Os algoritmos têm requisitos e níveis de segurança diferentes. O algoritmo argon2 é bastante seguro, mas consome muita memória e pode não ser apropriado para sistemas com poucos recursos. enable_update_checker=Habilitar verificador de novidades env_config_keys=Configuração do ambiente env_config_keys_prompt=As seguintes variáveis de ambiente também serão aplicadas ao seu ficheiro de configuração: @@ -829,7 +829,7 @@ activations_pending=Habilitações pendentes can_not_add_email_activations_pending=Existe uma validação pendente. Tente de novo dentro de alguns minutos, se quiser adicionar um novo email. delete_email=Remover email_deletion=Remover endereço de email -email_deletion_desc=O endereço de email e informações relacionadas serão removidos da sua conta. Os cometimentos feitos no Git com este endereço de email permanecerão inalterados. Quer continuar? +email_deletion_desc=Este endereço de email e informações relacionadas serão removidos da sua conta. Os cometimentos feitos no Git com este endereço de email permanecerão inalterados. Quer continuar? email_deletion_success=O endereço de email foi removido. theme_update_success=O seu tema foi substituído. theme_update_error=O tema escolhido não existe. @@ -1060,7 +1060,7 @@ user_unblock_success = O utilizador foi desbloqueado com sucesso. language.title = Idioma predefinido keep_activity_private.description = O seu trabalho público apenas estará visível para si e para os administradores da instância. language.description = Este idioma vai ser guardado na sua conta e ser usado como o predefinido depois de iniciar sessão. -language.localization_project = Ajude-nos a traduzir o Forgejo para o seu idioma! Ler mais. +language.localization_project = Ajude-nos a traduzir o Forgejo para o seu idioma! Saiba mais. pronouns_custom_label = Pronomes personalizados user_block_yourself = Não se pode bloquear a si próprio. change_username_redirect_prompt.with_cooldown.one = O nome de utilizador antigo estará disponível para todos após um período de espera de %[1]d dia. Pode ainda reivindicar o nome de utilizador antigo durante o período de espera. @@ -1157,7 +1157,7 @@ mirror_sync=sincronizado mirror_sync_on_commit=Sincronizar quando forem enviados cometimentos mirror_address=Clonar a partir do URL mirror_address_desc=Coloque, na secção de autorização, as credenciais que, eventualmente, sejam necessárias. -mirror_address_url_invalid=O URL fornecido é inválido. Tem que codificar adequadamente todos os componentes do URL. +mirror_address_url_invalid=O URL fornecido é inválido. Certifique-se de que os componentes da URL estão codificados corretamente. mirror_address_protocol_invalid=O URL fornecido é inválido. Só se pode replicar a partir de endereços http(s):// ou git://. mirror_lfs=Armazenamento de Ficheiros Grandes (LFS) mirror_lfs_desc=Habilitar a réplica de dados LFS. @@ -1247,7 +1247,7 @@ migrate_items_releases=Lançamentos migrate_repo=Migrar o repositório migrate.clone_address=Migrar / clonar a partir do URL migrate.clone_address_desc=O URL de clonagem HTTP(S) ou Git de um repositório existente -migrate.github_token_desc=Pode colocar aqui um ou mais códigos separados por vírgulas para tornar mais rápida a migração, para compensar a limitação de velocidade da API do GitHub. AVISO: O abuso desta funcionalidade poderá violar a política do seu fornecedor de serviço e levar ao bloqueio da conta. +migrate.github_token_desc=Pode colocar aqui um ou mais códigos aqui, separados por vírgulas, para tornar mais rápida a migração, contornando a limitação de taxa da API do GitHub. AVISO: O uso abusivo desta funcionalidade poderá violar a política do seu fornecedor de serviço e levar ao bloqueio da(s) sua(s) conta(s). migrate.clone_local_path=ou uma localização no servidor local migrate.permission_denied=Não está autorizado a importar repositórios locais. migrate.permission_denied_blocked=Não pode importar de servidores não permitidos, por favor peça ao administrador para verificar as configurações ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS. @@ -1880,7 +1880,7 @@ pulls.select_commit_hold_shift_for_range=Escolha o comentimento. Mantenha premid pulls.review_only_possible_for_full_diff=A revisão só é possível ao visualizar o diff completo pulls.filter_changes_by_commit=Filtrar por cometimento pulls.nothing_to_compare=Estes ramos são iguais. Não há necessidade de criar um pedido de integração. -pulls.nothing_to_compare_have_tag=O ramo/etiqueta escolhidos são iguais. +pulls.nothing_to_compare_have_tag=Os ramos/etiquetas escolhidos são iguais. pulls.nothing_to_compare_and_allow_empty_pr=Estes ramos são iguais. Este pedido de integração ficará vazio. pulls.has_pull_request=`Já existe um pedido de integração entre estes ramos: %[2]s#%[3]d` pulls.create=Criar um pedido de integração diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 1d96b2d4c8..f5848d632d 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -471,7 +471,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=Ошибка авторизации, обнаружен неверный запрос. Пожалуйста, свяжитесь с автором приложения, которое вы пытались авторизовать. @@ -755,7 +755,7 @@ public_profile=Публичный профиль biography_placeholder=Кратко расскажите о себе другим! (Можно использовать Markdown) location_placeholder=Пусть все знают, откуда вы profile_desc=Ваш профиль -password_username_disabled=Нелокальным пользователям запрещено изменение их имени пользователя. Для получения более подробной информации обратитесь к администратору сайта. +password_username_disabled=Нелокальные пользователи не могут изменить имя. Для подробностей обратитесь к администрации сайта. full_name=Полное имя website=Веб-сайт location=Местоположение @@ -766,7 +766,7 @@ update_language_not_found=Язык «%s» недоступен. update_language_success=Язык обновлён. update_profile_success=Ваш профиль успешно обновлён. change_username=Ваше имя пользователя было изменено. -change_username_prompt=Обратите внимание: изменение имени пользователя также меняет URL вашей учётной записи. +change_username_prompt=Учтите, что при изменении имени пользователя ссылка на ваш профиль тоже будет изменена. change_username_redirect_prompt=Старое имя будет перенаправлять на новое до тех пор, пока оно не будет занято. continue=Далее cancel=Отмена @@ -1053,7 +1053,7 @@ hints = Подсказки additional_repo_units_hint = Предлагать включить больше разделов в репозиториях update_hints = Обновить подсказки update_hints_success = Подсказки обновлены. -additional_repo_units_hint_description = Показывать подсказку "Включить больше разделов" в репозиториях, в которых включены не все разделы. +additional_repo_units_hint_description = Показывать подсказку «Включить больше разделов» в репозиториях, в которых включены не все разделы. pronouns_custom = Другие pronouns = Местоимения pronouns_unspecified = Не указаны @@ -1068,7 +1068,7 @@ change_username_redirect_prompt.with_cooldown.few = Прежнее имя буд keep_pronouns_private = Показывать местоимения только зарегистрированным пользователям keep_pronouns_private.description = Местоимения будут скрыты от пользователей, не имеющих учётных записей на сервере. quota.applies_to_user = Эти ограничения хранилища применяются к вашей учётной записи -quota.applies_to_org = К этой организации применяются следующие ограничения +quota.applies_to_org = Эти ограничения хранилища применяются к этой организации quota.sizes.repos.public = Общедоступные репозитории storage_overview = Использование места quota = Ограничения хранилища @@ -1232,7 +1232,7 @@ migrate_items_releases=Выпуски migrate_repo=Перенос репозитория migrate.clone_address=Перенос / Клонирование по URL migrate.clone_address_desc=HTTP/HTTPS или Git адрес существующего репозитория -migrate.github_token_desc=Вы можете поместить здесь один или несколько токенов, разделенных запятыми, чтобы ускорить миграцию за счет обхода ограничения скорости API GitHub. ПРЕДУПРЕЖДЕНИЕ: Злоупотребление этой функцией может нарушить политику поставщика услуг и привести к блокировке вашей учетной записи (ов). +migrate.github_token_desc=Вы можете указать один или несколько токенов, разделенных запятыми, чтобы ускорить перенос за счёт обхода ограничения частоты обращений к API GitHub. ПРЕДУПРЕЖДЕНИЕ: злоупотребление этой функцией может нарушить политику поставщика услуг и привести к блокировке вашей учётной записи. migrate.clone_local_path=или локальный путь на сервере migrate.permission_denied=У вас нет прав на импорт локальных репозиториев. migrate.permission_denied_blocked=Вы не можете импортировать с запрещённых хостов, пожалуйста, попросите администратора проверить настройки ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS. @@ -2698,7 +2698,7 @@ error.csv.invalid_field_count=Не удается отобразить этот mirror_address_protocol_invalid = Эта ссылка недействительна. Для зеркалирования можно использовать только расположения http(s):// и git:// . fork_no_valid_owners = Невозможно создать ответвление этого репозитория, т.к. здесь нет действующих владельцев. new_repo_helper = Репозиторий содержит все файлы проекта и историю изменений. Уже где-то есть репозиторий? Выполните перенос. -mirror_address_url_invalid = Указанный URL-адрес недействителен. Убедитесь, что компоненты URL-адреса экранированы правильно. +mirror_address_url_invalid = Указанная ссылка недействительна. Убедитесь, что все части экранированы правильно. issues.comment.blocked_by_user = Вы не можете комментировать под этой задачей, т.к. вы заблокированы владельцем репозитория или автором задачи. pulls.blocked_by_user = Невозможно создать запрос на слияние в этом репозитории, т.к. вы заблокированы его владельцем. settings.add_collaborator_blocked_our = Невозможно добавить соучастника, т.к. он заблокирован в этом репозитории. @@ -2756,7 +2756,7 @@ ambiguous_runes_description = `Этот файл содержит символы editor.invalid_commit_mail = Неправильная почта для создания коммита. pulls.has_merged = Слияние не удалось: запрос уже был слит, изменение целевой ветви или повторное слияние невозможно. settings.enter_repo_name = Введите имя владельца и название репозитория как указано: -signing.wont_sign.error = Произошла ошибка при проверке возможности подписания коммита. +signing.wont_sign.error = Не удалось проверить возможность подписания коммита. signing.wont_sign.nokey = Сервер не предоставляет ключ для подписи коммита. settings.wiki_globally_editable = Разрешить редактирование вики всем пользователям settings.webhook.test_delivery_desc_disabled = Активируйте этот веб-хук для проверки тестовым событием. @@ -3120,7 +3120,7 @@ dashboard.resync_all_hooks=Повторно синхронизировать х dashboard.reinit_missing_repos=Переинициализировать все отсутствующие Git репозитории, для которых существуют записи dashboard.sync_external_users=Синхронизировать данные сторонних пользователей dashboard.cleanup_hook_task_table=Очистить таблицу hook_task -dashboard.cleanup_packages=Очистка устаревших пакетов +dashboard.cleanup_packages=Удалить устаревшие пакеты dashboard.server_uptime=Время работы dashboard.current_goroutine=Выполняемые goroutines dashboard.current_memory_usage=Текущее использование памяти @@ -3582,7 +3582,7 @@ self_check.no_problem_found = Пока проблем не обнаружено. auths.tip.gitea = Зарегистрируйте новое приложение OAuth2. Доступна инструкция: %s auths.tips.oauth2.general.tip = При регистрации нового приложения OAuth2 ссылка обратного перенаправления должна быть: self_check.database_fix_mysql = Пользователи MySQL и MariaDB могут исправить проблемы с сопоставлением командой "forgejo doctor convert". Также можно вручную вписать "ALTER ... COLLATE ..." в SQL. -dashboard.cleanup_actions = Очистить устаревшие журналы и артефакты Действий +dashboard.cleanup_actions = Удалить устаревшие журналы и артефакты Действий dashboard.sync_repo_branches = Синхронизировать ветви из Git в базу данных assets = Кодовые объекты dashboard.sync_tag.started = Начата синхронизация тегов @@ -3845,7 +3845,7 @@ owner.settings.cargo.initialize.error=Не удалось инициализир owner.settings.cargo.initialize.success=Индекс Cargo успешно создан. owner.settings.cargo.rebuild=Перестроить индекс owner.settings.cargo.rebuild.error=Не удалось перестроить индекс Cargo: %v -owner.settings.cargo.rebuild.success=Индекс Cargo успешно перестроен. +owner.settings.cargo.rebuild.success=Индекс Cargo был перестроен успешно. owner.settings.cleanuprules.title=Правила очистки owner.settings.cleanuprules.add=Добавить правило очистки owner.settings.cleanuprules.edit=Изменить правило очистки diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index 5b06c5e3b5..553db1b19a 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -204,15 +204,20 @@ buttons.switch_to_legacy.tooltip = Använd legacy-redigeraren istället link_modal.url = Url link_modal.description = Beskrivning link_modal.header = Lägg till en länk +buttons.disable_monospace_font = Avaktivera jämnbrett typsnitt +link_modal.paste_reminder = Tips: Med ett URL i ditt klippbord, kan du klistra in direkt i textredigeraren för att skapa en länk. +buttons.enable_monospace_font = Aktivera jämnbrett typsnitt [filter] string.asc = A - Ö +string.desc = Ö - A [error] occurred = Ett fel har inträffat server_internal = Internt serverfel network_error = Nätverksfel report_message = Om du tror att detta är en Forgejo-bugg, sök efter ärenden på Codeberg eller öppna ett nytt ärende om det behövs. +not_found = Målet kunde inte hittas. [startpage] app_desc=En smidig, självhostad Git-tjänst @@ -333,6 +338,7 @@ internal_token_failed = Misslyckades att generera intern token: %v password_algorithm = Hashalgoritm för lösenord invalid_password_algorithm = Ogiltig hashalgoritm för lösenord env_config_keys_prompt = Följande miljövariabler kommer också att tillämpas på din konfigurationsfil: +smtp_from_invalid = "Skicka E-post som" adressen är ogiltig [home] uname_holder=Användarnamn eller e-postadress diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 332a855e88..8531446658 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -15,7 +15,7 @@ page=Сторінка template=Шаблон language=Мова notifications=Сповіщення -active_stopwatch=Трекер робочого часу +active_stopwatch=Облік робочого часу create_new=Створити… user_profile_and_more=Профіль і налаштування… signed_in_as=Увійшов як @@ -660,13 +660,13 @@ Location = Розташування AccessToken = Токен доступу unable_verify_ssh_key = Не вдалося перевірити ключ SSH, перевірте його на наявність помилок. repository_force_private = Увімкнено примусову приватність: приватні репозиторії не можна зробити публічними. -must_use_public_key = Ключ, який ви надали, є приватним. Будь ласка, нікуди не завантажуйте свій приватний ключ. Використовуйте замість нього публічний ключ. +must_use_public_key = Ключ, який ви надали, є приватним. Будь ласка, нікуди не завантажуйте свій приватний ключ. Використовуйте замість нього відкритий ключ. openid_been_used = Адреса OpenID «%s» вже використовується. still_has_org = Ваш обліковий запис є учасником однієї або декількох організацій, спочатку покиньте їх. duplicate_invite_to_team = Цього користувача вже запрошено як учасника команди. organization_leave_success = Ви успішно покинули організацію %s. include_error = ` має містити підрядок «%s».` -invalid_group_team_map_error = ` призначення недійсне: %s` +invalid_group_team_map_error = ` зіставлення недійсне: %s` unsupported_login_type = Цей тип входу не підтримує видалення облікового запису. admin_cannot_delete_self = Ви не можете видалити себе, якщо ви є адміністратором. Спочатку зніміть із себе права адміністратора. unset_password = Для користувача не встановлено пароль. @@ -815,7 +815,7 @@ manage_gpg_keys=Керування ключами GPG add_key=Додати ключ ssh_desc=Ці відкриті ключі SSH повʼязані з вашим обліковим записом. Відповідні приватні ключі дозволяють отримати повний доступ до ваших репозиторіїв. Підтверджені ключі можна використати для підтвердження комітів Git, підписаних із SSH. principal_desc=Ці настройки SSH сертифікатів вказані у вашому обліковому записі та надають повний доступ до ваших репозиторіїв. -gpg_desc=Ці публічні ключі GPG пов'язані з вашим обліковим записом і використовуються для підтвердження комітів. Тримайте свої приватні ключі в безпеці, оскільки вони дозволяють підписувати коміти вашим особистим підписом. +gpg_desc=Ці відкриті ключі GPG пов'язані з вашим обліковим записом і використовуються для підтвердження комітів. Тримайте свої приватні ключі в безпеці, оскільки вони дозволяють підписувати коміти вашим особистим підписом. ssh_helper=Потрібна допомога? Дивіться гід на GitHub з генерації ключів SSH або виправлення типових неполадок SSH. gpg_helper= Потрібна допомога? Перегляньте посібник GitHub про GPG . add_new_key=Додати SSH ключ @@ -895,7 +895,7 @@ oauth2_applications_desc=Програми OAuth2 дають можливість remove_oauth2_application=Видалити програму OAuth2 remove_oauth2_application_desc=Видалення програми OAuth2 скасує доступ до всіх підписаних токенів доступу. Продовжити? remove_oauth2_application_success=Програму видалено. -create_oauth2_application=Створити новий додаток OAuth2 +create_oauth2_application=Створити нову програму OAuth2 create_oauth2_application_button=Створити програму oauth2_application_name=Назва програми save_application=Зберегти @@ -999,7 +999,7 @@ comment_type_group_pull_request_push = Додані коміти permissions_public_only = Тільки публічні select_permissions = Виберіть дозволи permissions_access_all = Усі (публічні, приватні й обмежені) -create_oauth2_application_success = Ви успішно створили новий додаток OAuth2. +create_oauth2_application_success = Ви успішно створили нову програму OAuth2. keep_email_private_popup = Ваша адреса електронної пошти не буде відображатися у вашому профілі і не буде використовуватися за замовчуванням для комітів, зроблених через веб-інтерфейс, таких як завантаження файлів, редагування і об'єднання комітів. Натомість ви можете використовувати спеціальну адресу %s для прив'язки комітів до свого облікового запису. Ця опція не вплине на існуючі коміти. blocked_since = Заблокований з %s can_not_add_email_activations_pending = Очікується активація, спробуйте ще раз за кілька хвилин, якщо хочете додати нову адресу електронної пошти. @@ -1023,7 +1023,7 @@ pronouns_custom_label = Інші займенники repo_and_org_access = Доступ до репозиторію та організації change_username_redirect_prompt.with_cooldown.few = Старе ім'я користувача буде доступне всім після періоду захисту, який триватиме %[1]d днів. Протягом періоду захисту ви ще можете повернути собі старе ім'я. change_username_redirect_prompt.with_cooldown.one = Старе ім'я користувача буде доступне всім після періоду захисту, який триватиме %[1]d день. Протягом періоду захисту ви ще можете повернути собі старе ім'я. -change_username_redirect_prompt = Старе ім'я користувача буде перенаправленням, поки хтось не присвоїть ім'я собі. +change_username_redirect_prompt = Старе ім'я користувача буде переспрямуванням, поки хтось не присвоїть ім'я собі. comment_type_group_lock = Стан блокування webauthn_alternative_tip = Можливо, ви бажаєте налаштувати додатковий спосіб входу. user_unblock_success = Користувач_ку успішно розблоковано. @@ -1200,7 +1200,7 @@ migrate_items_pullrequests=Запити на злиття migrate_items_merge_requests=Запити на об'єднання migrate_items_releases=Релізи migrate_repo=Перенести репозиторій -migrate.clone_address=Міграція / клонувати з URL-адреси +migrate.clone_address=Міграція / клонування з URL-адреси migrate.clone_address_desc=URL-адреса HTTP(S) або Git «clone» існуючого репозиторію migrate.clone_local_path=або шлях до локального серверу migrate.permission_denied=Вам не дозволено імпортувати локальні репозиторії. @@ -1549,9 +1549,9 @@ issues.unlock=Розблокування обговорення issues.lock.unknown_reason=Неможливо заблокувати задачу з невідомою причиною. issues.lock_duplicate=Задача не може бути заблокованим двічі. issues.unlock_error=Не можливо розблокувати задачу, яка не заблокована. -issues.lock_with_reason=заблоковано як %s та обмежене обговорення для співавторів %s -issues.lock_no_reason=заблоковано та обмежене обговорення для співавторів %s -issues.unlock_comment=розблоковане обговорення %s +issues.lock_with_reason=блокує як %s та обмежує обговорення до співавторів %s +issues.lock_no_reason=блокує та обмежує обговорення до співавторів %s +issues.unlock_comment=розблоковує обговорення %s issues.lock_confirm=Заблокувати issues.unlock_confirm=Розблокувати issues.lock.notice_1=- Інші користувачі не можуть додавати нові коментарі до цієї задачі. @@ -1701,8 +1701,8 @@ pulls.required_status_check_administrator=Як адміністратор ви pulls.can_auto_merge_desc=Цей запит можна об'єднати автоматично. pulls.cannot_auto_merge_desc=Цей запит на злиття не може бути злитий автоматично через конфлікти. pulls.cannot_auto_merge_helper=Злийте вручну для вирішення конфліктів. -pulls.num_conflicting_files_1=%d конфліктуючий файл -pulls.num_conflicting_files_n=%d конфліктуючі файли +pulls.num_conflicting_files_1=%d конфліктний файл +pulls.num_conflicting_files_n=%d конфліктних файлів pulls.approve_count_1=%d схвалення pulls.approve_count_n=%d схвалень pulls.reject_count_1=%d запит на зміну @@ -1817,7 +1817,7 @@ activity.active_prs_count_1=%d активний запит на activity.active_prs_count_n=%d активних запитів на злиття activity.merged_prs_count_1=Об'єднаний запит на злиття activity.merged_prs_count_n=Об'єднані запити на злиття -activity.opened_prs_count_1=Запропонований запит на злиття +activity.opened_prs_count_1=Запропоновані запити на злиття activity.opened_prs_count_n=Запропонованих запитів на злиття activity.title.user_1=%d користувачем activity.title.user_n=%d користувачами @@ -1839,8 +1839,8 @@ activity.closed_issue_label=Закрито activity.new_issues_count_1=Нова задача activity.new_issues_count_n=Нові задачі activity.new_issue_label=Відкриті -activity.title.unresolved_conv_1=%d Незавершене обговорення -activity.title.unresolved_conv_n=%d Незавершених обговорень +activity.title.unresolved_conv_1=%d незавершене обговорення +activity.title.unresolved_conv_n=%d незавершених обговорень activity.unresolved_conv_desc=Список всіх старих задач і Pull Request'ів з недавньої активністю, але ще не закритих або прийнятих. activity.unresolved_conv_label=Відкрити activity.title.releases_1=%d випуск @@ -1911,20 +1911,20 @@ settings.use_external_wiki=Використовувати зовнішню ві settings.external_wiki_url=URL зовнішньої вікі settings.external_wiki_url_error=Зовнішня URL-адреса wiki не є допустимою URL-адресою. settings.external_wiki_url_desc=Відвідувачі будуть перенаправлені на URL-адресу, коли вони клацають по вкладці. -settings.issues_desc=Увімкнути відстеження задач в репозиторію +settings.issues_desc=Увімкнути відстеження задач settings.use_internal_issue_tracker=Використовувати вбудовану систему відстеження задач -settings.use_external_issue_tracker=Використовувати зовнішню систему обліку задач +settings.use_external_issue_tracker=Використовувати зовнішню систему відстеження задач settings.external_tracker_url=URL зовнішньої системи відстеження задач settings.external_tracker_url_error=URL зовнішнього баг-трекера не є допустимою URL-адресою. settings.external_tracker_url_desc=Відвідувачі перенаправляються на зовнішню URL-адресу, коли натискають вкладку 'Задачі'. -settings.tracker_url_format=Формат URL зовнішнього трекера задач +settings.tracker_url_format=Формат URL зовнішньої системи відстеження задач settings.tracker_url_format_error=Неправильний формат URL-адреси зовнішнього баг-трекера. -settings.tracker_issue_style=Формат номера для зовнішньої системи обліку задач +settings.tracker_issue_style=Формат номера для зовнішньої системи відстеження задач settings.tracker_issue_style.numeric=Цифровий settings.tracker_issue_style.alphanumeric=Буквено-цифровий settings.tracker_url_format_desc=Використовуйте шаблони {user}, {repo} та {index} для імені користувача, репозиторію та номеру задічі. settings.enable_timetracker=Увімкнути відстеження часу -settings.allow_only_contributors_to_track_time=Враховувати тільки учасників розробки в підрахунку часу +settings.allow_only_contributors_to_track_time=Дозволити відстеження часу тільки учасникам розробки settings.pulls_desc=Увімкнути запити на злиття в репозиторій settings.pulls.ignore_whitespace=Ігнорувати пробіл у конфліктах settings.pulls.enable_autodetect_manual_merge=Увімкнути автовизначення ручного злиття (Примітка: у деяких особливий випадках можуть виникнуть помилки) @@ -2032,7 +2032,7 @@ settings.slack_icon_url=URL іконки settings.slack_color=Колір settings.discord_username=Ім'я кристувача settings.discord_icon_url=URL іконки -settings.event_desc=Тригер: +settings.event_desc=Спрацьовує на: settings.event_push_only=Push події settings.event_send_everything=Усі події settings.event_choose=Власні події… @@ -2530,7 +2530,7 @@ issues.new.assign_to_me = Призначити собі contributors.contribution_type.additions = Додавання settings.add_web_hook_desc = Інтегрувати %s у цей репозиторій. settings.event_wiki_desc = Вікі-сторінку створено, перейменовано, відредаговано або видалено. -settings.mirror_settings.push_mirror.copy_public_key = Копіювати публічний ключ +settings.mirror_settings.push_mirror.copy_public_key = Копіювати відкритий ключ editor.add_tmpl.filename = назва файлу settings.unarchive.button = Розархівувати object_format = Формат об'єкта @@ -2787,7 +2787,7 @@ pulls.auto_merge_newly_scheduled = Заплановано об'єднати за pulls.auto_merge_newly_scheduled_comment = `планує автоматично об'єднати цей запит на злиття після успішного завершення всіх перевірок %[1]s` comments.edit.already_changed = Не вдається зберегти зміни. Схоже, що хтось інший уже змінив вміст коментаря. Оновіть сторінку і спробуйте відредагувати ще раз, щоб уникнути перезапису чужих змін pulls.auto_merge_canceled_schedule_comment = `скасовує автоматичне об'єднання цього запиту на злиття після успішного завершення всіх перевірок %[1]s` -signing.wont_sign.pubkey = Коміт не буде підписано, оскільки у вас немає публічного ключа, пов'язаного з вашим обліковим записом. +signing.wont_sign.pubkey = Коміт не буде підписано, оскільки у вас немає відкритого ключа, пов'язаного з вашим обліковим записом. signing.wont_sign.basesigned = Злиття не буде підписано, оскільки не підписано базовий коміт. signing.wont_sign.headsigned = Злиття не буде підписано, оскільки не підписано головний коміт. projects.column.new_submit = Створити стовпчик @@ -2840,6 +2840,17 @@ editor.revert = Вивернути %s на: commit.revert-content = Оберіть гілку, на яку вивернути: pulls.cmd_instruction_merge_warning = Увага: в цьому репозиторії не ввімкнено «Автовизначення ручного об'єднання», тож позначити цей запит як об'єднаний вручну вам доведеться самостійно. topic.format_prompt = Теми повинні починатися з літери або цифри, можуть містити дефіси («-») і крапки («.») і мати довжину до 35 символів. Дозволено використання лише малих літер. +issues.label_archive = Архівна мітка +editor.invalid_commit_mail = Недійсна пошта для створення коміту. +issues.label_exclusive = Ексклюзивний +issues.filter_type.reviewed_by_you = Перевірено вами +editor.push_out_of_date = Схоже, дані для відправки застаріли. +editor.commit_email = Пошта автора +issues.cancel_tracking_history = `скасовує відстеження часу %s` +issues.label_archive_tooltip = Архівовані мітки за замовчуванням виключаються з пропозицій під час пошуку за міткою. +settings.protect_status_check_matched = Збіг +settings.webhook.delivery.success = Подію додано до черги доставки. Може знадобитися кілька секунд, перш ніж вона з'явиться в історії доставки. +settings.protected_branch_required_rule_name = Необхідна назва правила [graphs] contributors.what = внески @@ -3082,10 +3093,10 @@ users.update_profile_success=Обліковий запис користувач users.edit_account=Редагувати обліковий запис users.max_repo_creation=Максимальна кількість репозиторіїв users.max_repo_creation_desc=(Введіть -1, щоб використовувати глобальний ліміт за замовчуванням.) -users.is_activated=Обліковий запис користувача увімкнено +users.is_activated=Активований обліковий запис users.prohibit_login=Заблокований обліковий запис users.is_admin=Обліковий запис адміністратора -users.is_restricted=Обмежений +users.is_restricted=Обмежений обліковий запис users.allow_git_hook=Може створювати Git-хуки users.allow_git_hook_tooltip=Git-хуки виконуються від імені користувача ОС, від якого запущено Forgejo, і мають той самий рівень доступу до хоста. Таким чином, користувачі зі спеціальними правами Git-хуків можуть отримати доступ і змінювати всі репозиторії Forgejo, а також базу даних Forgejo. Вони також здатні отримати права адміністратора Forgejo. users.allow_import_local=Може імпортувати локальні репозиторії @@ -3167,16 +3178,16 @@ auths.domain=Домен auths.host=Хост auths.port=Порт auths.bind_dn=Прив'язати DN -auths.bind_password=Прив'язати пароль +auths.bind_password=Пароль bind auths.user_base=База пошуку користувачів auths.user_dn=DN користувача auths.attribute_username=Атрибут імені користувача auths.attribute_username_placeholder=Залиште порожнім, щоб використовувати ім'я користувача для реєстрації. auths.attribute_name=Атрибут імені -auths.attribute_surname=Атрибут Surname -auths.attribute_mail=Атрибут Email -auths.attribute_ssh_public_key=Атрибут Відкритий SSH ключ -auths.attributes_in_bind=Витягувати атрибути в контексті Bind DN +auths.attribute_surname=Атрибут прізвища +auths.attribute_mail=Атрибут адреси email +auths.attribute_ssh_public_key=Атрибут відкритого ключа SSH +auths.attributes_in_bind=Отримувати атрибути в контексті bind DN auths.allow_deactivate_all=Дозволити порожньому результату пошуку відключити всіх користувачів auths.use_paged_search=Використовувати посторінковий пошук auths.search_page_size=Розмір сторінки @@ -3230,15 +3241,15 @@ auths.tips.oauth2.general=Автентифікація OAuth2 auths.tip.oauth2_provider=Постачальник OAuth2 auths.tip.bitbucket=Зареєструйте нового споживача OAuth на %s і додайте дозвіл «Обліковий запис» — «Читання» auths.tip.nextcloud=`Зареєструйте нового споживача OAuth у вашому екземплярі за допомогою наступного меню "Налаштування -> Безпека -> клієнт OAuth 2.0"` -auths.tip.dropbox=Створіть новий додаток на %s -auths.tip.facebook=Зареєструйте новий додаток на %s і додайте модуль «Facebook Login» -auths.tip.github=Зареєструйте новий додаток OAuth на %s +auths.tip.dropbox=Створіть нову програму на %s +auths.tip.facebook=Зареєструйте нову програму на %s і додайте модуль «Facebook Login» +auths.tip.github=Зареєструйте нову програму OAuth на %s auths.tip.gitlab=Додайте новий додаток на https://gitlab.com/profile/applications auths.tip.google_plus=Отримайте облікові дані клієнта OAuth2 в консолі Google API на сторінці %s auths.tip.openid_connect=Використовуйте OpenID Connect Discovery URL (/.well-known/openid-configuration) для автоматичної настройки входу OAuth auths.tip.twitter=Перейдіть на %s, створіть програму і переконайтеся, що ввімкнено опцію «Дозволити використання цієї програми для входу через Twitter» -auths.tip.discord=Зареєструйте новий додаток на %s -auths.tip.yandex=Створіть новий додаток на %s. У розділі «Yandex.Passport API» виберіть такі дозволи: «Доступ до адреси електронної пошти», «Доступ до аватара» і «Доступ до імені користувача, імені та прізвища, статі» +auths.tip.discord=Зареєструйте нову програму на %s +auths.tip.yandex=Створіть нову програму на %s. У розділі «Yandex.Passport API» виберіть такі дозволи: «Доступ до адреси електронної пошти», «Доступ до аватара» і «Доступ до імені користувача, імені та прізвища, статі» auths.tip.mastodon=Введіть URL спеціального екземпляра для екземпляра mastodon, який ви хочете автентифікувати за допомогою (або використовувати за замовчуванням) auths.edit=Редагувати джерело автентифікації auths.activated=Це джерело автентифікація активоване @@ -3312,7 +3323,7 @@ config.default_keep_email_private=Приховувати адреси елект config.default_allow_create_organization=Дозволити створення організацій за замовчуванням config.enable_timetracking=Увімкнути відстеження часу config.default_enable_timetracking=Увімкнути відстеження часу за замовчуванням -config.default_allow_only_contributors_to_track_time=Враховувати тільки учасників розробки в підрахунку часу +config.default_allow_only_contributors_to_track_time=Дозволити відстеження часу тільки учасникам розробки config.no_reply_address=Домен прихованих адрес електронної пошти config.default_visibility_organization=Видимість за замовчуванням для нових організацій config.default_enable_dependencies=Увімкнути залежності задач за замовчуванням @@ -3340,7 +3351,7 @@ config.cache_config=Конфігурація кешу config.cache_adapter=Адаптер кешу config.cache_interval=Інтервал кешування config.cache_conn=Підключення до кешу -config.cache_item_ttl=Час зберігання даних кешу +config.cache_item_ttl=Час зберігання даних у кеші config.session_config=Конфігурація сесії config.session_provider=Провайдер сесії @@ -3408,7 +3419,7 @@ notices.system_notice_list=Сповіщення системи notices.view_detail_header=Подробиці сповіщення notices.select_all=Вибрати все notices.deselect_all=Скасувати вибір -notices.inverse_selection=Інвертувати виділене +notices.inverse_selection=Інвертувати вибір notices.delete_selected=Видалити вибране notices.delete_all=Видалити всі cповіщення notices.type=Тип @@ -3453,8 +3464,8 @@ monitor.queue.settings.desc = Пули динамічно зростають у monitor.queue.settings.remove_all_items_done = Усі елементи в черзі видалено. monitor.queue.settings.remove_all_items = Видалити всі config.app_slogan = Гасло екземпляра -auths.tip.gitea = Зареєструйте новий додаток OAuth. Інструкцію можна знайти на %s -auths.tip.gitlab_new = Зареєструйте новий додаток на %s +auths.tip.gitea = Зареєструйте нову програму OAuth. Інструкцію можна знайти на %s +auths.tip.gitlab_new = Зареєструйте нову програму на %s monitor.duration = Тривалість (с) users.reserved = Зарезервовано systemhooks.desc = Вебхуки автоматично сповіщають HTTP-сервер POST-запитами, коли в Forgejo відбуваються певні події. Вказані тут вебхуки спрацьовуватимуть для всіх репозиторіїв системи, тож врахуйте всі ймовірні наслідки для швидкодії. Докладніше — в посібнику з вебхуків. @@ -3505,6 +3516,18 @@ users.details = Дані користувача auths.login_source_exist = Джерело автентифікації «%s» вже існує. dashboard.delete_old_system_notices = Видалити всі старі сповіщення системи з бази даних users.purge = Повністю видалити користувач_ку +auths.tips.oauth2.general.tip = При реєстрації нової програми OAuth2 URL-адреса зворотного виклику/переспрямування повинна бути: +auths.attribute_avatar = Атрибут аватара +auths.oauth2_required_claim_name = Необхідна назва заявки +auths.oauth2_admin_group = Значення групової заявки для адміністраторів. (Необов'язково — потрібна назва заявки вище) +auths.oauth2_required_claim_name_helper = Вкажіть назву, щоб обмежити вхід з цього джерела користувачами із заявкою з такою назвою +auths.map_group_to_team = Зіставити групи LDAP з командами організації (залиште поле порожнім, щоб пропустити) +auths.oauth2_required_claim_value = Необхідне значення заявки +auths.oauth2_map_group_to_team = Зіставити заявлені групи з командами організації. (Необов'язково — потрібна назва заявки вище) +auths.oauth2_required_claim_value_helper = Вкажіть значення, щоб обмежити вхід з цього джерела користувачами із заявкою з такими назвою і значенням +auths.oauth2_group_claim_name = Назва заявки, що надає назви груп для цього джерела. (Необов'язково) +auths.oauth2_restricted_group = Значення групової заявки для обмежених користувачів. (Необов'язково — потрібна назва заявки вище) +users.local_import.description = Дозволити імпорт репозиторіїв з локальної файлової системи сервера. Це може становити загрозу безпеці. [action] @@ -3724,7 +3747,7 @@ alpine.registry = Налаштуйте цей реєстр, додавши URL cran.registry = Налаштуйте цей реєстр у файлі Rprofile.site: npm.registry = Налаштуйте цей реєстр у файлі .npmrc свого проєкту: chef.registry = Налаштуйте цей реєстр у файлі ~/.chef/config.rb: -owner.settings.chef.keypair.description = Запити до реєстру Chef повинні бути криптографічно підписані як засіб автентифікації. При генерації пари ключів на Forgejo зберігається тільки публічний ключ. Приватний ключ надається вам для використання команд knife. Генерація нової пари ключів замінить попередню. +owner.settings.chef.keypair.description = Запити до реєстру Chef повинні бути криптографічно підписані як засіб автентифікації. При генерації пари ключів на Forgejo зберігається тільки відкритий ключ. Приватний ключ надається вам для використання команд knife. Генерація нової пари ключів замінить попередню. nuget.dependency.framework = Цільовий фреймворк owner.settings.cleanuprules.preview.overview = Заплановано видалити %d пакунків. owner.settings.cleanuprules.pattern_full_match = Застосувати шаблон до повної назви пакунка @@ -3754,6 +3777,8 @@ rpm.distros.redhat = у дистрибутивах на основі RedHat rpm.distros.suse = у дистрибутивах на основі SUSE owner.settings.cargo.rebuild.no_index = Неможливо перебудувати, індекс не ініціалізовано. alpine.registry.key = Завантажте відкритий RSA-ключ реєстру в папку /etc/apk/keys/ для перевірки підпису індексу: +rubygems.required.ruby = Необхідна версія Ruby +rubygems.required.rubygems = Необхідна версія RubyGem [secrets] deletion = Видалити секрет @@ -3861,6 +3886,7 @@ runs.invalid_workflow_helper = Недійсний файл конфігурац runs.no_job = Робочий потік повинен містити принаймні одне завдання workflow.dispatch.use_from = Використати робочий потік із runs.no_job_without_needs = Робочий потік повинен містити принаймні одне завдання без залежностей. +workflow.dispatch.trigger_found = Цей робочий потік спрацьовує на події workflow_dispatch. @@ -3930,6 +3956,8 @@ issues.read = Читати: дивитись і створювати за wiki.read = Читати: переглядати вбудовану вікі та її історію. actions.write = Писати: вручну запускати, перезапускати, скасовувати або схвалювати конвеєри CI/CD в очікуванні. projects.write = Писати: створювати проєкти і стовпчики та редагувати їх. +ext_issues = Доступ до посилання на зовнішню систему відстеження задач. Налаштування дозволів відбувається поза сайтом. +ext_wiki = Доступ до посилання на зовнішню вікі. Налаштування дозволів відбувається поза сайтом. [munits.data] pib = ПіБ diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 59901392c2..eb7c3c95e7 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -828,7 +828,7 @@ activations_pending=等待激活 can_not_add_email_activations_pending=有一个待处理的激活请求,请稍等几分钟后再尝试添加新的电子邮件地址。 delete_email=移除 email_deletion=移除电子邮件地址 -email_deletion_desc=电子邮件地址和相关信息将会被删除。使用此电子邮件地址发送的Git提交将会保留,继续? +email_deletion_desc=此电子邮件地址及相关信息将被删除。使用此电子邮件地址的Git提交将被保留。继续吗? email_deletion_success=您的电子邮件地址已被移除。 theme_update_success=您的主题已更新。 theme_update_error=所选主题不存在。 @@ -1156,7 +1156,7 @@ mirror_sync = 已同步 mirror_sync_on_commit=推送提交时同步 mirror_address=从 URL 克隆 mirror_address_desc=在授权框中输入必要的凭据。 -mirror_address_url_invalid=URL无效。请检查您所输入的URL是否正确。 +mirror_address_url_invalid=URL无效。请检查所输入URL的所有部分是否被正确地转译。 mirror_address_protocol_invalid=提供的URL无效。只能使用http(s)://或git://地址进行镜像操作。 mirror_lfs=大文件存储(LFS) mirror_lfs_desc=镜像 LFS 数据。 @@ -1245,7 +1245,7 @@ migrate_items_releases=版本发布 migrate_repo=迁移仓库 migrate.clone_address=从 URL 迁移/克隆 migrate.clone_address_desc=现有仓库的 HTTP(s) 或 Git “clone” URL -migrate.github_token_desc=由于 GitHub API 速率限制,您可以在此处放置一个或多个以逗号分隔的令牌,以加快迁移速度。 警告:滥用此功能可能会违反服务提供商的政策并导致帐户被封。 +migrate.github_token_desc=您可以在此填写一个或多个以逗号分隔的令牌,以规避 GitHub API 速率限制并加快迁移速度。 警告:滥用此功能可能会违反服务提供商的政策并导致您的帐户被封禁。 migrate.clone_local_path=或服务器本地路径 migrate.permission_denied=您没有获得导入本地仓库的权限。 migrate.permission_denied_blocked=您不能从不允许的主机导入,请询问管理员以检查 ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS 设置。 diff --git a/options/locale_next/locale_ar.json b/options/locale_next/locale_ar.json index 6cca2187a0..aafb85cb4e 100644 --- a/options/locale_next/locale_ar.json +++ b/options/locale_next/locale_ar.json @@ -141,5 +141,6 @@ "discussion.sidebar.reference": "مرجع", "admin.moderation.moderation_reports": "تقارير الإشراف", "admin.moderation.reports": "التقارير", - "admin.moderation.no_open_reports": "لا يوجد حالياً أية تقارير مفتوحة." + "admin.moderation.no_open_reports": "لا يوجد حالياً أية تقارير مفتوحة.", + "admin.moderation.deleted_content_ref": "المحتوى المُبلغ عنه بالنوع %[1]v والمعرف %[2]d لم يعد موجوداً" } diff --git a/options/locale_next/locale_de-DE.json b/options/locale_next/locale_de-DE.json index e8b0976994..59e12c2ea8 100644 --- a/options/locale_next/locale_de-DE.json +++ b/options/locale_next/locale_de-DE.json @@ -110,5 +110,6 @@ "admin.moderation.deleted_content_ref": "Gemeldeter Inhalt vom Typ %[1]v und ID %[2]d existiert nicht mehr", "admin.moderation.moderation_reports": "Moderationsmeldungen", "admin.moderation.reports": "Meldungen", - "admin.moderation.no_open_reports": "Es gibt momentan keine offenen Meldungen." + "admin.moderation.no_open_reports": "Es gibt momentan keine offenen Meldungen.", + "admin.dashboard.remove_resolved_reports": "Erledigte Meldungen entfernen" } diff --git a/options/locale_next/locale_fil.json b/options/locale_next/locale_fil.json index 6eb2039ab4..c07a6b152f 100644 --- a/options/locale_next/locale_fil.json +++ b/options/locale_next/locale_fil.json @@ -110,5 +110,6 @@ "admin.moderation.moderation_reports": "Mga ulat sa moderation", "admin.moderation.no_open_reports": "Kasalukuyang walang mga nakabukas na ulat.", "admin.moderation.reports": "Mga ulat", - "admin.moderation.deleted_content_ref": "Hindi na umiiral ang inulat na nilalaman na may uri na %[1]v at ID %[2]d" + "admin.moderation.deleted_content_ref": "Hindi na umiiral ang inulat na nilalaman na may uri na %[1]v at ID %[2]d", + "admin.dashboard.remove_resolved_reports": "Tanggalin ang mga naresolbang ulat" } diff --git a/options/locale_next/locale_fr-FR.json b/options/locale_next/locale_fr-FR.json index 4a1a27ac0d..97b2f1733a 100644 --- a/options/locale_next/locale_fr-FR.json +++ b/options/locale_next/locale_fr-FR.json @@ -99,9 +99,16 @@ "repo.form.cannot_create": "Tous les espaces dans lesquels vous pouvez créer des dépôts ont atteint la limite de dépôts.", "admin.dashboard.cleanup_offline_runners": "Nettoyer les exécuteurs hors ligne", "mail.actions.run_info_trigger": "Déclenché parce que : %[1]s par : %[2]s", - "settings.visibility.description": "La visibilité du profil affecte la capacité des autres à accéder à vos dépôts non-privés. Voir plus", + "settings.visibility.description": "La visibilité du profil affecte la capacité des autres à accéder à vos dépôts non-privés. Voir plus.", "editor.textarea.shift_tab_hint": "Pas d'indentation sur cette ligne. Appuyez sur Maj + Tab une nouvelle fois ou sur Échap pour quitter l'éditeur.", "avatar.constraints_hint": "L'avatar personnalisé ne doit pas dépasser une taille de %[1]s ou être plus grand que %[2]dx%[3]d pixels", "editor.textarea.tab_hint": "Ligne déjà indentée. Appuyez sur Tab une nouvelle fois ou sur Échap pour quitter l'éditeur.", - "discussion.sidebar.reference": "Référence" + "discussion.sidebar.reference": "Référence", + "repo.settings.push_mirror.branch_filter.label": "Filtre de branche (optionnel)", + "repo.diff.commit.next-short": "Suiv.", + "repo.diff.commit.previous-short": "Préc.", + "profile.actions.tooltip": "Plus d'actions", + "profile.edit.link": "Éditer le profil", + "keys.ssh.link": "Clé SSH", + "keys.gpg.link": "Clés GPG" } diff --git a/options/locale_next/locale_lv-LV.json b/options/locale_next/locale_lv-LV.json index 0bf903f026..bf6e4729b3 100644 --- a/options/locale_next/locale_lv-LV.json +++ b/options/locale_next/locale_lv-LV.json @@ -118,5 +118,6 @@ "admin.moderation.no_open_reports": "Pašlaik nav atvērtu pārskatu.", "admin.moderation.moderation_reports": "Satura pārraudzības pārskati", "admin.moderation.reports": "Pārskati", - "admin.moderation.deleted_content_ref": "Saturs, par kuru ziņots, ar veidu %[1]v un Id %[2]d vairs nepastāv" + "admin.moderation.deleted_content_ref": "Saturs, par kuru ziņots, ar veidu %[1]v un Id %[2]d vairs nepastāv", + "admin.dashboard.remove_resolved_reports": "Noņemt atrisinātos ziņojumus" } diff --git a/options/locale_next/locale_nds.json b/options/locale_next/locale_nds.json index f51077c610..66c70939f4 100644 --- a/options/locale_next/locale_nds.json +++ b/options/locale_next/locale_nds.json @@ -110,5 +110,6 @@ "admin.moderation.moderation_reports": "Moderatioons-Berichten", "admin.moderation.no_open_reports": "Dat gifft jüüst keene open Berichten.", "admin.moderation.reports": "Berichten", - "admin.moderation.deleted_content_ref": "Mellt Inholl mit Aard %[1]v un Kennteken %[2]d gifft dat nich mehr" + "admin.moderation.deleted_content_ref": "Mellt Inholl mit Aard %[1]v un Kennteken %[2]d gifft dat nich mehr", + "admin.dashboard.remove_resolved_reports": "Lööst Berichten wegdoon" } diff --git a/options/locale_next/locale_pt-BR.json b/options/locale_next/locale_pt-BR.json index 67a9f79917..74dd2c4b83 100644 --- a/options/locale_next/locale_pt-BR.json +++ b/options/locale_next/locale_pt-BR.json @@ -118,5 +118,6 @@ "admin.moderation.deleted_content_ref": "Conteúdo denunciado do tipo %[1]v e ID %[2]d não existe mais", "admin.moderation.moderation_reports": "Denúncias para moderação", "admin.moderation.reports": "Denúncias", - "admin.moderation.no_open_reports": "Não há denúncias abertas atualmente." + "admin.moderation.no_open_reports": "Não há denúncias abertas atualmente.", + "admin.dashboard.remove_resolved_reports": "Remover denúncias resolvidas" } diff --git a/options/locale_next/locale_pt-PT.json b/options/locale_next/locale_pt-PT.json index c3b908ed07..0bdabfd431 100644 --- a/options/locale_next/locale_pt-PT.json +++ b/options/locale_next/locale_pt-PT.json @@ -101,7 +101,7 @@ "editor.textarea.shift_tab_hint": "Sem indentação nesta linha. Pressione Shift + Tab novamente ou Escape para sair do editor.", "stars.list.none": "Ninguém juntou este repositório aos favoritos.", "admin.dashboard.cleanup_offline_runners": "Limpeza de executores offline", - "settings.visibility.description": "A visibilidade do perfil afecta a capacidade de outros acederem aos seus repositórios não privados. Ler mais", + "settings.visibility.description": "A visibilidade do perfil afecta a capacidade de outros acederem aos seus repositórios não privados. Saiba mais.", "avatar.constraints_hint": "O avatar personalizado não pode exceder %[1]s de tamanho ou ser maior do que %[2]dx%[3]d pixéis", "repo.diff.commit.next-short": "Seg.", "profile.actions.tooltip": "Mais Actions", @@ -114,5 +114,10 @@ "repo.settings.push_mirror.branch_filter.label": "Filtro de ramos (opcional)", "repo.settings.push_mirror.branch_filter.description": "Ramos a serem espelhados. Deixe em branco para espelhar todos os ramos. Veja a %[2]s documentação sobre a sintaxe. Exemplos: main, release/*", "mail.actions.run_info_sha": "Cometimento: %[1]s", - "discussion.sidebar.reference": "Referência" + "discussion.sidebar.reference": "Referência", + "admin.dashboard.remove_resolved_reports": "Remover denúncias resolvidas", + "admin.moderation.no_open_reports": "Atualmente não há denúncias em aberto.", + "admin.moderation.deleted_content_ref": "O conteúdo denunciado do tipo %[1]v e id %[2]d já não existe", + "admin.moderation.moderation_reports": "Denúncias aos moderadores", + "admin.moderation.reports": "Denúncias" } diff --git a/options/locale_next/locale_ru-RU.json b/options/locale_next/locale_ru-RU.json index cc6d99ca80..e15c8ffa27 100644 --- a/options/locale_next/locale_ru-RU.json +++ b/options/locale_next/locale_ru-RU.json @@ -102,7 +102,7 @@ "editor.textarea.shift_tab_hint": "В строке нет отступов. Нажмите Shift + Tab снова или Escape, чтобы покинуть редактор.", "admin.dashboard.cleanup_offline_runners": "Удалить недоступных исполнителей", "avatar.constraints_hint": "Изображение профиля не может быть более %[1]s и крупнее %[2]dx%[3]d пикселей", - "settings.visibility.description": "Видимость профиля влияет на доступ других до ваших не частных репозиториев. Подробнее", + "settings.visibility.description": "Видимость профиля влияет на доступ других до ваших не частных репозиториев. Подробнее.", "repo.diff.commit.previous-short": "Пред.", "repo.diff.commit.next-short": "След.", "profile.actions.tooltip": "Показать действия", @@ -114,5 +114,10 @@ "mail.actions.run_info_sha": "Коммит: %[1]s", "repo.settings.push_mirror.branch_filter.description": "Синхронизируемые ветви. Оставьте пустым, чтобы синхронизировать все. Ознакомьтесь с синтаксисом в документации %[2]s. Примеры: main, release/*", "repo.settings.push_mirror.branch_filter.label": "Выбор ветвей (опционально)", - "discussion.sidebar.reference": "Ссылка" + "discussion.sidebar.reference": "Ссылка", + "admin.moderation.moderation_reports": "Жалобы модерации", + "admin.moderation.deleted_content_ref": "Содержимое типа %[1]v и ид. %[2]d, на которое пожаловались, более не существует", + "admin.moderation.reports": "Жалобы", + "admin.moderation.no_open_reports": "Нет открытых жалоб.", + "admin.dashboard.remove_resolved_reports": "Удалить разрешённые жалобы" } diff --git a/options/locale_next/locale_uk-UA.json b/options/locale_next/locale_uk-UA.json index 046738e334..8c8ade33c9 100644 --- a/options/locale_next/locale_uk-UA.json +++ b/options/locale_next/locale_uk-UA.json @@ -117,5 +117,7 @@ "discussion.sidebar.reference": "Посилання", "admin.moderation.no_open_reports": "Відкритих скарг наразі немає.", "admin.moderation.reports": "Скарги", - "admin.moderation.deleted_content_ref": "Вміст типу %[1]v з ідентифікатором %[2]d, на який подано скаргу, більше не існує" + "admin.moderation.deleted_content_ref": "Вміст типу %[1]v з ідентифікатором %[2]d, на який подано скаргу, більше не існує", + "admin.moderation.moderation_reports": "Скарги модераторам", + "admin.dashboard.remove_resolved_reports": "Видалити закриті скарги" } From 3ff78d243a62e525d141238012ff554820b2f36e Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 1 Aug 2025 07:55:49 +0200 Subject: [PATCH 249/495] Update linters (forgejo) (#8750) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 179 +++++++++++++++++++++++----------------------- package.json | 12 ++-- 2 files changed, 94 insertions(+), 97 deletions(-) diff --git a/package-lock.json b/package-lock.json index eface926ae..9f5286dd43 100644 --- a/package-lock.json +++ b/package-lock.json @@ -65,25 +65,25 @@ "@eslint-community/eslint-plugin-eslint-comments": "4.5.0", "@playwright/test": "1.54.1", "@stoplight/spectral-cli": "6.15.0", - "@stylistic/eslint-plugin": "5.2.0", + "@stylistic/eslint-plugin": "5.2.2", "@stylistic/stylelint-plugin": "3.1.3", "@vitejs/plugin-vue": "6.0.0", "@vitest/coverage-v8": "3.2.4", "@vitest/eslint-plugin": "1.3.4", "@vue/test-utils": "2.4.6", - "eslint": "9.31.0", + "eslint": "9.32.0", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-array-func": "5.0.2", "eslint-plugin-import-x": "4.16.1", "eslint-plugin-no-jquery": "3.1.1", "eslint-plugin-no-use-extend-native": "0.7.2", - "eslint-plugin-playwright": "2.2.0", + "eslint-plugin-playwright": "2.2.2", "eslint-plugin-regexp": "2.9.0", "eslint-plugin-sonarjs": "3.0.4", "eslint-plugin-toml": "0.12.0", "eslint-plugin-unicorn": "59.0.1", "eslint-plugin-vitest-globals": "1.5.0", - "eslint-plugin-vue": "10.3.0", + "eslint-plugin-vue": "10.4.0", "eslint-plugin-vue-scoped-css": "2.11.0", "eslint-plugin-wc": "3.0.1", "globals": "16.3.0", @@ -92,13 +92,13 @@ "markdownlint-cli": "0.45.0", "postcss-html": "1.8.0", "sharp": "0.34.3", - "stylelint": "16.22.0", + "stylelint": "16.23.0", "stylelint-declaration-block-no-ignored-properties": "2.8.0", "stylelint-declaration-strict-value": "1.10.11", "stylelint-value-no-unknown-custom-properties": "6.0.1", "svgo": "4.0.0", "typescript": "5.8.3", - "typescript-eslint": "8.37.0", + "typescript-eslint": "8.38.0", "vite-string-plugin": "1.4.6", "vitest": "3.2.4" }, @@ -1162,9 +1162,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.31.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.31.0.tgz", - "integrity": "sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==", + "version": "9.32.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.32.0.tgz", + "integrity": "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==", "dev": true, "license": "MIT", "engines": { @@ -3048,9 +3048,9 @@ } }, "node_modules/@stylistic/eslint-plugin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.2.0.tgz", - "integrity": "sha512-RCEdbREv9EBiToUBQTlRhVYKG093I6ZnnQ990j08eJ6uRZh71DXkOnoxtTLfDQ6utVCVQzrhZFHZP0zfrfOIjA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.2.2.tgz", + "integrity": "sha512-bE2DUjruqXlHYP3Q2Gpqiuj2bHq7/88FnuaS0FjeGGLCy+X6a07bGVuwtiOYnPSLHR6jmx5Bwdv+j7l8H+G97A==", "dev": true, "license": "MIT", "dependencies": { @@ -3544,17 +3544,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.37.0.tgz", - "integrity": "sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz", + "integrity": "sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.37.0", - "@typescript-eslint/type-utils": "8.37.0", - "@typescript-eslint/utils": "8.37.0", - "@typescript-eslint/visitor-keys": "8.37.0", + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/type-utils": "8.38.0", + "@typescript-eslint/utils": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -3568,7 +3568,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.37.0", + "@typescript-eslint/parser": "^8.38.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } @@ -3584,16 +3584,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.37.0.tgz", - "integrity": "sha512-kVIaQE9vrN9RLCQMQ3iyRlVJpTiDUY6woHGb30JDkfJErqrQEmtdWH3gV0PBAfGZgQXoqzXOO0T3K6ioApbbAA==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.38.0.tgz", + "integrity": "sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.37.0", - "@typescript-eslint/types": "8.37.0", - "@typescript-eslint/typescript-estree": "8.37.0", - "@typescript-eslint/visitor-keys": "8.37.0", + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", "debug": "^4.3.4" }, "engines": { @@ -3609,14 +3609,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.37.0.tgz", - "integrity": "sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz", + "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.37.0", - "@typescript-eslint/types": "^8.37.0", + "@typescript-eslint/tsconfig-utils": "^8.38.0", + "@typescript-eslint/types": "^8.38.0", "debug": "^4.3.4" }, "engines": { @@ -3631,14 +3631,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.37.0.tgz", - "integrity": "sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz", + "integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.37.0", - "@typescript-eslint/visitor-keys": "8.37.0" + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3649,9 +3649,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.37.0.tgz", - "integrity": "sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz", + "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==", "dev": true, "license": "MIT", "engines": { @@ -3666,15 +3666,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.37.0.tgz", - "integrity": "sha512-SPkXWIkVZxhgwSwVq9rqj/4VFo7MnWwVaRNznfQDc/xPYHjXnPfLWn+4L6FF1cAz6e7dsqBeMawgl7QjUMj4Ow==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.38.0.tgz", + "integrity": "sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.37.0", - "@typescript-eslint/typescript-estree": "8.37.0", - "@typescript-eslint/utils": "8.37.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0", + "@typescript-eslint/utils": "8.38.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -3691,9 +3691,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.37.0.tgz", - "integrity": "sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz", + "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==", "dev": true, "license": "MIT", "engines": { @@ -3705,16 +3705,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.37.0.tgz", - "integrity": "sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz", + "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.37.0", - "@typescript-eslint/tsconfig-utils": "8.37.0", - "@typescript-eslint/types": "8.37.0", - "@typescript-eslint/visitor-keys": "8.37.0", + "@typescript-eslint/project-service": "8.38.0", + "@typescript-eslint/tsconfig-utils": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3767,16 +3767,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.37.0.tgz", - "integrity": "sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz", + "integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.37.0", - "@typescript-eslint/types": "8.37.0", - "@typescript-eslint/typescript-estree": "8.37.0" + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3791,13 +3791,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.37.0.tgz", - "integrity": "sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz", + "integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.37.0", + "@typescript-eslint/types": "8.38.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -7290,9 +7290,9 @@ } }, "node_modules/eslint": { - "version": "9.31.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.31.0.tgz", - "integrity": "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==", + "version": "9.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.32.0.tgz", + "integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==", "dev": true, "license": "MIT", "dependencies": { @@ -7302,8 +7302,8 @@ "@eslint/config-helpers": "^0.3.0", "@eslint/core": "^0.15.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.31.0", - "@eslint/plugin-kit": "^0.3.1", + "@eslint/js": "9.32.0", + "@eslint/plugin-kit": "^0.3.4", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -7506,14 +7506,11 @@ } }, "node_modules/eslint-plugin-playwright": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-2.2.0.tgz", - "integrity": "sha512-qSQpAw7RcSzE3zPp8FMGkthaCWovHZ/BsXtpmnGax9vQLIovlh1bsZHEa2+j2lv9DWhnyeLM/qZmp7ffQZfQvg==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-2.2.2.tgz", + "integrity": "sha512-j0jKpndIPOXRRP9uMkwb9l/nSmModOU3452nrFdgFJoEv/435J1onk8+aITzjDW8DfypxgmVaDMdmVIa6F7I0w==", "dev": true, "license": "MIT", - "workspaces": [ - "examples" - ], "dependencies": { "globals": "^13.23.0" }, @@ -7709,9 +7706,9 @@ "license": "MIT" }, "node_modules/eslint-plugin-vue": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.3.0.tgz", - "integrity": "sha512-A0u9snqjCfYaPnqqOaH6MBLVWDUIN4trXn8J3x67uDcXvR7X6Ut8p16N+nYhMCQ9Y7edg2BIRGzfyZsY0IdqoQ==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.4.0.tgz", + "integrity": "sha512-K6tP0dW8FJVZLQxa2S7LcE1lLw3X8VvB3t887Q6CLrFVxHYBXGANbXvwNzYIu6Ughx1bSJ5BDT0YB3ybPT39lw==", "dev": true, "license": "MIT", "dependencies": { @@ -13838,9 +13835,9 @@ "license": "ISC" }, "node_modules/stylelint": { - "version": "16.22.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.22.0.tgz", - "integrity": "sha512-SVEMTdjKNV4ollUrIY9ordZ36zHv2/PHzPjfPMau370MlL2VYXeLgSNMMiEbLGRO8RmD2R8/BVUeF2DfnfkC0w==", + "version": "16.23.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.23.0.tgz", + "integrity": "sha512-69T5aS2LUY306ekt1Q1oaSPwz/jaG9HjyMix3UMrai1iEbuOafBe2Dh8xlyczrxFAy89qcKyZWWtc42XLx3Bbw==", "dev": true, "funding": [ { @@ -13867,7 +13864,7 @@ "debug": "^4.4.1", "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^10.1.1", + "file-entry-cache": "^10.1.3", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", @@ -14924,16 +14921,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.37.0.tgz", - "integrity": "sha512-TnbEjzkE9EmcO0Q2zM+GE8NQLItNAJpMmED1BdgoBMYNdqMhzlbqfdSwiRlAzEK2pA9UzVW0gzaaIzXWg2BjfA==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.38.0.tgz", + "integrity": "sha512-FsZlrYK6bPDGoLeZRuvx2v6qrM03I0U0SnfCLPs/XCCPCFD80xU9Pg09H/K+XFa68uJuZo7l/Xhs+eDRg2l3hg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.37.0", - "@typescript-eslint/parser": "8.37.0", - "@typescript-eslint/typescript-estree": "8.37.0", - "@typescript-eslint/utils": "8.37.0" + "@typescript-eslint/eslint-plugin": "8.38.0", + "@typescript-eslint/parser": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0", + "@typescript-eslint/utils": "8.38.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" diff --git a/package.json b/package.json index b0dc05c6d1..559c79b38f 100644 --- a/package.json +++ b/package.json @@ -64,25 +64,25 @@ "@eslint-community/eslint-plugin-eslint-comments": "4.5.0", "@playwright/test": "1.54.1", "@stoplight/spectral-cli": "6.15.0", - "@stylistic/eslint-plugin": "5.2.0", + "@stylistic/eslint-plugin": "5.2.2", "@stylistic/stylelint-plugin": "3.1.3", "@vitejs/plugin-vue": "6.0.0", "@vitest/coverage-v8": "3.2.4", "@vitest/eslint-plugin": "1.3.4", "@vue/test-utils": "2.4.6", - "eslint": "9.31.0", + "eslint": "9.32.0", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-array-func": "5.0.2", "eslint-plugin-import-x": "4.16.1", "eslint-plugin-no-jquery": "3.1.1", "eslint-plugin-no-use-extend-native": "0.7.2", - "eslint-plugin-playwright": "2.2.0", + "eslint-plugin-playwright": "2.2.2", "eslint-plugin-regexp": "2.9.0", "eslint-plugin-sonarjs": "3.0.4", "eslint-plugin-toml": "0.12.0", "eslint-plugin-unicorn": "59.0.1", "eslint-plugin-vitest-globals": "1.5.0", - "eslint-plugin-vue": "10.3.0", + "eslint-plugin-vue": "10.4.0", "eslint-plugin-vue-scoped-css": "2.11.0", "eslint-plugin-wc": "3.0.1", "globals": "16.3.0", @@ -91,13 +91,13 @@ "markdownlint-cli": "0.45.0", "postcss-html": "1.8.0", "sharp": "0.34.3", - "stylelint": "16.22.0", + "stylelint": "16.23.0", "stylelint-declaration-block-no-ignored-properties": "2.8.0", "stylelint-declaration-strict-value": "1.10.11", "stylelint-value-no-unknown-custom-properties": "6.0.1", "svgo": "4.0.0", "typescript": "5.8.3", - "typescript-eslint": "8.37.0", + "typescript-eslint": "8.38.0", "vite-string-plugin": "1.4.6", "vitest": "3.2.4" }, From fb5726005619ff34986d1aacbeccec349230a977 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 1 Aug 2025 07:56:31 +0200 Subject: [PATCH 250/495] Update module github.com/golangci/golangci-lint/v2/cmd/golangci-lint to v2.3.0 (forgejo) (#8752) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index b46b23a44a..446e9e0546 100644 --- a/Makefile +++ b/Makefile @@ -39,7 +39,7 @@ XGO_VERSION := go-1.21.x AIR_PACKAGE ?= github.com/air-verse/air@v1 # renovate: datasource=go EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-checker/v3/cmd/editorconfig-checker@v3.3.0 # renovate: datasource=go GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.8.0 # renovate: datasource=go -GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.2.2 # renovate: datasource=go +GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.3.0 # renovate: datasource=go GXZ_PACKAGE ?= github.com/ulikunitz/xz/cmd/gxz@v0.5.11 # renovate: datasource=go SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.31.0 # renovate: datasource=go XGO_PACKAGE ?= src.techknowlogick.com/xgo@latest From f185a4ce671e131c7d3c6952b9ad4a2253fdcde2 Mon Sep 17 00:00:00 2001 From: Michael Kriese Date: Fri, 1 Aug 2025 10:55:05 +0200 Subject: [PATCH 251/495] feat(logger): rename settings for consistency and remove obsolete settings (#8667) - [x] rename logger settings: `logger..MODE` -> `LOGGER__MODE` - [x] dropped legacy logger settings - [ ] create a docs PR to update documentation I used Github Copilot for some auto completion of code. ## Checklist The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org). ### Tests - I added test coverage for Go changes... - [x] in their respective `*_test.go` for unit tests. - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server. - I added test coverage for JavaScript changes... - [ ] in `web_src/js/*.test.js` if it can be unit tested. - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)). ### Documentation - [x] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [ ] I did not document these changes and I do not expect someone else to do it. ### Release notes - [ ] I do not want this change to show in the release notes. - [x] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/.md` to be be used for the release notes instead of the title. ## Release notes - Breaking features - [PR](https://codeberg.org/forgejo/forgejo/pulls/8667): feat(logger): rename settings for consistency and remove obsolete settings Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8667 Reviewed-by: Earl Warren Co-authored-by: Michael Kriese Co-committed-by: Michael Kriese --- custom/conf/app.example.ini | 6 +-- modules/setting/config_provider.go | 8 +++ modules/setting/log.go | 80 +++++++++++++++++++++--------- modules/setting/log_test.go | 36 +++++++++++--- tests/mysql.ini.tmpl | 2 +- tests/pgsql.ini.tmpl | 2 +- tests/sqlite.ini.tmpl | 2 +- 7 files changed, 100 insertions(+), 36 deletions(-) diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index 8f7c4658ce..ec65b3382e 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -592,9 +592,9 @@ LEVEL = Info ;BUFFER_LEN = 10000 ;; ;; Sub logger modes, a single comma means use default MODE above, empty means disable it -;logger.access.MODE= -;logger.router.MODE=, -;logger.xorm.MODE=, +;LOGGER_ACCESS_MODE= +;LOGGER_ROUTER_MODE=, +;LOGGER_XORM_MODE=, ;; ;; Collect SSH logs (Creates log from ssh git request) ;; diff --git a/modules/setting/config_provider.go b/modules/setting/config_provider.go index 19f3b9008a..a34859de56 100644 --- a/modules/setting/config_provider.go +++ b/modules/setting/config_provider.go @@ -331,6 +331,14 @@ func deprecatedSetting(rootCfg ConfigProvider, oldSection, oldKey, newSection, n } } +func deprecatedSettingWarning(rootCfg ConfigProvider, oldSection, oldKey, newSection, newKey string) { //nolint:unparam + if rootCfg.Section(oldSection).HasKey(oldKey) { + msg := fmt.Sprintf("Deprecated config option `[%s]` `%s` present. Use `[%s]` `%s` instead.", oldSection, oldKey, newSection, newKey) + log.Error("%v", msg) + DeprecatedWarnings = append(DeprecatedWarnings, msg) + } +} + // deprecatedSettingDB add a hint that the configuration has been moved to database but still kept in app.ini func deprecatedSettingDB(rootCfg ConfigProvider, oldSection, oldKey string) { if rootCfg.Section(oldSection).HasKey(oldKey) { diff --git a/modules/setting/log.go b/modules/setting/log.go index 6d069d0e9c..a23662239e 100644 --- a/modules/setting/log.go +++ b/modules/setting/log.go @@ -56,41 +56,73 @@ func loadLogGlobalFrom(rootCfg ConfigProvider) { func prepareLoggerConfig(rootCfg ConfigProvider) { sec := rootCfg.Section("log") - if !sec.HasKey("logger.default.MODE") { - sec.Key("logger.default.MODE").MustString(",") + // Priority: `LOGGER_DEFAULT_MODE` -> `logger.default.MODE` + deprecatedSettingWarning(rootCfg, "log", "logger.default.MODE", "log", "LOGGER_DEFAULT_MODE") + hasNoValue := !sec.HasKey("LOGGER_DEFAULT_MODE") + if hasNoValue && sec.HasKey("logger.default.MODE") { + sec.Key("LOGGER_DEFAULT_MODE").SetValue(sec.Key("logger.default.MODE").String()) + hasNoValue = false + } + if hasNoValue { + sec.Key("LOGGER_DEFAULT_MODE").SetValue(",") // use default logger } - deprecatedSetting(rootCfg, "log", "ACCESS", "log", "logger.access.MODE", "1.21") - deprecatedSetting(rootCfg, "log", "ENABLE_ACCESS_LOG", "log", "logger.access.MODE", "1.21") - if val := sec.Key("ACCESS").String(); val != "" { - sec.Key("logger.access.MODE").MustString(val) + // Priority: `ENABLE_ACCESS_LOG` -> `LOGGER_ACCESS_MODE` -> `logger.access.MODE` -> `ACCESS` + deprecatedSettingWarning(rootCfg, "log", "ACCESS", "log", "LOGGER_ACCESS_MODE") + deprecatedSettingWarning(rootCfg, "log", "ENABLE_ACCESS_LOG", "log", "LOGGER_ACCESS_MODE") + deprecatedSettingWarning(rootCfg, "log", "logger.access.MODE", "log", "LOGGER_ACCESS_MODE") + hasNoValue = !sec.HasKey("LOGGER_ACCESS_MODE") + if hasNoValue && sec.HasKey("logger.access.MODE") { + sec.Key("LOGGER_ACCESS_MODE").SetValue(sec.Key("logger.access.MODE").String()) + hasNoValue = false + } + if val := sec.Key("ACCESS").String(); hasNoValue && val != "" { + sec.Key("LOGGER_ACCESS_MODE").SetValue(val) } if sec.HasKey("ENABLE_ACCESS_LOG") && !sec.Key("ENABLE_ACCESS_LOG").MustBool() { - sec.Key("logger.access.MODE").SetValue("") + sec.Key("LOGGER_ACCESS_MODE").SetValue("") } - deprecatedSetting(rootCfg, "log", "ROUTER", "log", "logger.router.MODE", "1.21") - deprecatedSetting(rootCfg, "log", "DISABLE_ROUTER_LOG", "log", "logger.router.MODE", "1.21") - if val := sec.Key("ROUTER").String(); val != "" { - sec.Key("logger.router.MODE").MustString(val) + // Priority: `DISABLE_ROUTER_LOG` -> `LOGGER_ROUTER_MODE` -> `logger.router.MODE` -> `ROUTER` + deprecatedSettingWarning(rootCfg, "log", "ROUTER", "log", "LOGGER_ROUTER_MODE") + deprecatedSettingWarning(rootCfg, "log", "DISABLE_ROUTER_LOG", "log", "LOGGER_ROUTER_MODE") + deprecatedSettingWarning(rootCfg, "log", "logger.router.MODE", "log", "LOGGER_ROUTER_MODE") + hasNoValue = !sec.HasKey("LOGGER_ROUTER_MODE") + if hasNoValue && sec.HasKey("logger.router.MODE") { + sec.Key("LOGGER_ROUTER_MODE").SetValue(sec.Key("logger.router.MODE").String()) + hasNoValue = false } - if !sec.HasKey("logger.router.MODE") { - sec.Key("logger.router.MODE").MustString(",") // use default logger + if val := sec.Key("ROUTER").String(); hasNoValue && val != "" { + sec.Key("LOGGER_ROUTER_MODE").SetValue(val) + hasNoValue = false } if sec.HasKey("DISABLE_ROUTER_LOG") && sec.Key("DISABLE_ROUTER_LOG").MustBool() { - sec.Key("logger.router.MODE").SetValue("") + sec.Key("LOGGER_ROUTER_MODE").SetValue("") + hasNoValue = false + } + if hasNoValue { + sec.Key("LOGGER_ROUTER_MODE").SetValue(",") // use default logger } - deprecatedSetting(rootCfg, "log", "XORM", "log", "logger.xorm.MODE", "1.21") - deprecatedSetting(rootCfg, "log", "ENABLE_XORM_LOG", "log", "logger.xorm.MODE", "1.21") - if val := sec.Key("XORM").String(); val != "" { - sec.Key("logger.xorm.MODE").MustString(val) + // Priority: `ENABLE_XORM_LOG` -> `LOGGER_XORM_MODE` -> `logger.xorm.MODE` -> `XORM` + deprecatedSettingWarning(rootCfg, "log", "XORM", "log", "LOGGER_XORM_MODE") + deprecatedSettingWarning(rootCfg, "log", "ENABLE_XORM_LOG", "log", "LOGGER_XORM_MODE") + deprecatedSettingWarning(rootCfg, "log", "logger.xorm.MODE", "log", "LOGGER_XORM_MODE") + hasNoValue = !sec.HasKey("LOGGER_XORM_MODE") + if hasNoValue && sec.HasKey("logger.xorm.MODE") { + sec.Key("LOGGER_XORM_MODE").SetValue(sec.Key("logger.xorm.MODE").String()) + hasNoValue = false } - if !sec.HasKey("logger.xorm.MODE") { - sec.Key("logger.xorm.MODE").MustString(",") // use default logger + if val := sec.Key("XORM").String(); hasNoValue && val != "" { + sec.Key("LOGGER_XORM_MODE").SetValue(val) + hasNoValue = false } if sec.HasKey("ENABLE_XORM_LOG") && !sec.Key("ENABLE_XORM_LOG").MustBool() { - sec.Key("logger.xorm.MODE").SetValue("") + sec.Key("LOGGER_XORM_MODE").SetValue("") + hasNoValue = false + } + if hasNoValue { + sec.Key("LOGGER_XORM_MODE").SetValue(",") // use default logger } } @@ -217,14 +249,14 @@ func initManagedLoggers(manager *log.LoggerManager, cfg ConfigProvider) { func initLoggerByName(manager *log.LoggerManager, rootCfg ConfigProvider, loggerName string) { sec := rootCfg.Section("log") - keyPrefix := "logger." + loggerName + key := "LOGGER_" + strings.ToUpper(loggerName) + "_MODE" - disabled := sec.HasKey(keyPrefix+".MODE") && sec.Key(keyPrefix+".MODE").String() == "" + disabled := sec.HasKey(key) && sec.Key(key).String() == "" if disabled { return } - modeVal := sec.Key(keyPrefix + ".MODE").String() + modeVal := sec.Key(key).String() if modeVal == "," { modeVal = Log.Mode } diff --git a/modules/setting/log_test.go b/modules/setting/log_test.go index 528921c669..a37c8f07a9 100644 --- a/modules/setting/log_test.go +++ b/modules/setting/log_test.go @@ -251,8 +251,8 @@ ENABLE_ACCESS_LOG = false func TestLogConfigNewConfig(t *testing.T) { manager, managerClose := initLoggersByConfig(t, ` [log] -logger.access.MODE = console -logger.xorm.MODE = console, console-1 +LOGGER_ACCESS_MODE = console +LOGGER_XORM_MODE = console, console-1 [log.console] LEVEL = warn @@ -421,7 +421,7 @@ func TestLegacyLoggerMigrations(t *testing.T) { } t.Run("default", func(t *testing.T) { - runCases(t, "logger.default.MODE", Cases{ + runCases(t, "LOGGER_DEFAULT_MODE", Cases{ { "uses default value for default logger", "", @@ -438,7 +438,7 @@ logger.default.MODE = file }) t.Run("access", func(t *testing.T) { - runCases(t, "logger.access.MODE", Cases{ + runCases(t, "LOGGER_ACCESS_MODE", Cases{ { "uses default value for access logger", "", @@ -475,6 +475,14 @@ logger.access.MODE = console `, "console", }, + { + "LOGGER_ACCESS_MODE has precedence over logger.access.MODE for access logger", + `[log] +LOGGER_ACCESS_MODE = file +logger.access.MODE = console +`, + "file", + }, { "ENABLE_ACCESS_LOG doesn't enable access logger", `[log] @@ -486,7 +494,7 @@ ENABLE_ACCESS_LOG = true }) t.Run("router", func(t *testing.T) { - runCases(t, "logger.router.MODE", Cases{ + runCases(t, "LOGGER_ROUTER_MODE", Cases{ { "uses default value for router logger", "", @@ -523,11 +531,19 @@ logger.router.MODE = console `, "console", }, + { + "LOGGER_ROUTER_MODE has precedence over logger.router.MODE for router logger", + `[log] +LOGGER_ROUTER_MODE = file +logger.router.MODE = console +`, + "file", + }, }) }) t.Run("xorm", func(t *testing.T) { - runCases(t, "logger.xorm.MODE", Cases{ + runCases(t, "LOGGER_XORM_MODE", Cases{ { "uses default value for xorm logger", "", @@ -564,6 +580,14 @@ logger.xorm.MODE = console `, "console", }, + { + "LOGGER_XORM_MODE has precedence over logger.xorm.MODE for xorm logger", + `[log] +LOGGER_XORM_MODE = file +logger.xorm.MODE = console +`, + "file", + }, }) }) } diff --git a/tests/mysql.ini.tmpl b/tests/mysql.ini.tmpl index 3315d85a3f..674884cea5 100644 --- a/tests/mysql.ini.tmpl +++ b/tests/mysql.ini.tmpl @@ -77,7 +77,7 @@ PROVIDER_CONFIG = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-mysql/data/sessions MODE = {{TEST_LOGGER}} ROOT_PATH = {{REPO_TEST_DIR}}mysql-log ENABLE_SSH_LOG = true -logger.xorm.MODE = file +LOGGER_XORM_MODE = file [log.test] LEVEL = Info diff --git a/tests/pgsql.ini.tmpl b/tests/pgsql.ini.tmpl index 1e9b981800..386137d219 100644 --- a/tests/pgsql.ini.tmpl +++ b/tests/pgsql.ini.tmpl @@ -82,7 +82,7 @@ PROVIDER_CONFIG = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-pgsql/data/sessions MODE = {{TEST_LOGGER}} ROOT_PATH = {{REPO_TEST_DIR}}pgsql-log ENABLE_SSH_LOG = true -logger.xorm.MODE = file +LOGGER_XORM_MODE = file [log.test] LEVEL = Info diff --git a/tests/sqlite.ini.tmpl b/tests/sqlite.ini.tmpl index df6cea44ca..b3baa314a2 100644 --- a/tests/sqlite.ini.tmpl +++ b/tests/sqlite.ini.tmpl @@ -79,7 +79,7 @@ PROVIDER_CONFIG = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-sqlite/data/sessions MODE = {{TEST_LOGGER}} ROOT_PATH = {{REPO_TEST_DIR}}sqlite-log ENABLE_SSH_LOG = true -logger.xorm.MODE = file +LOGGER_XORM_MODE = file [log.test] LEVEL = Info From d539fe7bf773150b47478c4a52dbdf10d2f215f4 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 1 Aug 2025 21:01:54 +0200 Subject: [PATCH 252/495] Update module github.com/mattn/go-sqlite3 to v1.14.30 (forgejo) (#8738) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8738 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 167fe117c1..b0df1e7480 100644 --- a/go.mod +++ b/go.mod @@ -72,7 +72,7 @@ require ( github.com/lib/pq v1.10.9 github.com/markbates/goth v1.80.0 github.com/mattn/go-isatty v0.0.20 - github.com/mattn/go-sqlite3 v1.14.29 + github.com/mattn/go-sqlite3 v1.14.30 github.com/meilisearch/meilisearch-go v0.31.0 github.com/mholt/archiver/v3 v3.5.1 github.com/microcosm-cc/bluemonday v1.0.27 diff --git a/go.sum b/go.sum index a8af308a15..adb10d19d2 100644 --- a/go.sum +++ b/go.sum @@ -395,8 +395,8 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.14.29 h1:1O6nRLJKvsi1H2Sj0Hzdfojwt8GiGKm+LOfLaBFaouQ= -github.com/mattn/go-sqlite3 v1.14.29/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/mattn/go-sqlite3 v1.14.30 h1:bVreufq3EAIG1Quvws73du3/QgdeZ3myglJlrzSYYCY= +github.com/mattn/go-sqlite3 v1.14.30/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/meilisearch/meilisearch-go v0.31.0 h1:yZRhY1qJqdH8h6GFZALGtkDLyj8f9v5aJpsNMyrUmnY= github.com/meilisearch/meilisearch-go v0.31.0/go.mod h1:aNtyuwurDg/ggxQIcKqWH6G9g2ptc8GyY7PLY4zMn/g= github.com/mholt/acmez/v3 v3.1.2 h1:auob8J/0FhmdClQicvJvuDavgd5ezwLBfKuYmynhYzc= From 1331a7f75cf74a89e5e6cac13d0bcf856e3ec28d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 1 Aug 2025 21:01:58 +0200 Subject: [PATCH 253/495] Update module github.com/golang-jwt/jwt/v5 to v5.3.0 (forgejo) (#8739) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8739 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b0df1e7480..d664940e5a 100644 --- a/go.mod +++ b/go.mod @@ -53,7 +53,7 @@ require ( github.com/gobwas/glob v0.2.3 github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85 - github.com/golang-jwt/jwt/v5 v5.2.3 + github.com/golang-jwt/jwt/v5 v5.3.0 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 github.com/google/go-github/v64 v64.0.0 github.com/google/pprof v0.0.0-20250630185457-6e76a2b096b5 diff --git a/go.sum b/go.sum index adb10d19d2..d358671e16 100644 --- a/go.sum +++ b/go.sum @@ -268,8 +268,8 @@ github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85/go.mod h1:fR6z github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v5 v5.2.3 h1:kkGXqQOBSDDWRhWNXTFpqGSCMyh/PLnqUvMGJPDJDs0= -github.com/golang-jwt/jwt/v5 v5.2.3/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo= +github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= From e4cd25057f04e45aabf27eb0f6092776936a30db Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 1 Aug 2025 22:33:27 +0200 Subject: [PATCH 254/495] Update dependency @vitejs/plugin-vue to v6.0.1 (forgejo) (#8749) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9f5286dd43..b4bbf1f575 100644 --- a/package-lock.json +++ b/package-lock.json @@ -67,7 +67,7 @@ "@stoplight/spectral-cli": "6.15.0", "@stylistic/eslint-plugin": "5.2.2", "@stylistic/stylelint-plugin": "3.1.3", - "@vitejs/plugin-vue": "6.0.0", + "@vitejs/plugin-vue": "6.0.1", "@vitest/coverage-v8": "3.2.4", "@vitest/eslint-plugin": "1.3.4", "@vue/test-utils": "2.4.6", @@ -2207,9 +2207,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.19", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz", - "integrity": "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==", + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.29.tgz", + "integrity": "sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==", "dev": true, "license": "MIT" }, @@ -4078,13 +4078,13 @@ ] }, "node_modules/@vitejs/plugin-vue": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.0.tgz", - "integrity": "sha512-iAliE72WsdhjzTOp2DtvKThq1VBC4REhwRcaA+zPAAph6I+OQhUXv+Xu2KS7ElxYtb7Zc/3R30Hwv1DxEo7NXQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz", + "integrity": "sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==", "dev": true, "license": "MIT", "dependencies": { - "@rolldown/pluginutils": "1.0.0-beta.19" + "@rolldown/pluginutils": "1.0.0-beta.29" }, "engines": { "node": "^20.19.0 || >=22.12.0" diff --git a/package.json b/package.json index 559c79b38f..b8f5db1e78 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "@stoplight/spectral-cli": "6.15.0", "@stylistic/eslint-plugin": "5.2.2", "@stylistic/stylelint-plugin": "3.1.3", - "@vitejs/plugin-vue": "6.0.0", + "@vitejs/plugin-vue": "6.0.1", "@vitest/coverage-v8": "3.2.4", "@vitest/eslint-plugin": "1.3.4", "@vue/test-utils": "2.4.6", From 648a75e687445f441e7233b51a505706e083b1e1 Mon Sep 17 00:00:00 2001 From: Gusted Date: Sat, 2 Aug 2025 13:06:04 +0200 Subject: [PATCH 255/495] fix: correctly get stats for API commits (#8756) - Instead of generating a patch and parsing its contents, use a faster and simple way to get it via `--shortstat`. - Resolves forgejo/forgejo#8725 - Regression of forgejo/forgejo#7682 - Adds unit test. - Adds integration test. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8756 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- modules/git/repo_compare.go | 11 +++ modules/git/repo_compare_test.go | 81 +++++++++++++++++++ services/convert/git_commit.go | 11 +-- .../integration/api_repo_git_commits_test.go | 19 +++++ 4 files changed, 115 insertions(+), 7 deletions(-) diff --git a/modules/git/repo_compare.go b/modules/git/repo_compare.go index 373b5befb5..94f1911c4a 100644 --- a/modules/git/repo_compare.go +++ b/modules/git/repo_compare.go @@ -183,6 +183,17 @@ func (repo *Repository) GetDiffShortStat(base, head string) (numFiles, totalAddi return numFiles, totalAdditions, totalDeletions, err } +// GetCommitStat returns the number of files, total additions and total deletions the commit has. +func (repo *Repository) GetCommitShortStat(commitID string) (numFiles, totalAdditions, totalDeletions int, err error) { + cmd := NewCommand(repo.Ctx, "diff-tree", "--shortstat", "--no-commit-id", "--root").AddDynamicArguments(commitID) + stdout, _, err := cmd.RunStdString(&RunOpts{Dir: repo.Path}) + if err != nil { + return 0, 0, 0, err + } + + return parseDiffStat(stdout) +} + // GetDiffShortStat counts number of changed files, number of additions and deletions func GetDiffShortStat(ctx context.Context, repoPath string, trustedArgs TrustedCmdArgs, dynamicArgs ...string) (numFiles, totalAdditions, totalDeletions int, err error) { // Now if we call: diff --git a/modules/git/repo_compare_test.go b/modules/git/repo_compare_test.go index 86bd6855a7..b1ebdf6177 100644 --- a/modules/git/repo_compare_test.go +++ b/modules/git/repo_compare_test.go @@ -1,4 +1,5 @@ // Copyright 2018 The Gitea Authors. All rights reserved. +// Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package git @@ -162,3 +163,83 @@ func TestGetCommitFilesChanged(t *testing.T) { assert.ElementsMatch(t, tc.files, changedFiles) } } + +func TestGetCommitShortStat(t *testing.T) { + t.Run("repo1_bare", func(t *testing.T) { + repo, err := openRepositoryWithDefaultContext(filepath.Join(testReposDir, "repo1_bare")) + if err != nil { + require.NoError(t, err) + return + } + defer repo.Close() + + numFiles, totalAddition, totalDeletions, err := repo.GetCommitShortStat("ce064814f4a0d337b333e646ece456cd39fab612") + require.NoError(t, err) + assert.Equal(t, 0, numFiles) + assert.Equal(t, 0, totalAddition) + assert.Equal(t, 0, totalDeletions) + + numFiles, totalAddition, totalDeletions, err = repo.GetCommitShortStat("feaf4ba6bc635fec442f46ddd4512416ec43c2c2") + require.NoError(t, err) + assert.Equal(t, 0, numFiles) + assert.Equal(t, 0, totalAddition) + assert.Equal(t, 0, totalDeletions) + + numFiles, totalAddition, totalDeletions, err = repo.GetCommitShortStat("37991dec2c8e592043f47155ce4808d4580f9123") + require.NoError(t, err) + assert.Equal(t, 1, numFiles) + assert.Equal(t, 1, totalAddition) + assert.Equal(t, 0, totalDeletions) + + numFiles, totalAddition, totalDeletions, err = repo.GetCommitShortStat("6fbd69e9823458e6c4a2fc5c0f6bc022b2f2acd1") + require.NoError(t, err) + assert.Equal(t, 2, numFiles) + assert.Equal(t, 2, totalAddition) + assert.Equal(t, 0, totalDeletions) + + numFiles, totalAddition, totalDeletions, err = repo.GetCommitShortStat("8006ff9adbf0cb94da7dad9e537e53817f9fa5c0") + require.NoError(t, err) + assert.Equal(t, 2, numFiles) + assert.Equal(t, 2, totalAddition) + assert.Equal(t, 0, totalDeletions) + + numFiles, totalAddition, totalDeletions, err = repo.GetCommitShortStat("8d92fc957a4d7cfd98bc375f0b7bb189a0d6c9f2") + require.NoError(t, err) + assert.Equal(t, 1, numFiles) + assert.Equal(t, 1, totalAddition) + assert.Equal(t, 0, totalDeletions) + + numFiles, totalAddition, totalDeletions, err = repo.GetCommitShortStat("95bb4d39648ee7e325106df01a621c530863a653") + require.NoError(t, err) + assert.Equal(t, 1, numFiles) + assert.Equal(t, 1, totalAddition) + assert.Equal(t, 0, totalDeletions) + }) + + t.Run("repo6_blame_sha256", func(t *testing.T) { + repo, err := openRepositoryWithDefaultContext(filepath.Join(testReposDir, "repo6_blame_sha256")) + if err != nil { + require.NoError(t, err) + return + } + defer repo.Close() + + numFiles, totalAddition, totalDeletions, err := repo.GetCommitShortStat("e2f5660e15159082902960af0ed74fc144921d2b0c80e069361853b3ece29ba3") + require.NoError(t, err) + assert.Equal(t, 1, numFiles) + assert.Equal(t, 1, totalAddition) + assert.Equal(t, 0, totalDeletions) + + numFiles, totalAddition, totalDeletions, err = repo.GetCommitShortStat("9347b0198cd1f25017579b79d0938fa89dba34ad2514f0dd92f6bc975ed1a2fe") + require.NoError(t, err) + assert.Equal(t, 1, numFiles) + assert.Equal(t, 1, totalAddition) + assert.Equal(t, 1, totalDeletions) + + numFiles, totalAddition, totalDeletions, err = repo.GetCommitShortStat("ab2b57a4fa476fb2edb74dafa577caf918561abbaa8fba0c8dc63c412e17a7cc") + require.NoError(t, err) + assert.Equal(t, 1, numFiles) + assert.Equal(t, 6, totalAddition) + assert.Equal(t, 0, totalDeletions) + }) +} diff --git a/services/convert/git_commit.go b/services/convert/git_commit.go index 4603cfac4d..6a691966b8 100644 --- a/services/convert/git_commit.go +++ b/services/convert/git_commit.go @@ -15,7 +15,6 @@ import ( api "forgejo.org/modules/structs" "forgejo.org/modules/util" ctx "forgejo.org/services/context" - "forgejo.org/services/gitdiff" ) // ToCommitUser convert a git.Signature to an api.CommitUser @@ -210,17 +209,15 @@ func ToCommit(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Rep // Get diff stats for commit if opts.Stat { - diff, _, err := gitdiff.GetDiffSimple(ctx, gitRepo, &gitdiff.DiffOptions{ - AfterCommitID: commit.ID.String(), - }) + _, totalAdditions, totalDeletions, err := gitRepo.GetCommitShortStat(commit.ID.String()) if err != nil { return nil, err } res.Stats = &api.CommitStats{ - Total: diff.TotalAddition + diff.TotalDeletion, - Additions: diff.TotalAddition, - Deletions: diff.TotalDeletion, + Total: totalAdditions + totalDeletions, + Additions: totalAdditions, + Deletions: totalDeletions, } } diff --git a/tests/integration/api_repo_git_commits_test.go b/tests/integration/api_repo_git_commits_test.go index 7a93029d4c..db73307653 100644 --- a/tests/integration/api_repo_git_commits_test.go +++ b/tests/integration/api_repo_git_commits_test.go @@ -231,3 +231,22 @@ func TestGetFileHistoryNotOnMaster(t *testing.T) { assert.Equal(t, "1", resp.Header().Get("X-Total")) } + +func TestAPIReposGitCommit(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + session := loginUser(t, "user2") + token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository) + + req := NewRequest(t, "GET", "/api/v1/repos/user2/repo16/git/commits/f27c2b2b03dcab38beaf89b0ab4ff61f6de63441"). + AddTokenAuth(token) + resp := MakeRequest(t, req, http.StatusOK) + + var apiData api.Commit + DecodeJSON(t, resp, &apiData) + + assert.Equal(t, "f27c2b2b03dcab38beaf89b0ab4ff61f6de63441", apiData.CommitMeta.SHA) + assert.Equal(t, 1, apiData.Stats.Total) + assert.Equal(t, 1, apiData.Stats.Additions) + assert.Equal(t, 0, apiData.Stats.Deletions) +} From a2d6b791950f9aec56bad22036f6dc3b3abc5081 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 3 Aug 2025 03:36:45 +0200 Subject: [PATCH 256/495] Update dependency @playwright/test to v1.54.2 (forgejo) (#8761) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 24 ++++++++++++------------ package.json | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index b4bbf1f575..d9e278262d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,7 +63,7 @@ "devDependencies": { "@axe-core/playwright": "4.10.2", "@eslint-community/eslint-plugin-eslint-comments": "4.5.0", - "@playwright/test": "1.54.1", + "@playwright/test": "1.54.2", "@stoplight/spectral-cli": "6.15.0", "@stylistic/eslint-plugin": "5.2.2", "@stylistic/stylelint-plugin": "3.1.3", @@ -2172,13 +2172,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.54.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.54.1.tgz", - "integrity": "sha512-FS8hQ12acieG2dYSksmLOF7BNxnVf2afRJdCuM1eMSxj6QTSE6G4InGF7oApGgDb65MX7AwMVlIkpru0yZA4Xw==", + "version": "1.54.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.54.2.tgz", + "integrity": "sha512-A+znathYxPf+72riFd1r1ovOLqsIIB0jKIoPjyK2kqEIe30/6jF6BC7QNluHuwUmsD2tv1XZVugN8GqfTMOxsA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.54.1" + "playwright": "1.54.2" }, "bin": { "playwright": "cli.js" @@ -11987,13 +11987,13 @@ } }, "node_modules/playwright": { - "version": "1.54.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.1.tgz", - "integrity": "sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g==", + "version": "1.54.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.2.tgz", + "integrity": "sha512-Hu/BMoA1NAdRUuulyvQC0pEqZ4vQbGfn8f7wPXcnqQmM+zct9UliKxsIkLNmz/ku7LElUNqmaiv1TG/aL5ACsw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.54.1" + "playwright-core": "1.54.2" }, "bin": { "playwright": "cli.js" @@ -12006,9 +12006,9 @@ } }, "node_modules/playwright-core": { - "version": "1.54.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.1.tgz", - "integrity": "sha512-Nbjs2zjj0htNhzgiy5wu+3w09YetDx5pkrpI/kZotDlDUaYk0HVA5xrBVPdow4SAUIlhgKcJeJg4GRKW6xHusA==", + "version": "1.54.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.2.tgz", + "integrity": "sha512-n5r4HFbMmWsB4twG7tJLDN9gmBUeSPcsBZiWSE4DnYz9mJMAFqr2ID7+eGC9kpEnxExJ1epttwR59LEWCk8mtA==", "dev": true, "license": "Apache-2.0", "bin": { diff --git a/package.json b/package.json index b8f5db1e78..ed97d45ea7 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "devDependencies": { "@axe-core/playwright": "4.10.2", "@eslint-community/eslint-plugin-eslint-comments": "4.5.0", - "@playwright/test": "1.54.1", + "@playwright/test": "1.54.2", "@stoplight/spectral-cli": "6.15.0", "@stylistic/eslint-plugin": "5.2.2", "@stylistic/stylelint-plugin": "3.1.3", From 7af647025a3fd234adb8ff516b20645a17668d13 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 3 Aug 2025 03:37:09 +0200 Subject: [PATCH 257/495] Update module github.com/golangci/golangci-lint/v2/cmd/golangci-lint to v2.3.1 (forgejo) (#8763) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 446e9e0546..c9e3f17402 100644 --- a/Makefile +++ b/Makefile @@ -39,7 +39,7 @@ XGO_VERSION := go-1.21.x AIR_PACKAGE ?= github.com/air-verse/air@v1 # renovate: datasource=go EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-checker/v3/cmd/editorconfig-checker@v3.3.0 # renovate: datasource=go GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.8.0 # renovate: datasource=go -GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.3.0 # renovate: datasource=go +GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.3.1 # renovate: datasource=go GXZ_PACKAGE ?= github.com/ulikunitz/xz/cmd/gxz@v0.5.11 # renovate: datasource=go SWAGGER_PACKAGE ?= github.com/go-swagger/go-swagger/cmd/swagger@v0.31.0 # renovate: datasource=go XGO_PACKAGE ?= src.techknowlogick.com/xgo@latest From a8ef6af0fd05e3085cb6690bf9b131ec3d4ee0a8 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 3 Aug 2025 03:39:00 +0200 Subject: [PATCH 258/495] Update dependency @stylistic/stylelint-plugin to v4 (forgejo) (#8765) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 98 ++++++++++++++++++++++++++++------------------- package.json | 2 +- 2 files changed, 59 insertions(+), 41 deletions(-) diff --git a/package-lock.json b/package-lock.json index d9e278262d..a9ee1b866b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,7 +66,7 @@ "@playwright/test": "1.54.2", "@stoplight/spectral-cli": "6.15.0", "@stylistic/eslint-plugin": "5.2.2", - "@stylistic/stylelint-plugin": "3.1.3", + "@stylistic/stylelint-plugin": "4.0.0", "@vitejs/plugin-vue": "6.0.1", "@vitest/coverage-v8": "3.2.4", "@vitest/eslint-plugin": "1.3.4", @@ -481,9 +481,9 @@ } }, "node_modules/@csstools/media-query-list-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", - "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", "dev": true, "funding": [ { @@ -500,8 +500,8 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, "node_modules/@discoveryjs/json-ext": { @@ -3082,18 +3082,17 @@ } }, "node_modules/@stylistic/stylelint-plugin": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.1.3.tgz", - "integrity": "sha512-85fsmzgsIVmyG3/GFrjuYj6Cz8rAM7IZiPiXCMiSMfoDOC1lOrzrXPDk24WqviAghnPqGpx8b0caK2PuewWGFg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-4.0.0.tgz", + "integrity": "sha512-CFwt3K4Y/7bygNCLCQ8Sy4Hzgbhxq3BsNW0FIuYxl17HD3ywptm54ocyeiLVRrk5jtz1Zwks7Xr9eiZt8SWHAw==", "dev": true, "license": "MIT", "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", - "@csstools/media-query-list-parser": "^3.0.1", - "is-plain-object": "^5.0.0", - "postcss": "^8.4.41", - "postcss-selector-parser": "^6.1.2", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3", + "postcss": "^8.5.6", + "postcss-selector-parser": "^7.1.0", "postcss-value-parser": "^4.2.0", "style-search": "^0.1.0" }, @@ -3101,7 +3100,50 @@ "node": "^18.12 || >=20.9" }, "peerDependencies": { - "stylelint": "^16.8.0" + "stylelint": "^16.22.0" + } + }, + "node_modules/@stylistic/stylelint-plugin/node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "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.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/@stylistic/stylelint-plugin/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" } }, "node_modules/@swc/helpers": { @@ -13940,30 +13982,6 @@ "stylelint": ">=16" } }, - "node_modules/stylelint/node_modules/@csstools/media-query-list-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", - "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, "node_modules/stylelint/node_modules/@csstools/selector-specificity": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", diff --git a/package.json b/package.json index ed97d45ea7..b790414c22 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "@playwright/test": "1.54.2", "@stoplight/spectral-cli": "6.15.0", "@stylistic/eslint-plugin": "5.2.2", - "@stylistic/stylelint-plugin": "3.1.3", + "@stylistic/stylelint-plugin": "4.0.0", "@vitejs/plugin-vue": "6.0.1", "@vitest/coverage-v8": "3.2.4", "@vitest/eslint-plugin": "1.3.4", From cdb6296d580aceeddc315f415e67b8c82676cc69 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 3 Aug 2025 03:41:36 +0200 Subject: [PATCH 259/495] Update dependency eslint-plugin-unicorn to v60 (forgejo) (#8766) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 61 ++++++++++++++++------------------------------- package.json | 2 +- 2 files changed, 22 insertions(+), 41 deletions(-) diff --git a/package-lock.json b/package-lock.json index a9ee1b866b..54cb1d7ac7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -81,7 +81,7 @@ "eslint-plugin-regexp": "2.9.0", "eslint-plugin-sonarjs": "3.0.4", "eslint-plugin-toml": "0.12.0", - "eslint-plugin-unicorn": "59.0.1", + "eslint-plugin-unicorn": "60.0.0", "eslint-plugin-vitest-globals": "1.5.0", "eslint-plugin-vue": "10.4.0", "eslint-plugin-vue-scoped-css": "2.11.0", @@ -5467,6 +5467,13 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "dev": true, + "license": "MIT" + }, "node_modules/character-entities": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", @@ -7679,65 +7686,39 @@ } }, "node_modules/eslint-plugin-unicorn": { - "version": "59.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-59.0.1.tgz", - "integrity": "sha512-EtNXYuWPUmkgSU2E7Ttn57LbRREQesIP1BiLn7OZLKodopKfDXfBUkC/0j6mpw2JExwf43Uf3qLSvrSvppgy8Q==", + "version": "60.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-60.0.0.tgz", + "integrity": "sha512-QUzTefvP8stfSXsqKQ+vBQSEsXIlAiCduS/V1Em+FKgL9c21U/IIm20/e3MFy1jyCf14tHAhqC1sX8OTy6VUCg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "@eslint-community/eslint-utils": "^4.5.1", - "@eslint/plugin-kit": "^0.2.7", - "ci-info": "^4.2.0", + "@babel/helper-validator-identifier": "^7.27.1", + "@eslint-community/eslint-utils": "^4.7.0", + "@eslint/plugin-kit": "^0.3.3", + "change-case": "^5.4.4", + "ci-info": "^4.3.0", "clean-regexp": "^1.0.0", - "core-js-compat": "^3.41.0", + "core-js-compat": "^3.44.0", "esquery": "^1.6.0", "find-up-simple": "^1.0.1", - "globals": "^16.0.0", + "globals": "^16.3.0", "indent-string": "^5.0.0", "is-builtin-module": "^5.0.0", "jsesc": "^3.1.0", "pluralize": "^8.0.0", "regexp-tree": "^0.1.27", "regjsparser": "^0.12.0", - "semver": "^7.7.1", + "semver": "^7.7.2", "strip-indent": "^4.0.0" }, "engines": { - "node": "^18.20.0 || ^20.10.0 || >=21.0.0" + "node": "^20.10.0 || >=21.0.0" }, "funding": { "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" }, "peerDependencies": { - "eslint": ">=9.22.0" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/@eslint/core": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", - "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/@eslint/plugin-kit": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", - "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.13.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "eslint": ">=9.29.0" } }, "node_modules/eslint-plugin-vitest-globals": { diff --git a/package.json b/package.json index b790414c22..0966c570cf 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "eslint-plugin-regexp": "2.9.0", "eslint-plugin-sonarjs": "3.0.4", "eslint-plugin-toml": "0.12.0", - "eslint-plugin-unicorn": "59.0.1", + "eslint-plugin-unicorn": "60.0.0", "eslint-plugin-vitest-globals": "1.5.0", "eslint-plugin-vue": "10.4.0", "eslint-plugin-vue-scoped-css": "2.11.0", From 2269831c9fd87e2868e4131097744ababfd8c77b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 3 Aug 2025 04:17:41 +0200 Subject: [PATCH 260/495] Update module code.forgejo.org/forgejo/runner/v9 to v9.0.2 (forgejo) (#8762) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | code.forgejo.org/forgejo/runner/v9 | `v9.0.1` -> `v9.0.2` | [![age](https://developer.mend.io/api/mc/badges/age/go/code.forgejo.org%2fforgejo%2frunner%2fv9/v9.0.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/go/code.forgejo.org%2fforgejo%2frunner%2fv9/v9.0.1/v9.0.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8762 Reviewed-by: Earl Warren Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d664940e5a..8850e3e17c 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( code.forgejo.org/forgejo/go-rpmutils v1.0.0 code.forgejo.org/forgejo/levelqueue v1.0.0 code.forgejo.org/forgejo/reply v1.0.2 - code.forgejo.org/forgejo/runner/v9 v9.0.1 + code.forgejo.org/forgejo/runner/v9 v9.0.2 code.forgejo.org/go-chi/binding v1.0.1 code.forgejo.org/go-chi/cache v1.0.1 code.forgejo.org/go-chi/captcha v1.0.2 diff --git a/go.sum b/go.sum index d358671e16..475c1f345d 100644 --- a/go.sum +++ b/go.sum @@ -14,8 +14,8 @@ code.forgejo.org/forgejo/levelqueue v1.0.0 h1:9krYpU6BM+j/1Ntj6m+VCAIu0UNnne1/Uf code.forgejo.org/forgejo/levelqueue v1.0.0/go.mod h1:fmG6zhVuqim2rxSFOoasgXO8V2W/k9U31VVYqLIRLhQ= code.forgejo.org/forgejo/reply v1.0.2 h1:dMhQCHV6/O3L5CLWNTol+dNzDAuyCK88z4J/lCdgFuQ= code.forgejo.org/forgejo/reply v1.0.2/go.mod h1:RyZUfzQLc+fuLIGjTSQWDAJWPiL4WtKXB/FifT5fM7U= -code.forgejo.org/forgejo/runner/v9 v9.0.1 h1:Qdg7c0yvqgjXj9NMQ+Vsq+GuUoGshHFHGYF79Bz+/2g= -code.forgejo.org/forgejo/runner/v9 v9.0.1/go.mod h1:b6JWcpwHnBwLuWeQERM4pCRzFbnsEvC9gagQfxbZeJw= +code.forgejo.org/forgejo/runner/v9 v9.0.2 h1:ajTyjmn3tjJs3fkJ58498CgI4kvxifVY8gbh46SWAgc= +code.forgejo.org/forgejo/runner/v9 v9.0.2/go.mod h1:b6JWcpwHnBwLuWeQERM4pCRzFbnsEvC9gagQfxbZeJw= code.forgejo.org/forgejo/ssh v0.0.0-20241211213324-5fc306ca0616 h1:kEZL84+02jY9RxXM4zHBWZ3Fml0B09cmP1LGkDsCfIA= code.forgejo.org/forgejo/ssh v0.0.0-20241211213324-5fc306ca0616/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= code.forgejo.org/go-chi/binding v1.0.1 h1:coKNI+X1NzRN7X85LlrpvBRqk0TXpJ+ja28vusQWEuY= From 4392dee96d7437ca3d47ed156883b43cb02385d3 Mon Sep 17 00:00:00 2001 From: 0ko <0ko@noreply.codeberg.org> Date: Sun, 3 Aug 2025 05:49:24 +0200 Subject: [PATCH 261/495] chore(ui): improve hashbox (#8721) Followup to https://codeberg.org/forgejo/forgejo/pulls/7822 * Fix signaturebox's background breaking out of hashbox and thus breaking it's rounded corners * Fix a bug where an extra right margin was applied to signbox's avatar on pull request overview by unrelated rule * Untangle hashbox's CSS from .label - it was not a good partnership between them. Some extra properties, some that we had to override * Move CSS out of "repo.css" to a separate file - it's clearly not only related to repos Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8721 Reviewed-by: Gusted --- templates/repo/commit_header.tmpl | 6 +- templates/repo/commits_table.tmpl | 4 +- templates/repo/editor/cherry_pick.tmpl | 2 +- templates/repo/settings/lfs_file_find.tmpl | 4 +- templates/repo/settings/options.tmpl | 4 +- templates/repo/settings/webhook/history.tmpl | 2 +- templates/repo/shabox.tmpl | 2 +- web_src/css/index.css | 1 + web_src/css/modules/hashbox.css | 104 +++++++++++++++++++ web_src/css/repo.css | 97 ----------------- 10 files changed, 117 insertions(+), 109 deletions(-) create mode 100644 web_src/css/modules/hashbox.css diff --git a/templates/repo/commit_header.tmpl b/templates/repo/commit_header.tmpl index 9604daf2b0..f0c094c9bd 100644 --- a/templates/repo/commit_header.tmpl +++ b/templates/repo/commit_header.tmpl @@ -181,11 +181,11 @@ {{ctx.Locale.Tr "repo.diff.parent"}} {{range .Parents}} {{if $.PageIsWiki}} - + {{ShortSha .}} {{else}} - + {{ShortSha .}} {{end}} @@ -200,7 +200,7 @@ {{ShortSha .CommitID}} {{else}} - + {{ShortSha .CommitID}} {{end}} diff --git a/templates/repo/commits_table.tmpl b/templates/repo/commits_table.tmpl index c0e4f5ca46..1c2f793d1c 100644 --- a/templates/repo/commits_table.tmpl +++ b/templates/repo/commits_table.tmpl @@ -10,11 +10,11 @@
    {{if .IsDiffCompare}} diff --git a/templates/repo/editor/cherry_pick.tmpl b/templates/repo/editor/cherry_pick.tmpl index 49b210f75c..362b8d52ee 100644 --- a/templates/repo/editor/cherry_pick.tmpl +++ b/templates/repo/editor/cherry_pick.tmpl @@ -11,7 +11,7 @@
    diff --git a/templates/repo/shabox.tmpl b/templates/repo/shabox.tmpl index 270eab7759..86413a5412 100644 --- a/templates/repo/shabox.tmpl +++ b/templates/repo/shabox.tmpl @@ -1,4 +1,4 @@ -{{$class := "ui sha label"}} +{{$class := "sha label"}} {{if .signature}} {{$class = (print $class " isSigned")}} {{if .verification.Verified}} diff --git a/web_src/css/index.css b/web_src/css/index.css index d86a784bcc..7b0fa45916 100644 --- a/web_src/css/index.css +++ b/web_src/css/index.css @@ -30,6 +30,7 @@ @import "./modules/svg.css"; @import "./modules/flexcontainer.css"; @import "./modules/user-cards.css"; +@import "./modules/hashbox.css"; @import "./shared/flex-list.css"; @import "./shared/milestone.css"; diff --git a/web_src/css/modules/hashbox.css b/web_src/css/modules/hashbox.css new file mode 100644 index 0000000000..316ac1f655 --- /dev/null +++ b/web_src/css/modules/hashbox.css @@ -0,0 +1,104 @@ +.sha.label { + display: inline-flex; + flex-shrink: 0; + gap: 0; + align-items: center; + margin: 0 6px; /* needs to go but looked into case-by-case */ + padding: 0; + min-width: 0; /* from .ui.label, may be bad actually */ + background: var(--color-label-bg); + color: var(--color-label-text); + border: 1px solid var(--color-light-border); + border-radius: var(--border-radius); + white-space: nowrap; + font-family: var(--fonts-monospace); + font-size: 13px; + font-weight: var(--font-weight-normal); + line-height: 1; +} + +.primary.sha.label { + border: none; + background: var(--color-primary); + color: var(--color-primary-contrast); +} + +.sha.label .shortsha { + padding: 0.33rem 0.5rem; +} + +.sha.label .signature { + color: var(--color-text); + background: var(--color-light); + padding: 0.25rem 0.33rem; + border-left: 1px solid var(--color-light-border); + border-top-right-radius: inherit; + border-bottom-right-radius: inherit; +} + +.sha.label .signature-author { + display: flex; + gap: 0.25rem; +} + +.sha.label .signature-author .avatar { + height: 16px; + width: 16px; + margin: 0 !important; /* In some areas selectors with .avatar are too broad */ +} + +.sha.label.isSigned.isWarning { + border: 1px solid var(--color-red-badge); + background: var(--color-red-badge-bg); +} + +.sha.label.isSigned.isWarning .signature { + border-left: 1px solid var(--color-red-badge); + color: var(--color-red-badge); +} + +.sha.label.isSigned.isWarning:hover { + background: var(--color-red-badge-hover-bg); +} + +.sha.label.isSigned.isVerified { + border: 1px solid var(--color-green-badge); + background: var(--color-green-badge-bg); +} + +.sha.label.isSigned.isVerified .signature { + border-left: 1px solid var(--color-green-badge); + color: var(--color-green-badge); +} + +.sha.label.isSigned.isVerified:hover { + background: var(--color-green-badge-hover-bg); +} + +.sha.label.isSigned.isVerifiedUntrusted { + border: 1px solid var(--color-yellow-badge); + background: var(--color-yellow-badge-bg); +} + +.sha.label.isSigned.isVerifiedUntrusted .signature { + border-left: 1px solid var(--color-yellow-badge); + color: var(--color-yellow-badge); +} + +.sha.label.isSigned.isVerifiedUntrusted:hover { + background: var(--color-yellow-badge-hover-bg); +} + +.sha.label.isSigned.isVerifiedUnmatched { + border: 1px solid var(--color-orange-badge); + background: var(--color-orange-badge-bg); +} + +.sha.label.isSigned.isVerifiedUnmatched .signature { + border-left: 1px solid var(--color-orange-badge); + color: var(--color-orange-badge); +} + +.sha.label.isSigned.isVerifiedUnmatched:hover { + background: var(--color-orange-badge-hover-bg); +} diff --git a/web_src/css/repo.css b/web_src/css/repo.css index a3713a4c3d..4aa6faa46e 100644 --- a/web_src/css/repo.css +++ b/web_src/css/repo.css @@ -1238,103 +1238,6 @@ pdf-object { background-color: var(--color-light) !important; } -.ui .sha.label { - font-family: var(--fonts-monospace); - font-size: 13px; - font-weight: var(--font-weight-normal); - margin: 0 6px; - padding: 0; - gap: 0; - flex-shrink: 0; -} - -.ui.ui .sha.label { - border: 1px solid var(--color-light-border); -} - -.ui.primary.sha.label { - border: none !important; - background: var(--color-primary) !important; -} - -.sha.label .shortsha { - padding: 0.33rem 0.5rem; -} - -.sha.label .signature { - color: var(--color-text); - background: var(--color-light); - padding: 0.25rem 0.33rem; - border-left: 1px solid var(--color-light-border); -} - -.sha.label .signature-author { - display: flex; - gap: 0.25rem; -} - -.sha.label .signature-author .avatar { - height: 16px; - margin-bottom: 0; - width: 16px; -} - -.sha.label.isSigned.isWarning { - border: 1px solid var(--color-red-badge); - background: var(--color-red-badge-bg); -} - -.sha.label.isSigned.isWarning .signature { - border-left: 1px solid var(--color-red-badge); - color: var(--color-red-badge); -} - -.sha.label.isSigned.isWarning:hover { - background: var(--color-red-badge-hover-bg) !important; -} - -.sha.label.isSigned.isVerified { - border: 1px solid var(--color-green-badge); - background: var(--color-green-badge-bg); -} - -.sha.label.isSigned.isVerified .signature { - border-left: 1px solid var(--color-green-badge); - color: var(--color-green-badge); -} - -.sha.label.isSigned.isVerified:hover { - background: var(--color-green-badge-hover-bg) !important; -} - -.sha.label.isSigned.isVerifiedUntrusted { - border: 1px solid var(--color-yellow-badge); - background: var(--color-yellow-badge-bg); -} - -.sha.label.isSigned.isVerifiedUntrusted .signature { - border-left: 1px solid var(--color-yellow-badge); - color: var(--color-yellow-badge); -} - -.sha.label.isSigned.isVerifiedUntrusted:hover { - background: var(--color-yellow-badge-hover-bg) !important; -} - -.sha.label.isSigned.isVerifiedUnmatched { - border: 1px solid var(--color-orange-badge); - background: var(--color-orange-badge-bg); -} - -.sha.label.isSigned.isVerifiedUnmatched .signature { - border-left: 1px solid var(--color-orange-badge); - color: var(--color-orange-badge); -} - -.sha.label.isSigned.isVerifiedUnmatched:hover { - background: var(--color-orange-badge-hover-bg) !important; -} - .repository .data-table { width: 100%; } From 64193310eeed0dd7e32a659c12a0ff0b230114df Mon Sep 17 00:00:00 2001 From: zokki Date: Sun, 3 Aug 2025 06:19:45 +0200 Subject: [PATCH 262/495] fix(ui): compare branches even with pull requests disabled (#8496) Resolves #8428 Its currently showing the diff of two branches, even if the PR-unit is disabled. But the POST to create the PR is still returning an error when the unit is disabled, so its only a change for UI. Preview: https://codeberg.org/attachments/610d6b81-a50f-4c43-91c2-db4c38e7b701 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8496 Reviewed-by: 0ko <0ko@noreply.codeberg.org> Co-authored-by: zokki Co-committed-by: zokki --- options/locale_next/locale_en-US.json | 1 + routers/web/repo/compare.go | 11 ----------- templates/repo/branch/list.tmpl | 6 +++++- templates/repo/diff/compare.tmpl | 11 ++++++++--- tests/integration/compare_test.go | 11 +++++++---- 5 files changed, 21 insertions(+), 19 deletions(-) diff --git a/options/locale_next/locale_en-US.json b/options/locale_next/locale_en-US.json index d861c42d66..8542114100 100644 --- a/options/locale_next/locale_en-US.json +++ b/options/locale_next/locale_en-US.json @@ -111,5 +111,6 @@ "settings.visibility.description": "Profile visibility affects others' ability to access your non-private repositories. Learn more.", "avatar.constraints_hint": "Custom avatar may not exceed %[1]s in size or be larger than %[2]dx%[3]d pixels", "og.repo.summary_card.alt_description": "Summary card of repository %[1]s, described as: %[2]s", + "compare.branches.title": "Compare branches", "meta.last_line": "Thank you for translating Forgejo! This line isn't seen by the users but it serves other purposes in the translation management. You can place a fun fact in the translation instead of translating it." } diff --git a/routers/web/repo/compare.go b/routers/web/repo/compare.go index 90ce2e0a71..feedeef945 100644 --- a/routers/web/repo/compare.go +++ b/routers/web/repo/compare.go @@ -520,17 +520,6 @@ func ParseCompareInfo(ctx *context.Context) *common.CompareInfo { ctx.Data["PageIsComparePull"] = headIsBranch && baseIsBranch } - if ctx.Data["PageIsComparePull"] == true && !permBase.CanReadIssuesOrPulls(true) { - if log.IsTrace() { - log.Trace("Permission Denied: User: %-v cannot create/read pull requests in Repo: %-v\nUser in baseRepo has Permissions: %-+v", - ctx.Doer, - baseRepo, - permBase) - } - ctx.NotFound("ParseCompareInfo", nil) - return nil - } - baseBranchRef := ci.BaseBranch if baseIsBranch { baseBranchRef = git.BranchPrefix + ci.BaseBranch diff --git a/templates/repo/branch/list.tmpl b/templates/repo/branch/list.tmpl index fe945324ea..7ee53deb84 100644 --- a/templates/repo/branch/list.tmpl +++ b/templates/repo/branch/list.tmpl @@ -121,7 +121,11 @@ {{end}} - {{if not .LatestPullRequest}} + {{if not ($.Permission.CanRead $.UnitTypePullRequests)}} + + + + {{else if not .LatestPullRequest}} {{if .IsIncluded}} {{svg "octicon-git-pull-request"}} {{ctx.Locale.Tr "repo.branch.included"}} diff --git a/templates/repo/diff/compare.tmpl b/templates/repo/diff/compare.tmpl index c1b00c5f9e..9dadb13510 100644 --- a/templates/repo/diff/compare.tmpl +++ b/templates/repo/diff/compare.tmpl @@ -2,11 +2,16 @@
    {{template "repo/header" .}} {{$showDiffBox := false}} + {{$canReadPullRequests := .Permission.CanRead $.UnitTypePullRequests}}

    {{if and $.PageIsComparePull $.IsSigned (not .Repository.IsArchived)}} - {{ctx.Locale.Tr "repo.pulls.compare_changes"}} -
    {{ctx.Locale.Tr "repo.pulls.compare_changes_desc"}}
    + {{if $canReadPullRequests}} + {{ctx.Locale.Tr "repo.pulls.compare_changes"}} +
    {{ctx.Locale.Tr "repo.pulls.compare_changes_desc"}}
    + {{else}} + {{ctx.Locale.Tr "compare.branches.title"}} + {{end}} {{else}} {{ctx.Locale.Tr "action.compare_commits_general"}} {{end}} @@ -166,7 +171,7 @@ {{else}}
    {{ctx.Locale.Tr "repo.pulls.nothing_to_compare_have_tag"}}
    {{end}} - {{else if and .PageIsComparePull (gt .CommitCount 0)}} + {{else if and .PageIsComparePull (gt .CommitCount 0) $canReadPullRequests}} {{if .HasPullRequest}}
    diff --git a/tests/integration/compare_test.go b/tests/integration/compare_test.go index 3c3e8adf94..581aa67659 100644 --- a/tests/integration/compare_test.go +++ b/tests/integration/compare_test.go @@ -267,13 +267,14 @@ func TestCompareWithPRsDisabled(t *testing.T) { []unit_model.Type{unit_model.TypePullRequests}) require.NoError(t, err) - t.Run("branch view doesn't offer creating PRs", func(t *testing.T) { + t.Run("branch view offer comparing branches", func(t *testing.T) { defer tests.PrintCurrentTest(t)() req := NewRequest(t, "GET", "/user1/repo1/branches") resp := session.MakeRequest(t, req, http.StatusOK) htmlDoc := NewHTMLParser(t, resp.Body) - htmlDoc.AssertElement(t, "a[href='/user1/repo1/compare/master...recent-push']", false) + compareLink := htmlDoc.Find("a[href='/user1/repo1/compare/master...recent-push']") + assert.Equal(t, "Compare branches", strings.TrimSpace(compareLink.Text())) }) t.Run("compare doesn't offer local branches", func(t *testing.T) { @@ -290,11 +291,13 @@ func TestCompareWithPRsDisabled(t *testing.T) { } }) - t.Run("comparing against a disabled-PR repo is 404", func(t *testing.T) { + t.Run("comparing against a disabled-PR repo", func(t *testing.T) { defer tests.PrintCurrentTest(t)() req := NewRequest(t, "GET", "/user1/repo1/compare/master...recent-push") - session.MakeRequest(t, req, http.StatusNotFound) + resp := session.MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + assert.Equal(t, "Compare branches", strings.TrimSpace(htmlDoc.Find("h2.header").Text())) }) }) } From 7566ebfba7a144a224705fb5a63922d297afc78e Mon Sep 17 00:00:00 2001 From: Michael Jerger Date: Sun, 3 Aug 2025 11:55:01 +0200 Subject: [PATCH 263/495] Add ActivityPub Person follow from distant (#8720) This PR is part of #4767. It 1. adds the ability to follow a local person from a distant federation server (see tests/integration/api_activitypub_person_inbox_follow_test.go) 2. streamlines the router code (refactor the person conversion & handling of inbox requests in service direction, unifies service call signature & error handling) 3. introduces queues for decoupling outgoing communication (delivery retry to cope network issues or distant service downtimes) and 4. adds minor fixes to integration tests (test timeout & invalid inbox activities) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8720 Reviewed-by: Earl Warren Co-authored-by: Michael Jerger Co-committed-by: Michael Jerger --- .deadcode-out | 16 +-- routers/api/v1/activitypub/person.go | 54 +++------ routers/init.go | 2 + services/convert/activitypub_person.go | 62 +++++++++++ services/federation/delivery_queue.go | 76 +++++++++++++ services/federation/federation_service.go | 5 +- services/federation/person_inbox_follow.go | 73 ++++++++++++ services/federation/person_inbox_undo.go | 47 ++++++++ services/federation/person_service.go | 25 +++++ templates/swagger/v1_json.tmpl | 2 +- tests/integration/activitypub_client_test.go | 17 +-- ...pi_activitypub_person_inbox_follow_test.go | 105 ++++++++++++++++++ .../api_activitypub_person_test.go | 4 +- 13 files changed, 422 insertions(+), 66 deletions(-) create mode 100644 services/convert/activitypub_person.go create mode 100644 services/federation/delivery_queue.go create mode 100644 services/federation/person_inbox_follow.go create mode 100644 services/federation/person_inbox_undo.go create mode 100644 services/federation/person_service.go create mode 100644 tests/integration/api_activitypub_person_inbox_follow_test.go diff --git a/.deadcode-out b/.deadcode-out index 31b04687dc..87dc416ff1 100644 --- a/.deadcode-out +++ b/.deadcode-out @@ -59,16 +59,12 @@ forgejo.org/models/user IsErrExternalLoginUserAlreadyExist IsErrExternalLoginUserNotExist NewFederatedUser - NewFederatedUserFollower IsErrUserSettingIsNotExist GetUserAllSettings DeleteUserSetting GetFederatedUser GetFederatedUserByUserID GetFollowersForUser - AddFollower - RemoveFollower - IsFollowingAp forgejo.org/modules/activitypub NewContext @@ -99,11 +95,7 @@ forgejo.org/modules/eventsource Event.String forgejo.org/modules/forgefed - NewForgeFollowFromAp NewForgeFollow - ForgeFollow.MarshalJSON - ForgeFollow.UnmarshalJSON - ForgeFollow.Validate NewForgeUndoLike ForgeUndoLike.UnmarshalJSON ForgeUndoLike.Validate @@ -228,7 +220,6 @@ forgejo.org/modules/util/filebuffer forgejo.org/modules/validation IsErrNotValid - ValidateIDExists forgejo.org/modules/web RouteMock @@ -245,11 +236,8 @@ forgejo.org/routers/web/org forgejo.org/services/context GetPrivateContext -forgejo.org/services/federation - NewErrInternalf - ErrInternal.Error - Init - NewServiceResultWithBytes +forgejo.org/services/convert + ToActivityPubPersonFeedItem forgejo.org/services/repository IsErrForkAlreadyExist diff --git a/routers/api/v1/activitypub/person.go b/routers/api/v1/activitypub/person.go index 1da7933418..6120a078af 100644 --- a/routers/api/v1/activitypub/person.go +++ b/routers/api/v1/activitypub/person.go @@ -4,14 +4,14 @@ package activitypub import ( - "fmt" "net/http" - "strings" "forgejo.org/modules/activitypub" "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "forgejo.org/modules/web" "forgejo.org/services/context" + "forgejo.org/services/convert" + "forgejo.org/services/federation" ap "github.com/go-ap/activitypub" "github.com/go-ap/jsonld" @@ -34,45 +34,12 @@ func Person(ctx *context.APIContext) { // "200": // "$ref": "#/responses/ActivityPub" - // TODO: the setting.AppURL during the test doesn't follow the definition: "It always has a '/' suffix" - link := fmt.Sprintf("%s/api/v1/activitypub/user-id/%d", strings.TrimSuffix(setting.AppURL, "/"), ctx.ContextUser.ID) - person := ap.PersonNew(ap.IRI(link)) - - person.Name = ap.NaturalLanguageValuesNew() - err := person.Name.Set("en", ap.Content(ctx.ContextUser.FullName)) + person, err := convert.ToActivityPubPerson(ctx, ctx.ContextUser) if err != nil { - ctx.ServerError("Set Name", err) + ctx.ServerError("convert.ToActivityPubPerson", err) return } - person.PreferredUsername = ap.NaturalLanguageValuesNew() - err = person.PreferredUsername.Set("en", ap.Content(ctx.ContextUser.Name)) - if err != nil { - ctx.ServerError("Set PreferredUsername", err) - return - } - - person.URL = ap.IRI(ctx.ContextUser.HTMLURL()) - - person.Icon = ap.Image{ - Type: ap.ImageType, - MediaType: "image/png", - URL: ap.IRI(ctx.ContextUser.AvatarLink(ctx)), - } - - person.Inbox = ap.IRI(link + "/inbox") - person.Outbox = ap.IRI(link + "/outbox") - - person.PublicKey.ID = ap.IRI(link + "#main-key") - person.PublicKey.Owner = ap.IRI(link) - - publicKeyPem, err := activitypub.GetPublicKey(ctx, ctx.ContextUser) - if err != nil { - ctx.ServerError("GetPublicKey", err) - return - } - person.PublicKey.PublicKeyPem = publicKeyPem - binary, err := jsonld.WithContext(jsonld.IRI(ap.ActivityBaseURI), jsonld.IRI(ap.SecurityContextURI)).Marshal(person) if err != nil { ctx.ServerError("MarshalJSON", err) @@ -99,8 +66,15 @@ func PersonInbox(ctx *context.APIContext) { // type: integer // required: true // responses: - // "204": + // "202": // "$ref": "#/responses/empty" - ctx.Status(http.StatusNoContent) + form := web.GetForm(ctx) + activity := form.(*ap.Activity) + result, err := federation.ProcessPersonInbox(ctx, ctx.ContextUser, activity) + if err != nil { + ctx.Error(federation.HTTPStatus(err), "PersonInbox", err) + return + } + responseServiceResult(ctx, result) } diff --git a/routers/init.go b/routers/init.go index 90a1cb1e89..9a304527fa 100644 --- a/routers/init.go +++ b/routers/init.go @@ -38,6 +38,7 @@ import ( "forgejo.org/services/auth/source/oauth2" "forgejo.org/services/automerge" "forgejo.org/services/cron" + federation_service "forgejo.org/services/federation" feed_service "forgejo.org/services/feed" indexer_service "forgejo.org/services/indexer" "forgejo.org/services/mailer" @@ -122,6 +123,7 @@ func InitWebInstalled(ctx context.Context) { mailer.NewContext(ctx) mustInit(cache.Init) mustInit(feed_service.Init) + mustInit(federation_service.Init) mustInit(uinotification.Init) mustInitCtx(ctx, archiver.Init) diff --git a/services/convert/activitypub_person.go b/services/convert/activitypub_person.go new file mode 100644 index 0000000000..2c05f8c1c0 --- /dev/null +++ b/services/convert/activitypub_person.go @@ -0,0 +1,62 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package convert + +import ( + "context" + + "forgejo.org/models/activities" + user_model "forgejo.org/models/user" + "forgejo.org/modules/activitypub" + + ap "github.com/go-ap/activitypub" +) + +func ToActivityPubPersonFeedItem(item *activities.FederatedUserActivity) ap.Note { + return ap.Note{ + AttributedTo: ap.IRI(item.ActorURI), + Content: ap.NaturalLanguageValues{{Value: ap.Content(item.NoteContent), Ref: ap.NilLangRef}}, + ID: ap.IRI(item.NoteURL), + URL: ap.IRI(item.OriginalNote), + } +} + +func ToActivityPubPerson(ctx context.Context, user *user_model.User) (*ap.Person, error) { + link := user.APActorID() + person := ap.PersonNew(ap.IRI(link)) + + person.Name = ap.NaturalLanguageValuesNew() + err := person.Name.Set("en", ap.Content(user.FullName)) + if err != nil { + return nil, err + } + + person.PreferredUsername = ap.NaturalLanguageValuesNew() + err = person.PreferredUsername.Set("en", ap.Content(user.Name)) + if err != nil { + return nil, err + } + + person.URL = ap.IRI(user.HTMLURL()) + + person.Icon = ap.Image{ + Type: ap.ImageType, + MediaType: "image/png", + URL: ap.IRI(user.AvatarLink(ctx)), + } + + person.Inbox = ap.IRI(link + "/inbox") + person.Outbox = ap.IRI(link + "/outbox") + + person.PublicKey.ID = ap.IRI(link + "#main-key") + person.PublicKey.Owner = ap.IRI(link) + + publicKeyPem, err := activitypub.GetPublicKey(ctx, user) + if err != nil { + return nil, err + } + person.PublicKey.PublicKeyPem = publicKeyPem + + return person, nil +} diff --git a/services/federation/delivery_queue.go b/services/federation/delivery_queue.go new file mode 100644 index 0000000000..f71467e9f0 --- /dev/null +++ b/services/federation/delivery_queue.go @@ -0,0 +1,76 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package federation + +import ( + "fmt" + "io" + + "forgejo.org/models/user" + "forgejo.org/modules/activitypub" + "forgejo.org/modules/graceful" + "forgejo.org/modules/log" + "forgejo.org/modules/process" + "forgejo.org/modules/queue" +) + +type deliveryQueueItem struct { + Doer *user.User + InboxURL string + Payload []byte + DeliveryCount int +} + +var deliveryQueue *queue.WorkerPoolQueue[deliveryQueueItem] + +func initDeliveryQueue() error { + deliveryQueue = queue.CreateUniqueQueue(graceful.GetManager().ShutdownContext(), "activitypub_inbox_delivery", deliveryQueueHandler) + if deliveryQueue == nil { + return fmt.Errorf("unable to create activitypub_inbox_delivery queue") + } + go graceful.GetManager().RunWithCancel(deliveryQueue) + + return nil +} + +func deliveryQueueHandler(items ...deliveryQueueItem) (unhandled []deliveryQueueItem) { + for _, item := range items { + item.DeliveryCount++ + err := deliverToInbox(item) + if err != nil && item.DeliveryCount < 10 { + unhandled = append(unhandled, item) + } + } + return unhandled +} + +func deliverToInbox(item deliveryQueueItem) error { + ctx, _, finished := process.GetManager().AddContext(graceful.GetManager().HammerContext(), + fmt.Sprintf("Delivering an Activity via user[%d] (%s), to %s", item.Doer.ID, item.Doer.Name, item.InboxURL)) + defer finished() + + clientFactory, err := activitypub.GetClientFactory(ctx) + if err != nil { + return err + } + apclient, err := clientFactory.WithKeys(ctx, item.Doer, item.Doer.APActorID()+"#main-key") + if err != nil { + return err + } + + log.Debug("Delivering %s to %s", item.Payload, item.InboxURL) + res, err := apclient.Post(item.Payload, item.InboxURL) + if err != nil { + return err + } + if res.StatusCode >= 400 { + defer res.Body.Close() + body, _ := io.ReadAll(io.LimitReader(res.Body, 16*1024)) + + log.Warn("Delivering to %s failed: %d %s, %v times", item.InboxURL, res.StatusCode, string(body), item.DeliveryCount) + return fmt.Errorf("delivery failed") + } + + return nil +} diff --git a/services/federation/federation_service.go b/services/federation/federation_service.go index 36788e725a..ccdb9bbab0 100644 --- a/services/federation/federation_service.go +++ b/services/federation/federation_service.go @@ -23,7 +23,10 @@ import ( ) func Init() error { - return nil + if !setting.Federation.Enabled { + return nil + } + return initDeliveryQueue() } func FindOrCreateFederationHost(ctx context.Context, actorURI string) (*forgefed.FederationHost, error) { diff --git a/services/federation/person_inbox_follow.go b/services/federation/person_inbox_follow.go new file mode 100644 index 0000000000..baa7934ad5 --- /dev/null +++ b/services/federation/person_inbox_follow.go @@ -0,0 +1,73 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package federation + +import ( + "context" + "fmt" + "net/http" + + "forgejo.org/models/user" + "forgejo.org/modules/forgefed" + "forgejo.org/modules/log" + + ap "github.com/go-ap/activitypub" + "github.com/go-ap/jsonld" +) + +func processPersonFollow(ctx context.Context, ctxUser *user.User, activity *ap.Activity) (ServiceResult, error) { + follow, err := forgefed.NewForgeFollowFromAp(*activity) + if err != nil { + log.Error("Invalid follow activity: %s", err) + return ServiceResult{}, NewErrNotAcceptablef("Invalid follow activity: %v", err) + } + + actorURI := follow.Actor.GetLink().String() + _, federatedUser, federationHost, err := FindOrCreateFederatedUser(ctx, actorURI) + if err != nil { + log.Error("Error finding or creating federated user (%s): %v", actorURI, err) + return ServiceResult{}, NewErrNotAcceptablef("Federated user not found: %v", err) + } + + following, err := user.IsFollowingAp(ctx, ctxUser, federatedUser) + if err != nil { + log.Error("forgefed.IsFollowing: %v", err) + return ServiceResult{}, NewErrNotAcceptablef("forgefed.IsFollowing: %v", err) + } + if following { + // If the user is already following, we're good, nothing to do. + log.Trace("Local user[%d] is already following federated user[%d]", ctxUser.ID, federatedUser.ID) + return NewServiceResultStatusOnly(http.StatusNoContent), nil + } + + follower, err := user.AddFollower(ctx, ctxUser, federatedUser) + if err != nil { + log.Error("Unable to add follower: %v", err) + return ServiceResult{}, NewErrNotAcceptablef("Unable to add follower: %v", err) + } + + accept := ap.AcceptNew(ap.IRI(fmt.Sprintf( + "%s#accepts/follow/%d", ctxUser.APActorID(), follower.ID, + )), follow) + accept.Actor = ap.IRI(ctxUser.APActorID()) + payload, err := jsonld.WithContext(jsonld.IRI(ap.ActivityBaseURI)).Marshal(accept) + if err != nil { + log.Error("Unable to Marshal JSON: %v", err) + return ServiceResult{}, NewErrInternalf("MarshalJSON: %v", err) + } + + hostURL := federationHost.AsURL() + if err := deliveryQueue.Push(deliveryQueueItem{ + InboxURL: hostURL.JoinPath(federatedUser.InboxPath).String(), + Doer: ctxUser, + Payload: payload, + }); err != nil { + log.Error("Unable to push to pending queue: %v", err) + return ServiceResult{}, NewErrInternalf("Unable to push to pending queue: %v", err) + } + + // Respond back with an accept + result := NewServiceResultWithBytes(http.StatusAccepted, []byte(`{"status":"Accepted"}`)) + return result, nil +} diff --git a/services/federation/person_inbox_undo.go b/services/federation/person_inbox_undo.go new file mode 100644 index 0000000000..4379cf242a --- /dev/null +++ b/services/federation/person_inbox_undo.go @@ -0,0 +1,47 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package federation + +import ( + "context" + "net/http" + + "forgejo.org/models/user" + "forgejo.org/modules/log" + + ap "github.com/go-ap/activitypub" +) + +func processPersonInboxUndo(ctx context.Context, ctxUser *user.User, activity *ap.Activity) (ServiceResult, error) { + if activity.Object.GetType() != ap.FollowType { + log.Error("Invalid object type for Undo activity: %v", activity.Object.GetType()) + return ServiceResult{}, NewErrNotAcceptablef("Invalid object type for Undo activity: %v", activity.Object.GetType()) + } + + actorURI := activity.Actor.GetLink().String() + _, federatedUser, _, err := findFederatedUser(ctx, actorURI) + if err != nil { + log.Error("User not found: %v", err) + return ServiceResult{}, NewErrInternalf("User not found: %v", err) + } + + if federatedUser != nil { + following, err := user.IsFollowingAp(ctx, ctxUser, federatedUser) + if err != nil { + log.Error("forgefed.IsFollowing: %v", err) + return ServiceResult{}, NewErrInternalf("forgefed.IsFollowing: %v", err) + } + if !following { + // The local user is not following the federated one, nothing to do. + log.Trace("Local user[%d] is not following federated user[%d]", ctxUser.ID, federatedUser.ID) + return NewServiceResultStatusOnly(http.StatusNoContent), nil + } + if err := user.RemoveFollower(ctx, ctxUser, federatedUser); err != nil { + log.Error("Unable to remove follower", err) + return ServiceResult{}, NewErrInternalf("Unable to remove follower: %v", err) + } + } + + return NewServiceResultStatusOnly(http.StatusNoContent), nil +} diff --git a/services/federation/person_service.go b/services/federation/person_service.go new file mode 100644 index 0000000000..f67d2b492d --- /dev/null +++ b/services/federation/person_service.go @@ -0,0 +1,25 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package federation + +import ( + "context" + + "forgejo.org/models/user" + "forgejo.org/modules/log" + + ap "github.com/go-ap/activitypub" +) + +func ProcessPersonInbox(ctx context.Context, user *user.User, activity *ap.Activity) (ServiceResult, error) { + switch activity.Type { + case ap.FollowType: + return processPersonFollow(ctx, user, activity) + case ap.UndoType: + return processPersonInboxUndo(ctx, user, activity) + } + + log.Error("Unsupported PersonInbox activity: %v", activity.Type) + return ServiceResult{}, NewErrNotAcceptablef("unsupported activity: %v", activity.Type) +} diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index a610620eab..492f9487f3 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -162,7 +162,7 @@ } ], "responses": { - "204": { + "202": { "$ref": "#/responses/empty" } } diff --git a/tests/integration/activitypub_client_test.go b/tests/integration/activitypub_client_test.go index 2adb8304c2..67482a7277 100644 --- a/tests/integration/activitypub_client_test.go +++ b/tests/integration/activitypub_client_test.go @@ -6,14 +6,15 @@ package integration import ( "net/url" "testing" + "time" - "forgejo.org/models/db" "forgejo.org/models/unittest" user_model "forgejo.org/models/user" "forgejo.org/modules/activitypub" "forgejo.org/modules/setting" "forgejo.org/modules/test" "forgejo.org/routers" + "forgejo.org/services/contexttest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -25,15 +26,15 @@ func TestActivityPubClientBodySize(t *testing.T) { onGiteaRun(t, func(t *testing.T, u *url.URL) { user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) - - clientFactory, err := activitypub.GetClientFactory(db.DefaultContext) - require.NoError(t, err) - - apClient, err := clientFactory.WithKeys(db.DefaultContext, user1, user1.KeyID()) - require.NoError(t, err) - url := u.JoinPath("/api/v1/nodeinfo").String() + ctx, _ := contexttest.MockAPIContext(t, url) + clientFactory, err := activitypub.NewClientFactoryWithTimeout(60 * time.Second) + require.NoError(t, err) + + apClient, err := clientFactory.WithKeys(ctx, user1, user1.KeyID()) + require.NoError(t, err) + // Request with normal MaxSize t.Run("NormalMaxSize", func(t *testing.T) { resp, err := apClient.GetBody(url) diff --git a/tests/integration/api_activitypub_person_inbox_follow_test.go b/tests/integration/api_activitypub_person_inbox_follow_test.go new file mode 100644 index 0000000000..f171b8951f --- /dev/null +++ b/tests/integration/api_activitypub_person_inbox_follow_test.go @@ -0,0 +1,105 @@ +// Copyright 2022 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package integration + +import ( + "fmt" + "net/http" + "net/url" + "testing" + "time" + + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/activitypub" + "forgejo.org/modules/setting" + "forgejo.org/modules/test" + "forgejo.org/routers" + "forgejo.org/services/contexttest" + "forgejo.org/services/federation" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// Flow of this test is documented at: https://codeberg.org/forgejo-contrib/federation/src/branch/main/doc/user-activity-following.md +func TestActivityPubPersonInboxFollow(t *testing.T) { + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&setting.Federation.SignatureEnforced, false)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + federation.Init() + + mock := test.NewFederationServerMock() + federatedSrv := mock.DistantServer(t) + defer federatedSrv.Close() + + onGiteaRun(t, func(t *testing.T, localUrl *url.URL) { + defer test.MockVariableValue(&setting.AppURL, localUrl.String())() + + distantURL := federatedSrv.URL + distantUser15URL := fmt.Sprintf("%s/api/v1/activitypub/user-id/15", distantURL) + + localUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + localUser2URL := localUrl.JoinPath("/api/v1/activitypub/user-id/2").String() + localUser2Inbox := localUrl.JoinPath("/api/v1/activitypub/user-id/2/inbox").String() + + ctx, _ := contexttest.MockAPIContext(t, localUser2Inbox) + + // distant follows local + followActivity := []byte(fmt.Sprintf( + `{"type":"Follow",`+ + `"actor":"%s",`+ + `"object":"%s"}`, + distantUser15URL, + localUser2URL, + )) + cf, err := activitypub.NewClientFactoryWithTimeout(60 * time.Second) + require.NoError(t, err) + c, err := cf.WithKeysDirect(ctx, mock.ApActor.PrivKey, + mock.ApActor.KeyID(federatedSrv.URL)) + require.NoError(t, err) + resp, err := c.Post(followActivity, localUser2Inbox) + require.NoError(t, err) + assert.Equal(t, http.StatusAccepted, resp.StatusCode) + + // local follow exists + distantFederatedUser := unittest.AssertExistsAndLoadBean(t, &user_model.FederatedUser{ExternalID: "15"}) + unittest.AssertExistsAndLoadBean(t, + &user_model.FederatedUserFollower{ + FollowedUserID: localUser.ID, + FollowingUserID: distantFederatedUser.UserID, + }, + ) + + // distant is informed about accepting follow + assert.Contains(t, mock.LastPost, "\"type\":\"Accept\"") + + // distant undoes follow + undoFollowActivity := []byte(fmt.Sprintf( + `{"type":"Undo",`+ + `"actor":"%s",`+ + `"object":{"type":"Follow",`+ + `"actor":"%s",`+ + `"object":"%s"}}`, + distantUser15URL, + distantUser15URL, + localUser2URL, + )) + c, err = cf.WithKeysDirect(ctx, mock.ApActor.PrivKey, + mock.ApActor.KeyID(federatedSrv.URL)) + require.NoError(t, err) + resp, err = c.Post(undoFollowActivity, localUser2Inbox) + require.NoError(t, err) + assert.Equal(t, http.StatusNoContent, resp.StatusCode) + + // local follow removed + unittest.AssertNotExistsBean(t, + &user_model.FederatedUserFollower{ + FollowedUserID: localUser.ID, + FollowingUserID: distantFederatedUser.UserID, + }, + ) + }) +} diff --git a/tests/integration/api_activitypub_person_test.go b/tests/integration/api_activitypub_person_test.go index 277b150a1e..04d1fb1648 100644 --- a/tests/integration/api_activitypub_person_test.go +++ b/tests/integration/api_activitypub_person_test.go @@ -105,9 +105,9 @@ func TestActivityPubPersonInbox(t *testing.T) { c, err := cf.WithKeys(ctx, user1, user1url) require.NoError(t, err) - // Signed request "succeeds" + // invalid request is rejected resp, err := c.Post([]byte{}, user2inboxurl) require.NoError(t, err) - assert.Equal(t, http.StatusNoContent, resp.StatusCode) + assert.Equal(t, http.StatusNotAcceptable, resp.StatusCode) }) } From e50cfc849936e6ea25d13c43a9c85add9f009542 Mon Sep 17 00:00:00 2001 From: Gusted Date: Sun, 3 Aug 2025 22:14:13 +0200 Subject: [PATCH 264/495] fix: migrate new Github release assets (#8771) - It seems that mid-May (according to some system notices in Codeberg) Github started (or converted all) release asssets to be made available under `https://release-assets.githubusercontent.com/`. - Update the migration code to allow this baseURL for Github release assets. - Resolves Codeberg/Community#2061 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8771 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- services/migrations/github.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/migrations/github.go b/services/migrations/github.go index 9721c86180..317eb568b5 100644 --- a/services/migrations/github.go +++ b/services/migrations/github.go @@ -364,7 +364,8 @@ func (g *GithubDownloaderV3) convertGithubRelease(rel *github.RepositoryRelease) // Prevent open redirect if !hasBaseURL(redirectURL, g.baseURL) && - !hasBaseURL(redirectURL, "https://objects.githubusercontent.com/") { + !hasBaseURL(redirectURL, "https://objects.githubusercontent.com/") && + !hasBaseURL(redirectURL, "https://release-assets.githubusercontent.com/") { WarnAndNotice("Unexpected AssetURL for assetID[%d] in %s: %s", asset.GetID(), g, redirectURL) return io.NopCloser(strings.NewReader(redirectURL)), nil From 15231669e6e85ef1c1d300ebe7f93d1311f136d1 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 4 Aug 2025 07:24:16 +0200 Subject: [PATCH 265/495] Update renovate to v41.51.1 (forgejo) (#8775) Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- .forgejo/workflows/renovate.yml | 2 +- Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/renovate.yml b/.forgejo/workflows/renovate.yml index c2923f7d0e..1b5d05ceef 100644 --- a/.forgejo/workflows/renovate.yml +++ b/.forgejo/workflows/renovate.yml @@ -28,7 +28,7 @@ jobs: runs-on: docker container: - image: data.forgejo.org/renovate/renovate:41.43.5 + image: data.forgejo.org/renovate/renovate:41.51.1 steps: - name: Load renovate repo cache diff --git a/Makefile b/Makefile index c9e3f17402..8e3341b33b 100644 --- a/Makefile +++ b/Makefile @@ -47,7 +47,7 @@ GO_LICENSES_PACKAGE ?= github.com/google/go-licenses@v1.6.0 # renovate: datasour GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1 # renovate: datasource=go DEADCODE_PACKAGE ?= golang.org/x/tools/cmd/deadcode@v0.35.0 # renovate: datasource=go GOMOCK_PACKAGE ?= go.uber.org/mock/mockgen@v0.5.2 # renovate: datasource=go -RENOVATE_NPM_PACKAGE ?= renovate@41.43.5 # renovate: datasource=docker packageName=data.forgejo.org/renovate/renovate +RENOVATE_NPM_PACKAGE ?= renovate@41.51.1 # renovate: datasource=docker packageName=data.forgejo.org/renovate/renovate # https://github.com/disposable-email-domains/disposable-email-domains/commits/main/ DISPOSABLE_EMAILS_SHA ?= 0c27e671231d27cf66370034d7f6818037416989 # renovate: ... From f2ffae12cfd2ac4be0f151ba3c8f4c21af6021cb Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 4 Aug 2025 09:16:38 +0200 Subject: [PATCH 266/495] Update https://data.forgejo.org/forgejo/forgejo-build-publish action to v5.4.1 (forgejo) (#8776) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [https://data.forgejo.org/forgejo/forgejo-build-publish](https://data.forgejo.org/forgejo/forgejo-build-publish) | action | minor | `v5.3.5` -> `v5.4.1` | --- ### Release Notes
    forgejo/forgejo-build-publish (https://data.forgejo.org/forgejo/forgejo-build-publish) ### [`v5.4.1`](https://data.forgejo.org/forgejo/forgejo-build-publish/compare/v5.4.0...v5.4.1) [Compare Source](https://data.forgejo.org/forgejo/forgejo-build-publish/compare/v5.4.0...v5.4.1) ### [`v5.4.0`](https://data.forgejo.org/forgejo/forgejo-build-publish/compare/v5.3.5...v5.4.0) [Compare Source](https://data.forgejo.org/forgejo/forgejo-build-publish/compare/v5.3.5...v5.4.0)
    --- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8776 Reviewed-by: Earl Warren Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- .forgejo/workflows/build-release.yml | 4 ++-- .forgejo/workflows/publish-release.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.forgejo/workflows/build-release.yml b/.forgejo/workflows/build-release.yml index 944fd68fb7..c0948781c1 100644 --- a/.forgejo/workflows/build-release.yml +++ b/.forgejo/workflows/build-release.yml @@ -164,7 +164,7 @@ jobs: - name: build container & release if: ${{ secrets.TOKEN != '' }} - uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.5 + uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.4.1 with: forgejo: "${{ env.GITHUB_SERVER_URL }}" owner: "${{ env.GITHUB_REPOSITORY_OWNER }}" @@ -183,7 +183,7 @@ jobs: - name: build rootless container if: ${{ secrets.TOKEN != '' }} - uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.5 + uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.4.1 with: forgejo: "${{ env.GITHUB_SERVER_URL }}" owner: "${{ env.GITHUB_REPOSITORY_OWNER }}" diff --git a/.forgejo/workflows/publish-release.yml b/.forgejo/workflows/publish-release.yml index 3aec46fb03..91fa03ab8e 100644 --- a/.forgejo/workflows/publish-release.yml +++ b/.forgejo/workflows/publish-release.yml @@ -44,7 +44,7 @@ jobs: - uses: https://data.forgejo.org/actions/checkout@v4 - name: copy & sign - uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.3.5 + uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.4.1 with: from-forgejo: ${{ vars.FORGEJO }} to-forgejo: ${{ vars.FORGEJO }} From eb18fccac57137e9f99ef687427284494a8d708b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 4 Aug 2025 09:21:41 +0200 Subject: [PATCH 267/495] Lock file maintenance (forgejo) (#8777) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Update | Change | |---|---| | lockFileMaintenance | All locks refreshed | 🔧 This Pull Request updates lock files to use the latest dependency versions. --- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8777 Reviewed-by: Earl Warren Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 428 ++++++++++++----------------- web_src/fomantic/package-lock.json | 12 +- 2 files changed, 188 insertions(+), 252 deletions(-) diff --git a/package-lock.json b/package-lock.json index 54cb1d7ac7..1ab1271cae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -504,6 +504,50 @@ "@csstools/css-tokenizer": "^3.0.4" } }, + "node_modules/@csstools/selector-resolve-nested": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", + "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", @@ -2261,9 +2305,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.0.tgz", - "integrity": "sha512-9f3nSTFI2ivfxc7/tHBHcJ8pRnp8ROrELvsVprlQPVvcZ+j5zztYd+PTJGpyIOAdTvNwNrpCXswKSeoQcyGjMQ==", + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.2.tgz", + "integrity": "sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==", "cpu": [ "arm" ], @@ -2275,9 +2319,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.0.tgz", - "integrity": "sha512-tFZSEhqJ8Yrpe50TzOdeoYi72gi/jsnT7y8Qrozf3cNu28WX+s6I3XzEPUAqoaT9SAS8Xz9AzGTFlxxCH/w20w==", + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.2.tgz", + "integrity": "sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==", "cpu": [ "arm64" ], @@ -2289,9 +2333,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.0.tgz", - "integrity": "sha512-+DikIIs+p6yU2hF51UaWG8BnHbq90X0QIOt5zqSKSZxY+G3qqdLih214e9InJal21af2PuuxkDectetGfbVPJw==", + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.2.tgz", + "integrity": "sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==", "cpu": [ "arm64" ], @@ -2303,9 +2347,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.0.tgz", - "integrity": "sha512-5a+NofhdEB/WimSlFMskbFQn1vqz1FWryYpA99trmZGO6qEmiS0IsX6w4B3d91U878Q2ZQdiaFF1gxX4P147og==", + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.2.tgz", + "integrity": "sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==", "cpu": [ "x64" ], @@ -2317,9 +2361,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.0.tgz", - "integrity": "sha512-igr/RlKPS3OCy4jD3XBmAmo3UAcNZkJSubRsw1JeM8bAbwf15k/3eMZXD91bnjheijJiOJcga3kfCLKjV8IXNg==", + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.2.tgz", + "integrity": "sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==", "cpu": [ "arm64" ], @@ -2331,9 +2375,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.0.tgz", - "integrity": "sha512-MdigWzPSHlQzB1xZ+MdFDWTAH+kcn7UxjEBoOKuaso7z1DRlnAnrknB1mTtNOQ+GdPI8xgExAGwHeqQjntR0Cg==", + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.2.tgz", + "integrity": "sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==", "cpu": [ "x64" ], @@ -2345,9 +2389,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.0.tgz", - "integrity": "sha512-dmZseE0ZwA/4yy1+BwFrDqFTjjNg24GO9xSrb1weVbt6AFkhp5pz1gVS7IMtfIvoWy8yp6q/zN0bKnefRUImvQ==", + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.2.tgz", + "integrity": "sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==", "cpu": [ "arm" ], @@ -2359,9 +2403,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.0.tgz", - "integrity": "sha512-fzhfn6p9Cfm3W8UrWKIa4l7Wfjs/KGdgaswMBBE3KY3Ta43jg2XsPrAtfezHpsRk0Nx+TFuS3hZk/To2N5kFPQ==", + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.2.tgz", + "integrity": "sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==", "cpu": [ "arm" ], @@ -2373,9 +2417,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.0.tgz", - "integrity": "sha512-vVDD+iPDPmJQ5nAQ5Tifq3ywdv60FartglFI8VOCK+hcU9aoG0qlQTsDJP97O5yiTaTqlneZWoARMcVC5nyUoQ==", + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.2.tgz", + "integrity": "sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==", "cpu": [ "arm64" ], @@ -2387,9 +2431,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.0.tgz", - "integrity": "sha512-0d0jx08fzDHCzXqrtCMEEyxKU0SvJrWmUjUDE2/KDQ2UDJql0tfiwYvEx1oHELClKO8CNdE+AGJj+RqXscZpdQ==", + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.2.tgz", + "integrity": "sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==", "cpu": [ "arm64" ], @@ -2401,9 +2445,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.0.tgz", - "integrity": "sha512-XBYu9oW9eKJadWn8M7hkTZsD4yG+RrsTrVEgyKwb4L72cpJjRbRboTG9Lg9fec8MxJp/cfTHAocg4mnismQR8A==", + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.2.tgz", + "integrity": "sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==", "cpu": [ "loong64" ], @@ -2415,9 +2459,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.0.tgz", - "integrity": "sha512-wJaRvcT17PoOK6Ggcfo3nouFlybHvARBS4jzT0PC/lg17fIJHcDS2fZz3sD+iA4nRlho2zE6OGbU0HvwATdokQ==", + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.2.tgz", + "integrity": "sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==", "cpu": [ "ppc64" ], @@ -2429,9 +2473,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.0.tgz", - "integrity": "sha512-GZ5bkMFteAGkcmh8x0Ok4LSa+L62Ez0tMsHPX6JtR0wl4Xc3bQcrFHDiR5DGLEDFtGrXih4Nd/UDaFqs968/wA==", + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.2.tgz", + "integrity": "sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==", "cpu": [ "riscv64" ], @@ -2443,9 +2487,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.0.tgz", - "integrity": "sha512-7CjPw6FflFsVOUfWOrVrREiV3IYXG4RzZ1ZQUaT3BtSK8YXN6x286o+sruPZJESIaPebYuFowmg54ZdrkVBYog==", + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.2.tgz", + "integrity": "sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==", "cpu": [ "riscv64" ], @@ -2457,9 +2501,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.0.tgz", - "integrity": "sha512-nmvnl0ZiuysltcB/cKjUh40Rx4FbSyueERDsl2FLvLYr6pCgSsvGr3SocUT84svSpmloS7f1DRWqtRha74Gi1w==", + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.2.tgz", + "integrity": "sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==", "cpu": [ "s390x" ], @@ -2471,9 +2515,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.0.tgz", - "integrity": "sha512-Cv+moII5C8RM6gZbR3cb21o6rquVDZrN2o81maROg1LFzBz2dZUwIQSxFA8GtGZ/F2KtsqQ2z3eFPBb6akvQNg==", + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.2.tgz", + "integrity": "sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==", "cpu": [ "x64" ], @@ -2485,9 +2529,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.0.tgz", - "integrity": "sha512-PHcMG8DZTM9RCIjp8QIfN0VYtX0TtBPnWOTRurFhoCDoi9zptUZL2k7pCs+5rgut7JAiUsYy+huyhVKPcmxoog==", + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.2.tgz", + "integrity": "sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==", "cpu": [ "x64" ], @@ -2499,9 +2543,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.0.tgz", - "integrity": "sha512-1SI/Rd47e8aQJeFWMDg16ET+fjvCcD/CzeaRmIEPmb05hx+3cCcwIF4ebUag4yTt/D1peE+Mgp0+Po3M358cAA==", + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.2.tgz", + "integrity": "sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==", "cpu": [ "arm64" ], @@ -2513,9 +2557,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.0.tgz", - "integrity": "sha512-JwOCYxmumFDfDhx4kNyz6kTVK3gWzBIvVdMNzQMRDubcoGRDniOOmo6DDNP42qwZx3Bp9/6vWJ+kNzNqXoHmeA==", + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.2.tgz", + "integrity": "sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==", "cpu": [ "ia32" ], @@ -2527,9 +2571,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.0.tgz", - "integrity": "sha512-IPMIfrfkG1GaEXi+JSsQEx8x9b4b+hRZXO7KYc2pKio3zO2/VDXDs6B9Ts/nnO+25Fk1tdAVtUn60HKKPPzDig==", + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.2.tgz", + "integrity": "sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==", "cpu": [ "x64" ], @@ -3132,20 +3176,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/@stylistic/stylelint-plugin/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@swc/helpers": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.2.14.tgz", @@ -3273,9 +3303,9 @@ "license": "MIT" }, "node_modules/@types/d3-dispatch": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", - "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", "license": "MIT" }, "node_modules/@types/d3-drag": { @@ -5041,13 +5071,13 @@ } }, "node_modules/ast-v8-to-istanbul": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.3.tgz", - "integrity": "sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.4.tgz", + "integrity": "sha512-cxrAnZNLBnQwBPByK4CeDaw5sWZtMilJE/Q3iDA0aamgaIVNDF9T6K2/8DfYDZEejZ2jNnDrG9m8MY72HFd0KA==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", + "@jridgewell/trace-mapping": "^0.3.29", "estree-walker": "^3.0.3", "js-tokens": "^9.0.1" } @@ -5337,9 +5367,9 @@ } }, "node_modules/cacheable/node_modules/keyv": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.4.0.tgz", - "integrity": "sha512-TMckyVjEoacG5IteUpUrOBsFORtheqziVyyY2dLUwg1jwTb8u48LX4TgmtogkNl9Y9unaEJ1luj10fGyjMGFOQ==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.0.tgz", + "integrity": "sha512-QG7qR2tijh1ftOvClut4YKKg1iW6cx3GZsKoGyJPxHkGWK9oJhG9P3j5deP0QQOGDowBMVQFaP+Vm4NpGYvmIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5415,9 +5445,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001727", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", - "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==", + "version": "1.0.30001731", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz", + "integrity": "sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==", "funding": [ { "type": "opencollective", @@ -6068,9 +6098,9 @@ "license": "MIT" }, "node_modules/cytoscape": { - "version": "3.32.1", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.32.1.tgz", - "integrity": "sha512-dbeqFTLYEwlFg7UGtcZhCCG/2WayX72zK3Sq323CEX29CY81tYfVhw1MIdduCtpstB0cTOhJswWlM/OEB3Xp+Q==", + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.0.tgz", + "integrity": "sha512-2d2EwwhaxLWC8ahkH1PpQwCyu6EY3xDRdcEJXrLTb4fOUtVc+YWQalHU67rFS1a6ngj1fgv9dQLtJxP/KAFZEw==", "license": "MIT", "engines": { "node": ">=0.10" @@ -6992,9 +7022,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.191", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.191.tgz", - "integrity": "sha512-xcwe9ELcuxYLUFqZZxL19Z6HVKcvNkIwhbHUz7L3us6u12yR+7uY89dSl570f/IqNthx8dAw3tojG7i4Ni4tDA==", + "version": "1.5.194", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.194.tgz", + "integrity": "sha512-SdnWJwSUot04UR51I2oPD8kuP2VI37/CADR1OHsFOUzZIvfWJBO6q11k5P/uKNyTT3cdOsnyjkrZ+DDShqYqJA==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -7783,10 +7813,10 @@ "vue-eslint-parser": ">=7.1.0" } }, - "node_modules/eslint-plugin-vue-scoped-css/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "node_modules/eslint-plugin-vue/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, "license": "MIT", "dependencies": { @@ -12227,19 +12257,6 @@ "postcss": "^8.1.0" } }, - "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-modules-scope": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", @@ -12255,19 +12272,6 @@ "postcss": "^8.1.0" } }, - "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-modules-values": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", @@ -12308,6 +12312,19 @@ "postcss": "^8.2.14" } }, + "node_modules/postcss-nested/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-nesting": { "version": "13.0.2", "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", @@ -12335,63 +12352,6 @@ "postcss": "^8.4" } }, - "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", - "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-resolve-nested-selector": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", @@ -12444,9 +12404,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -13963,29 +13923,6 @@ "stylelint": ">=16" } }, - "node_modules/stylelint/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, "node_modules/stylelint/node_modules/file-entry-cache": { "version": "10.1.3", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.3.tgz", @@ -14074,20 +14011,6 @@ "postcss": "^8.4.31" } }, - "node_modules/stylelint/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/stylelint/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -14414,6 +14337,19 @@ } } }, + "node_modules/tailwindcss/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/tapable": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", @@ -14944,9 +14880,9 @@ } }, "node_modules/typo-js": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/typo-js/-/typo-js-1.2.5.tgz", - "integrity": "sha512-F45vFWdGX8xahIk/sOp79z2NJs8ETMYsmMChm9D5Hlx3+9j7VnCyQyvij5MOCrNY3NNe8noSyokRjQRfq+Bc7A==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/typo-js/-/typo-js-1.3.0.tgz", + "integrity": "sha512-ERVoYp5PG7jpj7+kzKmFZfp5+IYMOOQM3etNnlYu06Z2CL5UmC9ekT8Z/JVYpR7e7sXB4bOFq1fz/budv++Z0g==", "license": "BSD-3-Clause" }, "node_modules/uc.micro": { @@ -15326,9 +15262,9 @@ } }, "node_modules/vite/node_modules/rollup": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.0.tgz", - "integrity": "sha512-ONmkT3Ud3IfW15nl7l4qAZko5/2iZ5ALVBDh02ZSZ5IGVLJSYkRcRa3iB58VyEIyoofs9m2xdVrm+lTi97+3pw==", + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", + "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", "dev": true, "license": "MIT", "dependencies": { @@ -15342,26 +15278,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.46.0", - "@rollup/rollup-android-arm64": "4.46.0", - "@rollup/rollup-darwin-arm64": "4.46.0", - "@rollup/rollup-darwin-x64": "4.46.0", - "@rollup/rollup-freebsd-arm64": "4.46.0", - "@rollup/rollup-freebsd-x64": "4.46.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.46.0", - "@rollup/rollup-linux-arm-musleabihf": "4.46.0", - "@rollup/rollup-linux-arm64-gnu": "4.46.0", - "@rollup/rollup-linux-arm64-musl": "4.46.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.46.0", - "@rollup/rollup-linux-ppc64-gnu": "4.46.0", - "@rollup/rollup-linux-riscv64-gnu": "4.46.0", - "@rollup/rollup-linux-riscv64-musl": "4.46.0", - "@rollup/rollup-linux-s390x-gnu": "4.46.0", - "@rollup/rollup-linux-x64-gnu": "4.46.0", - "@rollup/rollup-linux-x64-musl": "4.46.0", - "@rollup/rollup-win32-arm64-msvc": "4.46.0", - "@rollup/rollup-win32-ia32-msvc": "4.46.0", - "@rollup/rollup-win32-x64-msvc": "4.46.0", + "@rollup/rollup-android-arm-eabi": "4.46.2", + "@rollup/rollup-android-arm64": "4.46.2", + "@rollup/rollup-darwin-arm64": "4.46.2", + "@rollup/rollup-darwin-x64": "4.46.2", + "@rollup/rollup-freebsd-arm64": "4.46.2", + "@rollup/rollup-freebsd-x64": "4.46.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.46.2", + "@rollup/rollup-linux-arm-musleabihf": "4.46.2", + "@rollup/rollup-linux-arm64-gnu": "4.46.2", + "@rollup/rollup-linux-arm64-musl": "4.46.2", + "@rollup/rollup-linux-loongarch64-gnu": "4.46.2", + "@rollup/rollup-linux-ppc64-gnu": "4.46.2", + "@rollup/rollup-linux-riscv64-gnu": "4.46.2", + "@rollup/rollup-linux-riscv64-musl": "4.46.2", + "@rollup/rollup-linux-s390x-gnu": "4.46.2", + "@rollup/rollup-linux-x64-gnu": "4.46.2", + "@rollup/rollup-linux-x64-musl": "4.46.2", + "@rollup/rollup-win32-arm64-msvc": "4.46.2", + "@rollup/rollup-win32-ia32-msvc": "4.46.2", + "@rollup/rollup-win32-x64-msvc": "4.46.2", "fsevents": "~2.3.2" } }, diff --git a/web_src/fomantic/package-lock.json b/web_src/fomantic/package-lock.json index 073339afc6..1351785107 100644 --- a/web_src/fomantic/package-lock.json +++ b/web_src/fomantic/package-lock.json @@ -1249,9 +1249,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001727", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", - "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==", + "version": "1.0.30001731", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz", + "integrity": "sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==", "funding": [ { "type": "opencollective", @@ -2005,9 +2005,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.191", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.191.tgz", - "integrity": "sha512-xcwe9ELcuxYLUFqZZxL19Z6HVKcvNkIwhbHUz7L3us6u12yR+7uY89dSl570f/IqNthx8dAw3tojG7i4Ni4tDA==", + "version": "1.5.194", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.194.tgz", + "integrity": "sha512-SdnWJwSUot04UR51I2oPD8kuP2VI37/CADR1OHsFOUzZIvfWJBO6q11k5P/uKNyTT3cdOsnyjkrZ+DDShqYqJA==", "license": "ISC" }, "node_modules/emoji-regex": { From cc31b744d18820b5e709cebafa8c57220ed475b0 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 5 Aug 2025 02:41:36 +0200 Subject: [PATCH 268/495] Update dependency mini-css-extract-plugin to v2.9.3 (forgejo) (#8782) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8782 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1ab1271cae..93396a9ed5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,7 @@ "jquery": "3.7.1", "katex": "0.16.22", "mermaid": "11.8.1", - "mini-css-extract-plugin": "2.9.2", + "mini-css-extract-plugin": "2.9.3", "minimatch": "10.0.3", "monaco-editor": "0.52.2", "monaco-editor-webpack-plugin": "7.1.0", @@ -11274,9 +11274,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", - "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.3.tgz", + "integrity": "sha512-tRA0+PsS4kLVijnN1w9jUu5lkxBwUk9E8SbgEB5dBJqchE6pVYdawROG6uQtpmAri7tdCK9i7b1bULeVWqS6Ag==", "license": "MIT", "dependencies": { "schema-utils": "^4.0.0", diff --git a/package.json b/package.json index 0966c570cf..22b8b3386c 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "jquery": "3.7.1", "katex": "0.16.22", "mermaid": "11.8.1", - "mini-css-extract-plugin": "2.9.2", + "mini-css-extract-plugin": "2.9.3", "minimatch": "10.0.3", "monaco-editor": "0.52.2", "monaco-editor-webpack-plugin": "7.1.0", From 0a444a374ed37b15e5fd3a21d9a1a86f9d889819 Mon Sep 17 00:00:00 2001 From: John Moon Date: Tue, 5 Aug 2025 17:00:35 +0200 Subject: [PATCH 269/495] fix: add .forgejo/CODEOWNERS support (#8773) Currently, the documentation mention that a CODEOWNERS file can be located in .forgejo for code owner PR review assignment, but this does not work. Add support for this location. Resolves #8746 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8773 Reviewed-by: Gusted Co-authored-by: John Moon Co-committed-by: John Moon --- routers/web/repo/view.go | 2 +- services/issue/pull.go | 2 +- tests/integration/codeowner_test.go | 297 +++++++++++++++------------- 3 files changed, 159 insertions(+), 142 deletions(-) diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go index 36791fc770..f317f1e549 100644 --- a/routers/web/repo/view.go +++ b/routers/web/repo/view.go @@ -438,7 +438,7 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) { if workFlowErr != nil { ctx.Data["FileError"] = ctx.Locale.Tr("actions.runs.invalid_workflow_helper", workFlowErr.Error()) } - } else if slices.Contains([]string{"CODEOWNERS", "docs/CODEOWNERS", ".gitea/CODEOWNERS"}, ctx.Repo.TreePath) { + } else if slices.Contains([]string{"CODEOWNERS", "docs/CODEOWNERS", ".gitea/CODEOWNERS", ".forgejo/CODEOWNERS"}, ctx.Repo.TreePath) { if rc, size, err := blob.NewTruncatedReader(setting.UI.MaxDisplayFileSize); err == nil { _, warnings := issue_model.GetCodeOwnersFromReader(ctx, rc, size > setting.UI.MaxDisplayFileSize) if len(warnings) > 0 { diff --git a/services/issue/pull.go b/services/issue/pull.go index 2eef1fbfa8..6245344ccb 100644 --- a/services/issue/pull.go +++ b/services/issue/pull.go @@ -71,7 +71,7 @@ func PullRequestCodeOwnersReview(ctx context.Context, issue *issues_model.Issue, } var rules []*issues_model.CodeOwnerRule - for _, file := range []string{"CODEOWNERS", "docs/CODEOWNERS", ".gitea/CODEOWNERS"} { + for _, file := range []string{"CODEOWNERS", "docs/CODEOWNERS", ".gitea/CODEOWNERS", ".forgejo/CODEOWNERS"} { if blob, err := commit.GetBlobByPath(file); err == nil { rc, size, err := blob.NewTruncatedReader(setting.UI.MaxDisplayFileSize) if err == nil { diff --git a/tests/integration/codeowner_test.go b/tests/integration/codeowner_test.go index e2eeb843d8..b85a5f213d 100644 --- a/tests/integration/codeowner_test.go +++ b/tests/integration/codeowner_test.go @@ -26,175 +26,192 @@ import ( "github.com/stretchr/testify/require" ) -func TestCodeOwner(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) +func CodeOwnerTestCommon(t *testing.T, u *url.URL, codeownerTest CodeownerTest) { + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - // Create the repo. - repo, _, f := tests.CreateDeclarativeRepo(t, user2, "", - []unit_model.Type{unit_model.TypePullRequests}, nil, - []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: "CODEOWNERS", - ContentReader: strings.NewReader("README.md @user5\ntest-file @user4"), - }, + // Create the repo. + repo, _, f := tests.CreateDeclarativeRepo(t, user2, codeownerTest.Name, + []unit_model.Type{unit_model.TypePullRequests}, nil, + []*files_service.ChangeRepoFile{ + { + Operation: "create", + TreePath: codeownerTest.Path, + ContentReader: strings.NewReader("README.md @user5\ntest-file @user4"), }, - ) - defer f() + }, + ) + defer f() - dstPath := t.TempDir() - r := fmt.Sprintf("%suser2/%s.git", u.String(), repo.Name) - cloneURL, _ := url.Parse(r) - cloneURL.User = url.UserPassword("user2", userPassword) - require.NoError(t, git.CloneWithArgs(t.Context(), nil, cloneURL.String(), dstPath, git.CloneRepoOptions{})) + dstPath := t.TempDir() + r := fmt.Sprintf("%suser2/%s.git", u.String(), repo.Name) + cloneURL, _ := url.Parse(r) + cloneURL.User = url.UserPassword("user2", userPassword) + require.NoError(t, git.CloneWithArgs(t.Context(), nil, cloneURL.String(), dstPath, git.CloneRepoOptions{})) - t.Run("Normal", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() + t.Run("Normal", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() - err := os.WriteFile(path.Join(dstPath, "README.md"), []byte("## test content"), 0o666) - require.NoError(t, err) + err := os.WriteFile(path.Join(dstPath, "README.md"), []byte("## test content"), 0o666) + require.NoError(t, err) - err = git.AddChanges(dstPath, true) - 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: "Add README.", - }) - require.NoError(t, err) - - err = git.NewCommand(git.DefaultContext, "push", "origin", "HEAD:refs/for/main", "-o", "topic=codeowner-normal").Run(&git.RunOpts{Dir: dstPath}) - require.NoError(t, err) - - pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{BaseRepoID: repo.ID, HeadBranch: "user2/codeowner-normal"}) - unittest.AssertExistsIf(t, true, &issues_model.Review{IssueID: pr.IssueID, Type: issues_model.ReviewTypeRequest, ReviewerID: 5}) + 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: "Add README.", }) + require.NoError(t, err) - t.Run("Forked repository", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() + err = git.NewCommand(git.DefaultContext, "push", "origin", "HEAD:refs/for/main", "-o", "topic=codeowner-normal").Run(&git.RunOpts{Dir: dstPath}) + require.NoError(t, err) - session := loginUser(t, "user1") - testRepoFork(t, session, user2.Name, repo.Name, "user1", "repo1") + pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{BaseRepoID: repo.ID, HeadBranch: "user2/codeowner-normal"}) + unittest.AssertExistsIf(t, true, &issues_model.Review{IssueID: pr.IssueID, Type: issues_model.ReviewTypeRequest, ReviewerID: 5}) + }) - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerName: "user1", Name: "repo1"}) + t.Run("Forked repository", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() - r := fmt.Sprintf("%suser1/repo1.git", u.String()) - remoteURL, _ := url.Parse(r) - remoteURL.User = url.UserPassword("user2", userPassword) - doGitAddRemote(dstPath, "forked", remoteURL)(t) + session := loginUser(t, "user1") + testRepoFork(t, session, user2.Name, repo.Name, "user1", codeownerTest.Name) - err := git.NewCommand(git.DefaultContext, "push", "forked", "HEAD:refs/for/main", "-o", "topic=codeowner-forked").Run(&git.RunOpts{Dir: dstPath}) - require.NoError(t, err) + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerName: "user1", Name: codeownerTest.Name}) - pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{BaseRepoID: repo.ID, HeadBranch: "user2/codeowner-forked"}) - unittest.AssertExistsIf(t, false, &issues_model.Review{IssueID: pr.IssueID, Type: issues_model.ReviewTypeRequest, ReviewerID: 5}) + r := fmt.Sprintf("%suser1/%s.git", u.String(), codeownerTest.Name) + remoteURL, _ := url.Parse(r) + remoteURL.User = url.UserPassword("user2", userPassword) + doGitAddRemote(dstPath, "forked", remoteURL)(t) + + err := git.NewCommand(git.DefaultContext, "push", "forked", "HEAD:refs/for/main", "-o", "topic=codeowner-forked").Run(&git.RunOpts{Dir: dstPath}) + require.NoError(t, err) + + pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{BaseRepoID: repo.ID, HeadBranch: "user2/codeowner-forked"}) + unittest.AssertExistsIf(t, false, &issues_model.Review{IssueID: pr.IssueID, Type: issues_model.ReviewTypeRequest, ReviewerID: 5}) + }) + + t.Run("Out of date", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + // Push the changes made from the previous subtest. + require.NoError(t, git.NewCommand(git.DefaultContext, "push", "origin").Run(&git.RunOpts{Dir: dstPath})) + + // Reset the tree to the previous commit. + require.NoError(t, git.NewCommand(git.DefaultContext, "reset", "--hard", "HEAD~1").Run(&git.RunOpts{Dir: dstPath})) + + 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: "Add test-file.", }) + require.NoError(t, err) - t.Run("Out of date", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() + err = git.NewCommand(git.DefaultContext, "push", "origin", "HEAD:refs/for/main", "-o", "topic=codeowner-out-of-date").Run(&git.RunOpts{Dir: dstPath}) + require.NoError(t, err) - // Push the changes made from the previous subtest. - require.NoError(t, git.NewCommand(git.DefaultContext, "push", "origin").Run(&git.RunOpts{Dir: dstPath})) + pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{BaseRepoID: repo.ID, HeadBranch: "user2/codeowner-out-of-date"}) + unittest.AssertExistsIf(t, true, &issues_model.Review{IssueID: pr.IssueID, Type: issues_model.ReviewTypeRequest, ReviewerID: 4}) + unittest.AssertExistsIf(t, false, &issues_model.Review{IssueID: pr.IssueID, Type: issues_model.ReviewTypeRequest, ReviewerID: 5}) + }) + t.Run("From a forked repository", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() - // Reset the tree to the previous commit. - require.NoError(t, git.NewCommand(git.DefaultContext, "reset", "--hard", "HEAD~1").Run(&git.RunOpts{Dir: dstPath})) + session := loginUser(t, "user1") - err := os.WriteFile(path.Join(dstPath, "test-file"), []byte("## test content"), 0o666) - require.NoError(t, err) + r := fmt.Sprintf("%suser1/%s.git", u.String(), codeownerTest.Name) + remoteURL, _ := url.Parse(r) + remoteURL.User = url.UserPassword("user1", userPassword) + doGitAddRemote(dstPath, "forked-2", remoteURL)(t) - err = git.AddChanges(dstPath, true) - require.NoError(t, err) + err := git.NewCommand(git.DefaultContext, "push", "forked-2", "HEAD:branch").Run(&git.RunOpts{Dir: dstPath}) + 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: "Add test-file.", - }) - require.NoError(t, err) - - err = git.NewCommand(git.DefaultContext, "push", "origin", "HEAD:refs/for/main", "-o", "topic=codeowner-out-of-date").Run(&git.RunOpts{Dir: dstPath}) - require.NoError(t, err) - - pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{BaseRepoID: repo.ID, HeadBranch: "user2/codeowner-out-of-date"}) - unittest.AssertExistsIf(t, true, &issues_model.Review{IssueID: pr.IssueID, Type: issues_model.ReviewTypeRequest, ReviewerID: 4}) - unittest.AssertExistsIf(t, false, &issues_model.Review{IssueID: pr.IssueID, Type: issues_model.ReviewTypeRequest, ReviewerID: 5}) + req := NewRequestWithValues(t, "POST", repo.FullName()+"/compare/main...user1/"+codeownerTest.Name+":branch", map[string]string{ + "_csrf": GetCSRF(t, session, repo.FullName()+"/compare/main...user1/"+codeownerTest.Name+":branch"), + "title": "pull request", }) - t.Run("From a forked repository", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() + session.MakeRequest(t, req, http.StatusOK) - session := loginUser(t, "user1") + pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{BaseRepoID: repo.ID, HeadBranch: "branch"}) + unittest.AssertExistsIf(t, true, &issues_model.Review{IssueID: pr.IssueID, Type: issues_model.ReviewTypeRequest, ReviewerID: 4}) + }) - r := fmt.Sprintf("%suser1/repo1.git", u.String()) - remoteURL, _ := url.Parse(r) - remoteURL.User = url.UserPassword("user1", userPassword) - doGitAddRemote(dstPath, "forked-2", remoteURL)(t) + t.Run("Codeowner user with no permission", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() - err := git.NewCommand(git.DefaultContext, "push", "forked-2", "HEAD:branch").Run(&git.RunOpts{Dir: dstPath}) - require.NoError(t, err) + // Make repository private, only user2 (owner of repository) has now access to this repository. + repo.IsPrivate = true + _, err := db.GetEngine(db.DefaultContext).Cols("is_private").Update(repo) + require.NoError(t, err) - req := NewRequestWithValues(t, "POST", repo.FullName()+"/compare/main...user1/repo1:branch", map[string]string{ - "_csrf": GetCSRF(t, session, repo.FullName()+"/compare/main...user1/repo1:branch"), - "title": "pull request", - }) - session.MakeRequest(t, req, http.StatusOK) + err = os.WriteFile(path.Join(dstPath, "README.md"), []byte("## very sensitive info"), 0o666) + require.NoError(t, err) - pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{BaseRepoID: repo.ID, HeadBranch: "branch"}) - unittest.AssertExistsIf(t, true, &issues_model.Review{IssueID: pr.IssueID, Type: issues_model.ReviewTypeRequest, ReviewerID: 4}) + 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: "Add secrets to the README.", }) + require.NoError(t, err) - t.Run("Codeowner user with no permission", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() + err = git.NewCommand(git.DefaultContext, "push", "origin", "HEAD:refs/for/main", "-o", "topic=codeowner-private").Run(&git.RunOpts{Dir: dstPath}) + require.NoError(t, err) - // Make repository private, only user2 (owner of repository) has now access to this repository. - repo.IsPrivate = true - _, err := db.GetEngine(db.DefaultContext).Cols("is_private").Update(repo) - require.NoError(t, err) - - err = os.WriteFile(path.Join(dstPath, "README.md"), []byte("## very sensitive info"), 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: "Add secrets to the README.", - }) - require.NoError(t, err) - - err = git.NewCommand(git.DefaultContext, "push", "origin", "HEAD:refs/for/main", "-o", "topic=codeowner-private").Run(&git.RunOpts{Dir: dstPath}) - require.NoError(t, err) - - // In CODEOWNERS file the codeowner for README.md is user5, but does not have access to this private repository. - pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{BaseRepoID: repo.ID, HeadBranch: "user2/codeowner-private"}) - unittest.AssertExistsIf(t, false, &issues_model.Review{IssueID: pr.IssueID, Type: issues_model.ReviewTypeRequest, ReviewerID: 5}) - }) + // In CODEOWNERS file the codeowner for README.md is user5, but does not have access to this private repository. + pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{BaseRepoID: repo.ID, HeadBranch: "user2/codeowner-private"}) + unittest.AssertExistsIf(t, false, &issues_model.Review{IssueID: pr.IssueID, Type: issues_model.ReviewTypeRequest, ReviewerID: 5}) + }) +} + +type CodeownerTest struct { + Name string + Path string +} + +func TestCodeOwner(t *testing.T) { + onGiteaRun(t, func(t *testing.T, u *url.URL) { + tests := []CodeownerTest{ + {Name: "root", Path: "CODEOWNERS"}, + {Name: "docs", Path: "docs/CODEOWNERS"}, + {Name: "gitea", Path: ".gitea/CODEOWNERS"}, + {Name: "forgejo", Path: ".forgejo/CODEOWNERS"}, + } + for _, test := range tests { + CodeOwnerTestCommon(t, u, test) + } }) } From 5294cff95f43a1ded4e8d160605e35793a9aa5a8 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 6 Aug 2025 01:30:20 +0200 Subject: [PATCH 270/495] Update module github.com/alecthomas/chroma/v2 to v2.20.0 (forgejo) (#8783) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8783 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- go.mod | 2 +- go.sum | 8 +++--- modules/indexer/code/search_test.go | 12 ++++---- modules/markup/html_test.go | 40 +++++++++++++------------- modules/markup/orgmode/orgmode_test.go | 8 +++--- 5 files changed, 35 insertions(+), 35 deletions(-) diff --git a/go.mod b/go.mod index 8850e3e17c..d1a6e17532 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,7 @@ require ( github.com/ProtonMail/go-crypto v1.3.0 github.com/PuerkitoBio/goquery v1.10.3 github.com/SaveTheRbtz/zstd-seekable-format-go/pkg v0.7.2 - github.com/alecthomas/chroma/v2 v2.19.0 + github.com/alecthomas/chroma/v2 v2.20.0 github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb github.com/blevesearch/bleve/v2 v2.5.2 github.com/buildkite/terminal-to-html/v3 v3.16.8 diff --git a/go.sum b/go.sum index 475c1f345d..2231ea9fa6 100644 --- a/go.sum +++ b/go.sum @@ -62,11 +62,11 @@ github.com/SaveTheRbtz/zstd-seekable-format-go/pkg v0.7.2/go.mod h1:JitQWJ8JuV4Y github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs= -github.com/alecthomas/chroma/v2 v2.19.0 h1:Im+SLRgT8maArxv81mULDWN8oKxkzboH07CHesxElq4= -github.com/alecthomas/chroma/v2 v2.19.0/go.mod h1:RVX6AvYm4VfYe/zsk7mjHueLDZor3aWCNE14TFlepBk= +github.com/alecthomas/chroma/v2 v2.20.0 h1:sfIHpxPyR07/Oylvmcai3X/exDlE8+FA820NTz+9sGw= +github.com/alecthomas/chroma/v2 v2.20.0/go.mod h1:e7tViK0xh/Nf4BYHl00ycY6rV7b8iXBksI9E359yNmA= github.com/alecthomas/repr v0.0.0-20220113201626-b1b626ac65ae/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8= -github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= -github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= +github.com/alecthomas/repr v0.5.1 h1:E3G4t2QbHTSNpPKBgMTln5KLkZHLOcU7r37J4pXBuIg= +github.com/alecthomas/repr v0.5.1/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 h1:Kk6a4nehpJ3UuJRqlA3JxYxBZEqCeOmATOvrbT4p9RA= github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= diff --git a/modules/indexer/code/search_test.go b/modules/indexer/code/search_test.go index e542b38c24..2413ddec0b 100644 --- a/modules/indexer/code/search_test.go +++ b/modules/indexer/code/search_test.go @@ -86,9 +86,9 @@ func TestHighlightSearchResultCode(t *testing.T) { Range: [][3]int{{1, 14, 23}}, Code: "func main() {\n\tfmt.Println(\"mark this\")\n}", Result: []template.HTML{ - "func main() {", - "\tfmt.Println("mark this")", - "}", + "func main() {", + "\tfmt.Println("mark this")", + "}", }, }, { @@ -97,9 +97,9 @@ func TestHighlightSearchResultCode(t *testing.T) { Range: [][3]int{{1, 14, 28}}, Code: "func main() {\n\tfmt.Println(\"mark this 😊\")\n}", Result: []template.HTML{ - "func main() {", - "\tfmt.Println("mark this 😊")", - "}", + "func main() {", + "\tfmt.Println("mark this 😊")", + "}", }, }, } diff --git a/modules/markup/html_test.go b/modules/markup/html_test.go index 2bc929bb04..6bc0f7e56c 100644 --- a/modules/markup/html_test.go +++ b/modules/markup/html_test.go @@ -743,11 +743,11 @@ func TestRender_FilePreview(t *testing.T) { ``+ ``+ ``+ - `B`+"\n"+``+ + `B`+"\n"+``+ ``+ ``+ ``+ - `C`+"\n"+``+ + `C`+"\n"+``+ ``+ ``+ ``+ @@ -777,11 +777,11 @@ func TestRender_FilePreview(t *testing.T) { ``+ ``+ ``+ - `B`+"\n"+``+ + `B`+"\n"+``+ ``+ ``+ ``+ - `C`+"\n"+``+ + `C`+"\n"+``+ ``+ ``+ ``+ @@ -856,11 +856,11 @@ func TestRender_FilePreview(t *testing.T) { ``+ ``+ ``+ - `B`+"\n"+``+ + `B`+"\n"+``+ ``+ ``+ ``+ - `C`+"\n"+``+ + `C`+"\n"+``+ ``+ ``+ ``+ @@ -887,11 +887,11 @@ func TestRender_FilePreview(t *testing.T) { ``+ ``+ ``+ - `B`+"\n"+``+ + `B`+"\n"+``+ ``+ ``+ ``+ - `C`+"\n"+``+ + `C`+"\n"+``+ ``+ ``+ ``+ @@ -920,11 +920,11 @@ func TestRender_FilePreview(t *testing.T) { ``+ ``+ ``+ - `B`+"\n"+``+ + `B`+"\n"+``+ ``+ ``+ ``+ - `C`+"\n"+``+ + `C`+"\n"+``+ ``+ ``+ ``+ @@ -945,11 +945,11 @@ func TestRender_FilePreview(t *testing.T) { ``+ ``+ ``+ - `B`+"\n"+``+ + `B`+"\n"+``+ ``+ ``+ ``+ - `C`+"\n"+``+ + `C`+"\n"+``+ ``+ ``+ ``+ @@ -976,11 +976,11 @@ func TestRender_FilePreview(t *testing.T) { ``+ ``+ ``+ - `B`+"\n"+``+ + `B`+"\n"+``+ ``+ ``+ ``+ - `C`+"\n"+``+ + `C`+"\n"+``+ ``+ ``+ ``+ @@ -1001,11 +1001,11 @@ func TestRender_FilePreview(t *testing.T) { ``+ ``+ ``+ - `B`+"\n"+``+ + `B`+"\n"+``+ ``+ ``+ ``+ - `C`+"\n"+``+ + `C`+"\n"+``+ ``+ ``+ ``+ @@ -1026,11 +1026,11 @@ func TestRender_FilePreview(t *testing.T) { ``+ ``+ ``+ - `B`+"\n"+``+ + `B`+"\n"+``+ ``+ ``+ ``+ - `C`+"\n"+``+ + `C`+"\n"+``+ ``+ ``+ ``+ @@ -1129,11 +1129,11 @@ func TestRender_FilePreview(t *testing.T) { ``+ ``+ ``+ - `B`+"\n"+``+ + `B`+"\n"+``+ ``+ ``+ ``+ - `C`+"\n"+``+ + `C`+"\n"+``+ ``+ ``+ ``+ diff --git a/modules/markup/orgmode/orgmode_test.go b/modules/markup/orgmode/orgmode_test.go index cdaa9f18ce..71157dc7c7 100644 --- a/modules/markup/orgmode/orgmode_test.go +++ b/modules/markup/orgmode/orgmode_test.go @@ -152,9 +152,9 @@ func HelloWorld() { } #+end_src `, `
    -
    // HelloWorld prints "Hello World"
    -func HelloWorld() {
    -	fmt.Println("Hello World")
    -}
    +
    // HelloWorld prints "Hello World"
    +func HelloWorld() {
    +	fmt.Println("Hello World")
    +}
    `) } From 56f4671c82a73b2af13aaa2b8f7aca020848bb95 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 6 Aug 2025 00:04:22 +0000 Subject: [PATCH 271/495] Update module code.forgejo.org/forgejo/runner/v9 to v9.0.3 --- go.mod | 17 +++++++++-------- go.sum | 40 ++++++++++++++++++++++------------------ 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/go.mod b/go.mod index d1a6e17532..8ded0c003a 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( code.forgejo.org/forgejo/go-rpmutils v1.0.0 code.forgejo.org/forgejo/levelqueue v1.0.0 code.forgejo.org/forgejo/reply v1.0.2 - code.forgejo.org/forgejo/runner/v9 v9.0.2 + code.forgejo.org/forgejo/runner/v9 v9.0.3 code.forgejo.org/go-chi/binding v1.0.1 code.forgejo.org/go-chi/cache v1.0.1 code.forgejo.org/go-chi/captcha v1.0.2 @@ -144,13 +144,14 @@ require ( github.com/blevesearch/zapx/v14 v14.4.2 // indirect github.com/blevesearch/zapx/v15 v15.4.2 // indirect github.com/blevesearch/zapx/v16 v16.2.4 // indirect + github.com/bmatcuk/doublestar/v4 v4.8.0 // indirect github.com/boombuler/barcode v1.0.1 // indirect github.com/bradfitz/gomemcache v0.0.0-20250403215159-8d39553ac7cf // indirect github.com/caddyserver/zerossl v0.1.3 // indirect github.com/cention-sany/utf7 v0.0.0-20170124080048-26cad61bd60a // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cloudflare/circl v1.6.1 // indirect - github.com/cyphar/filepath-securejoin v0.3.6 // indirect + github.com/cyphar/filepath-securejoin v0.4.1 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/davidmz/go-pageant v1.0.2 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect @@ -165,7 +166,7 @@ require ( github.com/go-fed/httpsig v1.1.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.6.2 // indirect - github.com/go-git/go-git/v5 v5.13.2 // indirect + github.com/go-git/go-git/v5 v5.16.2 // indirect github.com/go-ini/ini v1.67.0 // indirect github.com/go-openapi/jsonpointer v0.21.1 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect @@ -173,7 +174,7 @@ require ( github.com/go-webauthn/x v0.1.23 // indirect github.com/goccy/go-json v0.10.5 // indirect github.com/golang-jwt/jwt/v4 v4.5.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.1.2 // indirect @@ -194,6 +195,7 @@ require ( github.com/markbates/going v1.0.3 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mattn/go-shellwords v1.0.12 // indirect github.com/mholt/acmez/v3 v3.1.2 // indirect github.com/miekg/dns v1.1.63 // indirect github.com/minio/crc64nvme v1.0.1 // indirect @@ -217,12 +219,11 @@ require ( github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.62.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect - github.com/rhysd/actionlint v1.6.27 // indirect + github.com/rhysd/actionlint v1.7.7 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/rs/xid v1.6.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect - github.com/skeema/knownhosts v1.3.0 // indirect + github.com/skeema/knownhosts v1.3.1 // indirect github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect github.com/tinylib/msgp v1.3.0 // indirect github.com/x448/float16 v0.8.4 // indirect @@ -230,7 +231,7 @@ require ( github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect github.com/zeebo/assert v1.3.0 // indirect github.com/zeebo/blake3 v0.2.4 // indirect - go.etcd.io/bbolt v1.4.0 // indirect + go.etcd.io/bbolt v1.4.2 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect diff --git a/go.sum b/go.sum index 2231ea9fa6..343088ce1b 100644 --- a/go.sum +++ b/go.sum @@ -14,8 +14,8 @@ code.forgejo.org/forgejo/levelqueue v1.0.0 h1:9krYpU6BM+j/1Ntj6m+VCAIu0UNnne1/Uf code.forgejo.org/forgejo/levelqueue v1.0.0/go.mod h1:fmG6zhVuqim2rxSFOoasgXO8V2W/k9U31VVYqLIRLhQ= code.forgejo.org/forgejo/reply v1.0.2 h1:dMhQCHV6/O3L5CLWNTol+dNzDAuyCK88z4J/lCdgFuQ= code.forgejo.org/forgejo/reply v1.0.2/go.mod h1:RyZUfzQLc+fuLIGjTSQWDAJWPiL4WtKXB/FifT5fM7U= -code.forgejo.org/forgejo/runner/v9 v9.0.2 h1:ajTyjmn3tjJs3fkJ58498CgI4kvxifVY8gbh46SWAgc= -code.forgejo.org/forgejo/runner/v9 v9.0.2/go.mod h1:b6JWcpwHnBwLuWeQERM4pCRzFbnsEvC9gagQfxbZeJw= +code.forgejo.org/forgejo/runner/v9 v9.0.3 h1:BijUSIuPCDNKE3xfq7Ilj0JvK/IcFmP8oarg9dX/QPE= +code.forgejo.org/forgejo/runner/v9 v9.0.3/go.mod h1:0/xEl3Fndpb7g28/4xmmInsugp2V6sXBePJuERPT+S8= code.forgejo.org/forgejo/ssh v0.0.0-20241211213324-5fc306ca0616 h1:kEZL84+02jY9RxXM4zHBWZ3Fml0B09cmP1LGkDsCfIA= code.forgejo.org/forgejo/ssh v0.0.0-20241211213324-5fc306ca0616/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= code.forgejo.org/go-chi/binding v1.0.1 h1:coKNI+X1NzRN7X85LlrpvBRqk0TXpJ+ja28vusQWEuY= @@ -123,6 +123,8 @@ github.com/blevesearch/zapx/v15 v15.4.2 h1:sWxpDE0QQOTjyxYbAVjt3+0ieu8NCE0fDRaFx github.com/blevesearch/zapx/v15 v15.4.2/go.mod h1:1pssev/59FsuWcgSnTa0OeEpOzmhtmr/0/11H0Z8+Nw= github.com/blevesearch/zapx/v16 v16.2.4 h1:tGgfvleXTAkwsD5mEzgM3zCS/7pgocTCnO1oyAUjlww= github.com/blevesearch/zapx/v16 v16.2.4/go.mod h1:Rti/REtuuMmzwsI8/C/qIzRaEoSK/wiFYw5e5ctUKKs= +github.com/bmatcuk/doublestar/v4 v4.8.0 h1:DSXtrypQddoug1459viM9X9D3dp1Z7993fw36I2kNcQ= +github.com/bmatcuk/doublestar/v4 v4.8.0/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= @@ -153,8 +155,8 @@ github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38 github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.3.6 h1:4d9N5ykBnSp5Xn2JkhocYDkOpURL/18CYMpo6xB9uWM= -github.com/cyphar/filepath-securejoin v0.3.6/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= +github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s= +github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -181,8 +183,8 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/editorconfig/editorconfig-core-go/v2 v2.6.3 h1:XVUp6qW3BIkmM3/1EkrHpa6bL56APOynfXcZEmIgOhs= github.com/editorconfig/editorconfig-core-go/v2 v2.6.3/go.mod h1:ThHVc+hqbUsmE1wmK/MASpQEhCleWu1JDJDNhUOMy0c= -github.com/elazarl/goproxy v1.4.0 h1:4GyuSbFa+s26+3rmYNSuUVsx+HgPrV1bk1jXI0l9wjM= -github.com/elazarl/goproxy v1.4.0/go.mod h1:X/5W/t+gzDyLfHW4DrMdpjqYjpXsURlBt9lpBDxZZZQ= +github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o= +github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= github.com/emersion/go-imap v1.2.1 h1:+s9ZjMEjOB8NzZMVTM3cCenz2JrQIGGo5j1df19WjTA= github.com/emersion/go-imap v1.2.1/go.mod h1:Qlx1FSx2FTxjnjWpIlVNEuX+ylerZQNFE5NsmKFSejY= github.com/emersion/go-message v0.15.0/go.mod h1:wQUEfE+38+7EW8p8aZ96ptg6bAb1iwdgej19uXASlE4= @@ -231,8 +233,8 @@ github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UN github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.13.2 h1:7O7xvsK7K+rZPKW6AQR1YyNhfywkv7B8/FsP3ki6Zv0= -github.com/go-git/go-git/v5 v5.13.2/go.mod h1:hWdW5P4YZRjmpGHwRH2v3zkWcNl6HeXaXQEMGb3NJ9A= +github.com/go-git/go-git/v5 v5.16.2 h1:fT6ZIOjE5iEnkzKyxTHK1W4HGAsPhqEqiSAssSO77hM= +github.com/go-git/go-git/v5 v5.16.2/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8= github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-ldap/ldap/v3 v3.4.6 h1:ert95MdbiG7aWo/oPYp9btL3KJlMPKnP58r09rI8T+A= @@ -272,8 +274,8 @@ github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9v github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -395,6 +397,8 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.14.30 h1:bVreufq3EAIG1Quvws73du3/QgdeZ3myglJlrzSYYCY= github.com/mattn/go-sqlite3 v1.14.30/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/meilisearch/meilisearch-go v0.31.0 h1:yZRhY1qJqdH8h6GFZALGtkDLyj8f9v5aJpsNMyrUmnY= @@ -484,8 +488,8 @@ github.com/redis/go-redis/v9 v9.8.0 h1:q3nRvjrlge/6UD7eTu/DSg2uYiU2mCL0G/uzBWqhi github.com/redis/go-redis/v9 v9.8.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rhysd/actionlint v1.6.27 h1:xxwe8YmveBcC8lydW6GoHMGmB6H/MTqUU60F2p10wjw= -github.com/rhysd/actionlint v1.6.27/go.mod h1:m2nFUjAnOrxCMXuOMz9evYBRCLUsMnKY2IJl/N5umbk= +github.com/rhysd/actionlint v1.7.7 h1:0KgkoNTrYY7vmOCs9BW2AHxLvvpoY9nEUzgBHiPUr0k= +github.com/rhysd/actionlint v1.7.7/go.mod h1:AE6I6vJEkNaIfWqC2GNE5spIJNhxf8NCtLEKU4NnUXg= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -493,8 +497,8 @@ github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= -github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= -github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= @@ -505,8 +509,8 @@ github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepq github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/skeema/knownhosts v1.3.0 h1:AM+y0rI04VksttfwjkSTNQorvGqmwATnvnAHpSgc0LY= -github.com/skeema/knownhosts v1.3.0/go.mod h1:sPINvnADmT/qYH1kfv+ePMmOBTH6Tbl7b5LvTDjFK7M= +github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8= +github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY= github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf h1:pvbZ0lM0XWPBqUKqFU8cmavspvIl9nulOYwdy6IFRRo= github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf/go.mod h1:RJID2RhlZKId02nZ62WenDCkgHFerpIOmW0iT7GKmXM= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -560,8 +564,8 @@ github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= gitlab.com/gitlab-org/api/client-go v0.130.1 h1:1xF5C5Zq3sFeNg3PzS2z63oqrxifne3n/OnbI7nptRc= gitlab.com/gitlab-org/api/client-go v0.130.1/go.mod h1:ZhSxLAWadqP6J9lMh40IAZOlOxBLPRh7yFOXR/bMJWM= -go.etcd.io/bbolt v1.4.0 h1:TU77id3TnN/zKr7CO/uk+fBCwF2jGcMuw2B/FMAzYIk= -go.etcd.io/bbolt v1.4.0/go.mod h1:AsD+OCi/qPN1giOX1aiLAha3o1U8rAz65bvN4j0sRuk= +go.etcd.io/bbolt v1.4.2 h1:IrUHp260R8c+zYx/Tm8QZr04CX+qWS5PGfPdevhdm1I= +go.etcd.io/bbolt v1.4.2/go.mod h1:Is8rSHO/b4f3XigBC0lL0+4FwAQv3HXEEIgFMuKHceM= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= From b6046c17a19afd4a62c91f199179c3f3ce4609fa Mon Sep 17 00:00:00 2001 From: pat-s Date: Wed, 6 Aug 2025 14:47:51 +0200 Subject: [PATCH 272/495] feat: add tag label to commit list view (#8759) Mainly a port of https://github.com/go-gitea/gitea/pull/31082. closes #3573 ## Screenshots ![image](/attachments/a1ba8729-e7f3-4d3d-ab20-04593b119c3f) ![image](/attachments/13790703-8a71-41a0-a875-9c087da989f8) --- ## Checklist ### Tests - I added test coverage for Go changes... - [x] in their respective `*_test.go` for unit tests. - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server. - I added test coverage for JavaScript changes... - [ ] in `web_src/js/*.test.js` if it can be unit tested. - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)). ### Documentation - [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [ ] I do not want this change to show in the release notes. - [x] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/.md` to be be used for the release notes instead of the title. ## Release notes - User Interface features - [PR](https://codeberg.org/forgejo/forgejo/pulls/8759): add tag label to commit list view Co-authored-by: Lunny Xiao Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8759 Reviewed-by: Gusted Co-authored-by: pat-s Co-committed-by: pat-s --- models/forgejo_migrations/migrate.go | 2 + models/forgejo_migrations/v40.go | 13 ++++ models/repo/release.go | 16 +++- models/repo/release_test.go | 13 ++++ options/locale_next/locale_en-US.json | 1 + routers/web/repo/commit.go | 11 +++ templates/repo/commits_list.tmpl | 8 ++ templates/repo/graph/commits.tmpl | 4 +- templates/repo/tag/name.tmpl | 3 + tests/integration/repo_commits_tags_test.go | 73 +++++++++++++++++++ .../integration/repo_commits_template_test.go | 61 ++++++++++++++++ 11 files changed, 201 insertions(+), 4 deletions(-) create mode 100644 models/forgejo_migrations/v40.go create mode 100644 templates/repo/tag/name.tmpl create mode 100644 tests/integration/repo_commits_tags_test.go create mode 100644 tests/integration/repo_commits_template_test.go diff --git a/models/forgejo_migrations/migrate.go b/models/forgejo_migrations/migrate.go index c5553388ea..71fcf16e7a 100644 --- a/models/forgejo_migrations/migrate.go +++ b/models/forgejo_migrations/migrate.go @@ -117,6 +117,8 @@ var migrations = []*Migration{ NewMigration("Add `resolved_unix` column to `abuse_report` table", AddResolvedUnixToAbuseReport), // v38 -> v39 NewMigration("Migrate `data` column of `secret` table to store keying material", MigrateActionSecretsToKeying), + // v39 -> v40 + NewMigration("Add index for release sha1", AddIndexForReleaseSha1), } // GetCurrentDBVersion returns the current Forgejo database version. diff --git a/models/forgejo_migrations/v40.go b/models/forgejo_migrations/v40.go new file mode 100644 index 0000000000..11e8fbd85e --- /dev/null +++ b/models/forgejo_migrations/v40.go @@ -0,0 +1,13 @@ +// Copyright 2024 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package forgejo_migrations + +import "xorm.io/xorm" + +func AddIndexForReleaseSha1(x *xorm.Engine) error { + type Release struct { + Sha1 string `xorm:"INDEX VARCHAR(64)"` + } + return x.Sync(new(Release)) +} diff --git a/models/repo/release.go b/models/repo/release.go index 10e9bb259f..b39a1de971 100644 --- a/models/repo/release.go +++ b/models/repo/release.go @@ -77,7 +77,7 @@ type Release struct { Target string TargetBehind string `xorm:"-"` // to handle non-existing or empty target Title string - Sha1 string `xorm:"VARCHAR(64)"` + Sha1 string `xorm:"INDEX VARCHAR(64)"` HideArchiveLinks bool `xorm:"NOT NULL DEFAULT false"` NumCommits int64 NumCommitsBehind int64 `xorm:"-"` @@ -618,3 +618,17 @@ func InsertReleases(ctx context.Context, rels ...*Release) error { return committer.Commit() } + +func FindTagsByCommitIDs(ctx context.Context, repoID int64, commitIDs ...string) (map[string][]*Release, error) { + releases := make([]*Release, 0, len(commitIDs)) + if err := db.GetEngine(ctx).Where("repo_id=?", repoID). + In("sha1", commitIDs). + Find(&releases); err != nil { + return nil, err + } + res := make(map[string][]*Release, len(releases)) + for _, r := range releases { + res[r.Sha1] = append(res[r.Sha1], r) + } + return res, nil +} diff --git a/models/repo/release_test.go b/models/repo/release_test.go index 94dbd6d9d5..69f9333589 100644 --- a/models/repo/release_test.go +++ b/models/repo/release_test.go @@ -49,3 +49,16 @@ func TestReleaseDisplayName(t *testing.T) { release.Title = "Title" assert.Equal(t, "Title", release.DisplayName()) } + +func Test_FindTagsByCommitIDs(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + sha1Rels, err := FindTagsByCommitIDs(db.DefaultContext, 1, "65f1bf27bc3bf70f64657658635e66094edbcb4d") + require.NoError(t, err) + assert.Len(t, sha1Rels, 1) + rels := sha1Rels["65f1bf27bc3bf70f64657658635e66094edbcb4d"] + assert.Len(t, rels, 3) + assert.Equal(t, "v1.1", rels[0].TagName) + assert.Equal(t, "delete-tag", rels[1].TagName) + assert.Equal(t, "v1.0", rels[2].TagName) +} diff --git a/options/locale_next/locale_en-US.json b/options/locale_next/locale_en-US.json index 8542114100..e730c84726 100644 --- a/options/locale_next/locale_en-US.json +++ b/options/locale_next/locale_en-US.json @@ -111,6 +111,7 @@ "settings.visibility.description": "Profile visibility affects others' ability to access your non-private repositories. Learn more.", "avatar.constraints_hint": "Custom avatar may not exceed %[1]s in size or be larger than %[2]dx%[3]d pixels", "og.repo.summary_card.alt_description": "Summary card of repository %[1]s, described as: %[2]s", + "repo.commit.load_tags_failed": "Load tags failed because of internal error", "compare.branches.title": "Compare branches", "meta.last_line": "Thank you for translating Forgejo! This line isn't seen by the users but it serves other purposes in the translation management. You can place a fun fact in the translation instead of translating it." } diff --git a/routers/web/repo/commit.go b/routers/web/repo/commit.go index f3192266ad..408a2844de 100644 --- a/routers/web/repo/commit.go +++ b/routers/web/repo/commit.go @@ -85,6 +85,17 @@ func Commits(ctx *context.Context) { } ctx.Data["Commits"] = git_model.ParseCommitsWithStatus(ctx, commits, ctx.Repo.Repository) + commitIDs := make([]string, 0, len(commits)) + for _, c := range commits { + commitIDs = append(commitIDs, c.ID.String()) + } + commitTagsMap, err := repo_model.FindTagsByCommitIDs(ctx, ctx.Repo.Repository.ID, commitIDs...) + if err != nil { + log.Error("FindTagsByCommitIDs: %v", err) + ctx.Flash.Error(ctx.Tr("repo.commit.load_tags_failed")) + } else { + ctx.Data["CommitTagsMap"] = commitTagsMap + } ctx.Data["Username"] = ctx.Repo.Owner.Name ctx.Data["Reponame"] = ctx.Repo.Repository.Name ctx.Data["CommitCount"] = commitsCount diff --git a/templates/repo/commits_list.tmpl b/templates/repo/commits_list.tmpl index 69837bfc1a..2c0a93f2ba 100644 --- a/templates/repo/commits_list.tmpl +++ b/templates/repo/commits_list.tmpl @@ -59,6 +59,14 @@ {{end}} {{template "repo/commit_statuses" dict "Status" .Status "Statuses" .Statuses}} + {{if $.CommitTagsMap}} + {{$tags := index $.CommitTagsMap .ID.String}} + {{if $tags}} + {{range $tags}} + {{- template "repo/tag/name" dict "RepoLink" $.Repository.Link "TagName" .TagName "IsRelease" (not .IsTag) -}} + {{end}} + {{end}} + {{end}} {{if IsMultilineCommitMessage .Message}}
    {{RenderCommitBody $.Context .Message ($.Repository.ComposeMetas ctx)}}
    {{end}} diff --git a/templates/repo/graph/commits.tmpl b/templates/repo/graph/commits.tmpl index 51392e3470..0c4cb49e9d 100644 --- a/templates/repo/graph/commits.tmpl +++ b/templates/repo/graph/commits.tmpl @@ -27,9 +27,7 @@ {{end}} {{else if eq $refGroup "tags"}} - - {{svg "octicon-tag"}} {{.ShortName}} - + {{- template "repo/tag/name" dict "RepoLink" $.Repository.Link "TagName" .ShortName -}} {{else if eq $refGroup "remotes"}} {{svg "octicon-cross-reference"}} {{.ShortName}} diff --git a/templates/repo/tag/name.tmpl b/templates/repo/tag/name.tmpl new file mode 100644 index 0000000000..a0445545e6 --- /dev/null +++ b/templates/repo/tag/name.tmpl @@ -0,0 +1,3 @@ + +{{svg "octicon-tag"}} {{.TagName}} + diff --git a/tests/integration/repo_commits_tags_test.go b/tests/integration/repo_commits_tags_test.go new file mode 100644 index 0000000000..a6797fce94 --- /dev/null +++ b/tests/integration/repo_commits_tags_test.go @@ -0,0 +1,73 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package integration + +import ( + "net/http" + "strings" + "testing" + + "forgejo.org/tests" + + "github.com/PuerkitoBio/goquery" + "github.com/stretchr/testify/assert" +) + +// TestRepoCommitsWithTags tests that tags are displayed inline with commit messages +// in the commits list, and not in a separate column +func TestRepoCommitsWithTags(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + session := loginUser(t, "user2") + req := NewRequest(t, "GET", "/user2/repo1/commits/branch/master") + resp := session.MakeRequest(t, req, http.StatusOK) + + doc := NewHTMLParser(t, resp.Body) + + // Find the commit with SHA 65f1bf27bc3bf70f64657658635e66094edbcb4d + // This commit should have tags v1.1 + commitRow := doc.doc.Find(`#commits-table tbody tr`).FilterFunction(func(i int, s *goquery.Selection) bool { + shaLink := s.Find("td.sha a") + href, _ := shaLink.Attr("href") + return strings.Contains(href, "65f1bf27bc3bf70f64657658635e66094edbcb4d") + }) + + // 1. Check for tag labels within the message cell + messageCell := commitRow.Find("td.message") + tagLabels := messageCell.Find("a.ui.label.basic") + assert.GreaterOrEqual(t, tagLabels.Length(), 1, "Should find tag label") + + // 2. tag has proper HTML attr and links to the correct tag + tagFound := false + tagLabels.Each(func(i int, s *goquery.Selection) { + if strings.Contains(s.Text(), "v1.1") { + tagFound = true + href, exists := s.Attr("href") + assert.True(t, exists, "Tag should have href") + assert.Contains(t, href, "/src/tag/v1.1", "Tag link should point to tag page") + assert.Equal(t, 1, s.Find("svg.octicon-tag").Length(), "Tag should have octicon-tag icon") + } + }) + assert.True(t, tagFound, "Should find v1.1 tag") + + // 3. tags appear after the commit messsage and status indicators + messageHTML, _ := messageCell.Html() + messageWrapperPos := strings.Index(messageHTML, "message-wrapper") + ellipsisButtonPos := strings.Index(messageHTML, "ellipsis-button") + commitStatusPos := strings.Index(messageHTML, "commit-status") + tagLabelPos := strings.Index(messageHTML, "ui label basic") + + // 4. Tags should appear after the message wrapper + assert.Greater(t, tagLabelPos, messageWrapperPos, "Tags should appear after message wrapper") + + // 5. If ellipsis button exists, tags should appear after that one + if ellipsisButtonPos > 0 { + assert.Greater(t, tagLabelPos, ellipsisButtonPos, "Tags should appear after ellipsis button") + } + + // 6. If commit status exists, tags should appear after that one + if commitStatusPos > 0 { + assert.Greater(t, tagLabelPos, commitStatusPos, "Tags should appear after commit status") + } +} diff --git a/tests/integration/repo_commits_template_test.go b/tests/integration/repo_commits_template_test.go new file mode 100644 index 0000000000..8243ecc62a --- /dev/null +++ b/tests/integration/repo_commits_template_test.go @@ -0,0 +1,61 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package integration + +import ( + "net/http" + "strings" + "testing" + + "forgejo.org/tests" + + "github.com/stretchr/testify/assert" +) + +// TestRepoCommitsTemplateVariables ensures that template variables in commits_list.tmpl are correctly referenced +func TestRepoCommitsTemplateVariables(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + session := loginUser(t, "user2") + + // Test the main commits page + req := NewRequest(t, "GET", "/user2/repo1/commits/branch/master") + resp := session.MakeRequest(t, req, http.StatusOK) + assert.Equal(t, http.StatusOK, resp.Code, "Template should render without errors") + + doc := NewHTMLParser(t, resp.Body) + + // 1. Repository.Link is used in tag template + tagLinks := doc.doc.Find("a.ui.label.basic[href*='/src/tag/']") + if tagLinks.Length() > 0 { + href, _ := tagLinks.First().Attr("href") + assert.Contains(t, href, "/user2/repo1/src/tag/", "Repository link should be correctly rendered in tag URLs") + } + + // 2. Repository.ObjectFormatName is used in the SHA column header + shaHeader := doc.doc.Find("#commits-table thead tr th.sha") + assert.Equal(t, 1, shaHeader.Length(), "SHA column header should exist") + headerText := strings.TrimSpace(shaHeader.Text()) + assert.NotEmpty(t, headerText, "SHA column header should have text (ObjectFormatName)") + // Should be uppercase SHA1 or SHA256 depending on the repository format + assert.True(t, headerText == "SHA1" || headerText == "SHA256", "ObjectFormatName should be rendered correctly, got: %s", headerText) + + // 3. Repository.ComposeMetas is used for rendering commit messages + commitMessages := doc.doc.Find("#commits-table tbody tr td.message .commit-summary") + assert.Positive(t, commitMessages.Length(), "Should have commit messages rendered") + + // 4. RepoLink variable is used throughout + commitLinks := doc.doc.Find("#commits-table tbody tr td.sha a[href*='/commit/']") + assert.Positive(t, commitLinks.Length(), "Should have commit links") + firstCommitLink, _ := commitLinks.First().Attr("href") + assert.Contains(t, firstCommitLink, "/user2/repo1/commit/", "RepoLink should be correctly used in commit URLs") + + // 5. CommitTagsMap is used for tag rendering + // If $.CommitTagsMap is mistyped, the template would fail with a 500 error + // (for detailed tag rendering tests see repo_commits_tags_test.go) + tagLabels := doc.doc.Find("#commits-table tbody tr td.message a.ui.label.basic") + if tagLabels.Length() > 0 { + assert.NotContains(t, tagLabels.First().Text(), "{{", "Tags should be properly rendered without template syntax") + } +} From 73dac787a374f166ad47c761134f8e09ec51b26a Mon Sep 17 00:00:00 2001 From: hazycora Date: Wed, 6 Aug 2025 14:50:51 +0200 Subject: [PATCH 273/495] fix: trim trailing slash in WebFinger OIDC issuer link (#8794) As stated in a comment: https://codeberg.org/forgejo/forgejo/issues/8634#issuecomment-6136933 > `routers/web/webfinger.go` was left unchanged, so it still includes the trailing slash, no longer matching the issuer specified in other endpoints. > > ... > > From the [OpenID Connect Discovery specification](https://openid.net/specs/openid-connect-discovery-1_0.html#IssuerDiscovery): > > > The Issuer location MUST be returned in the WebFinger response as the value of the href member of a links array element with rel member value http://openid.net/specs/connect/1.0/issuer. > > This sounds to me like the `href` should be the issuer location exactly. > > Using Forgejo for OIDC for auth with Tailscale is one instance of this change breaking something - signing up to Tailscale with OIDC now gives an error. Unsure what happens for existing accounts. In summary, since !8028, trailing slashes have been removed from the OIDC issuer locations specified by Forgejo everywhere except in WebFinger responses at `/.well-known/webfinger`, which still includes a trailing slash and so no longer matches the issuer as specified elsewhere (such as at `/.well-known/openid-configuration`). ## Checklist The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org). ### Tests - I added test coverage for Go changes... - [ ] in their respective `*_test.go` for unit tests. - [x] in the `tests/integration` directory if it involves interactions with a live Forgejo server. - I added test coverage for JavaScript changes... - [ ] in `web_src/js/*.test.js` if it can be unit tested. - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)). ### Documentation - [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [ ] I did not document these changes and I do not expect someone else to do it. ### Release notes - [ ] I do not want this change to show in the release notes. - [ ] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/.md` to be be used for the release notes instead of the title. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8794 Reviewed-by: Gusted Reviewed-by: Michael Kriese Co-authored-by: hazycora Co-committed-by: hazycora --- routers/web/webfinger.go | 2 +- tests/integration/webfinger_test.go | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/routers/web/webfinger.go b/routers/web/webfinger.go index 372c08f7d8..5f67e436bf 100644 --- a/routers/web/webfinger.go +++ b/routers/web/webfinger.go @@ -179,7 +179,7 @@ func WebfingerQuery(ctx *context.Context) { }, { Rel: "http://openid.net/specs/connect/1.0/issuer", - Href: appURL.String(), + Href: strings.TrimSuffix(appURL.String(), "/"), }, } diff --git a/tests/integration/webfinger_test.go b/tests/integration/webfinger_test.go index 9708fc1627..bc94d8a59a 100644 --- a/tests/integration/webfinger_test.go +++ b/tests/integration/webfinger_test.go @@ -7,6 +7,7 @@ import ( "fmt" "net/http" "net/url" + "strings" "testing" "forgejo.org/models/unittest" @@ -43,6 +44,8 @@ func TestWebfinger(t *testing.T) { session := loginUser(t, "user1") + ctx := t.Context() + req := NewRequest(t, "GET", fmt.Sprintf("/.well-known/webfinger?resource=acct:%s@%s", user.LowerName, appURL.Host)) resp := MakeRequest(t, req, http.StatusOK) assert.Equal(t, "application/jrd+json", resp.Header().Get("Content-Type")) @@ -50,6 +53,26 @@ func TestWebfinger(t *testing.T) { var jrd webfingerJRD DecodeJSON(t, resp, &jrd) assert.Equal(t, "acct:user2@"+appURL.Host, jrd.Subject) + assert.ElementsMatch(t, []*webfingerLink{ + { + Rel: "http://webfinger.net/rel/profile-page", + Type: "text/html", + Href: user.HTMLURL(), + }, + { + Rel: "http://webfinger.net/rel/avatar", + Href: user.AvatarLink(ctx), + }, + { + Rel: "self", + Type: "application/activity+json", + Href: appURL.String() + "api/v1/activitypub/user-id/" + fmt.Sprint(user.ID), + }, + { + Rel: "http://openid.net/specs/connect/1.0/issuer", + Href: strings.TrimSuffix(appURL.String(), "/"), + }, + }, jrd.Links) assert.ElementsMatch(t, []string{user.HTMLURL(), appURL.String() + "api/v1/activitypub/user-id/" + fmt.Sprint(user.ID)}, jrd.Aliases) instanceReq := NewRequest(t, "GET", fmt.Sprintf("/.well-known/webfinger?resource=acct:ghost@%s", appURL.Host)) From 7b76e5510bd9d08be64232a0d0e1fc18695207bc Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Wed, 6 Aug 2025 14:59:10 +0200 Subject: [PATCH 274/495] Update module code.forgejo.org/forgejo/runner/v9 to v9.0.3 (update licenses) --- assets/go-licenses.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/assets/go-licenses.json b/assets/go-licenses.json index 59d933a6d6..0a82cdcdff 100644 --- a/assets/go-licenses.json +++ b/assets/go-licenses.json @@ -249,6 +249,11 @@ "path": "github.com/blevesearch/zapx/v16/LICENSE", "licenseText": "\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright [yyyy] [name of copyright owner]\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License." }, + { + "name": "github.com/bmatcuk/doublestar/v4", + "path": "github.com/bmatcuk/doublestar/v4/LICENSE", + "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2014 Bob Matcuk\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n" + }, { "name": "github.com/boombuler/barcode", "path": "github.com/boombuler/barcode/LICENSE", @@ -709,6 +714,11 @@ "path": "github.com/mattn/go-runewidth/LICENSE", "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2016 Yasuhiro Matsumoto\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n" }, + { + "name": "github.com/mattn/go-shellwords", + "path": "github.com/mattn/go-shellwords/LICENSE", + "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2017 Yasuhiro Matsumoto\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n" + }, { "name": "github.com/meilisearch/meilisearch-go", "path": "github.com/meilisearch/meilisearch-go/LICENSE", From 6b6fa21b2536275ff084a5adf800ec126f37c6d9 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 6 Aug 2025 16:10:19 +0200 Subject: [PATCH 275/495] Update module github.com/caddyserver/certmagic to v0.24.0 (forgejo) (#8796) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8796 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 8ded0c003a..289a3e4da0 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb github.com/blevesearch/bleve/v2 v2.5.2 github.com/buildkite/terminal-to-html/v3 v3.16.8 - github.com/caddyserver/certmagic v0.23.0 + github.com/caddyserver/certmagic v0.24.0 github.com/chi-middleware/proxy v1.1.1 github.com/djherbis/buffer v1.2.0 github.com/djherbis/nio/v3 v3.0.1 @@ -190,7 +190,7 @@ require ( github.com/josharian/intern v1.0.0 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/klauspost/pgzip v1.2.6 // indirect - github.com/libdns/libdns v1.0.0-beta.1 // indirect + github.com/libdns/libdns v1.0.0 // indirect github.com/mailru/easyjson v0.9.0 // indirect github.com/markbates/going v1.0.3 // indirect github.com/mattn/go-colorable v0.1.14 // indirect diff --git a/go.sum b/go.sum index 343088ce1b..12642b5df1 100644 --- a/go.sum +++ b/go.sum @@ -136,8 +136,8 @@ github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= github.com/buildkite/terminal-to-html/v3 v3.16.8 h1:QN/daUob6cmK8GcdKnwn9+YTlPr1vNj+oeAIiJK6fPc= github.com/buildkite/terminal-to-html/v3 v3.16.8/go.mod h1:+k1KVKROZocrTLsEQ9PEf9A+8+X8uaVV5iO1ZIOwKYM= -github.com/caddyserver/certmagic v0.23.0 h1:CfpZ/50jMfG4+1J/u2LV6piJq4HOfO6ppOnOf7DkFEU= -github.com/caddyserver/certmagic v0.23.0/go.mod h1:9mEZIWqqWoI+Gf+4Trh04MOVPD0tGSxtqsxg87hAIH4= +github.com/caddyserver/certmagic v0.24.0 h1:EfXTWpxHAUKgDfOj6MHImJN8Jm4AMFfMT6ITuKhrDF0= +github.com/caddyserver/certmagic v0.24.0/go.mod h1:xPT7dC1DuHHnS2yuEQCEyks+b89sUkMENh8dJF+InLE= github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA= github.com/caddyserver/zerossl v0.1.3/go.mod h1:CxA0acn7oEGO6//4rtrRjYgEoa4MFw/XofZnrYwGqG4= github.com/cention-sany/utf7 v0.0.0-20170124080048-26cad61bd60a h1:MISbI8sU/PSK/ztvmWKFcI7UGb5/HQT7B+i3a2myKgI= @@ -382,8 +382,8 @@ github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+ github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/libdns/libdns v1.0.0-beta.1 h1:KIf4wLfsrEpXpZ3vmc/poM8zCATXT2klbdPe6hyOBjQ= -github.com/libdns/libdns v1.0.0-beta.1/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ= +github.com/libdns/libdns v1.0.0 h1:IvYaz07JNz6jUQ4h/fv2R4sVnRnm77J/aOuC9B+TQTA= +github.com/libdns/libdns v1.0.0/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= From c081f2077679aabf1d744de20dca182d5cec8a70 Mon Sep 17 00:00:00 2001 From: Michael Jerger Date: Wed, 6 Aug 2025 16:16:13 +0200 Subject: [PATCH 276/495] Sent user activities to distant federated server (#8792) This PR is part of #4767. It contains * a refactoring of validation error messages * adds the ability to send user-activities to distant federated servers Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8792 Reviewed-by: Earl Warren Co-authored-by: Michael Jerger Co-committed-by: Michael Jerger --- .deadcode-out | 19 +- .gitignore | 3 + modules/forgefed/activity_follow_test.go | 11 +- modules/forgefed/activity_like_test.go | 75 ++++---- modules/forgefed/activity_undo_like_test.go | 2 +- .../forgefed/activity_user_activity_test.go | 6 +- modules/forgefed/actor_person_test.go | 72 +++---- modules/forgefed/actor_test.go | 2 +- .../object_user_activity_note_test.go | 6 +- modules/validation/validatable.go | 6 +- routers/api/v1/activitypub/person.go | 162 ++++++++++++++++ routers/api/v1/api.go | 5 + routers/api/v1/swagger/activitypub.go | 7 + services/convert/activitypub_user_action.go | 177 ++++++++++++++++++ services/federation/person_inbox_accept.go | 22 +++ services/federation/person_inbox_create.go | 55 ++++++ services/federation/person_service.go | 35 ++++ services/federation/user_activity.go | 83 ++++++++ services/feed/action.go | 11 +- templates/swagger/v1_json.tmpl | 126 +++++++++++++ ...ivitypub_person_inbox_useractivity_test.go | 100 ++++++++++ .../api_activitypub_person_test.go | 30 ++- 22 files changed, 885 insertions(+), 130 deletions(-) create mode 100644 services/convert/activitypub_user_action.go create mode 100644 services/federation/person_inbox_accept.go create mode 100644 services/federation/person_inbox_create.go create mode 100644 services/federation/user_activity.go create mode 100644 tests/integration/api_activitypub_person_inbox_useractivity_test.go diff --git a/.deadcode-out b/.deadcode-out index 87dc416ff1..24facdf12e 100644 --- a/.deadcode-out +++ b/.deadcode-out @@ -13,13 +13,6 @@ forgejo.org/models IsErrSHANotFound IsErrMergeDivergingFastForwardOnly -forgejo.org/models/activities - GetActivityByID - NewFederatedUserActivity - CreateUserActivity - GetFollowingFeeds - FederatedUserActivity.loadActor - forgejo.org/models/auth WebAuthnCredentials @@ -63,8 +56,6 @@ forgejo.org/models/user GetUserAllSettings DeleteUserSetting GetFederatedUser - GetFederatedUserByUserID - GetFollowersForUser forgejo.org/modules/activitypub NewContext @@ -99,16 +90,10 @@ forgejo.org/modules/forgefed NewForgeUndoLike ForgeUndoLike.UnmarshalJSON ForgeUndoLike.Validate - NewForgeUserActivityFromAp - NewForgeUserActivity - ForgeUserActivity.Validate NewPersonIDFromModel GetItemByType JSONUnmarshalerFn NotEmpty - NewForgeUserActivityNoteFromAp - newNote - ForgeUserActivityNote.Validate ToRepository OnRepository @@ -236,8 +221,8 @@ forgejo.org/routers/web/org forgejo.org/services/context GetPrivateContext -forgejo.org/services/convert - ToActivityPubPersonFeedItem +forgejo.org/services/federation + FollowRemoteActor forgejo.org/services/repository IsErrForkAlreadyExist diff --git a/.gitignore b/.gitignore index 744e24a09a..e1200ce4e8 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,8 @@ _testmain.go *coverage.out coverage.all +coverage.html +coverage.html.gz coverage/ cpu.out @@ -129,3 +131,4 @@ prime/ # Manpage /man +tests/integration/api_activitypub_person_inbox_useractivity_test.go diff --git a/modules/forgefed/activity_follow_test.go b/modules/forgefed/activity_follow_test.go index bb0c1de2f7..8ba31d5f6f 100644 --- a/modules/forgefed/activity_follow_test.go +++ b/modules/forgefed/activity_follow_test.go @@ -9,6 +9,7 @@ import ( "forgejo.org/modules/validation" ap "github.com/go-ap/activitypub" + "github.com/stretchr/testify/assert" ) func Test_NewForgeFollowValidation(t *testing.T) { @@ -17,15 +18,13 @@ func Test_NewForgeFollowValidation(t *testing.T) { sut.Actor = ap.IRI("example.org/alice") sut.Object = ap.IRI("example.org/bob") - if err, _ := validation.IsValid(sut); !err { - t.Errorf("sut is invalid: %v\n", err) - } + valid, err := validation.IsValid(sut) + assert.True(t, valid, "sut is invalid: %v\n", err) sut = ForgeFollow{} sut.Actor = ap.IRI("example.org/alice") sut.Object = ap.IRI("example.org/bob") - if err, _ := validation.IsValid(sut); err { - t.Errorf("sut is valid: %v\n", err) - } + valid, err = validation.IsValid(sut) + assert.False(t, valid, "sut is valid: %v\n", err) } diff --git a/modules/forgefed/activity_like_test.go b/modules/forgefed/activity_like_test.go index 6b252d5960..eef5563d8b 100644 --- a/modules/forgefed/activity_like_test.go +++ b/modules/forgefed/activity_like_test.go @@ -13,6 +13,8 @@ import ( "forgejo.org/modules/validation" ap "github.com/go-ap/activitypub" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func Test_NewForgeLike(t *testing.T) { @@ -22,21 +24,14 @@ func Test_NewForgeLike(t *testing.T) { objectIRI := "https://codeberg.org/api/v1/activitypub/repository-id/1" startTime, _ := time.Parse("2006-Jan-02", "2024-Mar-07") sut, err := NewForgeLike(actorIRI, objectIRI, startTime) - if err != nil { - t.Errorf("unexpected error: %v\n", err) - } - if valid, _ := validation.IsValid(sut); !valid { - t.Errorf("sut expected to be valid: %v\n", sut.Validate()) - } + require.NoError(t, err, "unexpected error: %v\n", err) + + valid, _ := validation.IsValid(sut) + assert.True(t, valid, "sut expected to be valid: %v\n", sut.Validate()) got, err := sut.MarshalJSON() - if err != nil { - t.Errorf("MarshalJSON() error = \"%v\"", err) - return - } - if !reflect.DeepEqual(got, want) { - t.Errorf("MarshalJSON() got = %q, want %q", got, want) - } + require.NoError(t, err, "MarshalJSON() error = %q", err) + assert.True(t, reflect.DeepEqual(got, want), "MarshalJSON()\n got: %q,\n want: %q", got, want) } func Test_LikeMarshalJSON(t *testing.T) { @@ -66,13 +61,8 @@ func Test_LikeMarshalJSON(t *testing.T) { for name, tt := range tests { t.Run(name, func(t *testing.T) { got, err := tt.item.MarshalJSON() - if (err != nil || tt.wantErr != nil) && tt.wantErr.Error() != err.Error() { - t.Errorf("MarshalJSON() error = \"%v\", wantErr \"%v\"", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("MarshalJSON() got = %q, want %q", got, tt.want) - } + assert.False(t, (err != nil || tt.wantErr != nil) && tt.wantErr.Error() != err.Error(), "MarshalJSON()\n got: %v,\n want: %v", err, tt.wantErr) + assert.True(t, reflect.DeepEqual(got, tt.want), "MarshalJSON()\n got: %q\n want: %q", got, tt.want) }) } } @@ -89,8 +79,8 @@ func Test_LikeUnmarshalJSON(t *testing.T) { item: []byte(`{"type":"Like","actor":"https://repo.prod.meissa.de/api/activitypub/user-id/1","object":"https://codeberg.org/api/activitypub/repository-id/1"}`), want: &ForgeLike{ Activity: ap.Activity{ - Actor: ap.IRI("https://repo.prod.meissa.de/api/activitypub/user-id/1"), Type: "Like", + Actor: ap.IRI("https://repo.prod.meissa.de/api/activitypub/user-id/1"), Object: ap.IRI("https://codeberg.org/api/activitypub/repository-id/1"), }, }, @@ -107,12 +97,10 @@ func Test_LikeUnmarshalJSON(t *testing.T) { t.Run(name, func(t *testing.T) { got := new(ForgeLike) err := got.UnmarshalJSON(test.item) - if (err != nil || test.wantErr != nil) && !strings.Contains(err.Error(), test.wantErr.Error()) { - t.Errorf("UnmarshalJSON() error = \"%v\", wantErr \"%v\"", err, test.wantErr) - return - } + assert.False(t, (err != nil || test.wantErr != nil) && !strings.Contains(err.Error(), test.wantErr.Error()), "UnmarshalJSON()\n error: %v\n wantErr: %v", err, test.wantErr) + if !reflect.DeepEqual(got, test.want) { - t.Errorf("UnmarshalJSON() got = %q, want %q, err %q", got, test.want, err.Error()) + assert.Errorf(t, err, "UnmarshalJSON() got = %q, want %q, err %q", got, test.want, err.Error()) } }) } @@ -120,46 +108,47 @@ func Test_LikeUnmarshalJSON(t *testing.T) { func Test_ForgeLikeValidation(t *testing.T) { // Successful - sut := new(ForgeLike) sut.UnmarshalJSON([]byte(`{"type":"Like", "actor":"https://repo.prod.meissa.de/api/activitypub/user-id/1", "object":"https://codeberg.org/api/activitypub/repository-id/1", "startTime": "2014-12-31T23:00:00-08:00"}`)) - if res, _ := validation.IsValid(sut); !res { - t.Errorf("sut expected to be valid: %v\n", sut.Validate()) - } + valid, _ := validation.IsValid(sut) + assert.True(t, valid, "sut expected to be valid: %v\n", sut.Validate()) // Errors - sut.UnmarshalJSON([]byte(`{"actor":"https://repo.prod.meissa.de/api/activitypub/user-id/1", "object":"https://codeberg.org/api/activitypub/repository-id/1", "startTime": "2014-12-31T23:00:00-08:00"}`)) - if err := validateAndCheckError(sut, "type should not be empty"); err != nil { - t.Error(err) - } + validate := sut.Validate() + assert.Len(t, validate, 2) + assert.Equal(t, + "Field type contains the value , which is not in allowed subset [Like]", + validate[1]) sut.UnmarshalJSON([]byte(`{"type":"bad-type", "actor":"https://repo.prod.meissa.de/api/activitypub/user-id/1", "object":"https://codeberg.org/api/activitypub/repository-id/1", "startTime": "2014-12-31T23:00:00-08:00"}`)) - if err := validateAndCheckError(sut, "Field type contains the value bad-type, which is not in allowed subset [Like]"); err != nil { - t.Error(err) - } + validate = sut.Validate() + assert.Len(t, validate, 1) + assert.Equal(t, + "Field type contains the value bad-type, which is not in allowed subset [Like]", + validate[0]) sut.UnmarshalJSON([]byte(`{"type":"Like", "actor":"https://repo.prod.meissa.de/api/activitypub/user-id/1", "object":"https://codeberg.org/api/activitypub/repository-id/1", "startTime": "not a date"}`)) - if err := validateAndCheckError(sut, "StartTime was invalid."); err != nil { - t.Error(err) - } + validate = sut.Validate() + assert.Len(t, validate, 1) + assert.Equal(t, + "StartTime was invalid.", + validate[0]) } func TestActivityValidation_Attack(t *testing.T) { sut := new(ForgeLike) sut.UnmarshalJSON([]byte(`{rubbish}`)) - if len(sut.Validate()) != 5 { - t.Errorf("5 validation errors expected but was: %v\n", len(sut.Validate())) - } + assert.Len(t, sut.Validate(), 5) } diff --git a/modules/forgefed/activity_undo_like_test.go b/modules/forgefed/activity_undo_like_test.go index 5867a84e7b..76358b1669 100644 --- a/modules/forgefed/activity_undo_like_test.go +++ b/modules/forgefed/activity_undo_like_test.go @@ -173,7 +173,7 @@ func TestActivityValidationUndo(t *testing.T) { "startTime":"2024-03-27T00:00:00Z", "actor":"https://repo.prod.meissa.de/api/v1/activitypub/user-id/1", "object":"https://codeberg.org/api/v1/activitypub/repository-id/1"}}`)) - if err := validateAndCheckError(sut, "type should not be empty"); err != nil { + if err := validateAndCheckError(sut, "Value type should not be empty"); err != nil { t.Error(*err) } diff --git a/modules/forgefed/activity_user_activity_test.go b/modules/forgefed/activity_user_activity_test.go index 9cb9f133b9..107ae51204 100644 --- a/modules/forgefed/activity_user_activity_test.go +++ b/modules/forgefed/activity_user_activity_test.go @@ -9,6 +9,7 @@ import ( "forgejo.org/modules/validation" ap "github.com/go-ap/activitypub" + "github.com/stretchr/testify/assert" ) func Test_ForgeUserActivityValidation(t *testing.T) { @@ -34,7 +35,6 @@ func Test_ForgeUserActivityValidation(t *testing.T) { sut.Note = note - if res, _ := validation.IsValid(sut); !res { - t.Errorf("sut expected to be valid: %v\n", sut.Validate()) - } + valid, _ := validation.IsValid(sut) + assert.True(t, valid, "sut expected to be valid: %v\n", sut.Validate()) } diff --git a/modules/forgefed/actor_person_test.go b/modules/forgefed/actor_person_test.go index f466ddb964..e4f1734a9d 100644 --- a/modules/forgefed/actor_person_test.go +++ b/modules/forgefed/actor_person_test.go @@ -115,7 +115,7 @@ func TestPersonIdValidation(t *testing.T) { result, err := validation.IsValid(sut) assert.False(t, result) - require.EqualError(t, err, "Validation Error: forgefed.PersonID: path should not be empty\npath: \"\" has to be a person specific api path") + require.EqualError(t, err, "Validation Error: forgefed.PersonID: Value path should not be empty\npath: \"\" has to be a person specific api path") sut = PersonID{} sut.ID = "1" @@ -166,38 +166,28 @@ func TestWebfingerId(t *testing.T) { } func TestShouldThrowErrorOnInvalidInput(t *testing.T) { - var err any - _, err = NewPersonID("", "forgejo") - if err == nil { - t.Errorf("empty input should be invalid.") + tests := []struct { + input string + username string + expectErr bool + }{ + {"", "forgejo", true}, + {"http://localhost:3000/api/v1/something", "forgejo", true}, + {"./api/v1/something", "forgejo", true}, + {"http://1.2.3.4/api/v1/something", "forgejo", true}, + {"http:///[fe80::1ff:fe23:4567:890a%25eth0]/api/v1/something", "forgejo", true}, + {"https://codeberg.org/api/v1/activitypub/../activitypub/user-id/12345", "forgejo", true}, + {"https://myuser@an.other.host/api/v1/activitypub/user-id/1", "forgejo", true}, + {"https://an.other.host/api/v1/activitypub/user-id/1", "forgejo", false}, } - _, err = NewPersonID("http://localhost:3000/api/v1/something", "forgejo") - if err == nil { - t.Errorf("localhost uris are not external") - } - _, err = NewPersonID("./api/v1/something", "forgejo") - if err == nil { - t.Errorf("relative uris are not allowed") - } - _, err = NewPersonID("http://1.2.3.4/api/v1/something", "forgejo") - if err == nil { - t.Errorf("uri may not be ip-4 based") - } - _, err = NewPersonID("http:///[fe80::1ff:fe23:4567:890a%25eth0]/api/v1/something", "forgejo") - if err == nil { - t.Errorf("uri may not be ip-6 based") - } - _, err = NewPersonID("https://codeberg.org/api/v1/activitypub/../activitypub/user-id/12345", "forgejo") - if err == nil { - t.Errorf("uri may not contain relative path elements") - } - _, err = NewPersonID("https://myuser@an.other.host/api/v1/activitypub/user-id/1", "forgejo") - if err == nil { - t.Errorf("uri may not contain unparsed elements") - } - _, err = NewPersonID("https://an.other.host/api/v1/activitypub/user-id/1", "forgejo") - if err != nil { - t.Errorf("this uri should be valid but was: %v", err) + + for _, tt := range tests { + _, err := NewPersonID(tt.input, tt.username) + if tt.expectErr { + assert.Error(t, err, "Expected an error for input: %s", tt.input) + } else { + assert.NoError(t, err, "Expected no error for input: %s, but got: %v", tt.input, err) + } } } @@ -221,14 +211,11 @@ func Test_PersonUnmarshalJSON(t *testing.T) { } sut := new(ForgePerson) err := sut.UnmarshalJSON([]byte(`{"type":"Person","preferredUsername":"MaxMuster"}`)) - if err != nil { - t.Errorf("UnmarshalJSON() unexpected error: %v", err) - } + require.NoError(t, err, "UnmarshalJSON() unexpected error: %q", err) + x, _ := expected.MarshalJSON() y, _ := sut.MarshalJSON() - if !reflect.DeepEqual(x, y) { - t.Errorf("UnmarshalJSON() expected: %q got: %q", x, y) - } + assert.True(t, reflect.DeepEqual(x, y), "UnmarshalJSON()\n got: %q,\n want: %q", x, y) expectedStr := strings.ReplaceAll(strings.ReplaceAll(`{ "id":"https://federated-repo.prod.meissa.de/api/v1/activitypub/user-id/10", @@ -244,9 +231,7 @@ func Test_PersonUnmarshalJSON(t *testing.T) { "\n", ""), "\t", "") err = sut.UnmarshalJSON([]byte(expectedStr)) - if err != nil { - t.Errorf("UnmarshalJSON() unexpected error: %v", err) - } + require.NoError(t, err, "UnmarshalJSON() unexpected error: %q", err) result, _ := sut.MarshalJSON() assert.JSONEq(t, expectedStr, string(result), "Expected string is not equal") } @@ -254,9 +239,8 @@ func Test_PersonUnmarshalJSON(t *testing.T) { func TestForgePersonValidation(t *testing.T) { sut := new(ForgePerson) sut.UnmarshalJSON([]byte(`{"type":"Person","preferredUsername":"MaxMuster"}`)) - if res, _ := validation.IsValid(sut); !res { - t.Errorf("sut expected to be valid: %v\n", sut.Validate()) - } + valid, _ := validation.IsValid(sut) + assert.True(t, valid, "sut expected to be valid: %v\n", sut.Validate()) } func TestAsloginName(t *testing.T) { diff --git a/modules/forgefed/actor_test.go b/modules/forgefed/actor_test.go index 48d773c5b9..a32114616c 100644 --- a/modules/forgefed/actor_test.go +++ b/modules/forgefed/actor_test.go @@ -58,7 +58,7 @@ func TestActorIdValidation(t *testing.T) { sut.UnvalidatedInput = "https://an.other.host/api/v1/activitypub/user-id/" result := sut.Validate() assert.Len(t, result, 1) - assert.Equal(t, "ID should not be empty", result[0]) + assert.Equal(t, "Value ID should not be empty", result[0]) sut = ActorID{} sut.ID = "1" diff --git a/modules/forgefed/object_user_activity_note_test.go b/modules/forgefed/object_user_activity_note_test.go index 20c3666bb1..02aebd58d3 100644 --- a/modules/forgefed/object_user_activity_note_test.go +++ b/modules/forgefed/object_user_activity_note_test.go @@ -9,6 +9,7 @@ import ( "forgejo.org/modules/validation" ap "github.com/go-ap/activitypub" + "github.com/stretchr/testify/assert" ) func Test_UserActivityNoteValidation(t *testing.T) { @@ -22,7 +23,6 @@ func Test_UserActivityNoteValidation(t *testing.T) { } sut.URL = ap.IRI("example.org/user-id/57") - if res, _ := validation.IsValid(sut); !res { - t.Errorf("sut expected to be valid: %v\n", sut.Validate()) - } + valid, _ := validation.IsValid(sut) + assert.True(t, valid, "sut expected to be valid: %v\n", sut.Validate()) } diff --git a/modules/validation/validatable.go b/modules/validation/validatable.go index 4500f6e53d..7bcca03bf8 100644 --- a/modules/validation/validatable.go +++ b/modules/validation/validatable.go @@ -45,7 +45,7 @@ func IsValid(v Validateable) (bool, error) { func ValidateIDExists(value ap.Item, name string) []string { if value == nil { - return []string{fmt.Sprintf("%v should not be nil", name)} + return []string{fmt.Sprintf("Field %v must not be nil", name)} } return ValidateNotEmpty(value.GetID().String(), name) } @@ -76,12 +76,12 @@ func ValidateNotEmpty(value any, name string) []string { if isValid { return []string{} } - return []string{fmt.Sprintf("%v should not be empty", name)} + return []string{fmt.Sprintf("Value %v should not be empty", name)} } func ValidateMaxLen(value string, maxLen int, name string) []string { if utf8.RuneCountInString(value) > maxLen { - return []string{fmt.Sprintf("Value %v was longer than %v", name, maxLen)} + return []string{fmt.Sprintf("Value %v is longer than expected length %v", name, maxLen)} } return []string{} } diff --git a/routers/api/v1/activitypub/person.go b/routers/api/v1/activitypub/person.go index 6120a078af..72f9680b9b 100644 --- a/routers/api/v1/activitypub/person.go +++ b/routers/api/v1/activitypub/person.go @@ -6,9 +6,12 @@ package activitypub import ( "net/http" + "forgejo.org/models/activities" "forgejo.org/modules/activitypub" + "forgejo.org/modules/forgefed" "forgejo.org/modules/log" "forgejo.org/modules/web" + "forgejo.org/routers/api/v1/utils" "forgejo.org/services/context" "forgejo.org/services/convert" "forgejo.org/services/federation" @@ -78,3 +81,162 @@ func PersonInbox(ctx *context.APIContext) { } responseServiceResult(ctx, result) } + +// PersonFeed returns the recorded activities in the user's feed +func PersonFeed(ctx *context.APIContext) { + // swagger:operation GET /activitypub/user-id/{user-id}/outbox activitypub activitypubPersonFeed + // --- + // summary: List the user's recorded activity + // produces: + // - application/json + // parameters: + // - name: user-id + // in: path + // description: user ID of the user + // type: integer + // required: true + // responses: + // "200": + // "$ref": "#/responses/PersonFeed" + // "403": + // "$ref": "#/responses/forbidden" + + listOptions := utils.GetListOptions(ctx) + opts := activities.GetFollowingFeedsOptions{ + ListOptions: listOptions, + } + items, count, err := activities.GetFollowingFeeds(ctx, ctx.ContextUser.ID, opts) + if err != nil { + ctx.Error(http.StatusInternalServerError, "GetFollowingFeeds", err) + return + } + ctx.SetTotalCountHeader(count) + + feed := ap.OrderedCollectionNew(ap.IRI(ctx.ContextUser.APActorID() + "/outbox")) + feed.AttributedTo = ap.IRI(ctx.ContextUser.APActorID()) + for _, item := range items { + if err := feed.OrderedItems.Append(convert.ToActivityPubPersonFeedItem(item)); err != nil { + ctx.Error(http.StatusInternalServerError, "OrderedItems.Append", err) + return + } + } + + binary, err := jsonld.WithContext(jsonld.IRI(ap.ActivityBaseURI), jsonld.IRI(ap.SecurityContextURI)).Marshal(feed) + if err != nil { + ctx.ServerError("MarshalJSON", err) + return + } + + ctx.Resp.Header().Add("Content-Type", activitypub.ActivityStreamsContentType) + ctx.Resp.WriteHeader(http.StatusOK) + if _, err = ctx.Resp.Write(binary); err != nil { + log.Error("write to resp err: %v", err) + } +} + +func getActivity(ctx *context.APIContext, id int64) (*forgefed.ForgeUserActivity, error) { + action, err := activities.GetActivityByID(ctx, id) + if err != nil { + ctx.Error(http.StatusInternalServerError, "GetActivityByID", err.Error()) + return nil, err + } + + if action.UserID != action.ActUserID || action.ActUserID != ctx.ContextUser.ID { + ctx.NotFound() + return nil, err + } + + actions := activities.ActionList{action} + if err := actions.LoadAttributes(ctx); err != nil { + ctx.Error(http.StatusInternalServerError, "action.LoadAttributes", err.Error()) + return nil, err + } + + activity, err := convert.ActionToForgeUserActivity(ctx, actions[0]) + if err != nil { + ctx.Error(http.StatusInternalServerError, "ActionToForgeUserActivity", err.Error()) + return nil, err + } + + return &activity, nil +} + +// PersonActivity returns a user's given activity +func PersonActivity(ctx *context.APIContext) { + // swagger:operation GET /activitypub/user-id/{user-id}/activities/{activity-id}/activity activitypub activitypubPersonActivity + // --- + // summary: Get a specific activity of the user + // produces: + // - application/json + // parameters: + // - name: user-id + // in: path + // description: user ID of the user + // type: integer + // required: true + // - name: activity-id + // in: path + // description: activity ID of the sought activity + // type: integer + // required: true + // responses: + // "200": + // "$ref": "#/responses/ActivityPub" + + id := ctx.ParamsInt64("activity-id") + activity, err := getActivity(ctx, id) + if err != nil { + return + } + + binary, err := jsonld.WithContext(jsonld.IRI(ap.ActivityBaseURI), jsonld.IRI(ap.SecurityContextURI)).Marshal(activity) + if err != nil { + ctx.ServerError("MarshalJSON", err) + return + } + ctx.Resp.Header().Add("Content-Type", activitypub.ActivityStreamsContentType) + ctx.Resp.WriteHeader(http.StatusOK) + if _, err = ctx.Resp.Write(binary); err != nil { + log.Error("write to resp err: %v", err) + } +} + +// PersonActivity returns the Object part of a user's given activity +func PersonActivityNote(ctx *context.APIContext) { + // swagger:operation GET /activitypub/user-id/{user-id}/activities/{activity-id} activitypub activitypubPersonActivityNote + // --- + // summary: Get a specific activity object of the user + // produces: + // - application/json + // parameters: + // - name: user-id + // in: path + // description: user ID of the user + // type: integer + // required: true + // - name: activity-id + // in: path + // description: activity ID of the sought activity + // type: integer + // required: true + // responses: + // "200": + // "$ref": "#/responses/ActivityPub" + + id := ctx.ParamsInt64("activity-id") + activity, err := getActivity(ctx, id) + if err != nil { + return + } + + binary, err := jsonld.WithContext(jsonld.IRI(ap.ActivityBaseURI), jsonld.IRI(ap.SecurityContextURI)).Marshal(activity.Object) + if err != nil { + ctx.ServerError("MarshalJSON", err) + return + } + ctx.Resp.Header().Add("Content-Type", activitypub.ActivityStreamsContentType) + ctx.Resp.WriteHeader(http.StatusOK) + if _, err = ctx.Resp.Write(binary); err != nil { + log.Error("write to resp err: %v", err) + } +} diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 2f806ba35d..26a2c0ffe3 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -844,6 +844,11 @@ func Routes() *web.Route { activitypub.ReqHTTPUserSignature(), bind(ap.Activity{}), activitypub.PersonInbox) + m.Group("/activities/{activity-id}", func() { + m.Get("", activitypub.PersonActivityNote) + m.Get("/activity", activitypub.PersonActivity) + }) + m.Get("/outbox", activitypub.ReqHTTPUserSignature(), activitypub.PersonFeed) }, context.UserIDAssignmentAPI(), checkTokenPublicOnly()) m.Group("/actor", func() { m.Get("", activitypub.Actor) diff --git a/routers/api/v1/swagger/activitypub.go b/routers/api/v1/swagger/activitypub.go index 6235009572..a11fc4098c 100644 --- a/routers/api/v1/swagger/activitypub.go +++ b/routers/api/v1/swagger/activitypub.go @@ -13,3 +13,10 @@ type swaggerResponseActivityPub struct { // in:body Body api.ActivityPub `json:"body"` } + +// Personfeed +// swagger:response PersonFeed +type swaggerResponsePersonFeed struct { + // in:body + Body []api.APPersonFollowItem `json:"body"` +} diff --git a/services/convert/activitypub_user_action.go b/services/convert/activitypub_user_action.go new file mode 100644 index 0000000000..9c62e6f25c --- /dev/null +++ b/services/convert/activitypub_user_action.go @@ -0,0 +1,177 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package convert + +import ( + "context" + "fmt" + "html" + "net/url" + "time" + + activities_model "forgejo.org/models/activities" + issues_model "forgejo.org/models/issues" + fm "forgejo.org/modules/forgefed" + "forgejo.org/modules/json" + "forgejo.org/modules/markup" + "forgejo.org/modules/markup/markdown" +) + +func ActionToForgeUserActivity(ctx context.Context, action *activities_model.Action) (fm.ForgeUserActivity, error) { + render := func(format string, args ...any) string { + return fmt.Sprintf(`%s %s`, action.ActUser.HTMLURL(), action.GetActDisplayName(ctx), fmt.Sprintf(format, args...)) + } + renderIssue := func(issue *issues_model.Issue) string { + return fmt.Sprintf(`%s#%d`, + issue.HTMLURL(), + action.GetRepoPath(ctx), + issue.Index, + ) + } + renderRepo := func() string { + return fmt.Sprintf(`%s`, action.Repo.HTMLURL(), action.GetRepoPath(ctx)) + } + renderBranch := func() string { + return fmt.Sprintf(`%s`, action.GetRefLink(ctx), action.GetBranch()) + } + renderTag := func() string { + return fmt.Sprintf(`%s`, action.GetRefLink(ctx), action.GetTag()) + } + + makeUserActivity := func(format string, args ...any) (fm.ForgeUserActivity, error) { + return fm.NewForgeUserActivity(action.ActUser, action.ID, render(format, args...)) + } + + switch action.OpType { + case activities_model.ActionCreateRepo: + return makeUserActivity("created a new repository: %s", renderRepo()) + case activities_model.ActionRenameRepo: + return makeUserActivity("renamed a repository: %s", renderRepo()) + case activities_model.ActionStarRepo: + return makeUserActivity("starred a repository: %s", renderRepo()) + case activities_model.ActionWatchRepo: + return makeUserActivity("started watching a repository: %s", renderRepo()) + case activities_model.ActionCommitRepo: + type PushCommit struct { + Sha1 string + Message string + AuthorEmail string + AuthorName string + CommitterEmail string + CommitterName string + Timestamp time.Time + } + type PushCommits struct { + Commits []*PushCommit + HeadCommit *PushCommit + CompareURL string + Len int + } + + commits := &PushCommits{} + if err := json.Unmarshal([]byte(action.GetContent()), commits); err != nil { + return fm.ForgeUserActivity{}, err + } + commitsHTML := "" + renderCommit := func(commit *PushCommit) string { + return fmt.Sprintf(`
  • %s
    %s
  • `, + fmt.Sprintf("%s/commit/%s", action.GetRepoAbsoluteLink(ctx), url.PathEscape(commit.Sha1)), + commit.Sha1, + html.EscapeString(commit.Message), + ) + } + for _, commit := range commits.Commits { + commitsHTML += renderCommit(commit) + } + return makeUserActivity("pushed to %s at %s:
      %s
    ", renderBranch(), renderRepo(), commitsHTML) + case activities_model.ActionCreateIssue: + if err := action.LoadIssue(ctx); err != nil { + return fm.ForgeUserActivity{}, err + } + return makeUserActivity("opened issue %s", renderIssue(action.Issue)) + case activities_model.ActionCreatePullRequest: + if err := action.LoadIssue(ctx); err != nil { + return fm.ForgeUserActivity{}, err + } + return makeUserActivity("opened pull request %s", renderIssue(action.Issue)) + case activities_model.ActionTransferRepo: + return makeUserActivity("transferred %s", renderRepo()) + case activities_model.ActionPushTag: + return makeUserActivity("pushed %s at %s", renderTag(), renderRepo()) + case activities_model.ActionCommentIssue: + renderedComment, err := markdown.RenderString(&markup.RenderContext{ + Ctx: ctx, + }, action.Comment.Content) + if err != nil { + return fm.ForgeUserActivity{}, err + } + + return makeUserActivity(`commented on %s:
    %s
    `, + action.GetCommentHTMLURL(ctx), + renderIssue(action.Comment.Issue), + renderedComment, + ) + case activities_model.ActionMergePullRequest: + if err := action.LoadIssue(ctx); err != nil { + return fm.ForgeUserActivity{}, err + } + return makeUserActivity("merged pull request %s", renderIssue(action.Issue)) + case activities_model.ActionCloseIssue: + if err := action.LoadIssue(ctx); err != nil { + return fm.ForgeUserActivity{}, err + } + return makeUserActivity("closed issue %s", renderIssue(action.Issue)) + case activities_model.ActionReopenIssue: + if err := action.LoadIssue(ctx); err != nil { + return fm.ForgeUserActivity{}, err + } + return makeUserActivity("reopened issue %s", renderIssue(action.Issue)) + case activities_model.ActionClosePullRequest: + if err := action.LoadIssue(ctx); err != nil { + return fm.ForgeUserActivity{}, err + } + return makeUserActivity("closed pull request %s", renderIssue(action.Issue)) + case activities_model.ActionReopenPullRequest: + if err := action.LoadIssue(ctx); err != nil { + return fm.ForgeUserActivity{}, err + } + return makeUserActivity("reopened pull request %s", renderIssue(action.Issue)) + case activities_model.ActionDeleteTag: + return makeUserActivity("deleted tag %s at %s", action.GetTag(), renderRepo()) + case activities_model.ActionDeleteBranch: + return makeUserActivity("deleted branch %s at %s", action.GetBranch(), renderRepo()) + case activities_model.ActionApprovePullRequest: + if err := action.LoadIssue(ctx); err != nil { + return fm.ForgeUserActivity{}, err + } + return makeUserActivity("approved pull request %s", renderIssue(action.Issue)) + case activities_model.ActionRejectPullRequest: + if err := action.LoadIssue(ctx); err != nil { + return fm.ForgeUserActivity{}, err + } + return makeUserActivity("rejected pull request %s", renderIssue(action.Issue)) + case activities_model.ActionCommentPull: + renderedComment, err := markdown.RenderString(&markup.RenderContext{ + Ctx: ctx, + }, action.Comment.Content) + if err != nil { + return fm.ForgeUserActivity{}, err + } + + return makeUserActivity(`commented on %s:
    %s
    `, + action.GetCommentHTMLURL(ctx), + renderIssue(action.Comment.Issue), + renderedComment, + ) + case activities_model.ActionMirrorSyncPush: + case activities_model.ActionMirrorSyncCreate: + case activities_model.ActionMirrorSyncDelete: + case activities_model.ActionPublishRelease: + case activities_model.ActionPullReviewDismissed: + case activities_model.ActionPullRequestReadyForReview: + case activities_model.ActionAutoMergePullRequest: + } + + return makeUserActivity("performed an unrecognised action: %s", action.OpType.String()) +} diff --git a/services/federation/person_inbox_accept.go b/services/federation/person_inbox_accept.go new file mode 100644 index 0000000000..d0a840bd2d --- /dev/null +++ b/services/federation/person_inbox_accept.go @@ -0,0 +1,22 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package federation + +import ( + "net/http" + + "forgejo.org/modules/log" + + ap "github.com/go-ap/activitypub" +) + +func processPersonInboxAccept(activity *ap.Activity) (ServiceResult, error) { + if activity.Object.GetType() != ap.FollowType { + log.Error("Invalid object type for Accept activity: %v", activity.Object.GetType()) + return ServiceResult{}, NewErrNotAcceptablef("invalid object type for Accept activity: %v", activity.Object.GetType()) + } + + // We currently do not do anything here, we just drop it. + return NewServiceResultStatusOnly(http.StatusNoContent), nil +} diff --git a/services/federation/person_inbox_create.go b/services/federation/person_inbox_create.go new file mode 100644 index 0000000000..2132c7ede1 --- /dev/null +++ b/services/federation/person_inbox_create.go @@ -0,0 +1,55 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package federation + +import ( + "context" + "net/http" + + "forgejo.org/models/activities" + "forgejo.org/models/user" + fm "forgejo.org/modules/forgefed" + "forgejo.org/modules/log" + + ap "github.com/go-ap/activitypub" +) + +func processPersonInboxCreate(ctx context.Context, user *user.User, activity *ap.Activity) (ServiceResult, error) { + createAct, err := fm.NewForgeUserActivityFromAp(*activity) + if err != nil { + log.Error("Invalid user activity: %v, %v", activity, err) + return ServiceResult{}, NewErrNotAcceptablef("Invalid user activity: %v", err) + } + + actorURI := createAct.Actor.GetLink().String() + federatedBaseUser, _, _, err := findFederatedUser(ctx, actorURI) + if err != nil { + log.Error("Federated user not found (%s): %v", actorURI, err) + return ServiceResult{}, NewErrNotAcceptablef("federated user not found (%s): %v", actorURI, err) + } + if federatedBaseUser == nil { + log.Error("Federated user not found (%s): %v", actorURI, err) + return ServiceResult{}, NewErrNotAcceptablef("federated user not found (%s): %v", actorURI, err) + } + + federatedUserActivity, err := activities.NewFederatedUserActivity( + user.ID, + federatedBaseUser.ID, + createAct.Actor.GetLink().String(), + createAct.Note.Content.String(), + createAct.Note.URL.GetID().String(), + *activity, + ) + if err != nil { + log.Error("Error creating federatedUserActivity (%s): %v", actorURI, err) + return ServiceResult{}, NewErrNotAcceptablef("Error creating federatedUserActivity: %v", err) + } + + if err := activities.CreateUserActivity(ctx, &federatedUserActivity); err != nil { + log.Error("Unable to record activity: %v", err) + return ServiceResult{}, NewErrNotAcceptablef("Unable to record activity: %v", err) + } + + return NewServiceResultStatusOnly(http.StatusNoContent), nil +} diff --git a/services/federation/person_service.go b/services/federation/person_service.go index f67d2b492d..d6482d013c 100644 --- a/services/federation/person_service.go +++ b/services/federation/person_service.go @@ -5,21 +5,56 @@ package federation import ( "context" + "net/http" "forgejo.org/models/user" + "forgejo.org/modules/forgefed" "forgejo.org/modules/log" + context_service "forgejo.org/services/context" ap "github.com/go-ap/activitypub" + "github.com/go-ap/jsonld" ) func ProcessPersonInbox(ctx context.Context, user *user.User, activity *ap.Activity) (ServiceResult, error) { switch activity.Type { + case ap.CreateType: + return processPersonInboxCreate(ctx, user, activity) case ap.FollowType: return processPersonFollow(ctx, user, activity) case ap.UndoType: return processPersonInboxUndo(ctx, user, activity) + case ap.AcceptType: + return processPersonInboxAccept(activity) } log.Error("Unsupported PersonInbox activity: %v", activity.Type) return ServiceResult{}, NewErrNotAcceptablef("unsupported activity: %v", activity.Type) } + +func FollowRemoteActor(ctx *context_service.APIContext, localUser *user.User, actorURI string) error { + _, federatedUser, federationHost, err := FindOrCreateFederatedUser(ctx.Base, actorURI) + if err != nil { + log.Error("Federated user not found (%s): %v", actorURI, err) + ctx.Error(http.StatusNotAcceptable, "Federated user not found", err) + return err + } + + followReq, err := forgefed.NewForgeFollow(localUser.APActorID(), actorURI) + if err != nil { + return err + } + + payload, err := jsonld.WithContext(jsonld.IRI(ap.ActivityBaseURI)). + Marshal(followReq) + if err != nil { + return err + } + + hostURL := federationHost.AsURL() + return deliveryQueue.Push(deliveryQueueItem{ + InboxURL: hostURL.JoinPath(federatedUser.InboxPath).String(), + Doer: localUser, + Payload: payload, + }) +} diff --git a/services/federation/user_activity.go b/services/federation/user_activity.go new file mode 100644 index 0000000000..0db2aee4ec --- /dev/null +++ b/services/federation/user_activity.go @@ -0,0 +1,83 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package federation + +import ( + "context" + + activities_model "forgejo.org/models/activities" + "forgejo.org/models/forgefed" + "forgejo.org/models/user" + "forgejo.org/modules/setting" + "forgejo.org/modules/structs" + "forgejo.org/services/convert" + + ap "github.com/go-ap/activitypub" + "github.com/go-ap/jsonld" +) + +func SendUserActivity(ctx context.Context, doer *user.User, activity *activities_model.Action) error { + followers, err := user.GetFollowersForUser(ctx, doer) + if err != nil { + return err + } + + userActivity, err := convert.ActionToForgeUserActivity(ctx, activity) + if err != nil { + return err + } + + payload, err := jsonld.WithContext( + jsonld.IRI(ap.ActivityBaseURI), + ).Marshal(userActivity) + if err != nil { + return err + } + + for _, follower := range followers { + _, federatedUserFollower, err := user.GetFederatedUserByUserID(ctx, follower.FollowingUserID) + if err != nil { + return err + } + + federationHost, err := forgefed.GetFederationHost(ctx, federatedUserFollower.FederationHostID) + if err != nil { + return err + } + + hostURL := federationHost.AsURL() + if err := deliveryQueue.Push(deliveryQueueItem{ + InboxURL: hostURL.JoinPath(federatedUserFollower.InboxPath).String(), + Doer: doer, + Payload: payload, + }); err != nil { + return err + } + } + + return nil +} + +func NotifyActivityPubFollowers(ctx context.Context, actions []activities_model.Action) error { + if !setting.Federation.Enabled { + return nil + } + for _, act := range actions { + if act.Repo != nil { + if act.Repo.IsPrivate { + continue + } + if act.Repo.Owner.KeepActivityPrivate || act.Repo.Owner.Visibility != structs.VisibleTypePublic { + continue + } + } + if act.ActUser.KeepActivityPrivate || act.ActUser.Visibility != structs.VisibleTypePublic { + continue + } + if err := SendUserActivity(ctx, act.ActUser, &act); err != nil { + return err + } + } + return nil +} diff --git a/services/feed/action.go b/services/feed/action.go index 7d179bd1c8..c708ae5404 100644 --- a/services/feed/action.go +++ b/services/feed/action.go @@ -19,6 +19,7 @@ import ( "forgejo.org/modules/repository" "forgejo.org/modules/setting" "forgejo.org/modules/util" + federation_service "forgejo.org/services/federation" notify_service "forgejo.org/services/notify" ) @@ -40,21 +41,19 @@ func NewNotifier() notify_service.Notifier { } func notifyAll(ctx context.Context, action *activities_model.Action) error { - _, err := activities_model.NotifyWatchers(ctx, action) + out, err := activities_model.NotifyWatchers(ctx, action) if err != nil { return err } - return err - // return federation_service.NotifyActivityPubFollowers(ctx, out) + return federation_service.NotifyActivityPubFollowers(ctx, out) } func notifyAllActions(ctx context.Context, acts []*activities_model.Action) error { - _, err := activities_model.NotifyWatchersActions(ctx, acts) + out, err := activities_model.NotifyWatchersActions(ctx, acts) if err != nil { return err } - return nil - // return federation_service.NotifyActivityPubFollowers(ctx, out) + return federation_service.NotifyActivityPubFollowers(ctx, out) } func (a *actionNotifier) NewIssue(ctx context.Context, issue *issues_model.Issue, mentions []*user_model.User) { diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 492f9487f3..353abe76c0 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -142,6 +142,72 @@ } } }, + "/activitypub/user-id/{user-id}/activities/{activity-id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "activitypub" + ], + "summary": "Get a specific activity object of the user", + "operationId": "activitypubPersonActivityNote", + "parameters": [ + { + "type": "integer", + "description": "user ID of the user", + "name": "user-id", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "activity ID of the sought activity", + "name": "activity-id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/ActivityPub" + } + } + } + }, + "/activitypub/user-id/{user-id}/activities/{activity-id}/activity": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "activitypub" + ], + "summary": "Get a specific activity of the user", + "operationId": "activitypubPersonActivity", + "parameters": [ + { + "type": "integer", + "description": "user ID of the user", + "name": "user-id", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "activity ID of the sought activity", + "name": "activity-id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/ActivityPub" + } + } + } + }, "/activitypub/user-id/{user-id}/inbox": { "post": { "produces": [ @@ -168,6 +234,35 @@ } } }, + "/activitypub/user-id/{user-id}/outbox": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "activitypub" + ], + "summary": "List the user's recorded activity", + "operationId": "activitypubPersonFeed", + "parameters": [ + { + "type": "integer", + "description": "user ID of the user", + "name": "user-id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/PersonFeed" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, "/admin/cron": { "get": { "produces": [ @@ -21121,6 +21216,28 @@ }, "x-go-package": "forgejo.org/services/context" }, + "APPersonFollowItem": { + "type": "object", + "properties": { + "actor_id": { + "type": "string", + "x-go-name": "ActorID" + }, + "note": { + "type": "string", + "x-go-name": "Note" + }, + "original_item": { + "type": "string", + "x-go-name": "OriginalItem" + }, + "original_url": { + "type": "string", + "x-go-name": "OriginalURL" + } + }, + "x-go-package": "forgejo.org/modules/structs" + }, "AccessToken": { "type": "object", "title": "AccessToken represents an API access token.", @@ -29566,6 +29683,15 @@ } } }, + "PersonFeed": { + "description": "Personfeed", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/APPersonFollowItem" + } + } + }, "PublicKey": { "description": "PublicKey", "schema": { diff --git a/tests/integration/api_activitypub_person_inbox_useractivity_test.go b/tests/integration/api_activitypub_person_inbox_useractivity_test.go new file mode 100644 index 0000000000..39f08f4d9c --- /dev/null +++ b/tests/integration/api_activitypub_person_inbox_useractivity_test.go @@ -0,0 +1,100 @@ +// Copyright 2022, 2025 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package integration + +import ( + "fmt" + "net/http" + "net/url" + "testing" + "time" + + auth_model "forgejo.org/models/auth" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + "forgejo.org/modules/activitypub" + "forgejo.org/modules/setting" + "forgejo.org/modules/structs" + "forgejo.org/modules/test" + "forgejo.org/routers" + "forgejo.org/services/contexttest" + "forgejo.org/services/federation" + "forgejo.org/tests" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestActivityPubPersonInboxNoteToDistant(t *testing.T) { + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&setting.Federation.SignatureEnforced, false)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + federation.Init() + + mock := test.NewFederationServerMock() + federatedSrv := mock.DistantServer(t) + defer federatedSrv.Close() + + onGiteaRun(t, func(t *testing.T, localUrl *url.URL) { + defer test.MockVariableValue(&setting.AppURL, localUrl.String())() + + distantURL := federatedSrv.URL + distantUser15URL := fmt.Sprintf("%s/api/v1/activitypub/user-id/15", distantURL) + + localUser2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + localUser2URL := localUrl.JoinPath("/api/v1/activitypub/user-id/2").String() + localUser2Inbox := fmt.Sprintf("%v/inbox", localUser2URL) + localSession2 := loginUser(t, localUser2.LoginName) + localSecssion2Token := getTokenForLoggedInUser(t, localSession2, auth_model.AccessTokenScopeWriteIssue) + + repo, _, f := tests.CreateDeclarativeRepoWithOptions(t, localUser2, tests.DeclarativeRepoOptions{}) + defer f() + + // follow (distant follows local) + followActivity := []byte(fmt.Sprintf( + `{"type":"Follow",`+ + `"actor":"%s",`+ + `"object":"%s"}`, + distantUser15URL, + localUser2URL, + )) + ctx, _ := contexttest.MockAPIContext(t, localUser2Inbox) + cf, err := activitypub.NewClientFactoryWithTimeout(60 * time.Second) + require.NoError(t, err) + c, err := cf.WithKeysDirect(ctx, mock.ApActor.PrivKey, + mock.ApActor.KeyID(federatedSrv.URL)) + require.NoError(t, err) + resp, err := c.Post(followActivity, localUser2Inbox) + require.NoError(t, err) + assert.Equal(t, http.StatusAccepted, resp.StatusCode) + + // local action which triggers a user activity + IssueURL := fmt.Sprintf("/api/v1/repos/%s/issues?state=all", repo.FullName()) + req := NewRequestWithJSON(t, "POST", IssueURL, &structs.CreateIssueOption{ + Title: "ActivityFeed test", + Body: "Nothing to see here!", + }).AddTokenAuth(localSecssion2Token) + MakeRequest(t, req, http.StatusCreated) + + // distant request outbox + localUser2Outbox := fmt.Sprintf("%v/outbox", localUser2URL) + resp, err = c.Get(localUser2Outbox) + require.NoError(t, err) + assert.Equal(t, http.StatusOK, resp.StatusCode) + + // distant request activity & activity note + localUser2ActivityNote := fmt.Sprintf("%v/activities/1", localUser2URL) + localUser2Activity := fmt.Sprintf("%v/activities/1/activity", localUser2URL) + resp, err = c.Get(localUser2ActivityNote) + require.NoError(t, err) + assert.Equal(t, http.StatusOK, resp.StatusCode) + resp, err = c.Get(localUser2Activity) + require.NoError(t, err) + assert.Equal(t, http.StatusOK, resp.StatusCode) + + // check for activity on distant inbox + assert.Contains(t, mock.LastPost, "user2 opened issue") + }) +} diff --git a/tests/integration/api_activitypub_person_test.go b/tests/integration/api_activitypub_person_test.go index 04d1fb1648..bd21c13612 100644 --- a/tests/integration/api_activitypub_person_test.go +++ b/tests/integration/api_activitypub_person_test.go @@ -39,9 +39,6 @@ func TestActivityPubPerson(t *testing.T) { localUserName := "user2" localUserURL := fmt.Sprintf("%sapi/v1/activitypub/user-id/%d", localUrl, localUserID) - // distantURL := federatedSrv.URL - // distantUser15URL := fmt.Sprintf("%s/api/v1/activitypub/user-id/15", distantURL) - // Unsigned request t.Run("UnsignedRequest", func(t *testing.T) { req := NewRequest(t, "GET", localUserURL) @@ -111,3 +108,30 @@ func TestActivityPubPersonInbox(t *testing.T) { assert.Equal(t, http.StatusNotAcceptable, resp.StatusCode) }) } + +func TestActivityPubPersonOutbox(t *testing.T) { + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + mock := test.NewFederationServerMock() + federatedSrv := mock.DistantServer(t) + defer federatedSrv.Close() + + onGiteaRun(t, func(t *testing.T, u *url.URL) { + defer test.MockVariableValue(&setting.AppURL, u.String())() + user2outboxurl := u.JoinPath("/api/v1/activitypub/user-id/2/outbox").String() + + ctx, _ := contexttest.MockAPIContext(t, user2outboxurl) + cf, err := activitypub.NewClientFactoryWithTimeout(60 * time.Second) + require.NoError(t, err) + + c, err := cf.WithKeysDirect(ctx, mock.Persons[0].PrivKey, + mock.Persons[0].KeyID(federatedSrv.URL)) + require.NoError(t, err) + + // request outbox + resp, err := c.Get(user2outboxurl) + require.NoError(t, err) + assert.Equal(t, http.StatusOK, resp.StatusCode) + }) +} From 16a0c97fbf0255e632d0ea2244bf02a4dad0703a Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Wed, 6 Aug 2025 17:51:36 +0200 Subject: [PATCH 277/495] fix: correct release link in feed (#8802) Resolves forgejo/forgejo#8793 ## Checklist The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org). ### Tests - I added test coverage for Go changes... - [ ] in their respective `*_test.go` for unit tests. - [x] in the `tests/integration` directory if it involves interactions with a live Forgejo server. ### Release notes - [ ] I do not want this change to show in the release notes. - [x] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/.md` to be be used for the release notes instead of the title. ## Release notes - Bug fixes - [PR](https://codeberg.org/forgejo/forgejo/pulls/8802): correct release link in feed Co-authored-by: Gusted Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8802 Reviewed-by: Gusted Co-authored-by: Earl Warren Co-committed-by: Earl Warren --- routers/web/feed/release.go | 2 +- tests/integration/release_feed_test.go | 41 +++++++++++++++----------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/routers/web/feed/release.go b/routers/web/feed/release.go index 646241c021..d24fa6ecc7 100644 --- a/routers/web/feed/release.go +++ b/routers/web/feed/release.go @@ -29,7 +29,7 @@ func ShowReleaseFeed(ctx *context.Context, repo *repo_model.Repository, isReleas if isReleasesOnly { title = ctx.Locale.TrString("repo.release.releases_for", repo.FullName()) - link = &feeds.Link{Href: repo.HTMLURL() + "/release"} + link = &feeds.Link{Href: repo.HTMLURL() + "/releases"} } else { title = ctx.Locale.TrString("repo.release.tags_for", repo.FullName()) link = &feeds.Link{Href: repo.HTMLURL() + "/tags"} diff --git a/tests/integration/release_feed_test.go b/tests/integration/release_feed_test.go index e1781e343e..eded0459c8 100644 --- a/tests/integration/release_feed_test.go +++ b/tests/integration/release_feed_test.go @@ -4,6 +4,7 @@ package integration import ( + "fmt" "net/http" "regexp" "testing" @@ -27,50 +28,56 @@ func TestReleaseFeed(t *testing.T) { t.Run("RSS feed", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - resp := MakeRequest(t, NewRequest(t, "GET", "/user2/repo1/releases.rss"), http.StatusOK) - assert.Equal(t, ` + releasesPath := "/user2/repo1/releases" + MakeRequest(t, NewRequest(t, "GET", releasesPath), http.StatusOK) + + resp := MakeRequest(t, NewRequest(t, "GET", releasesPath+".rss"), http.StatusOK) + assert.Equal(t, fmt.Sprintf(` Releases for user2/repo1 - http://localhost/user2/repo1/release + http://localhost%[1]s pre-release - http://localhost/user2/repo1/releases/tag/v1.0 + http://localhost%[1]s/tag/v1.0 some text for a pre release

    ]]>
    user2 - 5: http://localhost/user2/repo1/releases/tag/v1.0 + 5: http://localhost%[1]s/tag/v1.0
    testing-release - http://localhost/user2/repo1/releases/tag/v1.1 + http://localhost%[1]s/tag/v1.1 user2 - 1: http://localhost/user2/repo1/releases/tag/v1.1 + 1: http://localhost%[1]s/tag/v1.1
    -
    `, normalize(resp.Body.String())) +
    `, releasesPath), normalize(resp.Body.String())) }) t.Run("Atom feed", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - resp := MakeRequest(t, NewRequest(t, "GET", "/user2/repo1/releases.atom"), http.StatusOK) - assert.Equal(t, ` + releasesPath := "/user2/repo1/releases" + MakeRequest(t, NewRequest(t, "GET", releasesPath), http.StatusOK) + + resp := MakeRequest(t, NewRequest(t, "GET", releasesPath+".atom"), http.StatusOK) + assert.Equal(t, fmt.Sprintf(` Releases for user2/repo1 - http://localhost/user2/repo1/release + http://localhost%[1]s - + pre-release - 5: http://localhost/user2/repo1/releases/tag/v1.0 + 5: http://localhost%[1]s/tag/v1.0 <p dir="auto">some text for a pre release</p> - + user2 user2@noreply.example.org @@ -79,13 +86,13 @@ func TestReleaseFeed(t *testing.T) { testing-release - 1: http://localhost/user2/repo1/releases/tag/v1.1 - + 1: http://localhost%[1]s/tag/v1.1 + user2 user2@noreply.example.org -`, normalize(resp.Body.String())) +`, releasesPath), normalize(resp.Body.String())) }) } From b51f97e97d55a8d55a2975d2ebcadff0d26638f1 Mon Sep 17 00:00:00 2001 From: Gusted Date: Wed, 6 Aug 2025 20:25:13 +0200 Subject: [PATCH 278/495] feat: add option to allow non-local users to change usernames (#8714) Add a new config option for OAuth2 authentication sources: allow users to change their username. In the case where OAuth2 is more like a social OAuth2 login there's no need to not allow users to change their username. The information how the user is linked to the authentication source is stored in different fields. Resolves forgejo/forgejo#687 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8714 Reviewed-by: 0ko <0ko@noreply.codeberg.org> Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- cmd/admin_auth_oauth.go | 9 +++++ cmd/admin_auth_oauth_test.go | 2 ++ models/user/fixtures/login_source.yml | 8 +++++ models/user/fixtures/user.yml | 1 + options/locale_next/locale_en-US.json | 2 ++ routers/web/admin/auths.go | 1 + services/auth/source/oauth2/source.go | 1 + services/forms/auth_form.go | 1 + services/user/user.go | 25 +++++++++++-- services/user/user_test.go | 40 +++++++++++++-------- templates/admin/auth/edit.tmpl | 7 ++++ templates/admin/auth/source/oauth.tmpl | 7 ++++ tests/integration/admin_auth_source_test.go | 32 +++++++++++++++++ 13 files changed, 119 insertions(+), 17 deletions(-) create mode 100644 models/user/fixtures/login_source.yml create mode 100644 tests/integration/admin_auth_source_test.go diff --git a/cmd/admin_auth_oauth.go b/cmd/admin_auth_oauth.go index 8a756480cd..ef5d9116e3 100644 --- a/cmd/admin_auth_oauth.go +++ b/cmd/admin_auth_oauth.go @@ -125,6 +125,10 @@ func oauthCLIFlags() []cli.Flag { Name: "group-team-map-removal", Usage: "Activate automatic team membership removal depending on groups", }, + &cli.BoolFlag{ + Name: "allow-username-change", + Usage: "Allow users to change their username", + }, } } @@ -176,6 +180,7 @@ func parseOAuth2Config(_ context.Context, c *cli.Command) *oauth2.Source { RestrictedGroup: c.String("restricted-group"), GroupTeamMap: c.String("group-team-map"), GroupTeamMapRemoval: c.Bool("group-team-map-removal"), + AllowUsernameChange: c.Bool("allow-username-change"), } } @@ -277,6 +282,10 @@ func (a *authService) updateOauth(ctx context.Context, c *cli.Command) error { oAuth2Config.GroupTeamMapRemoval = c.Bool("group-team-map-removal") } + if c.IsSet("allow-username-change") { + oAuth2Config.AllowUsernameChange = c.Bool("allow-username-change") + } + // update custom URL mapping customURLMapping := &oauth2.CustomURLMapping{} diff --git a/cmd/admin_auth_oauth_test.go b/cmd/admin_auth_oauth_test.go index ea5442e62d..3430ad1f56 100644 --- a/cmd/admin_auth_oauth_test.go +++ b/cmd/admin_auth_oauth_test.go @@ -55,6 +55,7 @@ func TestAddOauth(t *testing.T) { "--restricted-group", "restricted", "--group-team-map", `{"org_a_team_1": {"organization-a": ["Team 1"]}, "org_a_all_teams": {"organization-a": ["Team 1", "Team 2", "Team 3"]}}`, "--group-team-map-removal", + "--allow-username-change", }, source: &auth.Source{ Type: auth.OAuth2, @@ -83,6 +84,7 @@ func TestAddOauth(t *testing.T) { GroupTeamMapRemoval: true, RestrictedGroup: "restricted", SkipLocalTwoFA: true, + AllowUsernameChange: true, }, }, }, diff --git a/models/user/fixtures/login_source.yml b/models/user/fixtures/login_source.yml new file mode 100644 index 0000000000..3950f85964 --- /dev/null +++ b/models/user/fixtures/login_source.yml @@ -0,0 +1,8 @@ +- + id: 1001 + type: 6 # OAuth2 + name: OAuth2 authentication source + is_active: 1 + cfg: '{"Provider":"invalid","ClientID":"invalid","ClientSecret":"invalid","AllowUsernameChange":true}' + created_unix: 1753740851 + updated_unix: 1753740851 diff --git a/models/user/fixtures/user.yml b/models/user/fixtures/user.yml index b1892f331b..137064a368 100644 --- a/models/user/fixtures/user.yml +++ b/models/user/fixtures/user.yml @@ -11,6 +11,7 @@ must_change_password: false login_source: 1001 login_name: 123 + login_type: 6 type: 5 salt: ZogKvWdyEx max_repo_creation: -1 diff --git a/options/locale_next/locale_en-US.json b/options/locale_next/locale_en-US.json index e730c84726..aa8d811bd3 100644 --- a/options/locale_next/locale_en-US.json +++ b/options/locale_next/locale_en-US.json @@ -106,6 +106,8 @@ "discussion.sidebar.reference": "Reference", "editor.textarea.tab_hint": "Line already indented. Press Tab again or Escape to leave the editor.", "editor.textarea.shift_tab_hint": "No indentation on this line. Press Shift + Tab again or Escape to leave the editor.", + "admin.auths.allow_username_change": "Allow username change", + "admin.auths.allow_username_change.description": "Allow users to change their username in the profile settings", "admin.dashboard.cleanup_offline_runners": "Cleanup offline runners", "admin.dashboard.remove_resolved_reports": "Remove resolved reports", "settings.visibility.description": "Profile visibility affects others' ability to access your non-private repositories. Learn more.", diff --git a/routers/web/admin/auths.go b/routers/web/admin/auths.go index 2c6dc76305..c352b6ad1a 100644 --- a/routers/web/admin/auths.go +++ b/routers/web/admin/auths.go @@ -190,6 +190,7 @@ func parseOAuth2Config(form forms.AuthenticationForm) *oauth2.Source { AdminGroup: form.Oauth2AdminGroup, GroupTeamMap: form.Oauth2GroupTeamMap, GroupTeamMapRemoval: form.Oauth2GroupTeamMapRemoval, + AllowUsernameChange: form.AllowUsernameChange, } } diff --git a/services/auth/source/oauth2/source.go b/services/auth/source/oauth2/source.go index 5245f88270..a3126cf353 100644 --- a/services/auth/source/oauth2/source.go +++ b/services/auth/source/oauth2/source.go @@ -29,6 +29,7 @@ type Source struct { GroupTeamMapRemoval bool RestrictedGroup string SkipLocalTwoFA bool `json:",omitempty"` + AllowUsernameChange bool // reference to the authSource authSource *auth.Source diff --git a/services/forms/auth_form.go b/services/forms/auth_form.go index e665ca0d19..b89e87f749 100644 --- a/services/forms/auth_form.go +++ b/services/forms/auth_form.go @@ -79,6 +79,7 @@ type AuthenticationForm struct { SkipLocalTwoFA bool GroupTeamMap string `binding:"ValidGroupTeamMap"` GroupTeamMapRemoval bool + AllowUsernameChange bool } // Validate validates fields diff --git a/services/user/user.go b/services/user/user.go index d682d5a434..9cb6858f0c 100644 --- a/services/user/user.go +++ b/services/user/user.go @@ -13,6 +13,7 @@ import ( "forgejo.org/models" asymkey_model "forgejo.org/models/asymkey" + "forgejo.org/models/auth" "forgejo.org/models/db" "forgejo.org/models/organization" packages_model "forgejo.org/models/packages" @@ -25,6 +26,7 @@ import ( "forgejo.org/modules/storage" "forgejo.org/modules/util" "forgejo.org/services/agit" + "forgejo.org/services/auth/source/oauth2" org_service "forgejo.org/services/org" "forgejo.org/services/packages" container_service "forgejo.org/services/packages/container" @@ -49,9 +51,26 @@ func renameUser(ctx context.Context, u *user_model.User, newUserName string, doe // Non-local users are not allowed to change their username. // If the doer is an admin, then allow the rename - they know better. if !doerIsAdmin && !u.IsOrganization() && !u.IsLocal() { - return user_model.ErrUserIsNotLocal{ - UID: u.ID, - Name: u.Name, + // If the user's authentication source is OAuth2 and that source allows for + // username changes then don't make a fuzz about it. + + if !u.IsOAuth2() { + return user_model.ErrUserIsNotLocal{ + UID: u.ID, + Name: u.Name, + } + } + + source, err := auth.GetSourceByID(ctx, u.LoginSource) + if err != nil { + return err + } + sourceCfg := source.Cfg.(*oauth2.Source) + if !sourceCfg.AllowUsernameChange { + return user_model.ErrUserIsNotLocal{ + UID: u.ID, + Name: u.Name, + } } } diff --git a/services/user/user_test.go b/services/user/user_test.go index f1cab60a6d..0747833557 100644 --- a/services/user/user_test.go +++ b/services/user/user_test.go @@ -25,6 +25,7 @@ import ( "forgejo.org/modules/setting" "forgejo.org/modules/test" "forgejo.org/modules/timeutil" + "forgejo.org/services/auth/source/oauth2" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -140,23 +141,10 @@ func TestCreateUser(t *testing.T) { } func TestRenameUser(t *testing.T) { + defer unittest.OverrideFixtures("models/user/fixtures/")() require.NoError(t, unittest.PrepareTestDatabase()) user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 21}) - t.Run("Non-Local", func(t *testing.T) { - u := &user_model.User{ - ID: 2, - Name: "old-name", - Type: user_model.UserTypeIndividual, - LoginType: auth.OAuth2, - } - require.ErrorIs(t, RenameUser(db.DefaultContext, u, "user_rename2"), user_model.ErrUserIsNotLocal{UID: 2, Name: "old-name"}) - - t.Run("Admin", func(t *testing.T) { - require.NoError(t, AdminRenameUser(t.Context(), u, "user_rename2")) - }) - }) - t.Run("Same username", func(t *testing.T) { require.NoError(t, RenameUser(db.DefaultContext, user, user.Name)) }) @@ -225,6 +213,30 @@ func TestRenameUser(t *testing.T) { unittest.AssertExistsIf(t, true, &user_model.Redirect{LowerName: "redirect-1"}) unittest.AssertExistsIf(t, true, &user_model.Redirect{LowerName: "redirect-2"}) }) + + t.Run("Non-local", func(t *testing.T) { + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1041, LoginSource: 1001}) + authSource := unittest.AssertExistsAndLoadBean(t, &auth.Source{ID: user.LoginSource}) + assert.False(t, user.IsLocal()) + assert.True(t, user.IsOAuth2()) + + t.Run("Allowed", func(t *testing.T) { + require.NoError(t, RenameUser(t.Context(), user, "I-am-a-local-username")) + }) + + t.Run("Not allowed", func(t *testing.T) { + authSourceCfg := authSource.Cfg.(*oauth2.Source) + authSourceCfg.AllowUsernameChange = false + authSource.Cfg = authSourceCfg + _, err := db.GetEngine(t.Context()).Cols("cfg").ID(authSource.ID).Update(authSource) + require.NoError(t, err) + + require.ErrorIs(t, RenameUser(t.Context(), user, "Another-username-change"), user_model.ErrUserIsNotLocal{UID: user.ID, Name: user.Name}) + t.Run("Admin", func(t *testing.T) { + require.NoError(t, AdminRenameUser(t.Context(), user, "Another-username-change")) + }) + }) + }) } func TestCreateUser_Issue5882(t *testing.T) { diff --git a/templates/admin/auth/edit.tmpl b/templates/admin/auth/edit.tmpl index 1ca5573cae..11be03acc5 100644 --- a/templates/admin/auth/edit.tmpl +++ b/templates/admin/auth/edit.tmpl @@ -299,6 +299,13 @@

    {{ctx.Locale.Tr "admin.auths.skip_local_two_fa_helper"}}

    +
    +
    + + +

    {{ctx.Locale.Tr "admin.auths.allow_username_change.description"}}

    +
    +
    diff --git a/templates/admin/auth/source/oauth.tmpl b/templates/admin/auth/source/oauth.tmpl index 7d0a64d269..0cb9ea56bc 100644 --- a/templates/admin/auth/source/oauth.tmpl +++ b/templates/admin/auth/source/oauth.tmpl @@ -35,6 +35,13 @@

    {{ctx.Locale.Tr "admin.auths.skip_local_two_fa_helper"}}

    +
    +
    + + +

    {{ctx.Locale.Tr "admin.auths.allow_username_change.description"}}

    +
    +
    diff --git a/tests/integration/admin_auth_source_test.go b/tests/integration/admin_auth_source_test.go new file mode 100644 index 0000000000..4b46541318 --- /dev/null +++ b/tests/integration/admin_auth_source_test.go @@ -0,0 +1,32 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later. + +package integration + +import ( + "fmt" + "net/http" + "testing" + + "forgejo.org/models/auth" + "forgejo.org/tests" +) + +func TestAdminAuthAllowUsernameChangeSetting(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + session := loginUser(t, "user1") + + source := addAuthSource(t, map[string]string{ + "type": fmt.Sprintf("%d", auth.OAuth2), + "name": "some-name", + "is_active": "on", + "allow_username_change": "on", + "oauth2_provider": "gitlab", + }) + + response := session.MakeRequest(t, NewRequestf(t, "GET", "/admin/auths/%d", source.ID), http.StatusOK) + htmlDoc := NewHTMLParser(t, response.Body) + + htmlDoc.AssertElement(t, "#allow_username_change[checked]", true) +} From bc0c2b7d0d9a6af413da980a3449011b492cb693 Mon Sep 17 00:00:00 2001 From: Gusted Date: Thu, 7 Aug 2025 06:46:53 +0200 Subject: [PATCH 279/495] chore: add MariaDB to daily tests (#8810) - Add the oldest and newest supported version of MariaDB to the daily tests to be run against the integration tests. - Ref: https://codeberg.org/forgejo/forgejo/pulls/8691 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8810 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- .forgejo/workflows/testing-integration.yml | 31 ++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/.forgejo/workflows/testing-integration.yml b/.forgejo/workflows/testing-integration.yml index 518b56c463..bf0ebbf0e9 100644 --- a/.forgejo/workflows/testing-integration.yml +++ b/.forgejo/workflows/testing-integration.yml @@ -66,3 +66,34 @@ jobs: RACE_ENABLED: true TEST_TAGS: sqlite sqlite_unlock_notify USE_REPO_TEST_DIR: 1 + test-mariadb: +# if: vars.ROLE == 'forgejo-coding' + if: vars.ROLE == 'forgejo-integration' + runs-on: docker + name: ${{ format('test-mariadb (v{0})', matrix.version) }} + strategy: + matrix: + version: ['10.6', '11.8'] + container: + image: 'data.forgejo.org/oci/node:22-bookworm' + options: --tmpfs /tmp:exec,noatime + services: + mysql: + image: ${{ format('data.forgejo.org/oci/mariadb:{0}', matrix.version) }} + env: + MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: yes + MARIADB_DATABASE: testgitea + options: --tmpfs /mariadb/data:noatime + steps: + - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: ./.forgejo/workflows-composite/setup-env + - name: install dependencies & git >= 2.42 + uses: ./.forgejo/workflows-composite/apt-install-from + with: + packages: git git-lfs + - uses: ./.forgejo/workflows-composite/build-backend + - run: | + su forgejo -c 'make test-mysql-migration test-mysql' + timeout-minutes: 120 + env: + USE_REPO_TEST_DIR: 1 From 6faaf807ff66cd98c8834bb259b3dfa2121b630a Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 7 Aug 2025 06:49:30 +0200 Subject: [PATCH 280/495] Update dependency go to v1.24.6 (forgejo) (#8807) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [go](https://go.dev/) ([source](https://github.com/golang/go)) | toolchain | patch | `1.24.5` -> `1.24.6` | --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8807 Reviewed-by: Earl Warren Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 289a3e4da0..1aeeb7ee63 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module forgejo.org go 1.24 -toolchain go1.24.5 +toolchain go1.24.6 require ( code.forgejo.org/f3/gof3/v3 v3.11.0 From a1dd77d1156f1b57d027ab0d0afa8e17a90f7299 Mon Sep 17 00:00:00 2001 From: Shiny Nematoda Date: Thu, 7 Aug 2025 14:28:52 +0200 Subject: [PATCH 281/495] chore(dep): Update module meilisearch to v0.33 (#8788) Fixes the breakages with the version update... Co-authored-by: Renovate Bot Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8788 Reviewed-by: Gusted Co-authored-by: Shiny Nematoda Co-committed-by: Shiny Nematoda --- go.mod | 2 +- go.sum | 5 +-- .../indexer/issues/meilisearch/meilisearch.go | 14 +++--- .../issues/meilisearch/meilisearch_test.go | 44 ++++++++++--------- 4 files changed, 32 insertions(+), 33 deletions(-) diff --git a/go.mod b/go.mod index 1aeeb7ee63..5c6bd8e22d 100644 --- a/go.mod +++ b/go.mod @@ -73,7 +73,7 @@ require ( github.com/markbates/goth v1.80.0 github.com/mattn/go-isatty v0.0.20 github.com/mattn/go-sqlite3 v1.14.30 - github.com/meilisearch/meilisearch-go v0.31.0 + github.com/meilisearch/meilisearch-go v0.33.0 github.com/mholt/archiver/v3 v3.5.1 github.com/microcosm-cc/bluemonday v1.0.27 github.com/minio/minio-go/v7 v7.0.94 diff --git a/go.sum b/go.sum index 12642b5df1..192384aee5 100644 --- a/go.sum +++ b/go.sum @@ -267,7 +267,6 @@ github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f h1:3BSP1Tbs2djlpprl7w github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f/go.mod h1:Pcatq5tYkCW2Q6yrR2VRHlbHpZ/R4/7qyL1TCF7vl14= github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85 h1:UjoPNDAQ5JPCjlxoJd6K8ALZqSDDhk2ymieAZOVaDg0= github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85/go.mod h1:fR6z1Ie6rtF7kl/vBYMfgD5/G5B1blui7z426/sj2DU= -github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo= @@ -401,8 +400,8 @@ github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebG github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.14.30 h1:bVreufq3EAIG1Quvws73du3/QgdeZ3myglJlrzSYYCY= github.com/mattn/go-sqlite3 v1.14.30/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= -github.com/meilisearch/meilisearch-go v0.31.0 h1:yZRhY1qJqdH8h6GFZALGtkDLyj8f9v5aJpsNMyrUmnY= -github.com/meilisearch/meilisearch-go v0.31.0/go.mod h1:aNtyuwurDg/ggxQIcKqWH6G9g2ptc8GyY7PLY4zMn/g= +github.com/meilisearch/meilisearch-go v0.33.0 h1:vDJtB5Ba5X0XaDmrazDiX89QEpi3zuee5Lvt7FJu7Q0= +github.com/meilisearch/meilisearch-go v0.33.0/go.mod h1:dY4nxhVc0Ext8Kn7u2YohJCsEjirg80DdcOmfNezUYg= github.com/mholt/acmez/v3 v3.1.2 h1:auob8J/0FhmdClQicvJvuDavgd5ezwLBfKuYmynhYzc= github.com/mholt/acmez/v3 v3.1.2/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= diff --git a/modules/indexer/issues/meilisearch/meilisearch.go b/modules/indexer/issues/meilisearch/meilisearch.go index 17a8ba2452..8c83a7f417 100644 --- a/modules/indexer/issues/meilisearch/meilisearch.go +++ b/modules/indexer/issues/meilisearch/meilisearch.go @@ -13,6 +13,7 @@ import ( indexer_internal "forgejo.org/modules/indexer/internal" inner_meilisearch "forgejo.org/modules/indexer/internal/meilisearch" "forgejo.org/modules/indexer/issues/internal" + "forgejo.org/modules/json" "github.com/meilisearch/meilisearch-go" ) @@ -100,7 +101,7 @@ func (b *Indexer) Index(_ context.Context, issues ...*internal.IndexerData) erro return nil } for _, issue := range issues { - _, err := b.inner.Client.Index(b.inner.VersionedIndexName()).AddDocuments(issue) + _, err := b.inner.Client.Index(b.inner.VersionedIndexName()).AddDocuments(issue, nil) if err != nil { return err } @@ -305,18 +306,13 @@ func doubleQuoteKeyword(k string) string { func convertHits(searchRes *meilisearch.SearchResponse) ([]internal.Match, error) { hits := make([]internal.Match, 0, len(searchRes.Hits)) for _, hit := range searchRes.Hits { - hit, ok := hit.(map[string]any) - if !ok { - return nil, ErrMalformedResponse - } - - issueID, ok := hit["id"].(float64) - if !ok { + var issueID int64 + if err := json.Unmarshal(hit["id"], &issueID); err != nil { return nil, ErrMalformedResponse } hits = append(hits, internal.Match{ - ID: int64(issueID), + ID: issueID, }) } return hits, nil diff --git a/modules/indexer/issues/meilisearch/meilisearch_test.go b/modules/indexer/issues/meilisearch/meilisearch_test.go index 7637e8d6b4..810de77046 100644 --- a/modules/indexer/issues/meilisearch/meilisearch_test.go +++ b/modules/indexer/issues/meilisearch/meilisearch_test.go @@ -46,30 +46,34 @@ func TestMeilisearchIndexer(t *testing.T) { } func TestConvertHits(t *testing.T) { - _, err := convertHits(&meilisearch.SearchResponse{ - Hits: []any{"aa", "bb", "cc", "dd"}, - }) - require.ErrorIs(t, err, ErrMalformedResponse) + for _, invalidID := range []string{"\"aa\"", "{\"aa\":\"123\"}", "[\"aa\"]"} { + _, err := convertHits(&meilisearch.SearchResponse{ + Hits: meilisearch.Hits{ + meilisearch.Hit{"id": []byte(invalidID)}, + }, + }) + require.ErrorIs(t, err, ErrMalformedResponse) + } validResponse := &meilisearch.SearchResponse{ - Hits: []any{ - map[string]any{ - "id": float64(11), - "title": "a title", - "content": "issue body with no match", - "comments": []any{"hey what's up?", "I'm currently bowling", "nice"}, + Hits: meilisearch.Hits{ + meilisearch.Hit{ + "id": []byte("11"), + "title": []byte("\"a title\""), + "content": []byte("\"issue body with no match\""), + "comments": []byte("[\"hey what's up?\", \"I'm currently bowling\", \"nice\"]"), }, - map[string]any{ - "id": float64(22), - "title": "Bowling as title", - "content": "", - "comments": []any{}, + meilisearch.Hit{ + "id": []byte("22"), + "title": []byte("\"Bowling as title\""), + "content": []byte("\"\""), + "comments": []byte("[]"), }, - map[string]any{ - "id": float64(33), - "title": "Bowl-ing as fuzzy match", - "content": "", - "comments": []any{}, + meilisearch.Hit{ + "id": []byte("33"), + "title": []byte("\"Bowl-ing as fuzzy match\""), + "content": []byte("\"\""), + "comments": []byte("[]"), }, }, } From a2b73b7b1126fbdfe2722cf6fcd6173a9557f550 Mon Sep 17 00:00:00 2001 From: Robert Wolff Date: Thu, 7 Aug 2025 14:32:55 +0200 Subject: [PATCH 282/495] fix(ui): wrong org dashboard links when switching dashboard context (#8688) Regression of !8239 Closes #8685 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8688 Reviewed-by: floss4good Reviewed-by: Gusted Co-authored-by: Robert Wolff Co-committed-by: Robert Wolff --- models/organization/org_list.go | 8 +++----- models/organization/org_list_test.go | 12 ++++++------ 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/models/organization/org_list.go b/models/organization/org_list.go index e387936473..371993cdee 100644 --- a/models/organization/org_list.go +++ b/models/organization/org_list.go @@ -71,11 +71,8 @@ func GetOrgsCanCreateRepoByUserID(ctx context.Context, userID int64) ([]*Organiz Find(&orgs) } -// MinimalOrg represents a simple organization with only the needed columns -type MinimalOrg = Organization - // GetUserOrgsList returns all organizations the given user has access to -func GetUserOrgsList(ctx context.Context, user *user_model.User) ([]*MinimalOrg, error) { +func GetUserOrgsList(ctx context.Context, user *user_model.User) ([]*Organization, error) { schema, err := db.TableInfo(new(user_model.User)) if err != nil { return nil, err @@ -100,7 +97,7 @@ func GetUserOrgsList(ctx context.Context, user *user_model.User) ([]*MinimalOrg, } columnsStr := selectColumns.String() - var orgs []*MinimalOrg + var orgs []*Organization if err := db.GetEngine(ctx).Select(columnsStr). Table("user"). Where(builder.In("`user`.`id`", queryUserOrgIDs(user.ID, true))). @@ -138,6 +135,7 @@ func GetUserOrgsList(ctx context.Context, user *user_model.User) ([]*MinimalOrg, for _, org := range orgs { org.NumRepos = orgCountMap[org.ID] + org.Type = user_model.UserTypeOrganization } return orgs, nil diff --git a/models/organization/org_list_test.go b/models/organization/org_list_test.go index 170e2bf131..6e8c0bac26 100644 --- a/models/organization/org_list_test.go +++ b/models/organization/org_list_test.go @@ -85,11 +85,11 @@ func TestGetUserOrgsList(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) orgs, err := organization.GetUserOrgsList(db.DefaultContext, &user_model.User{ID: 4}) require.NoError(t, err) - if assert.Len(t, orgs, 1) { - assert.EqualValues(t, 3, orgs[0].ID) - // repo_id: 3 is in the team, 32 is public, 5 is private with no team - assert.Equal(t, 2, orgs[0].NumRepos) - } + assert.Len(t, orgs, 1) + assert.EqualValues(t, 3, orgs[0].ID) + // repo_id: 3 is in the team, 32 is public, 5 is private with no team + assert.Equal(t, 2, orgs[0].NumRepos) + assert.Equal(t, user_model.UserTypeOrganization, orgs[0].Type) } func TestGetUserOrgsListSorting(t *testing.T) { @@ -97,7 +97,7 @@ func TestGetUserOrgsListSorting(t *testing.T) { orgs, err := organization.GetUserOrgsList(db.DefaultContext, &user_model.User{ID: 1}) require.NoError(t, err) - isSorted := slices.IsSortedFunc(orgs, func(a, b *organization.MinimalOrg) int { + isSorted := slices.IsSortedFunc(orgs, func(a, b *organization.Organization) int { return strings.Compare(strings.ToLower(a.Name), strings.ToLower(b.Name)) }) From c0a1a604e6fce51c1770b7fbb8c97d62f3b4f1ad Mon Sep 17 00:00:00 2001 From: Codeberg Translate Date: Thu, 7 Aug 2025 14:01:05 +0000 Subject: [PATCH 283/495] i18n: update of translations from Codeberg Translate Co-authored-by: 0ko <0ko@noreply.codeberg.org> Co-authored-by: Benedikt Straub Co-authored-by: Codeberg Translate Co-authored-by: Dirk Co-authored-by: Edgarsons Co-authored-by: Fjuro Co-authored-by: Gusted Co-authored-by: Ikuyo Co-authored-by: Juno Takano Co-authored-by: Lzebulon Co-authored-by: SomeTr Co-authored-by: Vaibhav Sunder Co-authored-by: Vyxie Co-authored-by: Wuzzy Co-authored-by: earl-warren Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/cs/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/de/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/fil/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/fr/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/lv/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/nds/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/pt_BR/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/ru/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/uk/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/fr/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/hi/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/nl/ Translation: Forgejo/forgejo Translation: Forgejo/forgejo-next --- options/locale/locale_fr-FR.ini | 4 +- options/locale/locale_hi.ini | 60 ++++++++++++++++++++++++++- options/locale/locale_nl-NL.ini | 12 +++--- options/locale_next/locale_cs-CZ.json | 7 +++- options/locale_next/locale_de-DE.json | 6 ++- options/locale_next/locale_fil.json | 6 ++- options/locale_next/locale_fr-FR.json | 6 ++- options/locale_next/locale_lv-LV.json | 6 ++- options/locale_next/locale_nds.json | 6 ++- options/locale_next/locale_pt-BR.json | 3 +- options/locale_next/locale_ru-RU.json | 6 ++- options/locale_next/locale_uk-UA.json | 6 ++- 12 files changed, 110 insertions(+), 18 deletions(-) diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 90b7048df7..d1f9b805cf 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -773,7 +773,7 @@ language=Langue ui=Thème hidden_comment_types=Catégories de commentaires masqués hidden_comment_types_description=Cochez les catégories suivantes pour masquer les commentaires correspondants des fils d'activité. Par exemple, « Label » cache les commentaires du genre « Cerise a attribué le label Bug il y a 2 heures». -hidden_comment_types.ref_tooltip=Commentaires où ce ticket a été référencé sur un autre ticket, révision, etc. +hidden_comment_types.ref_tooltip=Commentaires où ce ticket a été référencé sur un autre ticket/révision/… hidden_comment_types.issue_ref_tooltip=Commentaires où l’utilisateur change la branche/étiquette associée au ticket comment_type_group_reference=Référence comment_type_group_label=Label @@ -2027,7 +2027,7 @@ milestones.filter_sort.most_issues=Le plus de tickets milestones.filter_sort.least_issues=Le moins de tickets signing.will_sign=Cette révision sera signée avec la clé « %s ». -signing.wont_sign.error=Impossible de vérifier la signature de la révision. +signing.wont_sign.error=Une erreur s'est produite lors des vérifications préliminaires à la signature de la révision. signing.wont_sign.nokey=Aucune clé n’est disponible sur cette instance pour signer cette révision. signing.wont_sign.never=Les révisions ne sont jamais signées. signing.wont_sign.always=Les révisions sont toujours signées. diff --git a/options/locale/locale_hi.ini b/options/locale/locale_hi.ini index 2f75c8d13e..c95c13df4d 100644 --- a/options/locale/locale_hi.ini +++ b/options/locale/locale_hi.ini @@ -39,4 +39,62 @@ organization = संगठन mirror = छवि settings = सेटिंग्स your_settings = आपकी सेटिंग्स -return_to_forgejo = फ़ोर्जेगो पे वापस जाएं \ No newline at end of file +return_to_forgejo = फ़ोर्जेगो पे वापस जाएं +access_token = एक्सेस टोकन +webauthn_insert_key = अपनी सिक्योरिटी की डालें +webauthn_press_button = अपनी सिक्योरिटी की पर बटन दबाएं… +webauthn_use_twofa = अपने फ़ोन से दो फैक्टर कोड लाएं +webauthn_unsupported_browser = आपका ब्राउज़र वेबौथ सपोर्ट नहीं करता। +webauthn_error_unknown = कोई अंजान एरर हुई, फिर से कोशिश करें। +webauthn_error_unable_to_process = सर्वर आपकी रिक्वेस्ट प्रोसेस नहीं कर पाया। +webauthn_error_empty = कृपया इस चाभी का नाम रखें। +webauthn_error_timeout = आपकी की पढ़ने से पहले टाइमआउट हो गया। पृष्ट रीलोड करें और फिर कोशिश करें। +new_project = नया प्रोजेक्ट +test = टेस्ट +locked = लॉक्ड +copy = कॉपी +copy_generic = क्लिपबोर्ड पर कॉपी करें +copy_url = URL कॉपी करें +copy_hash = कॉपी हैश +copy_path = राह कॉपी करें +admin_panel = वेबसाइट प्रबंधन +your_profile = प्रोफाइल +your_starred = सीतारित +new_mirror = नया मिरर +new_fork = नयी रिपॉजिटरी फोर्क +all = सब +sources = स्रोत +new_project_column = नया स्तम्भ +mirrors = मिर्रोर्स +toggle_menu = चालू-बंद करें +add_all = सब जोड़ें +remove_all = सारा हटाएं +new_org.title = नई संस्था +new_repo.link = नई रिपॉजिटरी +new_migrate.link = नया प्रवासन +new_org.link = नई संस्था +collaborative = सहयोगी +forks = फोर्क्स +issues = इश्यूज +milestones = महत्वपूर्ण +ok = ओके +cancel = रद्द करें +retry = फिर से करें +rerun = फिर से +save = सेव करें +add = जोड़ें +remove = हटाएं +remove_label_str = हटाएं आइटम “%s” +edit = संपादित करना +view = देखें +disabled = असक्षम किया गया +webauthn_sign_in = सिक्योरिटी की का बटन दबाएं, नहीं है तो फिर से प्लग करें। +webauthn_error_insecure = वेबौथ पर सिर्फ सुरक्षित कनेक्शन हो. HTTP टेस्ट के लिए ओरिजिन “लोकलहोस्ट” या “127.0.0.1” +new_repo.title = नई रिपॉजिटरी +pull_requests = पुल्ल करें +enabled = सक्षम किया गया +webauthn_error = सिक्योरिटी की रीड नहीं हो पा रही। +webauthn_error_duplicated = सिक्योरिटी की इस रिक्वेस्ट के लिए नहीं है। कृपया देखें की पहले से रजिस्टर्ड तो नहीं। +new_migrate.title = नया प्रवासन +activities = गतिविधियाँ +rerun_all = फिर से सारे काम करें \ No newline at end of file diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index d547b5bf77..3f354fe163 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -343,7 +343,7 @@ invalid_db_table = De database tabel "%s" is ongeldig: %v allow_dots_in_usernames = Sta gebruikers toe om punten te gebruiken in hun gebruikersnaam. Heeft geen invloed op bestaande accounts. enable_update_checker = Updatecontrole inschakelen invalid_password_algorithm = Ongeldig wachtwoord hash-algoritme -password_algorithm_helper = Stel het hashing-algoritme voor wachtwoorden in. De algoritmes hebben verschillende vereisten en sterkte. Het argon2-algoritme is tamelijk veilig, maar gebruikt veel geheugen en kan ongeschikt zijn voor kleine systemen. +password_algorithm_helper = Stel het hashing-algoritme voor wachtwoorden in. De algoritmes hebben verschillende vereisten en sterktes. Het argon2-algoritme is tamelijk veilig, maar gebruikt veel geheugen en kan ongeschikt zijn voor kleine systemen. run_user_helper = De gebruikersnaam van het besturingssysteem waaronder Forgejo draait. Merk op dat deze gebruiker toegang moet hebben tot de hoofdmap van de repository. require_sign_in_view.description = Beperk de inhoudstoegang tot aangemelde gebruikers. Bezoekers kunnen alleen de verificatiepagina's bezoeken. enable_update_checker_helper_forgejo = Het zal periodiek controleren op nieuwe Forgejo-versies door een TXT DNS-record op release.forgejo.org te controleren. @@ -815,7 +815,7 @@ activate_email=Stuur activatie activations_pending=Activaties in behandeling delete_email=Verwijder email_deletion=Verwijder e-mailadres -email_deletion_desc=Het e-mailadres en verwante informatie worden verwijderd uit je account. Git commits van dit e-mailadres blijven ongewijzigd. Wil je doorgaan? +email_deletion_desc=Dit e-mailadres en verwante informatie worden verwijderd uit je account. Git commits van dit e-mailadres blijven ongewijzigd. Wil je doorgaan? email_deletion_success=Het e-mailadres is verwijderd. theme_update_success=Je thema is bijgewerkt. theme_update_error=Het geselecteerde thema bestaat niet. @@ -1222,7 +1222,7 @@ migrate_items_releases=Releases migrate_repo=Migreer repository migrate.clone_address=Migreer / kloon van URL migrate.clone_address_desc=De HTTP(S) of Git "kloon" URL van een bestaande repository -migrate.github_token_desc=Je kunt hier een of meerdere tokens met komma gescheiden plaatsen om sneller te migreren door de GitHub API limiet te beperken. WAARSCHUWING: Het misbruik van deze functie kan in strijd zijn met het beleid van de serviceprovider en leiden tot het blokkeren van rekeningen. +migrate.github_token_desc=U kunt hier een of meer tokens plaatsen, gescheiden door komma's, om de migratie te versnellen door de GitHub API-limiet te omzeilen. WAARSCHUWING: Misbruik van deze functie kan in strijd zijn met het beleid van de serviceprovider en kan ertoe leiden dat uw account(s) worden geblokkeerd. migrate.clone_local_path=of een lokaal pad migrate.permission_denied=U bent niet gemachtigd om deze lokale repositories te importeren. migrate.permission_denied_blocked=Je kunt niet importeren uit niet-toegestane hosts, vraag de beheerder om de instellingen ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS te controleren. @@ -2495,7 +2495,7 @@ issues.label_archive = Label archiveren issues.label_exclusive_warning = Eventuele conflicterende scoped labels worden verwijderd bij het bewerken van de labels van een issue of pull request. issues.unpin_comment = ontpind dit %s pulls.show_changes_since_your_last_review = Wijzigingen weergeven sinds je laatste beoordeling -mirror_address_url_invalid = De opgegeven URL is ongeldig. Je moet alle componenten van de URL correct escapen. +mirror_address_url_invalid = De opgegeven URL is ongeldig. Zorg ervoor dat de onderdelen van de URL correct worden geëscape. desc.sha256 = SHA256 form.name_reserved = De repository naam "%s" is gereserveerd. form.name_pattern_not_allowed = Het patroon "%s" is niet toegestaan in een repository naam. @@ -2538,7 +2538,7 @@ editor.directory_is_a_file = Mapnaam "%s" wordt al gebruikt als bestandsnaam in commits.renamed_from = Hernoemd van %s projects.card_type.desc = Kaart voorbeeld pulls.filter_changes_by_commit = Filter op commit -pulls.nothing_to_compare_have_tag = De geselecteerde branch/tag zijn gelijk. +pulls.nothing_to_compare_have_tag = De geselecteerde branches/tags zijn gelijk. pulls.merged_success = Pull request succesvol samengevoegd en gesloten pulls.closed = Pull request gesloten pulls.merged_info_text = De branch %s kan nu verwijderd worden. @@ -2557,7 +2557,7 @@ signing.wont_sign.parentsigned = De vastlegging zal niet ondertekend worden, omd signing.wont_sign.headsigned = De samenvoeging zal niet ondertekend worden, omdat de hoofd commit niet ondertekend is. signing.wont_sign.commitssigned = De samenvoeging zal niet getekend worden, omdat alle geassocieerde commits niet getekend zijn. signing.wont_sign.never = Commits worden nooit ondertekend. -signing.wont_sign.error = Er is een fout opgetreden tijdens het controleren of de commit ondertekend kon worden. +signing.wont_sign.error = Er is een fout opgetreden bij het controleren of de commit kon worden ondertekend. signing.will_sign = Deze commit wordt ondertekend met sleutel "%s". milestones.filter_sort.latest_due_date = Uiterste vervaldatum milestones.filter_sort.earliest_due_data = Dichtstbijzijnde vervaldatum diff --git a/options/locale_next/locale_cs-CZ.json b/options/locale_next/locale_cs-CZ.json index 8de6c46ad8..e7ea7df21b 100644 --- a/options/locale_next/locale_cs-CZ.json +++ b/options/locale_next/locale_cs-CZ.json @@ -118,5 +118,10 @@ "admin.moderation.moderation_reports": "Hlášení moderace", "admin.moderation.reports": "Hlášení", "admin.moderation.deleted_content_ref": "Nahlášený obsah s typem %[1]v a ID %[2]d již neexistuje", - "admin.moderation.no_open_reports": "Momentálně nejsou otevřena žádná hlášení." + "admin.moderation.no_open_reports": "Momentálně nejsou otevřena žádná hlášení.", + "admin.dashboard.remove_resolved_reports": "Odstranit vyřešená hlášení", + "compare.branches.title": "Porovnat větve", + "repo.commit.load_tags_failed": "Načtení značek selhalo z důvodu interní chyby", + "admin.auths.allow_username_change": "Povolit změnu uživatelského jména", + "admin.auths.allow_username_change.description": "Povolit uživatelům změnit své uživatelské jméno v nastavení profilu" } diff --git a/options/locale_next/locale_de-DE.json b/options/locale_next/locale_de-DE.json index 59e12c2ea8..1e4d843001 100644 --- a/options/locale_next/locale_de-DE.json +++ b/options/locale_next/locale_de-DE.json @@ -111,5 +111,9 @@ "admin.moderation.moderation_reports": "Moderationsmeldungen", "admin.moderation.reports": "Meldungen", "admin.moderation.no_open_reports": "Es gibt momentan keine offenen Meldungen.", - "admin.dashboard.remove_resolved_reports": "Erledigte Meldungen entfernen" + "admin.dashboard.remove_resolved_reports": "Erledigte Meldungen entfernen", + "compare.branches.title": "Branches vergleichen", + "repo.commit.load_tags_failed": "Laden von Tags aufgrund eines internen Fehlers fehlgeschlagen", + "admin.auths.allow_username_change": "Erlaube Benutzernamenswechsel", + "admin.auths.allow_username_change.description": "Erlaube Benutzern, ihren Benutzernamen in den Profileinstellungen zu ändern" } diff --git a/options/locale_next/locale_fil.json b/options/locale_next/locale_fil.json index c07a6b152f..1b9eb4c85a 100644 --- a/options/locale_next/locale_fil.json +++ b/options/locale_next/locale_fil.json @@ -111,5 +111,9 @@ "admin.moderation.no_open_reports": "Kasalukuyang walang mga nakabukas na ulat.", "admin.moderation.reports": "Mga ulat", "admin.moderation.deleted_content_ref": "Hindi na umiiral ang inulat na nilalaman na may uri na %[1]v at ID %[2]d", - "admin.dashboard.remove_resolved_reports": "Tanggalin ang mga naresolbang ulat" + "admin.dashboard.remove_resolved_reports": "Tanggalin ang mga naresolbang ulat", + "compare.branches.title": "Ikumpara ang mga branch", + "repo.commit.load_tags_failed": "Nabigo ang pag-load ng mga tag dahil sa isang panloob na error", + "admin.auths.allow_username_change": "Payagan ang pagpalit ng username", + "admin.auths.allow_username_change.description": "Payagan ang mga user na palitan ang kanilang username sa mga setting ng profile" } diff --git a/options/locale_next/locale_fr-FR.json b/options/locale_next/locale_fr-FR.json index 97b2f1733a..9c2af655a0 100644 --- a/options/locale_next/locale_fr-FR.json +++ b/options/locale_next/locale_fr-FR.json @@ -110,5 +110,9 @@ "profile.actions.tooltip": "Plus d'actions", "profile.edit.link": "Éditer le profil", "keys.ssh.link": "Clé SSH", - "keys.gpg.link": "Clés GPG" + "keys.gpg.link": "Clés GPG", + "compare.branches.title": "Comparer les branches", + "repo.settings.push_mirror.branch_filter.description": "Branches a répliquer. Laisser vide pour répliquer toutes les branches. Voir la documentation %[2] pour la syntaxe. Exemples: main, release/*", + "mail.actions.run_info_sha": "Commit: %[1]s", + "admin.moderation.deleted_content_ref": "Le signalement avec le type %[1]v et l'identifiant %[2]d n'existe plus." } diff --git a/options/locale_next/locale_lv-LV.json b/options/locale_next/locale_lv-LV.json index bf6e4729b3..e0ded3a53b 100644 --- a/options/locale_next/locale_lv-LV.json +++ b/options/locale_next/locale_lv-LV.json @@ -119,5 +119,9 @@ "admin.moderation.moderation_reports": "Satura pārraudzības pārskati", "admin.moderation.reports": "Pārskati", "admin.moderation.deleted_content_ref": "Saturs, par kuru ziņots, ar veidu %[1]v un Id %[2]d vairs nepastāv", - "admin.dashboard.remove_resolved_reports": "Noņemt atrisinātos ziņojumus" + "admin.dashboard.remove_resolved_reports": "Noņemt atrisinātos ziņojumus", + "compare.branches.title": "Salīdzināt zarus", + "admin.auths.allow_username_change": "Atļaut lietotājvārda mainīšanu", + "repo.commit.load_tags_failed": "Birku ielādēšana neizdevās iekšējas kļūdas dēļ", + "admin.auths.allow_username_change.description": "Ļaut lietotājiem profila iestatījumos mainīt savu lietotājvārdu" } diff --git a/options/locale_next/locale_nds.json b/options/locale_next/locale_nds.json index 66c70939f4..9c6505b49e 100644 --- a/options/locale_next/locale_nds.json +++ b/options/locale_next/locale_nds.json @@ -111,5 +111,9 @@ "admin.moderation.no_open_reports": "Dat gifft jüüst keene open Berichten.", "admin.moderation.reports": "Berichten", "admin.moderation.deleted_content_ref": "Mellt Inholl mit Aard %[1]v un Kennteken %[2]d gifft dat nich mehr", - "admin.dashboard.remove_resolved_reports": "Lööst Berichten wegdoon" + "admin.dashboard.remove_resolved_reports": "Lööst Berichten wegdoon", + "compare.branches.title": "Twiegen verglieken", + "repo.commit.load_tags_failed": "Kunn de Markens um eenen binnern Fehler nich laden", + "admin.auths.allow_username_change.description": "Verlööv Brukers, hör Brukernaam in de Profil-Instellens to ännern", + "admin.auths.allow_username_change": "Brukernaam-Ännern verlöven" } diff --git a/options/locale_next/locale_pt-BR.json b/options/locale_next/locale_pt-BR.json index 74dd2c4b83..a2fb841c39 100644 --- a/options/locale_next/locale_pt-BR.json +++ b/options/locale_next/locale_pt-BR.json @@ -119,5 +119,6 @@ "admin.moderation.moderation_reports": "Denúncias para moderação", "admin.moderation.reports": "Denúncias", "admin.moderation.no_open_reports": "Não há denúncias abertas atualmente.", - "admin.dashboard.remove_resolved_reports": "Remover denúncias resolvidas" + "admin.dashboard.remove_resolved_reports": "Remover denúncias resolvidas", + "compare.branches.title": "Comparar branches" } diff --git a/options/locale_next/locale_ru-RU.json b/options/locale_next/locale_ru-RU.json index e15c8ffa27..0838e9063e 100644 --- a/options/locale_next/locale_ru-RU.json +++ b/options/locale_next/locale_ru-RU.json @@ -119,5 +119,9 @@ "admin.moderation.deleted_content_ref": "Содержимое типа %[1]v и ид. %[2]d, на которое пожаловались, более не существует", "admin.moderation.reports": "Жалобы", "admin.moderation.no_open_reports": "Нет открытых жалоб.", - "admin.dashboard.remove_resolved_reports": "Удалить разрешённые жалобы" + "admin.dashboard.remove_resolved_reports": "Удалить разрешённые жалобы", + "compare.branches.title": "Сравнение ветвей", + "repo.commit.load_tags_failed": "Загрузка тегов не удалась из-за внутренней ошибки", + "admin.auths.allow_username_change.description": "Пользователи смогут изменять свои имена после регистрации", + "admin.auths.allow_username_change": "Разрешить смену имён" } diff --git a/options/locale_next/locale_uk-UA.json b/options/locale_next/locale_uk-UA.json index 8c8ade33c9..dc410f29a2 100644 --- a/options/locale_next/locale_uk-UA.json +++ b/options/locale_next/locale_uk-UA.json @@ -119,5 +119,9 @@ "admin.moderation.reports": "Скарги", "admin.moderation.deleted_content_ref": "Вміст типу %[1]v з ідентифікатором %[2]d, на який подано скаргу, більше не існує", "admin.moderation.moderation_reports": "Скарги модераторам", - "admin.dashboard.remove_resolved_reports": "Видалити закриті скарги" + "admin.dashboard.remove_resolved_reports": "Видалити закриті скарги", + "compare.branches.title": "Порівняти гілки", + "repo.commit.load_tags_failed": "Завантаження тегів не вдалося через внутрішню помилку", + "admin.auths.allow_username_change.description": "Дозволити користувачам змінювати ім'я користувача в налаштуваннях профілю", + "admin.auths.allow_username_change": "Дозволити змінювати імена" } From 4e2908ff9d3643c40eb4c85a36c9cfa83b7dadc8 Mon Sep 17 00:00:00 2001 From: viceice Date: Fri, 8 Aug 2025 01:43:32 +0200 Subject: [PATCH 284/495] ci: fix mariadb path (#8815) Ref: forgejo/forgejo#8810 https://hub.docker.com/_/mariadb#where-to-store-data Signed-off-by: viceice Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8815 Reviewed-by: Gusted Co-authored-by: viceice Co-committed-by: viceice --- .forgejo/workflows/testing-integration.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/testing-integration.yml b/.forgejo/workflows/testing-integration.yml index bf0ebbf0e9..6822c45f39 100644 --- a/.forgejo/workflows/testing-integration.yml +++ b/.forgejo/workflows/testing-integration.yml @@ -83,7 +83,7 @@ jobs: env: MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: yes MARIADB_DATABASE: testgitea - options: --tmpfs /mariadb/data:noatime + options: --tmpfs /var/lib/mysql:noatime steps: - uses: https://data.forgejo.org/actions/checkout@v4 - uses: ./.forgejo/workflows-composite/setup-env From c872758c054b6a04b90fdb307c996aeb746d3684 Mon Sep 17 00:00:00 2001 From: BtbN Date: Fri, 8 Aug 2025 01:51:55 +0200 Subject: [PATCH 285/495] feat: improve `mysqlGetNextResourceIndex` to use modern MariaDB features (#8691) MariaDB supports "INSERT ... RETURNING ..." since 10.5.0, so this patch makes `mysqlGetNextResourceIndex` use that, provided the query is run on MariaDB of a sufficient version. If it's not supported it proceeds as it always did. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8691 Reviewed-by: Gusted Co-authored-by: BtbN Co-committed-by: BtbN --- models/db/index.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/models/db/index.go b/models/db/index.go index 4c15dbe8a1..c069f0febd 100644 --- a/models/db/index.go +++ b/models/db/index.go @@ -72,14 +72,19 @@ func postgresGetNextResourceIndex(ctx context.Context, tableName string, groupID } func mysqlGetNextResourceIndex(ctx context.Context, tableName string, groupID int64) (int64, error) { - if _, err := GetEngine(ctx).Exec(fmt.Sprintf("INSERT INTO %s (group_id, max_index) "+ - "VALUES (?,1) ON DUPLICATE KEY UPDATE max_index = max_index+1", - tableName), groupID); err != nil { + res, err := GetEngine(ctx).Query(fmt.Sprintf("INSERT INTO %s (group_id, max_index) "+ + "VALUES (?,1) ON DUPLICATE KEY UPDATE max_index = max_index+1 /*M!100500 RETURNING max_index */", + tableName), groupID) + if err != nil { return 0, err } + if len(res) > 0 { + return strconv.ParseInt(string(res[0]["max_index"]), 10, 64) + } + var idx int64 - _, err := GetEngine(ctx).SQL(fmt.Sprintf("SELECT max_index FROM %s WHERE group_id = ?", tableName), groupID).Get(&idx) + _, err = GetEngine(ctx).SQL(fmt.Sprintf("SELECT max_index FROM %s WHERE group_id = ?", tableName), groupID).Get(&idx) if err != nil { return 0, err } From 72bac983657c561b0318d908ecbaae3959d7a81e Mon Sep 17 00:00:00 2001 From: Gusted Date: Fri, 8 Aug 2025 01:53:23 +0200 Subject: [PATCH 286/495] feat: require `data-modal-id` for delete buttons (#8711) All instances should have a `data-modal-id` now. Throw a user-friendly error if this is not the case (custom templates, or missed cases). Checked via `rg -P -e '^(?=.*delete-button)' | grep -v "data-modal-id"` Removed two instances of delete modals and one case of simplified logic. ## Rationale I am currently surveying the existing modals in Forgejo in the context of eventually replacing the modals implementation with our own modal implementation. This refactor fixes one of the many inconsistencies that the current usage of modals has. It should explicitly specify which modal should be used to avoids any problems if new modals are introduced on the page (for example via https://codeberg.org/forgejo/forgejo/pulls/8662). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8711 Reviewed-by: oliverpool Co-authored-by: Gusted Co-committed-by: Gusted --- templates/admin/auth/edit.tmpl | 4 ++-- templates/admin/emails/list.tmpl | 4 ++-- templates/admin/packages/list.tmpl | 4 ++-- templates/admin/repo/list.tmpl | 4 ++-- templates/admin/stacktrace-row.tmpl | 2 +- templates/admin/stacktrace.tmpl | 2 +- templates/org/settings/delete.tmpl | 4 ++-- templates/org/team/new.tmpl | 4 ++-- templates/projects/list.tmpl | 4 ++-- templates/projects/view.tmpl | 4 ++-- templates/repo/branch/list.tmpl | 4 ++-- templates/repo/issue/labels/edit_delete_label.tmpl | 2 +- templates/repo/issue/labels/label_list.tmpl | 7 ++----- templates/repo/issue/milestones.tmpl | 4 ++-- templates/repo/issue/view_content.tmpl | 2 +- templates/repo/issue/view_content/pull.tmpl | 4 ++-- templates/repo/release/list.tmpl | 13 ------------- templates/repo/release/new.tmpl | 4 ++-- templates/repo/settings/branches.tmpl | 4 ++-- templates/repo/settings/collaboration.tmpl | 6 +++--- templates/repo/settings/deploy_keys.tmpl | 4 ++-- templates/repo/settings/webhook/base_list.tmpl | 2 +- templates/repo/settings/webhook/delete_modal.tmpl | 2 +- templates/repo/tag/list.tmpl | 4 ++-- templates/repo/wiki/view.tmpl | 4 ++-- templates/shared/actions/runner_edit.tmpl | 2 +- templates/user/dashboard/milestones.tmpl | 11 ----------- templates/webhook/shared-settings.tmpl | 2 +- web_src/js/features/common-global.js | 9 +++++---- 29 files changed, 50 insertions(+), 76 deletions(-) diff --git a/templates/admin/auth/edit.tmpl b/templates/admin/auth/edit.tmpl index 11be03acc5..d4eaa29117 100644 --- a/templates/admin/auth/edit.tmpl +++ b/templates/admin/auth/edit.tmpl @@ -404,7 +404,7 @@
    - +
    @@ -421,7 +421,7 @@

    -

    - {{ctx.Locale.Tr (printf "repo.migrate.%s.description" .Name)}} + {{if eq .Name "pagure"}} + {{ctx.Locale.Tr "migrate.pagure.description"}} + {{else}} + {{ctx.Locale.Tr (printf "repo.migrate.%s.description" .Name)}} + {{end}}
    diff --git a/tests/integration/repo_migration_ui_test.go b/tests/integration/repo_migration_ui_test.go index 279e9861fe..55a58e5f0b 100644 --- a/tests/integration/repo_migration_ui_test.go +++ b/tests/integration/repo_migration_ui_test.go @@ -1,4 +1,4 @@ -// Copyright 2024 The Forgejo Authors. All rights reserved. +// Copyright 2024-2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: GPL-3.0-or-later package integration @@ -6,15 +6,18 @@ package integration import ( "fmt" "net/http" + "strings" "testing" + "forgejo.org/modules/translation" "forgejo.org/tests" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" ) -// TestRepoMigrationUI is used to test various form properties of different migration types +// TestRepoMigrationUI is used to test various form properties of different +// migration types on /repo/migrate?service_type=%d func TestRepoMigrationUI(t *testing.T) { defer tests.PrepareTestEnv(t)() session := loginUser(t, "user1") @@ -103,3 +106,26 @@ func testRepoMigrationFormItems(t *testing.T, items *goquery.Selection, expected assert.Equal(t, expectedName, name) } } + +// TestRepoMigrationTypeSelect is a simple content test for page /repo/migrate +// where migration source type is selected +func TestRepoMigrationTypeSelect(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + session := loginUser(t, "user1") + locale := translation.NewLocale("en-US") + + page := NewHTMLParser(t, session.MakeRequest(t, NewRequest(t, "GET", "/repo/migrate"), http.StatusOK).Body) + headers := page.Find(".migrate-entry h3").Text() + descriptions := page.Find(".migrate-entry .description").Text() + + sourceNames := []string{"github", "gitea", "gitlab", "gogs", "onedev", "gitbucket", "codebase", "forgejo"} + for _, sourceName := range sourceNames { + assert.Contains(t, strings.ToLower(headers), sourceName) + assert.Contains(t, descriptions, locale.Tr(fmt.Sprintf("repo.migrate.%s.description", sourceName))) + } + + // Special case + assert.Contains(t, strings.ToLower(headers), "pagure") + assert.Contains(t, descriptions, locale.Tr("migrate.pagure.description")) // Not prefixed with repo. +} From ecda48307d80e26a6a3d824b6fa5cfcfff810b0e Mon Sep 17 00:00:00 2001 From: Shiny Nematoda Date: Sat, 23 Aug 2025 13:06:41 +0200 Subject: [PATCH 348/495] fix(code-search): fix broken pagination. (#9000) Missing parameters for: - repo: path and mode - user: mode - explore: mode resolves forgejo/forgejo!8997 and codeberg/community!2098 ## Release notes - Bug fixes - [PR](https://codeberg.org/forgejo/forgejo/pulls/9000): fix(code-search): fix broken pagination. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9000 Reviewed-by: Earl Warren Co-authored-by: Shiny Nematoda Co-committed-by: Shiny Nematoda --- routers/web/explore/code.go | 1 + routers/web/repo/search.go | 2 ++ routers/web/user/code.go | 1 + tests/integration/repo_search_test.go | 42 +++++++++++++++++++++++++-- 4 files changed, 44 insertions(+), 2 deletions(-) diff --git a/routers/web/explore/code.go b/routers/web/explore/code.go index f0b12e9142..6697755c22 100644 --- a/routers/web/explore/code.go +++ b/routers/web/explore/code.go @@ -147,6 +147,7 @@ func Code(ctx *context.Context) { pager := context.NewPagination(total, setting.UI.RepoSearchPagingNum, page, 5) pager.SetDefaultParams(ctx) pager.AddParam(ctx, "l", "Language") + pager.AddParam(ctx, "mode", "CodeSearchMode") ctx.Data["Page"] = pager ctx.HTML(http.StatusOK, tplExploreCode) diff --git a/routers/web/repo/search.go b/routers/web/repo/search.go index 1671378a3b..ad10542c01 100644 --- a/routers/web/repo/search.go +++ b/routers/web/repo/search.go @@ -165,6 +165,8 @@ func Search(ctx *context.Context) { pager := context.NewPagination(total, setting.UI.RepoSearchPagingNum, page, 5) pager.SetDefaultParams(ctx) pager.AddParam(ctx, "l", "Language") + pager.AddParam(ctx, "mode", "CodeSearchMode") + pager.AddParam(ctx, "path", "CodeSearchPath") ctx.Data["Page"] = pager ctx.HTML(http.StatusOK, tplSearch) diff --git a/routers/web/user/code.go b/routers/web/user/code.go index ac1852e410..b5c5e54953 100644 --- a/routers/web/user/code.go +++ b/routers/web/user/code.go @@ -131,6 +131,7 @@ func CodeSearch(ctx *context.Context) { pager := context.NewPagination(total, setting.UI.RepoSearchPagingNum, page, 5) pager.SetDefaultParams(ctx) pager.AddParam(ctx, "l", "Language") + pager.AddParam(ctx, "mode", "CodeSearchMode") ctx.Data["Page"] = pager ctx.HTML(http.StatusOK, tplUserCode) diff --git a/tests/integration/repo_search_test.go b/tests/integration/repo_search_test.go index aaaa4618cf..b145d9f427 100644 --- a/tests/integration/repo_search_test.go +++ b/tests/integration/repo_search_test.go @@ -5,6 +5,7 @@ package integration import ( "net/http" + "net/url" "testing" "forgejo.org/models/db" @@ -92,8 +93,8 @@ func testSearchRepo(t *testing.T, indexer bool) { testSearch(t, "/user2/glob/search?q=file5&page=1&mode=exact", []string{}, indexer) } -func testSearch(t *testing.T, url string, expected []string, indexer bool) { - req := NewRequest(t, "GET", url) +func testSearch(t *testing.T, rawURL string, expected []string, indexer bool) { + req := NewRequest(t, "GET", rawURL) resp := MakeRequest(t, req, http.StatusOK) doc := NewHTMLParser(t, resp.Body) @@ -119,4 +120,41 @@ func testSearch(t *testing.T, url string, expected []string, indexer bool) { filenames := resultFilenames(t, doc) assert.ElementsMatch(t, expected, filenames) + + testSearchPagination(t, rawURL, doc) +} + +// Tests that the variables set in the url persist for all the paginated links +func testSearchPagination(t *testing.T, rawURL string, doc *HTMLDoc) { + original, err := queryFromStr(rawURL) + require.NoError(t, err) + + hrefs := doc. + Find(".pagination.menu a[href]:not(.disabled)"). + Map(func(i int, el *goquery.Selection) string { + attr, ok := el.Attr("href") + require.True(t, ok) + return attr + }) + query := make([]url.Values, len(hrefs)) + for i, href := range hrefs { + query[i], err = queryFromStr(href) + require.NoError(t, err) + } + + for key := range original { + for i, q := range query { + assert.Equal(t, original.Get(key), q.Get(key), + "failed at index '%d' with url '%v'", i, hrefs[i]) + } + } +} + +func queryFromStr(rawURL string) (url.Values, error) { + u, err := url.Parse(rawURL) + if err != nil { + return nil, err + } + + return url.ParseQuery(u.RawQuery) } From 1dacb0b1beb7ad599de561909b6547329da73c29 Mon Sep 17 00:00:00 2001 From: Codeberg Translate Date: Sun, 24 Aug 2025 08:22:25 +0000 Subject: [PATCH 349/495] i18n: update of translations from Codeberg Translate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 0ko <0ko@noreply.codeberg.org> Co-authored-by: Codeberg Translate Co-authored-by: Fjuro Co-authored-by: Languages add-on Co-authored-by: Priit Jõerüüt Co-authored-by: SomeTr Co-authored-by: brano Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/ru/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/sk/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo-next/uk/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/cs/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/et/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/ru/ Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/sk/ Translation: Forgejo/forgejo Translation: Forgejo/forgejo-next --- options/locale/locale_cs-CZ.ini | 2 +- options/locale/locale_et.ini | 17 ++- options/locale/locale_ru-RU.ini | 4 +- options/locale/locale_sk-SK.ini | 161 +++++++++++++++++++++++++- options/locale_next/locale_eu.json | 1 + options/locale_next/locale_ga.json | 1 + options/locale_next/locale_he.json | 1 + options/locale_next/locale_jbo.json | 1 + options/locale_next/locale_ka.json | 1 + options/locale_next/locale_ro.json | 1 + options/locale_next/locale_ru-RU.json | 2 +- options/locale_next/locale_sk-SK.json | 132 ++++++++++++++++++++- options/locale_next/locale_uk-UA.json | 4 +- 13 files changed, 316 insertions(+), 12 deletions(-) create mode 100644 options/locale_next/locale_eu.json create mode 100644 options/locale_next/locale_ga.json create mode 100644 options/locale_next/locale_he.json create mode 100644 options/locale_next/locale_jbo.json create mode 100644 options/locale_next/locale_ka.json create mode 100644 options/locale_next/locale_ro.json diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index 3935a75ecc..de2b211922 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -2744,7 +2744,7 @@ migrate.forgejo.description = Migrovat data z codeberg.org nebo jiných instanc mirror_sync = synchronizováno blame.ignore_revs = Ignorování revizí v souboru .git-blame-ignore-revs. Klikněte sem pro udělení výjimky a zobrazení normálního přehledu blame. commits.browse_further = Procházet dále -issues.role.first_time_contributor = První přispěvatel +issues.role.first_time_contributor = První příspěvek editor.invalid_commit_mail = Neplatný e-mail pro vytvoření revize. commits.renamed_from = Přejmenováno z %s activity.navbar.recent_commits = Nedávné revize diff --git a/options/locale/locale_et.ini b/options/locale/locale_et.ini index 79361cf43d..6dcda1c9ba 100644 --- a/options/locale/locale_et.ini +++ b/options/locale/locale_et.ini @@ -168,6 +168,8 @@ code_search_unavailable = Koodiotsing ei ole praegu saadaval. Palun võta ühend union_tooltip = Kaasa tulemusi, mis vastavad mis tahes tühikutega eraldatud märksõnadele keyword_search_unavailable = Otsing märksõna järgi ei ole praegu saadaval. Palun võtke ühendust saidi haldajaga. pull_kind = Otsi tõmbepäringuid… +regexp_tooltip = Tõlgenda otsingusõna regulaaravaldisena +regexp = Regulaaravaldis [aria] navbar = Navigatsiooniriba @@ -351,6 +353,7 @@ Retype = Korda salasõna password_not_match = Salasõnad ei klapi. Password = Salasõna username_password_incorrect = Kassutajanimi või salasõna pole õige. +required_prefix = Sisendi alguses peab olema „&s“ [settings] retype_new_password = Korda uut salasõna @@ -385,6 +388,10 @@ commitstatus.failure = Tõrge commitstatus.pending = Ootel commitstatus.success = Valmis ext_issues = Välised vead +issues.filter_sort.moststars = Enim tärne +issues.choose.get_started = Alustame +issues.start_tracking_short = Käivita taimer +issues.filter_sort.feweststars = Kõike vähem tärne [actions] variables = Muutujad @@ -396,4 +403,12 @@ variables.management = Halda muutujaid [admin] users.password_helper = Kui sa ei taha salasõna muuta, siis jäta väli tühjaks. config.reset_password_code_lives = Taastekoodi aegumine -auths.bind_password = Seo salasõna \ No newline at end of file +auths.bind_password = Seo salasõna + +[explore] +users = Kasutajad +stars_few = %d tärni +stars_one = %d tärn + +[user] +starred = Tärniga märgitud hoidlad \ No newline at end of file diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 66a1333f34..68932d89a3 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -2978,7 +2978,7 @@ settings.visibility.limited_shortname=Ограниченный settings.visibility.private=Частная (видна только участникам организации) settings.visibility.private_shortname=Частная -settings.update_settings=Обновить настройки +settings.update_settings=Сохранить настройки settings.update_setting_success=Настройки организации обновлены. settings.change_orgname_prompt=Обратите внимание: изменение названия организации также изменит URL вашей организации и освободит старое имя. settings.change_orgname_redirect_prompt=Старое имя будет перенаправлено до тех пор, пока оно не будет введено. @@ -3026,7 +3026,7 @@ teams.no_desc=Эта группа не имеет описания teams.settings=Настройки teams.owners_permission_desc=Владельцы имеют полный доступ ко всем репозиториям и имеют права администратора организации. teams.members=Участники команды -teams.update_settings=Обновить настройки +teams.update_settings=Сохранить настройки teams.delete_team=Удалить команду teams.add_team_member=Добавить участника teams.invite_team_member=Пригласить в %s diff --git a/options/locale/locale_sk-SK.ini b/options/locale/locale_sk-SK.ini index aa2f863b14..567fe1f22e 100644 --- a/options/locale/locale_sk-SK.ini +++ b/options/locale/locale_sk-SK.ini @@ -111,7 +111,7 @@ preview=Náhľad loading=Načítava sa… error=Chyba -error404=Stránka, na ktorú sa pokúšate dostať, buď neexistuje, alebo nemáte oprávnenie na jej zobrazenie. +error404=Stránka, na ktorú sa pokúšate dostať, buď neexistuje, je zmazaná,alebo nemáte oprávnenie na jej zobrazenie. go_back=Naspäť never=Nikdy @@ -146,6 +146,28 @@ filter.is_archived = Archivované filter.private = Súkromný toggle_menu = Prepni menu more_items = Viac vecí +filter = Filter +filter.not_fork = Nie sú forky +copy_path = Kopírovať cestu +filter.is_template = Šablóny +filter.not_template = Nie sú šablóny +filter.public = Verejné +test = Test +invalid_data = Neplatné dáta: %v +confirm_delete_artifact = Naozaj chcete odstrániť artefakt „%s“? +copy_generic = Kopírovať do schránky +new_repo.title = Nový repozitár +new_migrate.title = Nová migrácia +new_org.title = Nová organizácia +new_repo.link = Nový repozitár +new_migrate.link = Nová migrácia +new_org.link = Nová organizácia +filter.clear = Zmazať filtre +error413 = Vyčerpaj ste svoju kvótu. +filter.not_archived = Nie je archivované +filter.is_mirror = Zrkadlá +filter.not_mirror = Nie sú zrkadlá +filter.is_fork = Forky [aria] navbar=Navigačná lišta @@ -158,6 +180,9 @@ number_of_contributions_in_the_last_12_months=%s príspevkov za posledných 12 m contributions_zero=Žiadne príspevky less=Menej more=Viac +contributions_one = príspevok +contributions_few = príspevky +contributions_format = {contributions} na {deň} {mesiac} {year}} [editor] buttons.heading.tooltip=Pridať hlavičku @@ -174,6 +199,18 @@ buttons.ref.tooltip=Odkázať na problém alebo žiadosť o natiahnutie buttons.switch_to_legacy.tooltip=Použiť starší editor namiest toho buttons.enable_monospace_font=Povoliť font s pevnou šírkou buttons.disable_monospace_font=Zakázať font s pevnou šírkou +buttons.indent.tooltip = Vnorenie položiek o jednu úroveň +table_modal.header = Pridať tabuľku +buttons.new_table.tooltip = Pridať tabuľku +table_modal.placeholder.header = Hlavička +table_modal.placeholder.content = Obsah +table_modal.label.rows = Riadky +table_modal.label.columns = Stĺpce +link_modal.url = Adresa +link_modal.description = Popis +buttons.unindent.tooltip = Zrušiť vnorenie položiek o jednu úroveň +link_modal.header = Pridať odkaz +link_modal.paste_reminder = Tip: Ak máte URL adresu v schránke, môžete ju vložiť priamo do editora a vytvoriť tak odkaz. [filter] string.asc=A - Z @@ -186,6 +223,7 @@ missing_csrf=Nesprávna žiadosť: neprítomný CSFR token invalid_csrf=Nesprávna žiadosť: nesprávny CSFR token not_found=Nebolo možné nájsť cieľ. network_error=Chyba siete +server_internal = Vnútorná chyba servera [startpage] app_desc=Jednoducho prístupný vlastný Git @@ -196,6 +234,7 @@ lightweight=Ľahká lightweight_desc=Forgejo má minimálne požiadavky a môže bežať na Raspberry Pi. Šetrite energiou vášho stroja! license=Otvorený zdrojový kód license_desc=Získajte Forgejo! Pridajte sa k nám a prispejte, aby bol tento projekt ešte lepší. Nehanbite sa byť prispievateľom! +platform_desc = Je potvrdené, že Forgejo beží na voľných operačných systémoch ako Linux a FreeBSD, ako aj na rôznych architektúrach CPU. Vyberte si tú, ktorá sa vám páči! [install] install=Inštalácia @@ -264,7 +303,7 @@ federated_avatar_lookup=Povoliť avatary z verejných zdrojov federated_avatar_lookup.description=Povoliť Libavatar na vyhľadávanie avatarov z verejných zdrojov. disable_registration=Zakázať registráciu disable_registration.description=Zakázať registráciu. Nové používateľské účty budú môcť vytvárať iba správci. -allow_only_external_registration.description=Povoliť registráciu iba skrze externé služby +allow_only_external_registration.description=Povoliť registráciu iba cez externé služby. openid_signin=Povoliť prihlásenie pomocou OpenID openid_signin.description=Povoliť používateľovi prihlásenie pomocou OpenID. openid_signup=Povoliť registráciu pomocou OpenID @@ -303,6 +342,17 @@ password_algorithm=Hašovací algoritmus hesla invalid_password_algorithm=Neplatný hash algoritmus hesla password_algorithm_helper=Nastavte algoritmus hashovania hesla. Algoritmy majú rôzne požiadavky a silu. Algoritmus argon2 je pomerne bezpečný, ale využíva veľa pamäte a môže byť nevhodný pre malé systémy. enable_update_checker=Povoliť kontrolu aktualizácií +invalid_db_table = Tabuľka databázy "%s" je neplatná: %v +smtp_from_invalid = Adresa „Odoslať e-mail ako“ je neplatná +env_config_keys_prompt = Nasledujúce premenné prostredia budú tiež aplikované na konfiguračný súbor: +app_slogan = Slogan inštancie +enable_update_checker_helper_forgejo = Pravidelne skontroluje nové verzie Forgejo pri kontrole záznamu TXT DNS na release.forgejo.org. +run_user_helper = Používateľské meno v operačnom systéme, pod ktorým Forgejo beží. Upozorňujeme, že tento používateľ musí mať prístup ku koreňovému adresáru repozitára. +app_slogan_helper = Sem zadajte slogan vašej inštancie. Pre deaktiváciu nechajte prázdne. +env_config_keys = Konfigurácia prostredia +allow_dots_in_usernames = Umožniť užívateľom používať bodky vo svojich menách. Nemá vplyv na existujúce účty. +allow_only_external_registration = Umožniť registráciu iba prostredníctvom externých služieb +config_location_hint = Tieto možnosti konfigurácie budú uložené v: [home] uname_holder=Používateľské meno alebo emailová adresa @@ -352,6 +402,10 @@ code_search_results=`Výsledky hľadania pre "%s"` code_last_indexed_at=Naposledy indexované %s relevant_repositories_tooltip=Repozitáre, ktoré sú forkami alebo ktoré nemajú tému, žiadnu ikonu ani popis, sú skryté. relevant_repositories=Zobrazujú sa iba relevantné repozitáre, zobraziť nefiltrované výsledky. +forks_few = %d forky +forks_one = %d fork +stars_one = %d hviezda +stars_few = %d hviezdy [auth] create_new_account=Zaregistrovať účet @@ -414,6 +468,25 @@ authorize_title=Autorizovať „%s“ pre prístup k vášmu účtu? authorization_failed=Autorizácia zlyhala sspi_auth_failed=SSPI overenie zlyhalo password_pwned_err=Nie je možné dokončiť žiadosť na HaveIBeenPwned +hint_login = Už máte účet? Prihláste sa! +hint_register = Potrebujete účet? Zaregistrujte sa. +last_admin = Nemôžete odstrániť posledného správcu. Musí existovať aspoň jeden správca. +password_pwned = Heslo, ktoré ste si vybrali, je na zozname ukradnutých hesiel, ktoré boli predtým odhalené pri únikoch verejných údajov. Skúste to znova s iným heslom a zvážte zmenu tohto hesla aj inde. +sign_up_successful = Účet bol úspešne vytvorený. Vitajte! +back_to_sign_in = Späť na prihlásenie +openid_signin_desc = Zadajte URI vášho OpenID. Napríklad: alice.openid.example.org alebo https://openid.example.org/alice. +use_onetime_code = Použite jednorázový kód +sign_up_button = Zaregistrujte sa teraz. +must_change_password = Aktualizácia vášho hesla +invalid_code_forgot_password = Váš potvrdzovací kód je neplatný alebo vypršal. Kliknite sem pre začatie novej relácie. +unauthorized_credentials = Prihlasovacie údaje sú nesprávne alebo ich platnosť vypršala. Zopakujte príkaz alebo si pozrite %s pre viac informácií +sign_in_openid = Pokračovať s OpenID +change_unconfirmed_email_summary = Zmeňte e-mailovú adresu, na ktorú sa odosiela aktivačný e-mail. +prohibit_login_desc = Váš účet bol pozastavený a nemohol interagovať s inštanciou. Ak chcete získať prístup, kontaktujte správcu inštancie. +change_unconfirmed_email = Ak ste pri registrácii zadali nesprávnu e-mailovú adresu, môžete ju nižšie zmeniť a na novú adresu vám bude zaslané potvrdenie. +authorization_failed_desc = Povolenie zlyhalo, pretože sme zistili neplatnú žiadosť. Prosím, kontaktujte údržbu aplikácie, ktorú ste sa snažili autorizovať. +change_unconfirmed_email_error = Nepodarilo sa zmeniť e-mailovú adresu: %v +reset_password_wrong_user = Ste prihlásený ako %s, ale odkaz na obnovenie účtu je určený pre %s [mail] view_it_on=Zobraziť na %s @@ -432,7 +505,7 @@ activate_email.text=Pre overenie vašej e-mailovej adresy kliknite, prosím, na register_notify=Vitajte v %s register_notify.title=%[1]s, vitajte v %[2]s register_notify.text_1=toto je e-mail potvrdzujúci vašu registráciu pre %s! -register_notify.text_2=Teraz sa môžete prihlásiť s používateľským menom: %s. +register_notify.text_2=Teraz sa môžete prihlásiť s používateľským menom: %s register_notify.text_3=Ak bol tento účet vytvorený pre vás, nastavte prosím najskôr svoje heslo. reset_password=Obnoviť váš účet @@ -478,6 +551,25 @@ team_invite.subject=%[1]s vás pozval/a, aby ste sa pripojili k organizácii %[2 team_invite.text_1=%[1]s vás pozval/a, aby ste sa pripojili k tímu %[2]s v organizácii %[3]s. team_invite.text_2=Ak sa chcete pripojiť k tímu, kliknite na nasledujúci odkaz: team_invite.text_3=Poznámka: Táto pozvánka bola určená pre %[1]s. Ak ste túto pozvánku nečakali, môžete tento e-mail ignorovať. +removed_security_key.subject = Bezpečnostný kľúč bol odstránený +admin.new_user.subject = Práve sa zaregistroval nový používateľ %s +password_change.subject = Vaše heslo sa zmenilo +primary_mail_change.subject = Váš primárny e-mail bol zmenený +totp_disabled.subject = TOTP bol deaktivovaný +totp_disabled.text_1 = Jednorazové heslo na dobu určitú (TOTP) vo vašom účte bolo práve deaktivované. +removed_security_key.text_1 = Bezpečnostný kľúč "%[1]" bol práve odstránený z vášho účtu. +removed_security_key.no_2fa = Už nie sú nakonfigurované žiadne iné metódy 2FA, čo znamená, že sa už nie je potrebné prihlasovať do svojho účtu pomocou 2FA. +account_security_caution.text_1 = Ak ste to boli vy, môžete tento e-mail pokojne ignorovať. +totp_enrolled.subject = Aktivovali ste TOTP ako metódu 2FA +admin.new_user.user_info = Informácie o používateľovi +admin.new_user.text = Ak chcete spravovať tohto používateľa z administrátorského panela, kliknite sem. +totp_enrolled.text_1.has_webauthn = Práve ste pre svoj účet povolili protokol TOTP. To znamená, že pre všetky budúce prihlásenia do svojho účtu môžete použiť protokol TOTP ako metódu 2FA alebo použiť ktorýkoľvek zo svojich bezpečnostných kľúčov. +issue_assigned.issue = @%[1]s vám pridelil problém %[2]s v repozitári %[3]s. +primary_mail_change.text_1 = Primárny e-mail vášho účtu bol práve zmenený na %[1]s. To znamená, že na túto e-mailovú adresu už nebudete dostávať e-mailové upozornenia pre váš účet. +account_security_caution.text_2 = Ak ste to neboli vy, váš účet je napadnutý. Kontaktujte, prosím, správcov tejto stránky. +totp_enrolled.text_1.no_webauthn = Práve ste pre svoj účet povolili protokol TOTP. To znamená, že pre všetky budúce prihlásenia do svojho účtu musíte použiť protokol TOTP ako metódu 2FA. +password_change.text_1 = Heslo k vášmu účtu bolo práve zmenené. +totp_disabled.no_2fa = Už nie sú nakonfigurované žiadne iné metódy 2FA, čo znamená, že sa už nie je potrebné prihlasovať do svojho účtu pomocou 2FA. [modal] yes=Áno @@ -567,6 +659,7 @@ auth_failed=Overenie zlyhalo: %v target_branch_not_exist=Cieľová vetva neexistuje. +FullName = Celé meno [user] @@ -841,6 +934,41 @@ visibility=Viditeľnosť používateľa visibility.public=Verejný visibility.limited=Obmedzený visibility.private=Súkromný +pronouns_unspecified = Neurčené +additional_repo_units_hint_description = Zobraziť nápoveda „Povoliť viac“ pre repozitáre, ktoré nemajú povolené všetky dostupné jednotky. +comment_type_group_assignee = Pridelená osoba +keep_activity_private = Skryť aktivitu na stránke profilu +comment_type_group_issue_ref = Referencia problému +uploaded_avatar_is_too_big = Veľkosť nahraného súboru (%d KiB) presahuje maximálnu veľkosť (%d KiB). +email_desc = Vaša primárna e-mailová adresa bude použitá na upozornenia, obnovenie hesla, a za predpokladu, že nie je skrytá, aj na webové operácie systému Git. +profile_desc = O Vás +can_not_add_email_activations_pending = Čaká sa na aktiváciu, skúste to znova o niekoľko minút, ak chcete pridať nový e-mail. +blocked_users = Blokovaný používatelia +retype_new_password = Potvrdiť nové heslo +hints = Nápovedy +update_hints = Aktualizovať nápovedy +update_hints_success = Nápovedy boli aktualizované. +hidden_comment_types.issue_ref_tooltip = Komentáre, v ktorých používateľ zmení vetvu/značku spojenú s problémom +hidden_comment_types.ref_tooltip = Komentáre, kde sa na tento problém odkazuje z iného problému/revízie/… +language.title = Východzí jazyk +keep_pronouns_private.description = Toto skryje vaše zámená pred návštevníkmi, ktorí nie sú prihlásení. +change_username_redirect_prompt = Staré používateľské meno sa bude presmerovávať, kým si ho niekto nenárokuje. +change_username_prompt = Poznámka: Zmenou používateľského mena sa zmení aj URL adresa Vášho účtu. +quota = Kvóta +location_placeholder = Zdieľajte svoju približnú polohu s ostatnými +pronouns = Zámená +update_language_not_found = Jazyk „%s“ nie je k dispozícii. +storage_overview = Prehľad úložiska +change_username_redirect_prompt.with_cooldown.few = Staré používateľské meno bude k dispozícii všetkým po období odkladu %[1]d dní. Počas tohto obdobia si stále môžete staré používateľské meno znova zaobstarať. +language.description = Tento jazyk bude uložený do vášho účtu a po prihlásení sa bude používať ako predvolený. +keep_email_private_popup = Vaša e-mailová adresa sa nezobrazí vo vašom profile a nebude predvolenou adresou pre revízie vytvorené cez webové rozhranie, ako je nahrávanie súborov, úpravy a zlúčenie revízií. Namiesto toho je možné na prepojenie revízií s vaším účtom použiť špeciálnu adresu %s. Táto možnosť neovplyvní existujúce revízie. +biography_placeholder = Povedzte ostatným niečo o sebe! (Markdown je podporovaný) +change_username_redirect_prompt.with_cooldown.one = Staré používateľské meno bude k dispozícii všetkým po období odkladu %[1]d dní. Počas tohto obdobia si stále môžete staré používateľské meno znova nárokovať. +language.localization_project = Pomôžte nám preložiť Forgejo do vášho jazyka! Zistite viac. +hidden_comment_types_description = Typy komentárov zaškrtnuté tu sa nezobrazia na stránkach s problémami. Zaškrtnutie políčka „Štítok“ napríklad odstráni všetky komentáre typu „ pridal/odstránil
    на %[3]s от огледало [auth] -tab_openid = OpenID openid_connect_submit = Свързване sign_up_successful = Акаунтът е създаден успешно. Добре дошли! login_userpass = Влизане forgot_password = Забравена парола? -sign_up_now = Нуждаете се от акаунт? Регистрирайте се сега. forgot_password_title = Забравена парола openid_register_title = Създаване на нов акаунт account_activated = Акаунтът е активиран -social_register_helper_msg = Вече имате акаунт? Свържете го сега! verify = Потвърждаване create_new_account = Регистриране на акаунт active_your_account = Активирайте акаунта си -register_helper_msg = Вече имате акаунт? Влезте сега! reset_password = Възстановяване на акаунта disable_register_prompt = Регистрирането е изключено. Моля, свържете се с вашия администратор на сайта. remember_me = Запомни ме @@ -2406,8 +2345,6 @@ disable_register_mail = Потвърждението по ел. поща за р manual_activation_only = Свържете се с вашия администратор на сайта, за да завършите активирането. must_change_password = Обновете паролата си password_too_short = Дължината на паролата не може да бъде по-малка от %d знака. -tab_signin = Влизане -tab_signup = Регистриране password_pwned = Паролата, която сте избрали, е в списък с откраднати пароли, разкрити преди това при публични пробиви на данни. Моля, опитайте отново с различна парола. confirmation_mail_sent_prompt = Ново ел. писмо за потвърждение е изпратено до %s. За да завършите процеса на регистрация, моля, проверете входящата си кутия и последвайте предоставената връзка в рамките на следващите %s. Ако адресът за ел. поща е неправилен, можете да влезете и да поискате друго ел. писмо за потвърждение да бъде изпратено на различен адрес. hint_login = Вече имате акаунт? Влезте! @@ -2475,17 +2412,12 @@ mark_all_as_read = Отбелязване на всички като проче pin = Закачване на известието [explore] -code_search_results = Резултати от търсенето на "%s" go_to = Отиване към repos = Хранилища users = Потребители -search = Търсене code = Код organizations = Организации code_last_indexed_at = Последно индексиран %s -repo_no_results = Няма намерени съответстващи хранилища. -user_no_results = Няма намерени съответстващи потребители. -org_no_results = Няма намерени съответстващи организации. stars_one = %d звезда stars_few = %d звезди forks_one = %d разклонение diff --git a/options/locale/locale_ca.ini b/options/locale/locale_ca.ini index ea2af3b645..17acc95ede 100644 --- a/options/locale/locale_ca.ini +++ b/options/locale/locale_ca.ini @@ -48,15 +48,11 @@ webauthn_error_insecure = WebAuthn només suporta connexions segures. Per provar webauthn_error_unable_to_process = El servidor no ha pogut processar la vostra petició. webauthn_error_duplicated = La clau de seguretat no és permesa per aquesta petició. Si us plau, assegureu-vos que la clau encara no ha estat registrada. webauthn_error_empty = S'ha d'anomenar aquesta clau. -webauthn_reload = Recarrega repository = Repositori organization = Organització mirror = Mirall -new_repo = Nou repositori -new_migrate = Nova migració new_mirror = Nou mirall new_fork = Nou fork d'un repositori -new_org = Nova organització new_project = Nou projecte new_project_column = Nova columna admin_panel = Administració del lloc @@ -148,7 +144,6 @@ new_migrate.link = Nova migració new_org.link = Nova organització [search] -milestone_kind = Cerca fites... fuzzy = Difusa search = Cerca... type_tooltip = Tipus de cerca @@ -156,7 +151,6 @@ fuzzy_tooltip = Inclou resultats que s'assemblen al terme de la cerca repo_kind = Cerca repos… user_kind = Cerca usuaris… code_search_unavailable = La cerca de codi no està disponible actualment. Si us plau concteu amb l'administrador del lloc. -code_search_by_git_grep = Els resultats actuals de la cerca de codi són proporcionats per "git grep". Podríen haver-hi millors resultats si l'administrador del lloc habilita l'indexador de codi. package_kind = Cerca paquets… project_kind = Cerca projectes… branch_kind = Cerca branques… @@ -194,8 +188,6 @@ occurred = Hi ha hagut un error report_message = Si creus que això es un bug de Forgejo, si us plau cerca problemes a Codeberg i obre'n un de nou si cal. not_found = L'objectiu no s'ha pogut trobar. server_internal = Error intern del servidor -missing_csrf = Petició Dolenta: falta el testimoni CSRF -invalid_csrf = Petició Dolenta: testimoni CSRF invàlid network_error = Error de xarxa [install] @@ -444,7 +436,6 @@ link_modal.paste_reminder = Pista: Amb un enllaç en el teu porta-retalls, pots [home] my_orgs = Organitzacions -show_more_repos = Mostra més repositoris… show_both_archived_unarchived = Mostrant ambdós arxivats i no-arxivats show_only_public = Mostrant només publics issues.in_your_repos = En els teus repositoris @@ -454,10 +445,8 @@ show_both_private_public = Mostrant amdós publics i privats show_only_private = Mostrant només privats filter_by_team_repositories = Filtra per respostirois d'equip feed_of = Canal de "%s" -collaborative_repos = Respositoris coŀlaboratius show_archived = Arxivat view_home = Veure %s -password_holder = Contrasenya switch_dashboard_context = Commuta el contexte del tauler my_repos = Repositoris show_only_archived = Mostrant només arxivats diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index de2b211922..73a3793459 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -49,21 +49,14 @@ webauthn_error_unable_to_process=Server nemohl zpracovat váš požadavek. webauthn_error_duplicated=Bezpečnostní klíč není pro tento požadavek povolen. Ujistěte se prosím, zda klíč již není registrován. webauthn_error_empty=Musíte nastavit název tohoto klíče. webauthn_error_timeout=Požadavek vypršel dříve, než se podařilo přečíst váš klíč. Znovu načtěte tuto stránku a akci opakujte. -webauthn_reload=Znovu načíst - repository=Repozitář organization=Organizace mirror=Zrcadlo -new_repo=Nový repozitář -new_migrate=Nová migrace new_mirror=Nové zrcadlo new_fork=Nový fork repozitáře -new_org=Nová organizace new_project=Nový projekt new_project_column=Nový sloupec -manage_org=Spravovat organizace admin_panel=Administrace -account_settings=Nastavení účtu settings=Nastavení your_profile=Profil your_starred=Oblíbené @@ -217,8 +210,6 @@ string.desc=Z – A [error] occurred=Došlo k chybě report_message=Pokud jste si jisti, že se jedná o chybu software Forgejo, vyhledejte prosím problémy ve službě Codeberg a v případě potřeby založte nový problém. -missing_csrf=Nesprávný požadavek: nenalezen token CSRF -invalid_csrf=Nesprávný požadavek: neplatný token CSRF not_found=Cíl nebyl nalezen. network_error=Chyba sítě server_internal = Interní chyba serveru @@ -354,15 +345,10 @@ app_slogan_helper = Sem zadejte slogan vaší instance. Ponechte prázdné pro z [home] uname_holder=Uživatelské jméno nebo e-mailová adresa -password_holder=Heslo switch_dashboard_context=Přepnout kontext nástěnky my_repos=Repozitáře -show_more_repos=Zobrazit více repozitářů… -collaborative_repos=Společné repozitáře my_orgs=Organizace -my_mirrors=Má zrcadla view_home=Zobrazit %s -search_repos=Nalézt repozitář… filter=Ostatní filtry filter_by_team_repositories=Filtrovat podle týmových repozitářů feed_of=Kanál „%s“ @@ -383,20 +369,8 @@ issues.in_your_repos=Ve vašich repozitářích repos=Repozitáře users=Uživatelé organizations=Organizace -search=Vyhledat go_to=Přejít na code=Kód -search.type.tooltip=Druh vyhledávání -search.fuzzy=Fuzzy -search.fuzzy.tooltip=Zahrnout výsledky, které také úzce odpovídají hledanému výrazu -search.match=Shoda -search.match.tooltip=Zahrnout pouze výsledky, které odpovídají přesnému hledanému výrazu -code_search_unavailable=V současné době není vyhledávání kódu dostupné. Obraťte se na správce webu. -repo_no_results=Nebyly nalezeny žádné odpovídající repozitáře. -user_no_results=Nebyly nalezeni žádní odpovídající uživatelé. -org_no_results=Nebyly nalezeny žádné odpovídající organizace. -code_no_results=Nebyl nalezen žádný zdrojový kód odpovídající hledanému výrazu. -code_search_results=Výsledky hledání pro „%s“ code_last_indexed_at=Naposledy indexováno %s relevant_repositories_tooltip=Repozitáře, které jsou forky nebo nemají žádné téma, žádnou ikonu a žádný popis, jsou skryty. relevant_repositories=Zobrazují se pouze relevantní repositáře, zobrazit nefiltrované výsledky. @@ -407,16 +381,12 @@ stars_few = %d hvězd [auth] create_new_account=Registrovat účet -register_helper_msg=Již máte účet? Přihlaste se! -social_register_helper_msg=Již máte účet? Připojte ho! disable_register_prompt=Registrace jsou vypnuty. Kontaktujte prosím administrátora webu. disable_register_mail=E-mailové potvrzení o registraci je zakázané. manual_activation_only=Pro dokončení aktivace kontaktujte administrátora webu. remember_me=Pamatovat si toto zařízení -remember_me.compromised=Přihlašovací token již není platný, což může znamenat napadení účtu. Zkontrolujte prosím svůj účet pro neobvyklé aktivity. forgot_password_title=Zapomenuté heslo forgot_password=Zapomenuté heslo? -sign_up_now=Nemáte účet? Zaregistrujte se. sign_up_successful=Účet byl úspěšně vytvořen. Vítejte! confirmation_mail_sent_prompt=Na adresu %s byl zaslán nový potvrzovací e-mail. Pro dokončení procesu registrace prosím zkontrolujte svou schránku a klikněte na poskytnutý odkaz do %s. Pokud jste zadali nesprávný e-mail, můžete se přihlásit a požádat o poslání nového potvrzovacího e-mailu na jinou adresu. must_change_password=Změňte své heslo @@ -429,7 +399,6 @@ prohibit_login_desc=Váš účet byl pozastaven z interakcí s instancí. Pro op resent_limit_prompt=Omlouváme se, ale nedávno jste již požádali o zaslání aktivačního e-mailu. Počkejte prosím 3 minuty a zkuste to znovu. has_unconfirmed_mail=Zdravíme, %s, máte nepotvrzenou e-mailovou adresu (%s). Pokud jste nedostali e-mail pro potvrzení nebo potřebujete zaslat nový, klikněte prosím na tlačítko níže. resend_mail=Klikněte sem pro opětovné odeslání aktivačního e-mailu -email_not_associate=Tato e-mailová adresa není spojena s žádným účtem. send_reset_mail=Zaslat obnovovací e-mail reset_password=Obnovení účtu invalid_code=Tento potvrzovací kód je neplatný nebo mu vypršela platnost. @@ -446,7 +415,6 @@ twofa_scratch_used=Použili jste svůj záložní kód. Byli jste přesměrován twofa_passcode_incorrect=Vaše heslo je neplatné. Pokud jste ztratili vaše zařízení, použijte záložní kód k přihlášení. twofa_scratch_token_incorrect=Váš záložní kód není správný. login_userpass=Přihlásit se -tab_openid=OpenID oauth_signup_tab=Zaregistrovat nový účet oauth_signup_title=Dokončit nový účet oauth_signup_submit=Dokončit účet @@ -472,15 +440,12 @@ authorize_application_description=Pokud udělíte přístup, bude moci přistupo authorize_title=Autorizovat „%s“ pro přístup k vašemu účtu? authorization_failed=Autorizace selhala authorization_failed_desc=Autorizace selhala, protože jsme detekovali neplatný požadavek. Kontaktujte prosím správce aplikace, kterou jste se pokoušeli autorizovat. -sspi_auth_failed=SSPI autentizace selhala password_pwned=Heslo, které jste zvolili, je na seznamu odcizených hesel, která byla dříve odhalena při narušení veřejných dat. Zkuste to prosím znovu s jiným heslem. password_pwned_err=Nelze dokončit požadavek na HaveIBeenPwned change_unconfirmed_email = Pokud jste při registraci zadali nesprávnou e-mailovou adresu, můžete ji změnit níže. Potvrzovací e-mail bude místo toho odeslán na novou adresu. change_unconfirmed_email_error = Nepodařilo se změnit e-mailovou adresu: %v change_unconfirmed_email_summary = Změna e-mailové adresy, na kterou bude odeslán aktivační e-mail. 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í. @@ -496,22 +461,18 @@ link_not_working_do_paste=Odkaz nefunguje? Zkuste jej zkopírovat a vložit do a hi_user_x=Dobrý den, uživateli %s, activate_account=Prosíme, aktivujte si váš účet -activate_account.title=%s, prosím aktivujte si váš účet activate_account.text_1=Dobrý den, uživateli %[1]s, děkujeme za registraci ve službě %[2]s! activate_account.text_2=Pro aktivaci vašeho účtu klikněte %s na následující odkaz : activate_email=Ověřte vaši e-mailovou adresu -activate_email.title=%s, prosím ověřte vaši e-mailovou adresu activate_email.text=Pro ověření vaší e-mailové adresy klikněte do %s na následující odkaz: register_notify=Vítejte v %s -register_notify.title=%[1]s vítejte v %[2]s register_notify.text_1=toto je váš potvrzovací e-mail pro %s! register_notify.text_2=Do svého účtu se můžete přihlásit svým uživatelským jménem: %s register_notify.text_3=Pokud vám tento účet vytvořil někdo jiný, musíte si nejprve nastavit své heslo. reset_password=Obnovit váš účet -reset_password.title=Uživateli %s, obdrželi jsme žádost o obnovu vašeho účtu reset_password.text=Pokud jste to byli vy, klikněte na následující odkaz pro obnovení vašeho účtu do %s: register_success=Registrace byla úspěšná @@ -586,8 +547,6 @@ RepoName=Název repozitáře Email=E-mailová adresa Password=Heslo Retype=Potvrzení hesla -SSHTitle=Název klíče SSH -HttpsUrl=HTTPS URL PayloadUrl=URL nákladu TeamName=Název týmu AuthName=Název ověření @@ -600,9 +559,6 @@ CommitChoice=Výběr revize TreeName=Cesta k souboru Content=Obsah -SSPISeparatorReplacement=Oddělovač -SSPIDefaultLanguage=Výchozí jazyk - require_error=` nemůže být prázdný.` alpha_dash_error=` by měl obsahovat pouze alfanumerické znaky, pomlčky („-“) a podtržítka („_“). ` alpha_dash_dot_error=` by měl obsahovat pouze alfanumerické znaky, pomlčky („-“), podtržítka („_“) nebo tečky („.“). ` @@ -624,7 +580,6 @@ lang_select_error=Vyberte jazyk ze seznamu. username_been_taken=Uživatelské jméno je již obsazeno. username_change_not_local_user=Uživatelé, kteří jsou ověřováni jinak než lokálně, si nemohou změnit uživatelské jméno. -username_has_not_been_changed=Uživatelské jméno nebylo změněno repo_name_been_taken=Název repozitáře je již použit. repository_force_private=Vynucené soukromí je povoleno: soukromé repozitáře nelze zveřejnit. repository_files_already_exist=Soubory pro tento repozitář již existují. Obraťte se na správce systému. @@ -704,7 +659,6 @@ unfollow=Přestat sledovat user_bio=Životopis disabled_public_activity=Tento uživatel zakázal veřejnou viditelnost aktivity. email_visibility.limited=Vaše e-mailová adresa je viditelná pro všechny ověřené uživatele -email_visibility.private=Vaše e-mailová adresa je viditelná pouze pro vás a administrátory show_on_map=Zobrazit toto místo na mapě settings=Uživatelská nastavení @@ -739,13 +693,11 @@ password=Heslo security=Zabezpečení avatar=Avatar ssh_gpg_keys=Klíče SSH / GPG -social=Účty sociálních sítí applications=Aplikace orgs=Organizace repos=Repozitáře delete=Smazat účet twofa=Dvoufázové ověření (TOTP) -account_link=Propojené účty organization=Organizace uid=UID webauthn=Dvoufázové ověření (bezpečnostní klíče) @@ -792,10 +744,7 @@ comment_type_group_issue_ref=Referenční číslo problému saved_successfully=Vaše nastavení bylo úspěšně uloženo. privacy=Soukromí keep_activity_private=Skrýt aktivitu z profilové stránky -keep_activity_private_popup=Vaše aktivita bude viditelná pouze pro vás a správce instance - lookup_avatar_by_mail=Vyhledat avatar pomocí e-mailové adresy -federated_avatar_lookup=Federované vyhledávání avatarů enable_custom_avatar=Použít vlastní avatar choose_new_avatar=Vybrat nový avatar update_avatar=Upravit avatar @@ -813,7 +762,6 @@ password_incorrect=Zadané heslo není správné. change_password_success=Vaše heslo bylo aktualizováno. Od nynějška používejte kpřihlášení nové heslo. password_change_disabled=Externě ověřovaní uživatelé nemohou aktualizovat své heslo prostřednictvím webového rozhraní Forgejo. -emails=E-mailové adresy manage_emails=Správa e-mailových adres manage_themes=Výchozí motiv manage_openid=Adresy OpenID @@ -856,8 +804,6 @@ principal_desc=Tyto SSH Principal certifikáty jsou přidruženy k vašemu účt gpg_desc=Tyto veřejné klíče GPG jsou propojeny s vaším účtem a používají se k ověření vašich revizí. Uložte je na bezpečné místo, jelikož umožňují podepsat revize vaší identitou. ssh_helper=Potřebujete pomoct? Podívejte se do příručky, jak vytvořit vlastní klíče SSH nebo vyřešte běžné problémy, se kterými se můžete potkat při použití SSH. gpg_helper=Potřebujete pomoct? Podívejte se do příručky o GPG. -add_new_key=Přidat klíč SSH -add_new_gpg_key=Přidat klíč GPG key_content_ssh_placeholder=Začíná s „ssh-ed25519“, „ssh-rsa“, „ecdsa-sha2-nistp256“, „ecdsa-sha2-nistp384“, „ecdsa-sha2-nistp521“, „sk-ecdsa-sha2-nistp256@openssh.com“ nebo „sk-ssh-ed25519@openssh.com“ key_content_gpg_placeholder=Začíná s „-----BEGIN PGP PUBLIC KEY BLOCK-----“ add_new_principal=Přidat principal @@ -875,7 +821,6 @@ gpg_invalid_token_signature=Zadaný klíč GPG, podpis a token se neshodují neb gpg_token_required=Musíte zadat podpis pro níže uvedený token gpg_token=Token gpg_token_help=Podpis můžete vygenerovat pomocí: -gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=Zakódovaný podpis GPG key_signature_gpg_placeholder=Začíná textem „-----BEGIN PGP SIGNATURE-----“ verify_gpg_key_success=Klíč GPG „%s“ byl ověřen. @@ -922,11 +867,6 @@ hide_openid=Odstranit z profilu ssh_disabled=SSH je zakázáno ssh_signonly=SSH je aktuálně zakázáno, proto jsou tyto klíče použity pouze pro ověření podpisu revizí. ssh_externally_managed=Tento klíč SSH je pro tohoto uživatele spravován externě -manage_social=Správa propojených účtů sociálních sítí -social_desc=Tyto účty sociálních sítí lze použít k přihlášení k vašemu účtu. Ujistěte se, že jsou všechny vaše. -unbind=Odpojit -unbind_success=Účet sociální sítě byl úspěšně odstraněn. - manage_access_token=Přístupové tokeny generate_new_token=Vygenerovat nový token tokens_desc=Tyto tokeny umožňují přístup k vašemu účtu pomocí Forgejo API. @@ -936,8 +876,6 @@ generate_token_success=Nový token byl vygenerován. Zkopírujte si jej nyní, j generate_token_name_duplicate=%s byl již použit jako název aplikace. Použijte prosím nový. delete_token=Smazat access_token_deletion=Odstranit přístupový token -access_token_deletion_cancel_action=Zrušit -access_token_deletion_confirm_action=Smazat access_token_deletion_desc=Smazání tokenu zruší přístup k vašemu účtu pro aplikace, které jej používají. Tuto akci nelze vrátit. Pokračovat? delete_token_success=Token byl odstraněn. Aplikace, které jej používají, již nemají přístup k vašemu účtu. repo_and_org_access=Přístup k repozitářům a organizacím @@ -1010,7 +948,6 @@ webauthn_alternative_tip=Možná budete chtít nakonfigurovat další metodu ov manage_account_links=Propojené účty manage_account_links_desc=Tyto externí účty jsou propojeny s vaším účtem Forgejo. -account_links_not_available=K vašemu Forgejo účtu nejsou aktuálně připojené žádné externí účty. link_account=Propojit účet remove_account_link=Odstranit propojený účet remove_account_link_desc=Odstraněním propojeného účtu zrušíte jeho přístup k vašemu Forgejo účtu. Pokračovat? @@ -1054,14 +991,12 @@ update_hints = Aktualizovat nápovědy update_hints_success = Nápovědy byly aktualizovány. additional_repo_units_hint_description = Zobrazit tip „Povolit další“ u repozitářů, které nemají povolené všechny dostupné jednotky. 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. language.description = Tento jazyk bude uložen do vašeho účtu a po přihlášení bude použit jako výchozí. language.localization_project = Pomozte nám s překladem Forgejo do vašeho jazyka! Více informací. user_block_yourself = Nemůžete zablokovat sami sebe. -pronouns_custom_label = Vlastní zájmena change_username_redirect_prompt.with_cooldown.few = Staré uživatelské jméno bude dostupné ostatním po %[1]d dnech. Do té doby budete moci své staré uživatelské jméno znovu získat. change_username_redirect_prompt.with_cooldown.one = Staré uživatelské jméno bude dostupné ostatním po %[1]d dnu. Do té doby budete moci své staré uživatelské jméno znovu získat. keep_pronouns_private = Zobrazovat zájmena pouze přihlášeným uživatelům @@ -1118,7 +1053,6 @@ fork_branch=Větev, která má být klonována pro fork all_branches=Všechny větve fork_no_valid_owners=Tento repozitář nemůže být rozštěpen, protože neexistují žádní platní vlastníci. use_template=Použít tuto šablonu -clone_in_vsc=Klonovat ve VS Code download_zip=Stáhnout ZIP download_tar=Stáhnout TAR.GZ download_bundle=Stáhnout BUNDLE @@ -1140,11 +1074,6 @@ readme=README readme_helper=Vyberte šablonu souboru README readme_helper_desc=Do tohoto místa můžete zadat celý popis vašeho projektu. auto_init=Inicializovat repozitář -trust_model_helper=Vyberte model důvěry pro ověření podpisu. Možnosti jsou: -trust_model_helper_collaborator=Spolupracovník: Důvěřovat podpisům spolupracovníků -trust_model_helper_committer=Přispěvatel: Důvěřovat podpisům, které se shodují s přispěvateli -trust_model_helper_collaborator_committer=Spolupracovník+Přispěvatel: Důvěřovat podpisům od spolupracovníků, které odpovídají přispěvateli -trust_model_helper_default=Výchozí: Použít výchozí model důvěry pro tuto instalaci create_repo=Vytvořit repozitář default_branch=Výchozí větev default_branch_label=výchozí @@ -1216,9 +1145,6 @@ template.invalid=Musíte vybrat repositář šablony archive.title=Tento repozitář byl archivován. Můžete prohlížet soubory, klonovat, ale nemůžete provádět žádné změny jeho stavu, jako nahrávání a vytváření nových problémů, žádostí nebo komentářů. archive.title_date=Tento repozitář byl archivován %s. Můžete prohlížet soubory, klonovat, ale nemůžete provádět žádné změny jeho stavu, jako nahrávání a vytváření nových problémů, žádostí nebo komentářů. -archive.issue.nocomment=Tento repozitář je archivovaný. Nemůžete komentovat problémy. -archive.pull.nocomment=Tento repozitář je archivovaný. Nemůžete komentovat žádosti o sloučení. - form.reach_limit_of_creation_1=Již jste dosáhli svůj limit %d repozitář. form.reach_limit_of_creation_n=Již jste dosáhli svůj limit %d repozitářů. form.name_reserved=Název repozitáře „%s“ je rezervován. @@ -1226,7 +1152,6 @@ form.name_pattern_not_allowed=Vzor „%s“ není povolený v názvu repozitář need_auth=Ověření migrate_options=Možnosti migrace -migrate_service=Migrační služba migrate_options_mirror_helper=Tento repozitář bude zrcadlem migrate_options_lfs=Migrovat soubory LFS migrate_options_lfs_endpoint.label=Endpoint LFS @@ -1312,7 +1237,6 @@ branches=Větve tags=Značky issues=Problémy pulls=Žádosti o sloučení -project_board=Projekty packages=Balíčky actions=Akce labels=Štítky @@ -1326,7 +1250,6 @@ release=Vydání releases=Vydání tag=Značka released_this=vytvořil/a toto vydání -tagged_this=označil/a file.title=%s v %s file_raw=Nezpracovaný file_history=Historie @@ -1440,9 +1363,7 @@ commits.desc=Procházet historii změn zdrojového kódu. commits.commits=Revize commits.no_commits=Žádné společné revize. „%s“ a „%s“ mají zcela odlišnou historii. commits.nothing_to_compare=Tyto větve jsou stejné. -commits.search=Hledání commitů… commits.search.tooltip=Můžete předřadit klíčová slova s „author:“, „committer:“, „after:“ nebo „before:“, např. „revert author:Alice before:2019-01-03“. -commits.find=Vyhledat commits.search_all=Všechny větve commits.author=Autor commits.message=Zpráva @@ -1470,8 +1391,6 @@ commitstatus.pending=Čekající commitstatus.success=Úspěch ext_issues=Externí problémy -ext_issues.desc=Odkaz na externí systém problémů. - projects=Projekty projects.desc=Spravovat problémy a žádosti o sloučení na projektových nástěnkách. projects.description=Popis (volitelné) @@ -1493,7 +1412,6 @@ projects.type.basic_kanban=Základní kanban projects.type.bug_triage=Třídění chyb projects.template.desc=Šablona projects.template.desc_helper=Začněte vybráním šablony projektu -projects.type.uncategorized=Nezařazené projects.column.edit=Upravit sloupec projects.column.edit_title=Název projects.column.new_title=Název @@ -1501,8 +1419,6 @@ projects.column.new_submit=Vytvořit sloupec projects.column.new=Nový sloupec projects.column.set_default=Nastavit jako výchozí projects.column.set_default_desc=Nastavit tento sloupec jako výchozí pro nekategorizované problémy a požadavky na sloučení -projects.column.unset_default=Zrušit nastavení jako výchozí -projects.column.unset_default_desc=Zrušit nastavení tohoto sloupce jako výchozí projects.column.delete=Odstranit sloupec projects.column.deletion_desc=Odstranění projektového sloupce přesune všechny související problémy do výchozího sloupce. Pokračovat? projects.column.color=Barva @@ -1616,7 +1532,6 @@ issues.filter_sort.moststars=Nejvíce hvězdiček issues.filter_sort.feweststars=Nejméně hvězdiček issues.filter_sort.mostforks=Nejvíce forků issues.filter_sort.fewestforks=Nejméně forků -issues.keyword_search_unavailable=Hledání podle klíčového slova není momentálně dostupné. Obraťte se na správce webu. issues.action_open=Otevřít issues.action_close=Zavřít issues.action_label=Štítek @@ -1661,11 +1576,8 @@ issues.ref_issue_from=`odkázal/a na tento problém %[3]s %[ issues.ref_pull_from=`odkázal/a na tuto žádost o sloučení %[3]s %[1]s` issues.ref_closing_from=`odkázal/a na tento problém ze žádosti o sloučení %[3]s, která jej uzavře, %[1]s` issues.ref_reopening_from=`odkázal/a na tento problém ze žádosti o sloučení %[3]s, která jej znovu otevře, %[1]s` -issues.ref_closed_from=`uzavřel/a tento problém %[4]s %[2]s` -issues.ref_reopened_from=`znovu otevřel/a tento problém %[4]s %[2]s` issues.ref_from=`z %[1]s` issues.author=Autor -issues.author_helper=Tento uživatel je autor. issues.role.owner=Vlastník issues.role.owner_helper=Tento uživatel je vlastníkem tohoto repozitáře. issues.role.member=Člen @@ -1759,18 +1671,13 @@ issues.add_time_sum_to_small=Čas nebyl zadán. issues.time_spent_total=Celkový strávený čas issues.time_spent_from_all_authors=`Celkový strávený čas: %s` issues.due_date=Termín dokončení -issues.invalid_due_date_format=Termín dokončení musí být ve formátu „rrrr-mm-dd“. -issues.error_modifying_due_date=Změna termínu dokončení selhala. -issues.error_removing_due_date=Odstranění termínu dokončení selhalo. issues.push_commit_1=přidal/a %d revizi %s issues.push_commits_n=přidal/a %d revize %s issues.force_push_codes=`vynutil/a nahrání %[1]s od %[2]s %[8]s do %[4]s %[9]s %[6]s` issues.force_push_compare=Porovnat issues.due_date_form=rrrr-mm-dd -issues.due_date_form_add=Přidat termín dokončení issues.due_date_form_edit=Upravit issues.due_date_form_remove=Odstranit -issues.due_date_not_writer=Pro aktualizaci data dokončení problému potřebujete přístup k zápisu do tohoto repozitáře. issues.due_date_not_set=Žádný termín dokončení. issues.due_date_added=přidal/a termín dokončení %s %s issues.due_date_modified=změnil/a datum termínu z %[2]s na %[1]s %[3]s @@ -1823,7 +1730,6 @@ issues.review.remove_review_request=odstranil/a žádost o kontrolu u %[1]s %[2] issues.review.remove_review_request_self=odmítl/a posoudit %s issues.review.pending=Čekající issues.review.pending.tooltip=Tento komentář není momentálně viditelný pro ostatní uživatele. Chcete-li odeslat Vaše čekající komentáře, vyberte „%s“ → „%s/%s/%s“ v horní části stránky. -issues.review.review=Posouzení issues.review.reviewers=Posuzovatelé issues.review.outdated=Zastaralé issues.review.outdated_description=Obsah se změnil od chvíle, kdy byl tento komentář vytvořen @@ -1836,7 +1742,6 @@ issues.review.hide_resolved=Skrýt vyřešené issues.review.resolve_conversation=Vyřešit konverzaci issues.review.un_resolve_conversation=Nevyřešit konverzaci issues.review.resolved_by=označil tuto konverzaci jako vyřešenou -issues.assignee.error=Ne všichni zpracovatelé byli přidáni z důvodu neočekávané chyby. issues.reference_issue.body=Tělo zprávy issues.content_history.deleted=vymazáno issues.content_history.edited=upraveno @@ -1844,8 +1749,6 @@ issues.content_history.created=vytvořeno issues.content_history.delete_from_history=Smazat z historie issues.content_history.delete_from_history_confirm=Smazat z historie? issues.content_history.options=Možnosti -issues.reference_link=Reference: %s - compare.compare_base=základní compare.compare_head=porovnat @@ -1880,8 +1783,6 @@ pulls.nothing_to_compare_have_tag = Vybrané větve a značky jsou shodné. pulls.nothing_to_compare_and_allow_empty_pr=Tyto větve jsou stejné. Tato žádost o sloučení bude prázdná. pulls.has_pull_request=`Žádost o sloučení mezi těmito větvemi již existuje: %[2]s#%[3]d` pulls.create=Vytvořit žádost o sloučení -pulls.title_desc_few=chce sloučit %[1]d commity z větve %[2]s do %[3]s -pulls.merged_title_desc_few=sloučil %[1]d commity z větve %[2]s do větve %[3]s před %[4]s pulls.change_target_branch_at=`změnil/a cílovou větev z %s na %s %s` pulls.tab_conversation=Konverzace pulls.tab_commits=Revize @@ -2038,8 +1939,6 @@ signing.wont_sign.approved=Sloučení nebude podepsáno, protože žádost o slo signing.wont_sign.not_signed_in=Nejste přihlášeni. ext_wiki=Externí wiki -ext_wiki.desc=Odkaz do externí Wiki. - wiki=Wiki wiki.welcome=Vítejte ve wiki. wiki.welcome_desc=Wiki vám umožní psát a sdílet dokumentaci se spolupracovníky. @@ -2136,17 +2035,6 @@ activity.git_stats_deletion_n=%d odebrání contributors.contribution_type.filter_label = Typ příspěvku: contributors.contribution_type.commits=Revize -search=Vyhledat -search.search_repo=Hledat repozitář -search.type.tooltip=Druh vyhledávání -search.fuzzy=Fuzzy -search.fuzzy.tooltip=Zahrnout výsledky, které také úzce odpovídají hledanému výrazu -search.match=Shoda -search.match.tooltip=Zahrnout pouze výsledky, které odpovídají přesnému hledanému výrazu -search.results=Výsledky hledání „%s“ v %s -search.code_no_results=Nebyl nalezen žádný zdrojový kód odpovídající hledanému výrazu. -search.code_search_unavailable=V současné době není vyhledávání kódu dostupné. Obraťte se na správce webu. - settings=Nastavení settings.desc=Nastavení je místo, kde můžete měnit nastavení repozitáře settings.options=Repozitář @@ -2247,7 +2135,6 @@ settings.transfer_abort=Zrušit převod settings.transfer_abort_invalid=Nemůžete zrušit neexistující převod repozitáře. settings.transfer_abort_success=Převod repozitáře do %s byl úspěšně zrušen. settings.transfer_desc=Předat tento repozitář uživateli nebo organizaci, ve které máte administrátorská práva. -settings.transfer_form_title=Zadejte jméno repozitáře pro potvrzení: settings.transfer_in_progress=V současné době probíhá převod. Zrušte jej, pokud chcete převést tento repozitář jinému uživateli. settings.transfer_notices_1=- Ztratíte přístup k repozitáři, pokud jej převedete na uživatele. settings.transfer_notices_2=- Zůstane vám přístup k repozitáři, pokud jej převedete na organizaci kterou (spolu)vlastníte. @@ -2292,7 +2179,6 @@ settings.delete_collaborator=Odstranit settings.collaborator_deletion=Odstranit spolupracovníka settings.collaborator_deletion_desc=Odstranění spolupracovníka zruší jeho přístup do tohoto repozitáře. Pokračovat? settings.remove_collaborator_success=Spolupracovník byl smazán. -settings.search_user_placeholder=Hledat uživatele… settings.org_not_allowed_to_be_collaborator=Organizace nemůže být přidána jako spolupracovník. settings.change_team_access_not_allowed=Změna přístupu týmu k repozitáře se omezuje na vlastníka organizace settings.team_not_in_organization=Tým není ve stejné organizaci jako repozitář @@ -2300,7 +2186,6 @@ settings.teams=Týmy settings.add_team=Přidat tým settings.add_team_duplicate=Tým již má repozitář settings.add_team_success=Tým má nyní přístup k repozitáři. -settings.search_team=Vyhledat tým… settings.change_team_permission_tip=Oprávnění týmu je nastaveno na stránce nastavení týmu a nelze je změnit pro každý repozitář settings.delete_team_tip=Tento tým má přístup ke všem repositářům a nemůže být odstraněn settings.remove_team_success=Přístup týmu k repozitáři byl odstraněn. @@ -2435,12 +2320,7 @@ settings.branches=Větve settings.protected_branch=Ochrana větví settings.protected_branch.save_rule=Uložit pravidlo settings.protected_branch.delete_rule=Odstranit pravidlo -settings.protected_branch_can_push=Povolit nahrání? -settings.protected_branch_can_push_yes=Můžete nahrávat -settings.protected_branch_can_push_no=Nemůžete nahrávat settings.branch_protection=Pravidla ochrany pro větev „%s“ -settings.protect_this_branch=Povolit ochranu větve -settings.protect_this_branch_desc=Zabraňuje smazání a omezuje gitu nahrávání a slučování do větve. settings.protect_disable_push=Zakázat nahrávání settings.protect_disable_push_desc=Žádné nahrávání do této větve nebude povoleno. settings.protect_enable_push=Povolit nahrávání @@ -2450,9 +2330,7 @@ settings.protect_whitelist_committers=Povolit omezené nahrání settings.protect_whitelist_committers_desc=Pouze povolení uživatelé budou moci nahrávat do této větve (ale ne vynutit nahrání). settings.protect_whitelist_deploy_keys=Povolit nahrání klíčům pro nasazení s přístupem pro zápis. settings.protect_whitelist_users=Povolení uživatelé pro nahrávání -settings.protect_whitelist_search_users=Hledat uživatele… settings.protect_whitelist_teams=Povolené týmy pro nahrávání -settings.protect_whitelist_search_teams=Vyhledat týmy… settings.protect_merge_whitelist_committers=Povolit whitelist pro slučování settings.protect_merge_whitelist_committers_desc=Povolit slučování požadavků na sloučení do této větve pouze vyjmenovaným uživatelům nebo týmům. settings.protect_merge_whitelist_users=Povolení uživatelé pro slučování @@ -2481,8 +2359,6 @@ settings.protect_protected_file_patterns=Vzory chráněných souborů (oddělen settings.protect_protected_file_patterns_desc=Chráněné soubory, které nemají povoleno být měněny přímo, i když uživatel má právo přidávat, upravovat nebo mazat soubory v této větvi. Více vzorů lze oddělit pomocí středníku („;“). Podívejte se na dokumentaci %[2]s pro syntaxi vzoru. Příklady: .drone.yml, /docs/**/*.txt. settings.protect_unprotected_file_patterns=Vzory nechráněných souborů (oddělené středníkem „;“) settings.protect_unprotected_file_patterns_desc=Nechráněné soubory, které je možné měnit přímo, pokud má uživatel právo zápisu, čímž se obejde omezení push. Více vzorů lze oddělit pomocí středníku („;“). Podívejte se na %[2]s dokumentaci pro syntaxi vzoru. Příklady: .drone.yml, /docs/**/*.txt. -settings.add_protected_branch=Zapnout ochranu -settings.delete_protected_branch=Vypnout ochranu settings.update_protect_branch_success=Ochrana větví pro větev „%s“ byla aktualizována. settings.remove_protected_branch_success=Ochrana větví pro větev „%s“ byla zakázána. settings.remove_protected_branch_failed=Odstranění ochranného pravidla větve „%s“ se nezdařilo. @@ -2561,8 +2437,6 @@ settings.lfs_pointers.associateAccessible=Přiřadit přístupné %d OID settings.rename_branch_failed_exist=Nelze přejmenovat větev, protože cílová větev %s existuje. settings.rename_branch_failed_not_exist=Větev %s nelze přejmenovat, protože neexistuje. settings.rename_branch_success=Větev %s byla úspěšně přejmenována na %s. -settings.rename_branch_from=starý název větve -settings.rename_branch_to=nový název větve settings.rename_branch=Přejmenovat větev diff.browse_source=Procházet zdroj @@ -2571,7 +2445,6 @@ diff.commit=revize diff.git-notes=Poznámky diff.data_not_available=Rozdílový obsah není dostupný diff.options_button=Možnosti porovnání -diff.show_diff_stats=Zobrazit statistiky diff.download_patch=Stáhnout soubor patche diff.download_diff=Stáhnout rozdílový soubor diff.show_split_view=Rozdělené zobrazení @@ -2664,7 +2537,6 @@ release.tag_name_invalid=Název štítku není platný. release.tag_name_protected=Název značky je chráněn. release.tag_already_exist=Tato značka již existuje. release.downloads=Soubory ke stažení -release.download_count=Stažení: %s release.add_tag_msg=Použít název a obsah vydání jako zprávu značky. release.add_tag=Vytvořit značku release.releases_for=Vydání pro %s @@ -2693,14 +2565,12 @@ branch.default_deletion_failed=Větev „%s“ je výchozí větev. Nelze ji ods branch.restore=Obnovit větev „%s“ branch.download=Stáhnout větev „%s“ branch.rename=Přejmenovat větev „%s“ -branch.search=Hledat větev branch.included_desc=Tato větev je součástí výchozí větve branch.included=Zahrnuje branch.create_new_branch=Vytvořit větev z větve: branch.confirm_create_branch=Vytvořit větev branch.warning_rename_default_branch=Přejmenováváte výchozí větev. branch.rename_branch_to=Přejmenovat „%s“ na: -branch.confirm_rename_branch=Přejmenovat větev branch.create_branch_operation=Vytvořit větev branch.new_branch=Vytvořit novou větev branch.new_branch_from=Vytvořit novou větev z „%s“ @@ -2726,7 +2596,6 @@ error.csv.unexpected=Tento soubor nelze vykreslit, protože obsahuje neočekáva error.csv.invalid_field_count=Soubor nelze vykreslit, protože má nesprávný počet polí na řádku %d. pulls.made_using_agit = AGit settings.confirm_wiki_branch_rename = Přejmenovat větev wiki -issues.comment.blocked_by_user = Tento problém nemůžete okomentovat, protože jste byli zablokováni majitelem repozitáře nebo autorem problému. contributors.contribution_type.additions = Přidání admin.manage_flags = Spravovat vlajky admin.enabled_flags = Vlajky povolené v repozitáři: @@ -2735,7 +2604,6 @@ admin.failed_to_replace_flags = Nepodařilo se nahradit vlajky repozitáře admin.flags_replaced = Vlajky repozitáře nahrazeny pulls.cmd_instruction_checkout_title = Kontrola settings.mirror_settings.docs.disabled_push_mirror.info = Push zrcadla byla zakázána administrátorem vašeho webu. -clone_in_vscodium = Klonovat do VSCodium settings.wiki_rename_branch_main_notices_1 = Tato operace je NEVRATNÁ. settings.wiki_branch_rename_success = Název větve wiki repozitáře byl úspěšně normalizován. rss.must_be_on_branch = Abyste mohli mít zdroj RSS, musíte se nacházet ve větvi. @@ -2789,9 +2657,6 @@ settings.protect_status_check_patterns_desc = Zadejte vzorce pro upřesnění ko settings.archive.mirrors_unavailable = Zrcadla nejsou v archivovaných repozitářích k dispozici. settings.protect_enable_merge_desc = Kdokoli s přístupem k zápisu bude moci slučovat žádosti o sloučení do této větve. settings.event_pull_request_review_request_desc = Bylo požádáno o posouzení žádosti o sloučení nebo bylo toto požádání odstraněno. -error.broken_git_hook = Zdá se, že u tohoto repozitáře jsou rozbité Git webhooky. Pro jejich opravení se prosím řiďte pokyny v dokumentaci a poté odešlete pár revizí pro obnovení stavu. -pulls.title_desc_one = žádá o sloučení %[1]d commitu z %[2]s do %[3]s -pulls.merged_title_desc_one = sloučil %[1]d commit z %[2]s do %[3]s %[4]s open_with_editor = Otevřít pomocí %s commits.search_branch = Tato větev editor.commit_id_not_matching = Tento soubor se během úpravy změnil. Odešlete změny do nové větve a poté je slučte. @@ -2817,7 +2682,6 @@ release.system_generated = Tato příloha byla automaticky vygenerována. settings.add_webhook.invalid_path = Cesta nesmí obsahovat část, která je „.“ nebo „..“ nebo prázdný řetězec. Nesmí začínat ani končit lomítkem. settings.web_hook_name_sourcehut_builds = Sestavení SourceHut settings.sourcehut_builds.manifest_path = Cesta manifestu sestavení -settings.sourcehut_builds.graphql_url = URL GraphQL (např. https://builds.sr.ht/query) settings.sourcehut_builds.visibility = Viditelnost práce settings.sourcehut_builds.secrets = Tajné klíče settings.sourcehut_builds.secrets_helper = Udělit práci přístup k tajným klíčům sestavení (vyžaduje oprávnění SECRETS:RO) @@ -2907,7 +2771,6 @@ commits.view_single_diff = Zobrazit změny tohoto souboru provedené v této rev pulls.editable = Upravitelné pulls.editable_explanation = Tato žádost o sloučení umožňuje úpravy správci. Můžete přispět přímo do ní. issues.reopen.blocked_by_user = Tento problém nemůžete znovu otevřít, protože jste byli zablokováni majitelem repozitáře nebo autorem tohoto problému. -pulls.comment.blocked_by_user = Tuto žádost o sloučení nemůžete okomentovat, protože jste byli zablokováni majitelem repozitáře nebo autorem žádosti. issues.filter_no_results_placeholder = Zkuste upravit filtry vyhledávání. issues.filter_no_results = Žádné výsledky migrate.repo_desc_helper = Ponechte prázdné pro importování existujícího popisu @@ -3016,9 +2879,7 @@ teams.none_access_helper=Možnost „žádný přístup“ má vliv pouze na sou teams.general_access=Vlastní přístup teams.general_access_helper=O oprávnění členů bude rozhodnuto níže uvedenou tabulkou oprávnění. teams.read_access=Čtení -teams.read_access_helper=Členové mohou zobrazit a klonovat repozitáře týmu. teams.write_access=Zápis -teams.write_access_helper=Členové mohou číst a nahrávat do repozitářů týmu. teams.admin_access=Přístup správce teams.admin_access_helper=Členové mohou natahovat i nahrávat do repozitářů týmu a mohou přidávat spolupracovníky. teams.no_desc=Tento tým není žádný popis @@ -3033,12 +2894,9 @@ teams.invite_team_member.list=Čekající pozvánky teams.delete_team_title=Odstranit tým teams.delete_team_desc=Smazání týmu zruší přístup jeho členům. Pokračovat? teams.delete_team_success=Tým byl odstraněn. -teams.read_permission_desc=Členství v tom týmu poskytuje právo čtení: členové mohou číst z a vytvářet klony repozitářů týmu. -teams.write_permission_desc=Členství v tom týmu poskytuje právo zápisu: členové mohou číst z a nahrávat do repozitářů týmu. teams.admin_permission_desc=Tento tým poskytuje přístup Správce: členové mohou číst, nahrávat a přidávat spolupracovníky do repozitářů týmu. teams.create_repo_permission_desc=Navíc tento tým uděluje oprávnění vytvořit repozitář: členové mohou vytvářet nové repozitáře v organizaci. teams.repositories=Repozitáře týmu -teams.search_repo_placeholder=Hledat repozitář… teams.remove_all_repos_title=Odstranit všechny repozitáře týmu teams.remove_all_repos_desc=Tímto odeberete všechny repozitáře z týmu. teams.add_all_repos_title=Přidat všechny repozitáře @@ -3051,9 +2909,6 @@ teams.specific_repositories=Konkrétní repozitáře teams.specific_repositories_helper=Členové budou mít přístup pouze do repozitářů výslovně přidaných do týmu. Výběrem tohoto nebudou automaticky odstraněny již přidané repozitáře pomocí Všechny repozitáře. teams.all_repositories=Všechny repozitáře teams.all_repositories_helper=Tým má přístup ke všem repositářům. Výběrem tohoto přidáte do týmu všechny existující repozitáře. -teams.all_repositories_read_permission_desc=Tomuto týmu je udělen přístup pro Čtení všech repozitářů: členové mohou prohlížet a klonovat repozitáře. -teams.all_repositories_write_permission_desc=Tomuto týmu je udělen přístup pro Zápis do všech repozitářů: členové mohou prohlížet a nahrávat do repozitářů. -teams.all_repositories_admin_permission_desc=Tomuto týmu je udělen Administrátorský přístup do všech repozitářů: členové mohou prohlížet, nahrávat a přidávat spolupracovníky do repozitářů. teams.invite.title=Byli jste pozváni do týmu %s v organizaci %s. teams.invite.by=Pozvání od %s teams.invite.description=Pro připojení k týmu klikněte na tlačítko níže. @@ -3147,7 +3002,6 @@ dashboard.gc_metadata_obtained=Získaná metadata GC dashboard.other_system_allocation_obtained=Získaná alokace ostatních systémových prostředků dashboard.next_gc_recycle=Příští recyklace GC dashboard.last_gc_time=Doba od posledního GC -dashboard.total_gc_time=Celková pauza GC dashboard.total_gc_pause=Celková pauza GC dashboard.last_gc_pause=Poslední pauza GC dashboard.gc_times=Časy GC @@ -3246,9 +3100,6 @@ repos.unadopted.no_more=Nebyly nalezeny žádné nepřijaté repositáře. repos.owner=Vlastník repos.name=Název repos.private=Soukromý -repos.watches=Sledovače -repos.stars=Oblíbení -repos.forks=Rozštěpení repos.issues=Problémy repos.size=Velikost repos.lfs_size=Velikost LFS @@ -3349,17 +3200,6 @@ auths.oauth2_group_claim_name=Název tvrzení poskytující názvy skupin pro te auths.oauth2_admin_group=Hodnota claimu pro skupinu uživatelů administrátorů. (Volitelné - vyžaduje název claimu výše) auths.oauth2_restricted_group=Hodnota claimu pro skupinu omezených uživatelů. (Volitelné - vyžaduje název claimu výše) auths.oauth2_map_group_to_team_removal=Odebrat uživatele z synchronizovaných týmů, pokud uživatel nepatří do odpovídající skupiny. -auths.enable_auto_register=Povolit automatické registrace -auths.sspi_auto_create_users=Automaticky vytvářet uživatele -auths.sspi_auto_create_users_helper=Povolit SSPI autentizační metodě automaticky vytvářet nové účty pro uživatele, kteří se poprvé přihlásili -auths.sspi_auto_activate_users=Automaticky aktivovat uživatele -auths.sspi_auto_activate_users_helper=Povolit SSPI autentizační metodě automaticky aktivovat nové uživatele -auths.sspi_strip_domain_names=Odstranit názvy domén z uživatelských jmen -auths.sspi_strip_domain_names_helper=Je-li zaškrtnuto, doménová jména budou odstraněna z přihlašovacích jmen (např. „DOMAIN\user“ a „user@example.org“ se stanou jen „user“). -auths.sspi_separator_replacement=Oddělovač použitý místo \, / a @ -auths.sspi_separator_replacement_helper=Znak k nahrazení oddělovače jmen na nižší úrovni (např. „DOMAIN\user“) a uživatelská jména (např. @ v „user@example.org“). -auths.sspi_default_language=Výchozí jazyk uživatele -auths.sspi_default_language_helper=Výchozí jazyk pro uživatele automaticky vytvořené pomocí SSPI auth metody. Pokud dáváte přednost automatickému zjištění jazyka, ponechte prázdné. auths.tips=Tipy auths.tips.oauth2.general=Ověřování OAuth2 auths.tips.oauth2.general.tip=Při registraci nové OAuth2 autentizace by URL callbacku/přesměrování měla být: @@ -3369,7 +3209,6 @@ auths.tip.nextcloud=Zaregistrujte nového OAuth konzumenta na vaší instanci po auths.tip.dropbox=Vytvořte novou aplikaci na %s auths.tip.facebook=Registrujte novou aplikaci na %s a přidejte produkt „Facebook Login“ auths.tip.github=Registrujte novou OAuth aplikaci na %s -auths.tip.gitlab=Registrujte novou aplikaci na https://gitlab.com/profile/applications auths.tip.google_plus=Získejte klientské pověření OAuth2 z Google API konzole na %s auths.tip.openid_connect=Použijte OpenID URL pro objevování spojení (/.well-known/openid-configuration) k nastavení koncových bodů auths.tip.twitter=Jděte na %s, vytvořte aplikaci a ujistěte se, že volba „Allow this application to be used to Sign in with Twitter“ je povolená @@ -3962,8 +3801,6 @@ runs.actors_no_select=Všichni aktéři runs.status_no_select=Všechny stavy runs.no_results=Nebyly nalezeny žádné výsledky. runs.no_workflows=Zatím nebyly vytvořeny žádné pracovní postupy. -runs.no_workflows.quick_start = Nevíte jak začít s Gitea Action? Podívejte se na průvodce rychlým startem. -runs.no_workflows.documentation = Další informace o Gitea Action, viz dokumentace. runs.no_runs=Pracovní postup zatím nebyl spuštěn. runs.empty_commit_message=(prázdná zpráva revize) @@ -4029,8 +3866,6 @@ submodule=Submodul code_search_unavailable = Vyhledávání kódu momentálně není dostupné. Kontaktujte prosím administrátora webu. type_tooltip = Typ vyhledávání fuzzy = Přibližné -match = Shoda -match_tooltip = Zahrnout pouze výsledky, které přesně odpovídají hledanému výrazu repo_kind = Hledat repozitáře… user_kind = Hledat uživatele… org_kind = Hledat organizace… @@ -4045,14 +3880,12 @@ no_results = Nenalezeny žádné odpovídající výsledky. fuzzy_tooltip = Zahrnout také výsledky, které úzce odpovídají hledanému výrazu search = Hledat… keyword_search_unavailable = Hledání pomocí klíčových slov momentálně není dostupné. Kontaktujte prosím administrátora webu. -code_search_by_git_grep = Aktuální výsledky vyhledávání kódu jsou poskytovány službou „git grep“. Lepší výsledky dostanete, když administrátor webu povolí indexování kódu. 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 žádosti… union = Sdružené union_tooltip = Zahrnout výsledky, které odpovídají jakémukoli ze slov oddělených mezerami -milestone_kind = Hledat milníky... regexp = RegExp regexp_tooltip = Interpretovat hledaný výraz jako regulární výraz diff --git a/options/locale/locale_da.ini b/options/locale/locale_da.ini index 179ceb07ca..e7f7897db9 100644 --- a/options/locale/locale_da.ini +++ b/options/locale/locale_da.ini @@ -1,6 +1,3 @@ - - - [common] home = Hjem dashboard = Instrumentpanel @@ -160,14 +157,12 @@ regexp_tooltip = Fortolk søgetermen som et regulært udtryk org_kind = Søg i organisationer… team_kind = Søg efter teams… code_kind = Søg kode… -code_search_by_git_grep = Aktuelle kodesøgeresultater leveres af "git grep". Der kan være bedre resultater, hvis webstedsadministratoren aktiverer kodeindeksering. package_kind = Søg pakker… project_kind = Søg efter projekter… commit_kind = Søg commits… branch_kind = Søg branches… runner_kind = Søg runners… issue_kind = Søg i problemer… -milestone_kind = Søg milepæle... pull_kind = Søg pulls… repo_kind = Søg depoter… code_search_unavailable = Kodesøgning er ikke tilgængelig i øjeblikket. Kontakt venligst webstedets administrator. @@ -564,8 +559,6 @@ CommitMessage = Commit besked CommitChoice = Commit valg TreeName = Fil sti Content = Indhold -SSPISeparatorReplacement = Separator -SSPIDefaultLanguage = Standard sprog require_error = ` må ikke være tomt.` alpha_dash_error = ` bør kun indeholde alfanumeriske, bindestreg ("-") og understregningstegn ("_").` alpha_dash_dot_error = ` bør kun indeholde alfanumeriske tegn, bindestreg ("-"), understregning ("_") og prik ("".").` @@ -702,7 +695,6 @@ full_name = Fulde navn website = Websted location = Lokation pronouns = Stedord -pronouns_custom = Brugerdefineret pronouns_unspecified = Uspecificeret update_theme = Skift tema update_language = Skift sprog @@ -977,7 +969,6 @@ visibility.private_tooltip = Kun synlig for medlemmer af organisationer, du har delete_with_all_comments = Din konto er yngre end %s. For at undgå spøgelseskommentarer slettes alle problemer/PR-kommentarer med kontoen. delete_account_title = Slet brugerkonto user_block_yourself = Du kan ikke blokere dig selv. -pronouns_custom_label = Brugerdefinerede stedord change_username_redirect_prompt.with_cooldown.one = Det gamle brugernavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dag, år. Du kan stadig kræve det gamle brugernavn tilbage i nedkølingsperioden. change_username_redirect_prompt.with_cooldown.few = Det gamle brugernavn vil være tilgængeligt for alle efter en nedkølingsperiode på %[1]d dage, år. Du kan stadig kræve det gamle brugernavn tilbage i nedkølingsperioden. keep_pronouns_private = Vis kun stedord til godkendte brugere @@ -1137,7 +1128,6 @@ mirror_address_protocol_invalid = Den angivne URL er ugyldig. Kun http(s):// ell transfer.reject_desc = Annuller overførsel til "%s" archive.title = Dette depot er arkiveret. Du kan se filer og klone det, men du kan ikke foretage ændringer i dets tilstand, f.eks. pushe og oprette nye problemer, pull-anmodninger eller kommentarer. archive.title_date = Dette depot er blevet arkiveret på %s. Du kan se filer og klone det, men du kan ikke foretage ændringer i dets tilstand, såsom at pushe og oprette nye problemer, pull-anmodninger eller kommentarer. -archive.issue.nocomment = Denne depot er arkiveret. Du kan ikke kommentere på problemer. form.reach_limit_of_creation_1 = Ejeren har allerede nået grænsen på %d depot. form.reach_limit_of_creation_n = Ejeren har allerede nået grænsen på %d depoterne. form.name_reserved = Depotnavnet "%s" er reserveret. @@ -1189,7 +1179,6 @@ forked_from = forked fra generated_from = genereret fra fork_from_self = Du kan ikke forke et depot, du ejer. migrate.onedev.description = Migrer data fra code.onedev.io eller andre OneDev-instanser. -archive.pull.nocomment = Denne depot er arkiveret. Du kan ikke kommentere på pull-anmodninger. migrated_from = Migreret fra %[2]s migrate.gitea.description = Migrer data fra gitea.com eller andre Gitea-instanser. migrate.gitbucket.description = Migrer data fra GitBucket-instanser. @@ -1521,8 +1510,6 @@ issues.add_remove_labels = tilføjede %s og fjernede %s etiketter %s issues.add_milestone_at = `føjede dette til %s milepælen %s` issues.add_project_at = `føjede dette til %s- projektet %s` issues.ref_reopening_from = `henviste til dette problem fra en pull-anmodning %[3]s, der vil genåbne det, %[1]s` -issues.ref_closed_from = `lukkede dette problem %[4]s %[2 ]s` -issues.ref_reopened_from = `genåbnede dette problem %[4]s %[2 ]s` issues.ref_from = `fra %[1]s` issues.author = Forfatter issues.commit_ref_at = `henviste til dette problem fra en commit %s` @@ -1764,7 +1751,6 @@ issues.review.add_remove_review_requests = anmodede om gennemgang fra %[1]s og f issues.review.pending = Afventer issues.dependency.add_error_dep_not_exist = Afhængighed eksisterer ikke. issues.review.pending.tooltip = Denne kommentar er i øjeblikket ikke synlig for andre brugere. For at indsende dine afventende kommentarer, vælg "%s" -> "%s/%s/%s" øverst på siden. -issues.review.review = Gennemgå issues.review.outdated_description = Indholdet er ændret siden denne kommentar blev lavet issues.review.option.show_outdated_comments = Vis forældede kommentarer issues.review.reviewers = Gemmengåer @@ -1784,8 +1770,6 @@ issues.content_history.delete_from_history = Slet fra historikken issues.content_history.delete_from_history_confirm = Slet fra historikken? issues.content_history.options = Valgmuligheder issues.blocked_by_user = Du kan ikke oprette problemer på dette depot, fordi du er blokeret af depotes ejer. -issues.comment.blocked_by_user = Du kan ikke kommentere til dette problem, fordi du er blokeret af depotes ejer eller anmelder af problemet. -issues.reference_link = Reference: %s compare.compare_base = base compare.compare_head = sammenlign pulls.desc = Aktiver pull-anmodninger og kodegennemgange. @@ -1897,7 +1881,6 @@ pulls.push_rejected = Push mislykkedes: Pushet blev afvist. Gennemgå Git-hooks pulls.push_rejected_no_message = Push mislykkedes: Pushet blev afvist, men der var ingen fjernmeddelelse. Gennemgå Git-hooks for dette depot pulls.status_checks_failure = Nogle kontroller mislykkedes issues.reopen.blocked_by_user = Du kan ikke genåbne dette problem, fordi du er blokeret af depotes ejer eller aflæggeren af dette problem. -pulls.comment.blocked_by_user = Du kan ikke kommentere denne pull-anmodning, fordi du er blokeret af depotes ejer eller plakaten for pull-anmodningen. pulls.open_unmerged_pull_exists = `Du kan ikke udføre en genåbnings handling, fordi der er en afventende pull-anmodning (#%d) med identiske egenskaber.` pulls.status_checking = Nogle kontroller afventer pulls.status_checks_warning = Nogle kontroller rapporterede advarsler @@ -2718,7 +2701,6 @@ branch.download = Download gren "%s" branch.rename = Omdøb grenen "%s" branch.included_desc = Denne gren er en del af standardgrenen branch.included = Inkluderet -error.broken_git_hook = Git hooks af dette depot ser ud til at være brudt. Følg venligst dokumentationen for at rette dem, og push derefter på nogle commits for at opdatere statussen. branch.create_new_branch = Opret en gren fra gren: branch.confirm_create_branch = Opret gren branch.rename_branch_to = Omdøb "%s" til: @@ -2842,7 +2824,6 @@ members.private_helper = Gør synlig members.member_role = Medlemsrolle: members.remove.detail = Vil du fjerne %[1]s fra %[2]s? members.invite_desc = Tilføj et nyt medlem til %s: -teams.read_permission_desc = Dette team giver læse adgang: medlemmer kan se og klone teamdepoter. teams.remove_all_repos_title = Slet alle team depoter members.leave.detail = Er du sikker på, at du vil forlade organisationen "%s"? settings.email = Kontakt email @@ -2879,7 +2860,6 @@ members.leave = Forlad teams.leave = Forlad teams.join = Deltag teams.delete_team_success = Teamet er blevet slettet. -teams.write_permission_desc = Dette team giver Skrive adgang: medlemmer kan læse fra og skubbe til teamdepoter. teams.invite_team_member = Inviter til %s teams.invite_team_member.list = Afventende invitationer teams.admin_permission_desc = Dette team giver Administrator adgang: medlemmer kan læse fra, skubbe til og tilføje samarbejdspartnere til teamdepoter. diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 0ebbcc8cad..c13d87d014 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -48,21 +48,14 @@ webauthn_error_unable_to_process=Der Server konnte deine Anfrage nicht bearbeite webauthn_error_duplicated=Für diese Anfrage ist der Sicherheitsschlüssel nicht erlaubt. Bitte stell sicher, dass er nicht bereits registriert ist. webauthn_error_empty=Du musst einen Namen für diesen Schlüssel festlegen. webauthn_error_timeout=Das Zeitlimit wurde erreicht, bevor dein Schlüssel gelesen werden konnte. Bitte lade die Seite erneut. -webauthn_reload=Neu laden - repository=Repository organization=Organisation mirror=Spiegel -new_repo=Neues Repository -new_migrate=Neue Migration new_mirror=Neuer Spiegel new_fork=Neuer Fork -new_org=Neue Organisation new_project=Neues Projekt new_project_column=Neue Spalte -manage_org=Organisationen verwalten admin_panel=Administration -account_settings=Kontoeinstellungen settings=Einstellungen your_profile=Profil your_starred=Favoriten @@ -218,8 +211,6 @@ string.desc=Z–A [error] occurred=Ein Fehler ist aufgetreten report_message=Wenn du glaubst, dass dies ein Fehler von Forgejo ist, such bitte auf Codeberg nach Issues oder erstelle gegebenenfalls ein neues Issue. -missing_csrf=Fehlerhafte Anfrage: Kein CSRF-Token verfügbar -invalid_csrf=Fehlerhafte Anfrage: Ungültiger CSRF-Token not_found=Das Ziel konnte nicht gefunden werden. network_error=Netzwerkfehler server_internal = Interner Serverfehler @@ -355,15 +346,10 @@ app_slogan_helper = Instanz-Slogan hier eingeben. Leer lassen zum Deaktivieren. [home] uname_holder=Benutzername oder E-Mail-Adresse -password_holder=Passwort switch_dashboard_context=Kontext der Übersichtsseite wechseln my_repos=Repositorys -show_more_repos=Zeige mehr Repositorys … -collaborative_repos=Gemeinschaftliche Repositorys my_orgs=Organisationen -my_mirrors=Meine Spiegel view_home=%s ansehen -search_repos=Finde ein Repository … filter=Andere Filter filter_by_team_repositories=Nach Team-Repositorys filtern feed_of=Feed von „%s“ @@ -384,20 +370,8 @@ issues.in_your_repos=Eigene Repositorys repos=Repositorys users=Benutzer organizations=Organisationen -search=Suche go_to=Gehe zu code=Code -search.type.tooltip=Suchmodus -search.fuzzy=Ähnlich -search.fuzzy.tooltip=Zeige auch Ergebnisse, die dem Suchbegriff ähneln -search.match=Genau -search.match.tooltip=Zeige nur Ergebnisse, die exakt mit dem Suchbegriff übereinstimmen -code_search_unavailable=Derzeit ist die Code-Suche nicht verfügbar. Bitte wende dich an den Website-Administrator. -repo_no_results=Keine passenden Repositorys gefunden. -user_no_results=Keine passenden Benutzer gefunden. -org_no_results=Keine passenden Organisationen gefunden. -code_no_results=Es konnte kein passender Code für deinen Suchbegriff gefunden werden. -code_search_results=Suchergebnisse für „%s“ code_last_indexed_at=Zuletzt indiziert %s relevant_repositories_tooltip=Repositorys, die Forks sind oder die kein Thema, kein Symbol und keine Beschreibung haben, werden ausgeblendet. relevant_repositories=Es werden nur relevante Repositorys angezeigt, ungefilterte Ergebnisse anzeigen. @@ -408,15 +382,12 @@ forks_few = %d Forks [auth] create_new_account=Konto registrieren -register_helper_msg=Hast du bereits ein Konto? Jetzt anmelden! -social_register_helper_msg=Hast du bereits ein Konto? Jetzt verknüpfen! disable_register_prompt=Die Registrierung ist deaktiviert. Bitte wende dich an den Administrator. disable_register_mail=E-Mail-Bestätigung bei der Registrierung ist deaktiviert. manual_activation_only=Kontaktiere den Website-Administrator, um die Aktivierung abzuschließen. remember_me=Dieses Gerät speichern forgot_password_title=Passwort vergessen forgot_password=Passwort vergessen? -sign_up_now=Noch kein Konto? Jetzt registrieren. sign_up_successful=Konto wurde erfolgreich erstellt. Willkommen! confirmation_mail_sent_prompt=Eine neue Bestätigungs-E-Mail wurde an %s gesendet. Um den Registrierungsprozess abzuschließen, überprüfe bitte deinen Posteingang und folge dem angegebenen Link innerhalb von: %s. Falls die E-Mail inkorrekt sein sollte, kannst du dich einloggen und anfragen, eine weitere Bestätigungs-E-Mail an eine andere Adresse zu senden. must_change_password=Aktualisiere dein Passwort @@ -429,7 +400,6 @@ prohibit_login_desc=Dein Account ist auf dieser Instanz gesperrt worden. Bitte k resent_limit_prompt=Du hast bereits eine Aktivierungs-E-Mail angefordert. Bitte warte 3 Minuten und probiere es dann nochmal. has_unconfirmed_mail=Hallo %s, du hast eine unbestätigte E-Mail-Adresse (%s). Wenn du keine Bestätigungs-E-Mail erhalten hast oder eine neue senden möchtest, klicke bitte auf den folgenden Button. resend_mail=Aktivierungs-E-Mail erneut verschicken -email_not_associate=Diese E-Mail-Adresse ist mit keinem Konto verknüpft. send_reset_mail=Wiederherstellungs-E-Mail senden reset_password=Kontowiederherstellung invalid_code=Dein Bestätigungs-Code ist ungültig oder abgelaufen. @@ -446,7 +416,6 @@ twofa_scratch_used=Du hast dein Einmalpasswort verwendet. Du wurdest zu den Eins twofa_passcode_incorrect=Ungültige PIN. Wenn du dein Gerät verloren hast, verwende dein Einmalpasswort. twofa_scratch_token_incorrect=Das Einmalpasswort ist falsch. login_userpass=Anmelden -tab_openid=OpenID oauth_signup_tab=Neues Konto registrieren oauth_signup_title=Neues Konto fertigstellen oauth_signup_submit=Konto vervollständigen @@ -472,16 +441,12 @@ authorize_application_description=Wenn du diese Anwendung autorisierst, wird sie authorize_title=„%s“ den Zugriff auf deinen Account gestatten? authorization_failed=Autorisierung fehlgeschlagen authorization_failed_desc=Die Autorisierung ist fehlgeschlagen, da wir eine ungültige Anfrage erkannt haben. Bitte kontaktiere den Betreuer der App, die du zu autorisieren versucht hast. -sspi_auth_failed=SSPI-Authentifizierung fehlgeschlagen password_pwned=Das von dir gewählte Passwort befindet sich auf einer List gestohlener Passwörter, die öffentlich verfügbar sind. Bitte versuche es erneut mit einem anderen Passwort und ziehe in Erwägung, auch anderswo deine Passwörter zu ändern. password_pwned_err=Anfrage an HaveIBeenPwned konnte nicht abgeschlossen werden change_unconfirmed_email_summary = Ändern der E-Mail-Adresse, an die die Aktivierungsnachricht gesendet wird. change_unconfirmed_email_error = Ändern der E-Mail-Adresse fehlgeschlagen: %v last_admin = Du kannst den letzten Administrator nicht entfernen. Es muss mindestens einen Administrator geben. change_unconfirmed_email = Wenn du bei der Anmeldung eine falsche E-Mail-Adresse angegeben hast, kannst du diese unten ändern und bekommst stattdessen eine Bestätigung an die neue Adresse geschickt. -remember_me.compromised = Der Anmeldetoken ist nicht mehr gültig, dies könnte auf ein kompromittiertes Konto hindeuten. Bitte prüfe dein Konto auf ungewöhnliche Aktivitäten. -tab_signin = Anmelden -tab_signup = Registrieren sign_up_button = Jetzt registrieren. back_to_sign_in = Zurück zur Anmeldung sign_in_openid = Mit OpenID fortfahren @@ -497,22 +462,18 @@ link_not_working_do_paste=Link funktioniert nicht? Versuche, ihn zu kopieren und hi_user_x=Hallo %s, activate_account=Bitte aktiviere dein Konto -activate_account.title=%s, bitte aktiviere dein Konto activate_account.text_1=Hallo %[1]s, danke für deine Registrierung bei %[2]s! activate_account.text_2=Bitte klicke innerhalb von %s auf folgenden Link, um dein Konto zu aktivieren: activate_email=Bestätige deine E-Mail-Adresse -activate_email.title=%s, bitte verifiziere deine E-Mail-Adresse activate_email.text=Bitte klicke innerhalb von %s auf folgenden Link, um dein Konto zu aktivieren: register_notify=Willkommen bei %s -register_notify.title=%[1]s, willkommen bei %[2]s register_notify.text_1=dies ist deine Bestätigungs-E-Mail für %s! register_notify.text_2=Du kannst dich mit dem Benutzernamen „%s“ anmelden register_notify.text_3=Wenn jemand anderes diesen Account für dich erstellt hat, musst du zuerst dein Passwort setzen. reset_password=Stelle dein Konto wieder her -reset_password.title=%s, wir haben eine Anfrage zur Wiederherstellung deines Kontos erhalten reset_password.text=Falls du das warst, klicke bitte innerhalb von %s auf folgenden Link, um dein Konto wiederherzustellen: register_success=Registrierung erfolgreich @@ -568,7 +529,6 @@ removed_security_key.subject = Ein Sicherheitsschlüssel wurde entfernt removed_security_key.no_2fa = Es sind keine anderen 2FA-Methoden mehr konfiguriert, was bedeutet, dass es nicht mehr nötig ist, sich in deinen Account mit 2FA einzuloggen. account_security_caution.text_1 = Wenn du das warst, kannst du diese E-Mail bedenkenlos ignorieren. removed_security_key.text_1 = Sicherheitsschlüssel „%[1]s“ wurde soeben von deinem Account entfernt. -reset_password.text_1 = Das Passwort für deinen Account wurde soeben geändert. primary_mail_change.text_1 = Die primäre E-Mail-Adresse deines Account wurde soeben zu %[1]s geändert. Das bedeutet, dass diese E-Mail-Adresse keine E-Mail-Benachrichtigungen für deinen Account erhalten wird. account_security_caution.text_2 = Wenn du das nicht warst, wurde dein Account kompromittiert. Bitte kontaktiere die Admins dieser Webseite. totp_enrolled.subject = Du hast TOTP als 2FA-Methode aktiviert @@ -588,8 +548,6 @@ RepoName=Repository-Name Email=E-Mail-Adresse Password=Passwort Retype=Passwort bestätigen -SSHTitle=SSH-Schlüsselname -HttpsUrl=HTTPS-URL PayloadUrl=Payload-URL TeamName=Teamname AuthName=Name der Autorisierung @@ -602,9 +560,6 @@ CommitChoice=Commit-Auswahl TreeName=Dateipfad Content=Inhalt -SSPISeparatorReplacement=Trennzeichen -SSPIDefaultLanguage=Standardsprache - require_error=` darf nicht leer sein.` alpha_dash_error=` sollte nur Buchstaben, Zahlen, Bindestriche („-“) und Unterstriche („_“) enthalten.` alpha_dash_dot_error=` sollte nur Buchstaben, Zahlen, Bindestriche („-“), Unterstriche („_“) und Punkte („.“) enthalten.` @@ -626,7 +581,6 @@ lang_select_error=Wähle eine Sprache aus der Liste aus. username_been_taken=Der Benutzername ist bereits vergeben. username_change_not_local_user=Nicht-lokale Benutzer dürfen ihren Nutzernamen nicht ändern. -username_has_not_been_changed=Benutzername wurde nicht geändert repo_name_been_taken=Der Repository-Name wird schon verwendet. repository_force_private=Privat erzwingen ist aktiviert: Private Repositorys können nicht veröffentlicht werden. repository_files_already_exist=Dateien für dieses Repository sind bereits vorhanden. Kontaktiere den Systemadministrator. @@ -706,7 +660,6 @@ unfollow=Nicht mehr folgen user_bio=Biografie disabled_public_activity=Dieser Benutzer hat die öffentliche Sichtbarkeit der Aktivität deaktiviert. email_visibility.limited=Ihre E-Mail-Adresse ist für alle authentifizierten Benutzer sichtbar -email_visibility.private=Deine E-Mail-Adresse ist nur für dich und Administratoren sichtbar show_on_map=Diesen Ort auf einer Karte anzeigen settings=Benutzereinstellungen @@ -741,13 +694,11 @@ password=Passwort security=Sicherheit avatar=Profilbild ssh_gpg_keys=SSH- / GPG-Schlüssel -social=Soziale Konten applications=Anwendungen orgs=Organisationen repos=Repositorys delete=Account löschen twofa=Zwei-Faktor-Authentifizierung (TOTP) -account_link=Verknüpfte Benutzerkonten organization=Organisationen uid=UID webauthn=Zwei-Faktor-Authentifizierung (Sicherheitsschlüssel) @@ -794,10 +745,7 @@ comment_type_group_issue_ref=Issue-Referenz saved_successfully=Die Einstellungen wurden erfolgreich gespeichert. privacy=Datenschutz keep_activity_private=Aktivität auf der Profilseite ausblenden -keep_activity_private_popup=Deine Aktivität wird nur für dich und die Instanzadministratoren sichtbar sein - lookup_avatar_by_mail=Profilbild anhand der E-Mail-Addresse suchen -federated_avatar_lookup=Suche nach föderierten Profilbildern enable_custom_avatar=Benutzerdefiniertes Profilbild verwenden choose_new_avatar=Neues Profilbild auswählen update_avatar=Profilbild aktualisieren @@ -815,7 +763,6 @@ password_incorrect=Das aktuelle Passwort ist falsch. change_password_success=Dein Passwort wurde aktualisiert. Verwende ab jetzt dein neues Passwort zum Einloggen. password_change_disabled=Benutzer, die nicht von Forgejo verwaltet werden, können ihr Passwort im Web-Interface nicht ändern. -emails=E-Mail-Adressen manage_emails=E-Mail-Adressen verwalten manage_themes=Standard-Theme manage_openid=OpenID-Adressen @@ -858,8 +805,6 @@ principal_desc=Diese SSH-Zertifikat-Principals sind mit deinem Konto verknüpft gpg_desc=Diese öffentlichen GPG-Schlüssel sind mit deinem Account verbunden und werden benutzt, um deine Commits zu verifizieren. Halte die dazugehörigen privaten GPG-Schlüssel geheim, da diese deine Commits signieren. ssh_helper=Brauchst du Hilfe? Sieh dir die Anleitung zum Erzeugen deiner eigenen SSH-Schlüssel an oder zum Lösen häufiger Probleme, denen du bei der Arbeit mit SSH begegnen kannst. gpg_helper=Brauchst du Hilfe? Sieh dir die Anleitung über GPG an. -add_new_key=SSH-Schlüssel hinzufügen -add_new_gpg_key=GPG-Schlüssel hinzufügen key_content_ssh_placeholder=Startet mit „ssh-ed25519“, „ssh-rsa“, „ecdsa-sha2-nistp256“, „ecdsa-sha2-nistp384“, „ecdsa-sha2-nistp521“, „sk-ecdsa-sha2-nistp256@openssh.com“ oder „sk-ssh-ed25519@openssh.com“ key_content_gpg_placeholder=Beginnt mit „-----BEGIN PGP PUBLIC KEY BLOCK-----“ add_new_principal=Identität hinzufügen @@ -877,7 +822,6 @@ gpg_invalid_token_signature=Der GPG-Key, die Signatur und das Token stimmen nich gpg_token_required=Du musst eine Signatur für das folgende Token angeben gpg_token=Token gpg_token_help=Du kannst eine Signatur wie folgt generieren: -gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=GPG-Textsignatur (armored signature) key_signature_gpg_placeholder=Beginnt mit „-----BEGIN PGP SIGNATURE-----“ verify_gpg_key_success=GPG-Schlüssel „%s“ wurde verifiziert. @@ -924,11 +868,6 @@ hide_openid=Nicht im Profil anzeigen ssh_disabled=SSH ist deaktiviert ssh_signonly=SSH ist derzeit deaktiviert, sodass diese Schlüssel nur zur Commit-Signaturverifizierung verwendet werden. ssh_externally_managed=Dieser SSH-Schlüssel wird extern für diesen Benutzer verwaltet -manage_social=Verknüpfte soziale Konten verwalten -social_desc=Diese sozialen Konten können verwendet werden, um sich bei deinem Konto anzumelden. Stell sicher, dass du sie alle zuordnen kannst. -unbind=Trennen -unbind_success=Das soziale Konto wurde erfolgreich entfernt. - manage_access_token=Zugriffstokens generate_new_token=Neuen Token erzeugen tokens_desc=Diese Tokens gewähren vollen Zugriff auf dein Konto mit der Forgejo-API. @@ -938,8 +877,6 @@ generate_token_success=Ein neuer Token wurde generiert. Kopiere diesen jetzt, da generate_token_name_duplicate=%s wurde bereits als Anwendungsname verwendet. Bitte wähle einen neuen Namen. delete_token=Löschen access_token_deletion=Zugriffstoken löschen -access_token_deletion_cancel_action=Abbrechen -access_token_deletion_confirm_action=Löschen access_token_deletion_desc=Wenn du ein Token löschst, haben die Anwendungen, die es nutzen, keinen Zugriff mehr auf deinen Account. Dies kann nicht rückgängig gemacht werden. Fortfahren? delete_token_success=Der Zugriffstoken wurde gelöscht. Anwendungen die diesen Token genutzt haben, haben nun keinen Zugriff mehr auf deinen Account. repo_and_org_access=Repository- und Organisationszugriff @@ -1010,7 +947,6 @@ webauthn_delete_key_desc=Wenn du einen Sicherheitsschlüssel entfernst, kannst d manage_account_links=Verknüpfte Accounts manage_account_links_desc=Diese externen Accounts sind mit deinem Forgejo-Account verknüpft. -account_links_not_available=Es sind keine externen Accounts mit diesem Forgejo-Account verknüpft. link_account=Account verbinden remove_account_link=Verknüpften Account entfernen remove_account_link_desc=Wenn du den verknüpften Account entfernst, wirst du darüber nicht mehr auf deinen Forgejo-Account zugreifen können. Fortfahren? @@ -1056,14 +992,12 @@ update_hints = Hinweise aktualisieren update_hints_success = Hinweise wurden aktualisiert. additional_repo_units_hint_description = Einen „Mehr aktivieren“-Hinweis für Repositorys, welche nicht alle verfügbaren Einheiten aktiviert haben, anzeigen. pronouns = Pronomen -pronouns_custom = Eigene pronouns_unspecified = Nicht spezifiziert language.title = Standardsprache keep_activity_private.description = Deine öffentliche Aktivität wird nur für dich selbst und die Instanzadminstratoren sichtbar sein. language.localization_project = Hilf uns, Forgejo in deine Sprache zu übersetzen! Mehr erfahren. language.description = Diese Sprache wird in deinem Konto gespeichert und standardmäßig nach dem Anmelden benutzt. user_block_yourself = Du kannst dich nicht selbst blockieren. -pronouns_custom_label = Individuelle Pronomen change_username_redirect_prompt.with_cooldown.one = Der alte Benutzername ist nach einer Schutzzeit von einem Tag wieder für alle verfügbar. Du kannst den alten Benutzername während dieser Schutzzeit erneut beanspruchen. change_username_redirect_prompt.with_cooldown.few = Der alte Benutzername ist nach einer Schutzzeit von %[1]d Tagen wieder für alle verfügbar. Du kannst den alten Benutzername während dieser Schutzzeit erneut beanspruchen. keep_pronouns_private = Pronomen nur angemeldeten Nutzern anzeigen @@ -1119,7 +1053,6 @@ fork_branch=Branch, der zum Fork geklont werden soll all_branches=Alle Branches fork_no_valid_owners=Dieses Repository kann nicht geforkt werden, da keine gültigen Besitzer vorhanden sind. use_template=Diese Vorlage verwenden -clone_in_vsc=In VS Code klonen download_zip=ZIP herunterladen download_tar=TAR.GZ herunterladen download_bundle=BUNDLE herunterladen @@ -1139,11 +1072,6 @@ readme=README readme_helper=Wähle eine README-Vorlage readme_helper_desc=Hier kannst du eine komplette Beschreibung für dein Projekt schreiben. auto_init=Repository initialisieren -trust_model_helper=Wähle das Vertrauensmodell für die Signaturvalidierung aus. Mögliche Modelle sind: -trust_model_helper_collaborator=Mitarbeiter: Vertraue Signaturen von Mitarbeitern am Projekt -trust_model_helper_committer=Committer: Vertraue Signaturen, die mit ihren Committern übereinstimmen -trust_model_helper_collaborator_committer=Mitarbeiter+Committer: Vertraue Signaturen von Mitarbeitern, die mit dem Committer übereinstimmen -trust_model_helper_default=Standard: Verwende das Standardvertrauensmodell für diese Installation create_repo=Repository erstellen default_branch=Standardbranch default_branch_label=Standard @@ -1216,9 +1144,6 @@ template.invalid=Es muss ein Vorlagen-Repository ausgewählt werden archive.title=Dieses Repository ist archiviert. Du kannst Dateien ansehen und es klonen, kannst aber seinen Status nicht verändern, zum Beispiel nichts pushen, keine Issues eröffnen und keine Pull-Requests oder Kommentare erstellen. archive.title_date=Dieses Repository wurde am %s archiviert. Du kannst Dateien ansehen und es klonen, kannst aber seinen Status nicht verändern, zum Beispiel nichts pushen, und keine Issues eröffnen, oder Pull-Requests oder Kommentare erstellen. -archive.issue.nocomment=Dieses Repository ist archiviert. Du kannst Issues nicht kommentieren. -archive.pull.nocomment=Dieses Repository ist archiviert. Du kannst Pull-Requests nicht kommentieren. - form.reach_limit_of_creation_1=Du hast bereits dein Limit von %d Repository erreicht. form.reach_limit_of_creation_n=Du hast bereits dein Limit von %d Repositorys erreicht. form.name_reserved=Der Repository-Name „%s“ ist reserviert. @@ -1226,7 +1151,6 @@ form.name_pattern_not_allowed=Das Muster „%s“ ist in Repository-Namen nicht need_auth=Authentifizierung migrate_options=Migrationsoptionen -migrate_service=Migrationsdienst migrate_options_mirror_helper=Dieses Repository wird ein Spiegel sein migrate_options_lfs=LFS-Dateien migrieren migrate_options_lfs_endpoint.label=LFS-Endpunkt @@ -1312,7 +1236,6 @@ branches=Branches tags=Tags issues=Issues pulls=Pull-Requests -project_board=Projekte packages=Pakete actions=Actions labels=Labels @@ -1326,7 +1249,6 @@ release=Release releases=Releases tag=Tag released_this=hat releast -tagged_this=hat getaggt file.title=%s an %s file_raw=Originalformat file_history=Verlauf @@ -1438,9 +1360,7 @@ commits.desc=Durchsuche die Quellcode-Änderungshistorie. commits.commits=Commits commits.no_commits=Keine gemeinsamen Commits. „%s“ und „%s“ haben vollständig unterschiedliche Historien. commits.nothing_to_compare=Diese Branches sind auf demselben Stand. -commits.search=Commits durchsuchen … commits.search.tooltip=Du kannst Suchbegriffen „author:“, „committer:“, „after:“, oder „before:“ voranstellen, z.B. „revert author:Alice before:2019-01-13“. -commits.find=Suchen commits.search_all=Alle Branches commits.author=Autor commits.message=Nachricht @@ -1468,8 +1388,6 @@ commitstatus.pending=Ausstehend commitstatus.success=Erfolg ext_issues=Externe Issues -ext_issues.desc=Link zu externem Issuetracker. - projects=Projekte projects.desc=Verwalte Issues und Pull-Requests in Projektboards. projects.description=Beschreibung (optional) @@ -1491,7 +1409,6 @@ projects.type.basic_kanban=Einfaches Kanban projects.type.bug_triage=Bug-Triage projects.template.desc=Vorlage projects.template.desc_helper=Wähle eine Projektvorlage aus, um loszulegen -projects.type.uncategorized=Nicht kategorisiert projects.column.edit=Spalte bearbeiten projects.column.edit_title=Name projects.column.new_title=Name @@ -1499,8 +1416,6 @@ projects.column.new_submit=Spalte erstellen projects.column.new=Neue Spalte projects.column.set_default=Als Standard verwenden projects.column.set_default_desc=Diese Spalte als Standard für nicht kategorisierte Issues und Pull-Requests festlegen -projects.column.unset_default=Standard entfernen -projects.column.unset_default_desc=Diese Spalte nicht als Standard verwenden projects.column.delete=Spalte löschen projects.column.deletion_desc=Beim Löschen einer Projektspalte werden alle dazugehörigen Issues zur Standardspalte verschoben. Fortfahren? projects.column.color=Farbe @@ -1614,7 +1529,6 @@ issues.filter_sort.moststars=Meiste Favoriten issues.filter_sort.feweststars=Wenigste Favoriten issues.filter_sort.mostforks=Meiste Forks issues.filter_sort.fewestforks=Wenigste Forks -issues.keyword_search_unavailable=Zurzeit ist die Stichwort-Suche nicht verfügbar. Bitte wende dich an den Website-Administrator. issues.action_open=Öffnen issues.action_close=Schließen issues.action_label=Label @@ -1659,11 +1573,8 @@ issues.ref_issue_from=`auf dieses Issue verwiesen %[3]s %[1] issues.ref_pull_from=`referenzierte diesen Pull-Request %[3]s %[1]s` issues.ref_closing_from=`referenzierte dieses Issue aus einem Pull-Request %[3]s der es schließen wird, %[1]s` issues.ref_reopening_from=`referenzierte dieses Issue aus einem Pull-Request %[3]s der es wieder öffnen wird, %[1]s` -issues.ref_closed_from=`hat dieses Issue %[4]s geschlossen %[2]s` -issues.ref_reopened_from=`hat dieses Issue %[4]s %[2]s wieder geöffnet` issues.ref_from=`von %[1]s` issues.author=Autor -issues.author_helper=Dieser Benutzer ist der Autor. issues.role.owner=Besitzer issues.role.owner_helper=Dieser Benutzer ist der Besitzer dieses Repositorys. issues.role.member=Mitglied @@ -1758,18 +1669,13 @@ issues.add_time_sum_to_small=Es wurde keine Zeit eingegeben. issues.time_spent_total=Zeitaufwand insgesamt issues.time_spent_from_all_authors=`Gesamtzeitaufwand: %s` issues.due_date=Fällig am -issues.invalid_due_date_format=Das Fälligkeitsdatum muss das Format „JJJJ-MM-TT“ haben. -issues.error_modifying_due_date=Fehler beim Ändern des Fälligkeitsdatums. -issues.error_removing_due_date=Fehler beim Entfernen des Fälligkeitsdatums. issues.push_commit_1=hat %d Commit %s hinzugefügt issues.push_commits_n=hat %d Commits %s hinzugefügt issues.force_push_codes=`hat %[6]s %[1]s von %[2]s %[8]s zu %[4]s %[9]s force-gepusht` issues.force_push_compare=Vergleichen issues.due_date_form=JJJJ-MM-TT -issues.due_date_form_add=Fälligkeitsdatum hinzufügen issues.due_date_form_edit=Bearbeiten issues.due_date_form_remove=Entfernen -issues.due_date_not_writer=Du musst Schreibrechte für dieses Repository haben, um das Fälligkeitsdatum zu ändern. issues.due_date_not_set=Kein Fälligkeitsdatum gesetzt. issues.due_date_added=hat %[2]s das Fälligkeitsdatum %[1]s hinzugefügt issues.due_date_modified=hat das Fälligkeitsdatum von %[2]s auf %[1]s %[3]s geändert @@ -1822,7 +1728,6 @@ issues.review.remove_review_request=hat die Sichtungsanfrage an %[1]s %[2]s entf issues.review.remove_review_request_self=hat die Sichtung %s verweigert issues.review.pending=Ausstehend issues.review.pending.tooltip=Dieser Kommentar ist derzeit nicht für andere Benutzer sichtbar. Um deine ausstehenden Kommentare einzureichen, wähle „%s“ -> „%s/%s/%s“ oben auf der Seite. -issues.review.review=Review issues.review.reviewers=Prüfer issues.review.outdated=Veraltet issues.review.outdated_description=Der Inhalt hat sich geändert, seit dieser Kommentar abgegeben wurde @@ -1835,7 +1740,6 @@ issues.review.hide_resolved=Erledigte ausblenden issues.review.resolve_conversation=Diskussion als „erledigt“ markieren issues.review.un_resolve_conversation=Diskussion als „nicht erledigt“ markieren issues.review.resolved_by=markierte diese Unterhaltung als „erledigt“ -issues.assignee.error=Aufgrund eines unerwarteten Fehlers konnten nicht alle Zuständigen hinzugefügt werden. issues.reference_issue.body=Beschreibung issues.content_history.deleted=gelöscht issues.content_history.edited=bearbeitet @@ -1843,8 +1747,6 @@ issues.content_history.created=erstellt issues.content_history.delete_from_history=Aus dem Verlauf entfernen issues.content_history.delete_from_history_confirm=Aus dem Verlauf löschen? issues.content_history.options=Optionen -issues.reference_link=Referenz: %s - compare.compare_base=Basis compare.compare_head=vergleichen @@ -1878,8 +1780,6 @@ pulls.nothing_to_compare=Diese Branches sind identisch. Es muss kein Pull-Reques pulls.nothing_to_compare_and_allow_empty_pr=Diese Branches sind gleich. Der Pull-Request wird leer sein. pulls.has_pull_request=`Es existiert bereits ein Pull-Request zwischen diesen beiden Branches: %[2]s#%[3]d` pulls.create=Pull-Request erstellen -pulls.title_desc_few=möchte %[1]d Commits von %[2]s nach %[3]s zusammenführen -pulls.merged_title_desc_few=hat %[1]d Commits von %[2]s nach %[3]s %[4]s zusammengeführt pulls.change_target_branch_at=`hat den Zielbranch von %s nach %s %s geändert` pulls.tab_conversation=Diskussion pulls.tab_commits=Commits @@ -2032,8 +1932,6 @@ signing.wont_sign.approved=Der Merge-Commit wird nicht signiert werden, da der P signing.wont_sign.not_signed_in=Du bist nicht eingeloggt. ext_wiki=Externes Wiki -ext_wiki.desc=Verweis auf externes Wiki. - wiki=Wiki wiki.welcome=Willkommen im Wiki. wiki.welcome_desc=Im Wiki kannst du Dokumentation schreiben und sie mit Mitarbeitern teilen. @@ -2128,17 +2026,6 @@ activity.git_stats_deletion_1=%d Löschung activity.git_stats_deletion_n=%d Löschungen contributors.contribution_type.commits = Commits -search=Suchen -search.search_repo=Repository durchsuchen -search.type.tooltip=Suchmodus -search.fuzzy=Ähnlich -search.fuzzy.tooltip=Zeige auch Ergebnisse, die dem Suchbegriff ähneln -search.match=Genau -search.match.tooltip=Zeige nur Ergebnisse, die exakt mit dem Suchbegriff übereinstimmen -search.results=Suchergebnisse für „%s“ in %s -search.code_no_results=Es konnte kein passender Quellcode für deinen Suchbegriff gefunden werden. -search.code_search_unavailable=Derzeit ist die Code-Suche nicht verfügbar. Bitte wende dich an den Website-Administrator. - settings=Einstellungen settings.desc=In den Einstellungen kannst du die Einstellungen des Repositorys anpassen settings.options=Repository @@ -2245,7 +2132,6 @@ settings.transfer_abort=Übertragung abbrechen settings.transfer_abort_invalid=Du kannst nur eingeleitete Repository-Übertragung abbrechen. settings.transfer_abort_success=Die Repository-Übertragung zu %s wurde abgebrochen. settings.transfer_desc=Übertrage dieses Repository auf einen anderen Benutzer oder eine Organisation, in der du Admin-Rechte hast. -settings.transfer_form_title=Gib den Repository-Namen zur Bestätigung ein: settings.transfer_in_progress=Es gibt derzeit eine laufende Übertragung. Bitte brich diese ab, wenn du dieses Repository an einen anderen Benutzer übertragen möchtest. settings.transfer_notices_1=– Du wirst keinen Zugriff mehr haben, wenn der neue Besitzer ein individueller Benutzer ist. settings.transfer_notices_2=– Du wirst weiterhin Zugriff haben, wenn der neue Besitzer eine Organisation ist und du einer der Besitzer bist. @@ -2290,7 +2176,6 @@ settings.delete_collaborator=Entfernen settings.collaborator_deletion=Mitarbeiter entfernen settings.collaborator_deletion_desc=Nach dem Löschen wird dieser Mitarbeiter keinen Zugriff mehr auf dieses Repository haben. Fortfahren? settings.remove_collaborator_success=Der Mitarbeiter wurde entfernt. -settings.search_user_placeholder=Benutzer suchen … settings.org_not_allowed_to_be_collaborator=Organisationen können nicht als Mitarbeiter hinzugefügt werden. settings.change_team_access_not_allowed=Nur der Besitzer der Organisation kann die Zugangsrechte des Teams ändern settings.team_not_in_organization=Das Team ist nicht in der gleichen Organisation wie das Repository @@ -2298,7 +2183,6 @@ settings.teams=Teams settings.add_team=Team hinzufügen settings.add_team_duplicate=Das Team ist dem Repository schon zugeordnet settings.add_team_success=Das Team hat nun Zugriff auf das Repository. -settings.search_team=Team suchen … settings.change_team_permission_tip=Die Team-Berechtigung ist auf der Team-Einstellungsseite festgelegt und kann nicht für ein Repository geändert werden settings.delete_team_tip=Dieses Team hat Zugriff auf alle Repositorys und kann nicht entfernt werden settings.remove_team_success=Der Zugriff des Teams auf das Repository wurde zurückgezogen. @@ -2436,12 +2320,7 @@ settings.branches=Branches settings.protected_branch=Branch-Schutz settings.protected_branch.save_rule=Regel speichern settings.protected_branch.delete_rule=Regel löschen -settings.protected_branch_can_push=Push erlauben? -settings.protected_branch_can_push_yes=Du kannst pushen -settings.protected_branch_can_push_no=Du kannst nicht pushen settings.branch_protection=Branch-Schutzregeln für Branch „%s“ -settings.protect_this_branch=Branch-Schutz aktivieren -settings.protect_this_branch_desc=Verhindert das Löschen und schränkt Git auf Push- und Merge-Änderungen auf dem Branch ein. settings.protect_disable_push=Push deaktivieren settings.protect_disable_push_desc=Kein Push auf diesen Branch erlauben. settings.protect_enable_push=Push aktivieren @@ -2452,9 +2331,7 @@ settings.protect_whitelist_committers=Positivlisten-eingeschränkter Push settings.protect_whitelist_committers_desc=Jeder, der auf der Whitelist steht, darf in diesen Branch pushen (aber kein Force-Push). settings.protect_whitelist_deploy_keys=Deploy-Key mit Schreibzugriff zum Pushen whitelisten. settings.protect_whitelist_users=Nutzer, die pushen dürfen -settings.protect_whitelist_search_users=Benutzer suchen … settings.protect_whitelist_teams=Teams, die pushen dürfen -settings.protect_whitelist_search_teams=Teams suchen … settings.protect_merge_whitelist_committers=Merge-Positivliste aktivieren settings.protect_merge_whitelist_committers_desc=Erlaube Nutzern oder Teams auf der Positivliste, Pull-Requests in diesen Branch zusammenzuführen. settings.protect_merge_whitelist_users=Nutzer, die zusammenführen dürfen @@ -2483,8 +2360,6 @@ settings.protect_protected_file_patterns=Geschützte Dateimuster (durch Semikolo settings.protect_protected_file_patterns_desc=Geschützte Dateien dürfen nicht direkt geändert werden, auch wenn der Benutzer Rechte hat, Dateien in diesem Branch hinzuzufügen, zu bearbeiten oder zu löschen. Mehrere Muster können mit Semikolon („;“) getrennt werden. Siehe %s-Dokumentation zur Mustersyntax. Beispiele: .drone.yml, /docs/**/*.txt. settings.protect_unprotected_file_patterns=Ungeschützte Dateimuster (durch Semikolon „;“ getrennt) settings.protect_unprotected_file_patterns_desc=Ungeschützte Dateien, die direkt geändert werden dürfen, wenn der Benutzer Schreibzugriff hat, können die Push-Beschränkung umgehen. Mehrere Muster können mit Semikolon („;“) getrennt werden. Siehe %[2]s-Dokumentation zur Mustersyntax. Beispiele: .drone.yml, /docs/**/*.txt. -settings.add_protected_branch=Schutz aktivieren -settings.delete_protected_branch=Schutz deaktivieren settings.update_protect_branch_success=Branchschutzregel „%s“ wurde aktualisiert. settings.remove_protected_branch_success=Branchschutzregel „%s“ wurde entfernt. settings.remove_protected_branch_failed=Entfernen der Branchschutzregel „%s“ fehlgeschlagen. @@ -2563,8 +2438,6 @@ settings.lfs_pointers.associateAccessible=Ordne %d zugängliche OIDs zu settings.rename_branch_failed_exist=Kann den Branch nicht umbenennen, da der Zielbranch %s bereits existiert. settings.rename_branch_failed_not_exist=Kann den Branch %s nicht umbenennen, da er nicht existiert. settings.rename_branch_success=Branch %s wurde erfolgreich in %s umbenannt. -settings.rename_branch_from=alter Branchname -settings.rename_branch_to=neuer Branchname settings.rename_branch=Branch umbenennen diff.browse_source=Quellcode durchsuchen @@ -2573,7 +2446,6 @@ diff.commit=Commit diff.git-notes=Hinweise diff.data_not_available=Kein Diff-Inhalt verfügbar diff.options_button=Diff-Optionen -diff.show_diff_stats=Statistiken anzeigen diff.download_patch=Patch-Datei herunterladen diff.download_diff=Diff-Datei herunterladen diff.show_split_view=Geteilte Ansicht @@ -2666,7 +2538,6 @@ release.tag_name_invalid=Der Tag-Name ist ungültig. release.tag_name_protected=Der Tag-Name ist geschützt. release.tag_already_exist=Dieser Tag-Name existiert bereits. release.downloads=Downloads -release.download_count=Downloads: %s release.add_tag_msg=Titel und Beschreibung des Releases als Tag-Nachricht verwenden. release.add_tag=Tag erstellen release.releases_for=Releases für %s @@ -2695,14 +2566,12 @@ branch.default_deletion_failed=Branch „%s“ kann nicht gelöscht werden, da d branch.restore=Branch „%s“ wiederherstellen branch.download=Branch „%s“ herunterladen branch.rename=Branch „%s“ umbenennen -branch.search=Branch suchen branch.included_desc=Dieser Branch ist im Standard-Branch enthalten branch.included=Enthalten branch.create_new_branch=Branch aus Branch erstellen: branch.confirm_create_branch=Branch erstellen branch.warning_rename_default_branch=Du benennst den Standard-Branch um. branch.rename_branch_to=„%s“ umbenennen in: -branch.confirm_rename_branch=Branch umbenennen branch.create_branch_operation=Branch erstellen branch.new_branch=Neue Branch erstellen branch.new_branch_from=Neuen Branch von „%s“ erstellen @@ -2728,8 +2597,6 @@ error.csv.unexpected=Diese Datei kann nicht gerendert werden, da sie ein unerwar error.csv.invalid_field_count=Diese Datei kann nicht gerendert werden, da sie eine falsche Anzahl an Feldern in Zeile %d hat. rss.must_be_on_branch = Du musst auf einem Branch sein, um einen RSS-Feed zu haben. new_repo_helper = Ein Repository enthält alle Projektdateien inklusive der Revisionshistorie. Bereits woanders gehostet? Repository migrieren. -issues.comment.blocked_by_user = Du kannst dieses Issue nicht kommentieren, weil du vom Repository-Besitzer oder dem Autoren des Issues blockiert wurdest. -clone_in_vscodium = In VSCodium klonen settings.units.add_more = Mehr aktivieren settings.wiki_rename_branch_main_desc = Den Branch, der intern vom Wiki benutzt wird, zu „%s“ umbenennen. Dies ist permanent und kann nicht rückgängig gemacht werden. desc.sha256 = SHA256 @@ -2791,9 +2658,6 @@ pulls.agit_explanation = Mittels AGit-Workflow erstellt. AGit erlaubt Mitwirkend activity.navbar.recent_commits = Neueste Commits activity.navbar.code_frequency = Code-Häufigkeit file_follow = Symlink folgen -error.broken_git_hook = Die Git-Hooks des Repositorys scheinen kaputt zu sein. Bitte folge der Dokumentation, um sie zu reparieren, dann pushe einige Commits, um den Status zu aktualisieren. -pulls.merged_title_desc_one = hat %[1]d Commit von %[2]s nach %[3]s %[4]s zusammengeführt -pulls.title_desc_one = möchte %[1]d Commit von %[2]s nach %[3]s zusammenführen open_with_editor = Öffnen mit %s commits.search_branch = Dieser Branch pulls.ready_for_review = Bereit zur Sichtung? @@ -2817,7 +2681,6 @@ release.download_count_one = %s Download release.download_count_few = %s Downloads release.system_generated = Dieser Anhang wurde automatisch generiert. settings.add_webhook.invalid_path = Der Pfad darf kein „.“ oder „..“ enhalten und darf auch nicht leer sein. Er darf auch nicht mit einem Schrägstrich anfangen oder enden. -settings.sourcehut_builds.graphql_url = GraphQL-URL (z.B. https://builds.sr.ht/query) settings.sourcehut_builds.manifest_path = Build-Manifest-Pfad settings.sourcehut_builds.visibility = Job-Sichtbarkeit settings.sourcehut_builds.secrets = Geheimnisse @@ -2909,7 +2772,6 @@ commits.view_single_diff = Änderungen an dieser Datei, die in diesem Commit ein pulls.editable = Bearbeitbar pulls.editable_explanation = Dieser Pull-Request erlaubt Bearbeitungen durch Maintainer. Du kannst direkt dazu beitragen. issues.reopen.blocked_by_user = Du kannst dieses Issue nicht wieder eröffnen, weil du vom Repository-Besitzer oder Ersteller des Issues blockiert wurdest. -pulls.comment.blocked_by_user = Du kannst diesen Pull-Request nicht kommentieren, da du vom Repository-Besitzer oder Ersteller des Pull-Requests blockiert wurdest. issues.filter_no_results = Keine Ergebnisse issues.filter_no_results_placeholder = Versuche, deine Suchfilter anzupassen. migrate.repo_desc_helper = Leer lassen, um vorhandene Beschreibung zu importieren @@ -3019,9 +2881,7 @@ teams.none_access_helper=Die Option „kein Zugriff“ hat nur Auswirkungen auf teams.general_access=Benutzerdefinierter Zugriff teams.general_access_helper=Mitgliederberechtigungen werden durch folgende Berechtigungstabelle festgelegt. teams.read_access=Lesen -teams.read_access_helper=Mitglieder können Teamrepositorys ansehen und klonen. teams.write_access=Schreiben -teams.write_access_helper=Mitglieder können Teamrepositorys ansehen und auf sie pushen. teams.admin_access=Administratorzugang teams.admin_access_helper=Mitglieder können auf Team-Repositorys pushen, von ihnen pullen und Mitarbeiter hinzufügen. teams.no_desc=Dieses Team hat keine Beschreibung @@ -3036,12 +2896,9 @@ teams.invite_team_member.list=Ausstehende Einladungen teams.delete_team_title=Team löschen teams.delete_team_desc=Das Löschen eines Teams widerruft den Repository-Zugriff für seine Mitglieder. Fortfahren? teams.delete_team_success=Das Team wurde gelöscht. -teams.read_permission_desc=Dieses Team hat Lesezugriff: Mitglieder können Team-Repositorys einsehen und klonen. -teams.write_permission_desc=Dieses Team hat Schreibzugriff: Mitglieder können Team-Repositorys einsehen und darauf pushen. teams.admin_permission_desc=Dieses Team hat Administratorzugriff: Mitglieder können von Team-Repositorys lesen, auf sie pushen und Mitarbeiter hinzufügen. teams.create_repo_permission_desc=Zusätzlich erteilt dieses Team die Berechtigung Repository erstellen: Mitglieder können neue Repositorys in der Organisation erstellen. teams.repositories=Team-Repositorys -teams.search_repo_placeholder=Repository durchsuchen … teams.remove_all_repos_title=Alle Team-Repositorys entfernen teams.remove_all_repos_desc=Dies entfernt alle Repositorys von dem Team. teams.add_all_repos_title=Alle Repositorys hinzufügen @@ -3054,9 +2911,6 @@ teams.specific_repositories=Bestimmte Repositorys teams.specific_repositories_helper=Mitglieder haben nur Zugriff auf Repositorys, die explizit dem Team hinzugefügt wurden. Wenn du diese Option wählst, werden Repositorys, die bereits mit Alle Repositorys hinzugefügt wurden, nicht automatisch entfernt. teams.all_repositories=Alle Repositorys teams.all_repositories_helper=Team hat Zugriff auf alle Repositorys. Wenn dies ausgewählt wird, werden alle vorhandenen Repositorys zum Team hinzugefügt. -teams.all_repositories_read_permission_desc=Dieses Team gewährt Lese-Zugriff auf Repositorys: Mitglieder können Repositorys ansehen und klonen. -teams.all_repositories_write_permission_desc=Dieses Team gewährt Schreib-Zugriff auf alle Repositorys: Mitglieder können Repositorys lesen und auf sie pushen. -teams.all_repositories_admin_permission_desc=Dieses Team gewährt Administrator-Zugriff auf alle Repositorys: Mitglieder können Repositorys lesen, auf sie pushen und Mitwirkende zu Repositorys hinzufügen. teams.invite.title=Du wurdest eingeladen, dem Team %s in der Organisation %s beizutreten. teams.invite.by=Von %s eingeladen teams.invite.description=Bitte klicke auf die folgende Schaltfläche, um dem Team beizutreten. @@ -3152,7 +3006,6 @@ dashboard.gc_metadata_obtained=Erhaltene GC-Metadaten dashboard.other_system_allocation_obtained=Andere erhaltene System-Allokationen dashboard.next_gc_recycle=Nächster GC-Zyklus dashboard.last_gc_time=Seit letztem GC-Zyklus -dashboard.total_gc_time=Gesamte GC-Pause dashboard.total_gc_pause=Gesamte GC-Pause dashboard.last_gc_pause=Letzte GC-Pause dashboard.gc_times=GC-Zeiten @@ -3250,9 +3103,6 @@ repos.unadopted.no_more=Keine nicht übernommenen Repositorys gefunden. repos.owner=Besitzer repos.name=Name repos.private=Privat -repos.watches=Beobachtungen -repos.stars=Favoriten -repos.forks=Forks repos.issues=Issues repos.size=Größe repos.lfs_size=LFS-Größe @@ -3356,17 +3206,6 @@ auths.oauth2_admin_group=Gruppen-Claim-Wert für Administratoren (optional – e auths.oauth2_restricted_group=Gruppen-Claim-Wert für eingeschränkte User. (Optional – erfordert Claim-Namen oben) auths.oauth2_map_group_to_team=Gruppen aus OAuth-Claims den Organisationsteams zuordnen (optional – oben muss der Name des Claims angegeben werden). auths.oauth2_map_group_to_team_removal=Benutzer aus synchronisierten Teams entfernen, wenn der Benutzer nicht zur entsprechenden Gruppe gehört. -auths.enable_auto_register=Automatische Registrierung aktivieren -auths.sspi_auto_create_users=Benutzer automatisch anlegen -auths.sspi_auto_create_users_helper=Erlaube der SSPI Authentifikationsmethode, automatisch neue Konten für unbekannte Benutzer anzulegen -auths.sspi_auto_activate_users=Benutzer automatisch aktivieren -auths.sspi_auto_activate_users_helper=Erlaube der SSPI Authentifikationsmethode, automatisch neue Benutzerkonten zu aktivieren -auths.sspi_strip_domain_names=Domain vom Nutzernamen entfernen -auths.sspi_strip_domain_names_helper=Falls aktiviert, werden Domainnamen von Loginnamen entfernt (z.B. „DOMAIN\benutzer“ und „benutzer@example.org“ werden beide nur „nutzer“). -auths.sspi_separator_replacement=Trennzeichen als Ersatz für \, / und @ -auths.sspi_separator_replacement_helper=Das zu verwendende Trennzeichen, um Logon-Namen (z.B. das „\“ in „DOMAIN\benutzer“) und die Hauptnamen von Benutzern (z.B. das „@“ in „benutzer@example.org“) zu trennen. -auths.sspi_default_language=Standardsprache für Benutzer -auths.sspi_default_language_helper=Standardsprache für Benutzer, die automatisch mit der SSPI-Authentifizierungsmethode erstellt wurden. Leer lassen, wenn du es bevorzugst, dass eine Sprache automatisch erkannt wird. auths.tips=Tipps auths.tips.oauth2.general=OAuth2-Authentifizierung auths.tips.oauth2.general.tip=Beim Registrieren einer OAuth2-Anwendung sollte die Callback-URL folgendermaßen lauten: @@ -3376,7 +3215,6 @@ auths.tip.nextcloud=Registriere einen neuen OAuth-Consumer auf deiner Instanz ü auths.tip.dropbox=Erstelle eine neue App auf %s auths.tip.facebook=Erstelle eine neue Anwendung auf %s und füge das Produkt „Facebook Login“ hinzu auths.tip.github=Registriere unter %s eine neue OAuth-Anwendung -auths.tip.gitlab=Erstelle unter https://gitlab.com/profile/applications eine neue Anwendung. auths.tip.google_plus=Du erhältst die OAuth2-Client-Zugangsdaten in der Google-API-Konsole unter %s auths.tip.openid_connect=Benutze die OpenID-Connect-Discovery-URL (/.well-known/openid-configuration), um die Endpunkte zu spezifizieren auths.tip.twitter=Gehe auf %s, erstelle eine Anwendung und stelle sicher, dass die Option „Allow this application to be used to Sign in with Twitter“ aktiviert ist @@ -3992,10 +3830,8 @@ variables.creation.failed=Fehler beim Hinzufügen der Variable. variables.creation.success=Die Variable „%s“ wurde hinzugefügt. variables.update.failed=Fehler beim Bearbeiten der Variable. variables.update.success=Die Variable wurde bearbeitet. -runs.no_workflows.quick_start = Weißt du nicht, wie du mit Forgejo Actions anfangen sollst? Sieh dir die Schnellstartanleitung an. runs.no_matching_online_runner_helper = Es existiert kein passender Online-Runner mit dem Label: %s runs.no_workflows = Es existieren noch keine Workflows. -runs.no_workflows.documentation = Für weitere Informationen über Forgejo Actions, siehe die Dokumentation. runs.empty_commit_message = (leere Commit-Nachricht) variables.id_not_exist = Variable mit ID %d existiert nicht. runs.workflow = Workflow @@ -4034,8 +3870,6 @@ search = Suchen … fuzzy_tooltip = Auch Ergebnisse einbinden, die grob zum Suchbegriff passen type_tooltip = Suchtyp fuzzy = Unscharf -match = Passend -match_tooltip = Nur Ergebnisse einbinden, die exakt zum Suchbegriff passen repo_kind = Repos suchen … user_kind = Benutzer suchen … org_kind = Orgs suchen … @@ -4049,14 +3883,12 @@ runner_kind = Runner suchen … no_results = Keine passenden Ergebnisse gefunden. code_search_unavailable = Die Code-Suche ist momentan nicht verfügbar. Bitte kontaktiere den Webseitenadministrator. keyword_search_unavailable = Die Suche mittels Schlüsselwort ist momentan nicht verfügbar. Bitte kontaktiere den Webseitenadministrator. -code_search_by_git_grep = Die derzeitigen Codesuchergebnisse werden durch „git grep“ bereitgestellt. Es könnten bessere Ergebnisse erzielt werden, wenn der Administrator die Repository-Indizierung aktiviert. exact = Exakt exact_tooltip = Nur Ergebnisse einbinden, die auf den exakten Suchbegriff passen issue_kind = Issues suchen … pull_kind = Pulls suchen … union = Vereinigungsmenge union_tooltip = Ergebnisse, die auf ein beliebiges von den Whitespace getrennten Schlüsselwörtern passen, einbinden -milestone_kind = Meilensteine suchen … regexp = RegExp regexp_tooltip = Suchbegriff als regulären Ausdruck interpretieren diff --git a/options/locale/locale_el-GR.ini b/options/locale/locale_el-GR.ini index a33117db22..311ac37974 100644 --- a/options/locale/locale_el-GR.ini +++ b/options/locale/locale_el-GR.ini @@ -49,21 +49,14 @@ webauthn_error_unable_to_process=Ο διακομιστής δεν μπόρεσε webauthn_error_duplicated=Το κλειδί ασφαλείας δεν επιτρέπεται για αυτό το αίτημα. Βεβαιωθείτε ότι το κλειδί δεν έχει ήδη καταχωρηθεί. webauthn_error_empty=Πρέπει να ορίσετε ένα όνομα για αυτό το κλειδί. webauthn_error_timeout=Το χρονικό όριο έφτασε πριν το κλειδί να διαβαστεί. Παρακαλώ ανανεώστε τη σελίδα και προσπαθήστε ξανά. -webauthn_reload=Ανανέωση - repository=Repository organization=Οργανισμός mirror=Αντίγραφο -new_repo=Νέο αποθετήριο -new_migrate=Νέα μεταφορά new_mirror=Νέο είδωλο new_fork=Νέο fork αποθετηρίου -new_org=Νέος οργανισμός new_project=Νέο έργο new_project_column=Νέα στήλη -manage_org=Διαχείριση Οργανισμών admin_panel=Διαχείριση -account_settings=Ρυθμίσεις λογαριασμού settings=Ρυθμίσεις your_profile=Προφίλ your_starred=Αγαπημένα @@ -217,8 +210,6 @@ string.desc=Z - A [error] occurred=Παρουσιάστηκε ένα σφάλμα report_message=Αν πιστεύετε ότι αυτό προέκυψε λόγω κάποιου σφάλματος στο Forgejo, σας παρακαλούμε να ρίξετε μία ματιά στα ζητήματα στο Codeberg ή να ανοίξετε ένα νέο ζήτημα εάν είναι απαραίτητο. -missing_csrf=Bad Request: δεν υπάρχει διακριτικό CSRF -invalid_csrf=Λάθος Αίτημα: μη έγκυρο διακριτικό CSRF not_found=Ο προορισμός δεν βρέθηκε. network_error=Σφάλμα δικτύου server_internal = Σφάλμα διακομιστή @@ -354,15 +345,10 @@ app_slogan_helper = Γράψτε το slogan του διακομιστή σας [home] uname_holder=Όνομα χρήστη ή διεύθυνση email -password_holder=Κωδικός Πρόσβασης switch_dashboard_context=Εναλλαγή περιεχομένων αρχικού πίνακα my_repos=Αποθετήρια -show_more_repos=Περισσότερα αποθετήρια… -collaborative_repos=Συνεργατικά αποθετήρια my_orgs=Οργανισμοί -my_mirrors=Τα Αντίγραφα Μου view_home=Προβολή %s -search_repos=Βρείτε ένα αποθετήριο… filter=Άλλα φίλτρα filter_by_team_repositories=Φιλτράρισμα ανά αποθετήρια ομάδας feed_of=Ροή (feed) του «%s» @@ -383,20 +369,8 @@ issues.in_your_repos=Στα αποθετήρια σας repos=Αποθετήρια users=Χρήστες organizations=Οργανισμοί -search=Αναζήτηση go_to=Μετάβαση σε code=Κώδικας -search.type.tooltip=Τύπος αναζήτησης -search.fuzzy=Όμοιο -search.fuzzy.tooltip=Συμπερίληψη και των αποτελεσμάτων που είναι πλησιέστερα με τον όρο αναζήτησης -search.match=Ταίριασμα -search.match.tooltip=Συμπερίληψη μόνο των αποτελεσμάτων που ταιριάζουν ακριβώς με τον όρο αναζήτησης -code_search_unavailable=Η αναζήτηση κώδικα δεν είναι διαθέσιμη αυτή τη στιγμή. Παρακαλώ επικοινωνήστε με το διαχειριστή. -repo_no_results=Δεν βρέθηκαν σχετικά αποθετήρια. -user_no_results=Δεν βρέθηκαν χρήστες που να ταιριάζουν με τα κριτήρια. -org_no_results=Δεν βρέθηκαν οργανισμοί που να ταιριάζουν με τα κριτήρια. -code_no_results=Δεν βρέθηκε πηγαίος κώδικας που να ταιριάζει με τον όρο αναζήτησης. -code_search_results=`Αποτελέσματα για «%s»` code_last_indexed_at=Τελευταία δημιουργία ευρετηρίου: %s relevant_repositories_tooltip=Τα αποθετήρια που είναι forks ή που δεν έχουν θέμα, εικονίδιο και περιγραφή είναι κρυμμένα. relevant_repositories=Εμφανίζονται μόνο αποθετήρια που θεωρούμε «σχετικά» για εσάς. Εμφάνιση αποτελεσμάτων χωρίς φίλτρο. @@ -407,16 +381,12 @@ forks_few = %d forks [auth] create_new_account=Δημιουργία λογαριασμού -register_helper_msg=Έχετε ήδη λογαριασμό; Συνδεθείτε τώρα! -social_register_helper_msg=Έχετε ήδη λογαριασμό; Συνδέστε το τώρα! disable_register_prompt=Οι εγγραφές είναι απενεργοποιημένες. Παρακαλούμε να επικοινωνήσετε με το διαχειριστή του ιστοτόπου. disable_register_mail=Η επιβεβαίωση email κατά την εγγραφή είναι απενεργοποιημένη. manual_activation_only=Επικοινωνήστε με το διαχειριστή της υπηρεσίας για να ολοκληρώσετε την ενεργοποίηση. remember_me=Θέλω να παραμείνω συνδεδεμένος -remember_me.compromised=Το διακριτικό σύνδεσης δεν είναι πλέον έγκυρο, αυτό ίσως υποδεικνύει έναν κλεμμένο λογαριασμό. Παρακαλώ ελέγξτε τον λογαριασμό σας για ασυνήθιστες δραστηριότητες. forgot_password_title=Ξέχασα τον κωδικό μου forgot_password=Ξεχάσατε τον κωδικό σας; -sign_up_now=Χρειάζεστε λογαριασμό; Εγγραφείτε τώρα. sign_up_successful=Ο λογαριασμός δημιουργήθηκε επιτυχώς. Καλώς ορίσατε! confirmation_mail_sent_prompt=Ένα νέο email επιβεβαίωσης έχει σταλεί στην διεύθυνση %s. Για την ολοκλήρωση της εγγραφής σας, παρακαλώ ελέγξτε τα εισερχόμενα σας και πατήστε το link που σας έχουμε στείλει μέσα στις επόμενες %s. must_change_password=Ενημερώστε τον κωδικό πρόσβασης σας @@ -429,7 +399,6 @@ prohibit_login_desc=Ο λογαριασμός σας έχει ανασταλεί resent_limit_prompt=Έχετε ήδη ζητήσει ένα email ενεργοποίησης πρόσφατα. Παρακαλώ περιμένετε 3 λεπτά και προσπαθήστε ξανά. has_unconfirmed_mail=Γειά %s, η διεύθυνση ηλεκτρονικού ταχυδρομείου σας (%s) δεν έχει επιβεβαιωθεί ακόμα. Εάν δεν έχετε λάβει κάποιο email επιβεβαίωσης ή αν χρειάζεστε ένα νέο email επιβεβαίωσης, παρακαλώ πατήστε το παρακάτω κουμπί. resend_mail=Κάντε κλικ εδώ για να στείλετε ξανά το email ενεργοποίησης -email_not_associate=Η διεύθυνση ηλεκτρονικού ταχυδρομείου δεν είναι συσχετισμένη με κάποιο λογαριασμό. send_reset_mail=Αποστολή email ανάκτησης λογαριασμού reset_password=Ανάκτηση λογαριασμού invalid_code=Ο κωδικός επιβεβαίωσης δεν είναι έγκυρος ή έχει λήξει. @@ -446,7 +415,6 @@ twofa_scratch_used=Χρησιμοποιήσατε τον κωδικό μιας twofa_passcode_incorrect=Ο κωδικός σας είναι εσφαλμένος. Αν χάσατε τη συσκευή σας, χρησιμοποιήστε τον κωδικό μιας χρήσης για να συνδεθείτε. twofa_scratch_token_incorrect=Ο κωδικός μιας χρήσης είναι εσφαλμένος. login_userpass=Είσοδος -tab_openid=OpenID oauth_signup_tab=Δημιουργία νέου λογαριασμού oauth_signup_title=Ολοκλήρωση νέου λογαριασμού oauth_signup_submit=Ολοκλήρωση λογαριασμού @@ -472,15 +440,12 @@ authorize_application_description=Αν παραχωρήσετε την πρόσ authorize_title=Είστε βέβαιοι πως θέλετε να δώσετε πρόσβαση στον λογαριασμό σας στην εφαρμογή «%s»; authorization_failed=Αποτυχία εξουσιοδότησης authorization_failed_desc=Η εξουσιοδότηση απέτυχε επειδή εντοπίστηκε μια μη έγκυρη αίτηση. Παρακαλούμε επικοινωνήστε με το συντηρητή της εφαρμογής που προσπαθήσατε να εξουσιοδοτήσετε. -sspi_auth_failed=Αποτυχία ταυτοποίησης SSPI password_pwned=Ο κωδικός πρόσβασης που επιλέξατε βρίσκεται σε μια λίστα κλεμμένων κωδικών πρόσβασης που προηγουμένως εκτέθηκαν σε παραβίαση δημόσιων δεδομένων. Παρακαλώ δοκιμάστε ξανά με διαφορετικό κωδικό πρόσβασης και σκεφτείτε να αλλάξετε αυτόν τον κωδικό πρόσβασης όπου αλλού χρησιμοποιείται. password_pwned_err=Δεν ήταν δυνατή η ολοκλήρωση του αιτήματος προς το HaveIBeenPwned change_unconfirmed_email_error = Δεν ήταν δυνατή η αλλαγή της διεύθυνσης email: %v last_admin = Δεν μπορείτε να αφαιρέσετε τον μοναδικό διαχειριστή. Πρέπει να υπάρχει τουλάχιστον ένας διαχειριστής. change_unconfirmed_email = Αν έχετε εισάγει μία λανθασμένη διεύθυνση email κατά την εγγραφή σας, μπορείτε να την αλλάξετε παρακάτω, έτσι ώστε να σας σταλεί εκ νέου ένα νέο email επιβεβαίωσης στην νέα σας διεύθυνση. change_unconfirmed_email_summary = Αλλαγή της διεύθυνσης email στην οποία θα σταλεί το email επιβεβαίωσης. -tab_signin = Είσοδος -tab_signup = Εγγραφή hint_login = Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ! hint_register = Χρειάζεστε έναν λογαριασμό; Κάντε εγγραφή εδώ! sign_up_button = Δημιουργία λογαριασμού. @@ -496,22 +461,18 @@ link_not_working_do_paste=Δεν δουλεύει το link; Δοκιμάστε hi_user_x=Γειά %s, activate_account=Παρακαλώ ενεργοποιήστε το λογαριασμό σας -activate_account.title=%s, παρακαλώ ενεργοποιήστε τον λογαριασμό σας activate_account.text_1=Γεια σας %[1]s, ευχαριστούμε για την εγγραφή στο %[2]s! activate_account.text_2=Για να ενεργοποιήσετε τον λογαριασμό σας, παρακαλώ πατήστε τον σύνδεσμο που ακολουθεί μέσα σε %s: activate_email=Επιβεβαιώστε τη διεύθυνση email σας -activate_email.title=%s, επαληθεύστε τη διεύθυνση email σας activate_email.text=Για να επαληθεύσετε τη διεύθυνση email σας, παρακαλώ πατήστε τον ακόλουθο σύνδεσμο μέσα σε %s: register_notify=Καλώς ήλθατε στο %s -register_notify.title=%[1]s, καλώς ήλθατε στο %[2]s register_notify.text_1=αυτό είναι το email επιβεβαίωσης εγγραφής σας για το %s! register_notify.text_2=Μπορείτε να συνδεθείτε χρησιμοποιώντας το όνομα χρήστη σας: %s register_notify.text_3=Εάν κάποιος άλλος δημιούργησε τον λογαριασμό για εσάς, παρακαλώ ορίστε πρώτα τον κωδικό πρόσβασής σας. reset_password=Ανάκτηση του λογαριασμού σας -reset_password.title=%s, λάβαμε ένα αίτημα ανάκτησης για τον λογαριασμό σας reset_password.text=Εφόσον το αίτημα δημιουργήθηκε από εσάς, πατήστε τον ακόλουθο σύνδεσμο για να ανακτήσετε το λογαριασμό σας μέσα σε %s: register_success=Η εγγραφή ολοκληρώθηκε επιτυχώς @@ -586,8 +547,6 @@ RepoName=Όνομα αποθετηρίου Email=Διεύθυνση email Password=Κωδικός πρόσβασης Retype=Επιβεβαίωση κωδικού -SSHTitle=Όνομα κλειδιού SSH -HttpsUrl=HTTPS URL PayloadUrl=Payload URL TeamName=Όνομα ομάδας AuthName=Όνομα εξουσιοδότησης @@ -600,9 +559,6 @@ CommitChoice=Επιλογή commit TreeName=Διαδρομή αρχείου Content=Περιεχόμενο -SSPISeparatorReplacement=Διαχωριστικό -SSPIDefaultLanguage=Προεπιλεγμένη γλώσσα - require_error=` δεν μπορεί να είναι κενό.` alpha_dash_error=`: Πρέπει να περιέχει μόνο αλφαριθμητικά, παύλες ('-') και κάτω παύλες ('_').` alpha_dash_dot_error=`: Πρέπει να περιέχει μόνο αλφαριθμητικά, παύλα ('-'), κάτω παύλα ('_') και τελείες ('.').` @@ -624,7 +580,6 @@ lang_select_error=Επιλέξτε μια γλώσσα από τη λίστα. username_been_taken=Το όνομα χρήστη χρησιμοποιείται ήδη. username_change_not_local_user=Δεν επιτρέπεται στους μη τοπικούς χρήστες να αλλάξουν το όνομα χρήστη τους. -username_has_not_been_changed=Το όνομα χρήστη δεν άλλαξε repo_name_been_taken=Το όνομα του αποθετηρίου χρησιμοποιείται ήδη. repository_force_private=Η επιλογή Μόνο Ιδιωτικά είναι ενεργοποιημένη: τα ιδιωτικά αποθετήρια δεν μπορούν να δημοσιευθούν. repository_files_already_exist=Αρχεία υπάρχουν ήδη για αυτό το repository. Επικοινωνήστε με το διαχειριστή του συστήματος. @@ -704,7 +659,6 @@ unfollow=Να μην ακολουθώ user_bio=Περιγραφή disabled_public_activity=Αυτός ο χρήστης έχει απενεργοποιήσει τη δημόσια προβολή της δραστηριότητας του. email_visibility.limited=Η διεύθυνση email σας είναι ορατή σε κάθε ταυτοποιημένο χρήστη -email_visibility.private=Η διεύθυνση email σας είναι ορατή μόνο σε εσάς και στους διαχειριστές show_on_map=Προβολή σε χάρτη settings=Ρυθμίσεις χρήστη @@ -739,13 +693,11 @@ password=Κωδικός πρόσβασης security=Ασφάλεια avatar=Εικόνα προφίλ ssh_gpg_keys=Κλειδιά SSH / GPG -social=Λογαριασμοί κοινωνικών δικτύων applications=Εφαρμογές orgs=Οργανισμοί repos=Αποθετήρια delete=Διαγραφή λογαριασμού twofa=Πιστοποίηση δύο παραγόντων (TOTP) -account_link=Συνδεδεμένοι λογαριασμοί organization=Οργανισμοί uid=UID webauthn=Πιστοποίηση δύο παραγόντων (Κλειδιά Ασφαλείας) @@ -792,10 +744,7 @@ comment_type_group_issue_ref=Αναφορά ζητήματος saved_successfully=Οι ρυθμίσεις σας αποθηκεύτηκαν επιτυχώς. privacy=Απόρρητο keep_activity_private=Απόκρυψη δραστηριότητας από το προφίλ -keep_activity_private_popup=Με αυτή την επιλογή η δραστηριότητα σας είναι ορατή μόνο σε εσάς και στους διαχειριστές - lookup_avatar_by_mail=Αναζήτηση εικόνας προφίλ με διεύθυνση email -federated_avatar_lookup=Αποκεντρωμένη αναζήτηση εικόνων προφίλ enable_custom_avatar=Χρήση προσαρμοσμένης εικόνας προφίλ choose_new_avatar=Επιλογή νέας εικόνας προφίλ update_avatar=Αλλαγή εικόνας @@ -813,7 +762,6 @@ password_incorrect=Ο τρέχων κωδικός πρόσβασης είναι change_password_success=Ο κωδικός πρόσβασής σας έχει ενημερωθεί. Από εδώ και τώρα συνδέεστε χρησιμοποιώντας τον νέο κωδικό πρόσβασής σας. password_change_disabled=Οι μη τοπικοί χρήστες δεν μπορούν να ενημερώσουν τον κωδικό πρόσβασής τους μέσω του διεπαφής web του Forgejo. -emails=Διευθύνσεις Email manage_emails=Διαχείριση διευθύνσεων email manage_themes=Προεπιλεγμένο θέμα manage_openid=Διευθύνσεις OpenID @@ -856,8 +804,6 @@ principal_desc=Αυτές οι αρχές πιστοποιητικών SSH συ gpg_desc=Αυτά τα δημόσια κλειδιά GPG συσχετίζονται με το λογαριασμό σας και επιτρέπουν την επικύρωση των commit σας. Κρατήστε τα ιδιωτικά κλειδιά σας ασφαλή, καθώς επιτρέπουν την υπογραφή των commits εκ μέρους σας. ssh_helper=Χρειάζεστε βοήθεια; Συμβουλευτείτε τον οδηγό του GitHub για να δημιουργήσετε τα δικά σας κλειδιά SSH ή να επιλύσετε κοινά προβλήματα που ίσως αντιμετωπίσετε με τη χρήση του SSH. gpg_helper=Χρειάζεστε βοήθεια; Συμβουλευτείτε τον οδηγό του GitHub για το 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_gpg_placeholder=Αρχίζει με «-----BEGIN PGP PUBLIC KEY BLOCK-----» add_new_principal=Προσθήκη αρχής (Principal) @@ -875,7 +821,6 @@ gpg_invalid_token_signature=Το κλειδί GPG, η υπογραφή και τ gpg_token_required=Πρέπει να δώσετε μια υπογραφή για το παρακάτω διακριτικό gpg_token=Διακριτικό gpg_token_help=Μπορείτε να δημιουργήσετε μια υπογραφή χρησιμοποιώντας: -gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=Θωρακισμένη υπογραφή GPG key_signature_gpg_placeholder=Αρχίζει με «-----BEGIN PGP SIGNATURE-----» verify_gpg_key_success=Το κλειδί GPG «%s» επαληθεύτηκε. @@ -922,11 +867,6 @@ hide_openid=Απόκρυψη από το προφίλ ssh_disabled=Το SSH είναι απενεργοποιημένο ssh_signonly=Το SSH είναι απενεργοποιημένο αυτή τη στιγμή, έτσι αυτά τα κλειδιά είναι μόνο για την επαλήθευση υπογραφών των commit. ssh_externally_managed=Αυτό το κλειδί SSH διαχειρίζεται εξωτερικά για αυτόν το χρήστη -manage_social=Διαχείριση Συσχετιζόμενων Λογαριασμών Κοινωνικών Δικτύων -social_desc=Αυτοί οι λογαριασμοί κοινωνικών δικτύων μπορούν να χρησιμοποιηθούν για να συνδεθείτε στο λογαριασμό σας. Βεβαιωθείτε ότι τους αναγνωρίζετε όλους. -unbind=Αποσύνδεση -unbind_success=Ο λογαριασμός κοινωνικού δικτύου έχει διαγραφεί επιτυχώς. - manage_access_token=Διακριτικά πρόσβασης (tokens) generate_new_token=Δημιουργία νέου διακριτικού (token) tokens_desc=Αυτά τα διακριτικά (tokens) παρέχουν πρόσβαση στο λογαριασμό σας μέσω του API του Forgejo. @@ -936,8 +876,6 @@ generate_token_success=Το νέο διακριτικό σας έχει δημι generate_token_name_duplicate=Το %s χρησιμοποιείται ήδη ως όνομα εφαρμογής. Παρακαλούμε χρησιμοποιήστε ένα νέο. delete_token=Διαγραφή access_token_deletion=Διαγραφή διακριτικού πρόσβασης -access_token_deletion_cancel_action=Άκυρο -access_token_deletion_confirm_action=Διαγραφή access_token_deletion_desc=Η διαγραφή ενός διακριτικού θα ανακαλέσει οριστικά την πρόσβαση στο λογαριασμό σας για εφαρμογές που το χρησιμοποιούν. Συνέχεια; delete_token_success=Το διακριτικό έχει διαγραφεί. Οι εφαρμογές που το χρησιμοποιούν δεν έχουν πλέον πρόσβαση στο λογαριασμό σας. repo_and_org_access=Πρόσβαση στο repository και οργανισμό @@ -1011,7 +949,6 @@ webauthn_alternative_tip=Μπορεί να θέλετε να ρυθμίσετε manage_account_links=Διαχείριση συνδεδεμένων λογαριασμών manage_account_links_desc=Αυτοί οι εξωτερικοί λογαριασμοί είναι συνδεδεμένοι στον λογαριασμό Forgejo σας. -account_links_not_available=Προς το παρόν δεν υπάρχουν εξωτερικοί λογαριασμοί συνδεδεμένοι με τον λογαριασμό σας στο Forgejo. link_account=Σύνδεση λογαριασμού remove_account_link=Αφαίρεση συνδεδεμένου λογαριασμού remove_account_link_desc=Η κατάργηση ενός συνδεδεμένου λογαριασμού θα ανακαλέσει την πρόσβασή του στο λογαριασμό σας στο Forgejo. Συνέχεια; @@ -1050,7 +987,6 @@ blocked_users = Αποκλεισμένοι χρήστες user_block_success = Ο αποκλεισμός του χρήστη ήταν επιτυχής. additional_repo_units_hint = Να συνιστάται η προσθήκη μονάδων αποθετηρίων pronouns = Αντωνυμίες -pronouns_custom = κάτι άλλο pronouns_unspecified = Απροσδιόριστες hints = Συμβουλές additional_repo_units_hint_description = Εμφάνιση υπόδειξης «Προσθήκη μονάδων...» σε αποθετήρια που δεν έχουν ενεργοποιημένες όλες τις διαθέσιμες μονάδες. @@ -1060,7 +996,6 @@ language.title = Προεπιλεγμένη γλώσσα keep_activity_private.description = Η δημόσια δραστηριότητά σας θα είναι ορατή μόνο σε εσάς και στους διαχειριστές. language.localization_project = Βοηθήστε μας να μεταφράσουμε το Forgejo στην γλώσσα σας! Περισσότερες πληροφορίες. language.description = Από εδώ και στο εξής, αυτή η γλώσσα θα χρησιμοποιείται από προεπιλογή για τον λογαριασμό σας. -pronouns_custom_label = Ειδικές αντωνυμίες user_block_yourself = Δεν μπορείτε να αποκλείσετε τον εαυτό σας. change_username_redirect_prompt.with_cooldown.one = Το παλιό όνομα χρήστη θα γίνει διαθέσιμο όταν λήξει σε %[1]d ημέρα. Μέσα σε αυτό το χρονικό πλαίσιο, θα μπορείτε να ανανεώσετε το όνομα χρήστη σας. change_username_redirect_prompt.with_cooldown.few = Το παλιό όνομα χρήστη θα γίνει διαθέσιμο όταν λήξει σε %[1]d ημέρες. Μέσα σε αυτό το χρονικό πλαίσιο, θα μπορείτε να ανανεώσετε το όνομα χρήστη σας. @@ -1093,7 +1028,6 @@ fork_branch=Κλάδος που θα κλωνοποιηθεί στο fork all_branches=Όλοι οι κλάδοι fork_no_valid_owners=Αυτό το repository δεν μπορεί να γίνει fork, επειδή δεν υπάρχουν έγκυροι ιδιοκτήτες. use_template=Χρήση αυτού του πρότυπου -clone_in_vsc=Κλωνοποίηση στο VS Code download_zip=Λήψη ZIP download_tar=Λήψη TAR.GZ download_bundle=Κατεβάστε Το ΔΕΜΑ @@ -1113,11 +1047,6 @@ readme=README readme_helper=Επιλέξτε ένα πρότυπο αρχείου README readme_helper_desc=Αυτό είναι το μέρος όπου μπορείτε να γράψετε μια πλήρη περιγραφή για το έργο σας. auto_init=Αρχικοποίηση αποθετηρίου (Προσθήκη .gitignore, άδειας χρήσης και README) -trust_model_helper=Επιλέξτε ένα μοντέλο εμπιστοσύνης για την επαλήθευση υπογραφής. Πιθανές επιλογές είναι: -trust_model_helper_collaborator=Συνεργάτης: Εμπιστοσύνη υπογραφών από συνεργάτες -trust_model_helper_committer=Υποβολέας: Εμπιστοσύνη των υπογραφών που ταιριάζουν με τους υποβολείς -trust_model_helper_collaborator_committer=Συνεργάτης+Υποβολέας: Εμπιστοσύνη των υπογραφών από συνεργάτες που ταιριάζουν με τον υποβολέα -trust_model_helper_default=Προεπιλογή: Χρήση προεπιλεγμένου μοντέλου εμπιστοσύνης της υπηρεσίας create_repo=Δημιουργία αποθετηρίου default_branch=Προεπιλεγμένος κλάδος default_branch_label=προεπιλογή @@ -1190,9 +1119,6 @@ template.invalid=Πρέπει να επιλέξετε ένα πρότυπο repo archive.title=Αυτό το αποθετήρειο αρχειοθετήθηκε. Μπορείτε να προβάλετε αρχεία και να τα κλωνοποιήσετε, αλλά δεν μπορείτε να ωθήσετε ή να ανοίξετε ζητήματα ή pull requests. archive.title_date=Αυτό το repository αρχειοθετήθηκε στις %s. Μπορείτε να δείτε τα αρχεία του και να το κλωνοποιήσετε, αλλά δεν μπορείτε να κάνετε push, να ανοίξετε ζητήματα ή pull requests. -archive.issue.nocomment=Αυτό το repository έχει αρχειοθετηθεί. Δεν μπορείτε να σχολιάσετε σε ζητήματα. -archive.pull.nocomment=Αυτό το repo αρχειοθετήθηκε. Δεν μπορείτε να σχολιάσετε στα pull requests. - form.reach_limit_of_creation_1=Έχετε ήδη συμπληρώσει το όριο του %d αποθετηρίου. form.reach_limit_of_creation_n=Έχετε ήδη συμπληρώσει το όριο των %d αποθετηρίων. form.name_reserved=Το όνομα αποθετηρίου «%s» είναι δεσμευμένο. @@ -1200,7 +1126,6 @@ form.name_pattern_not_allowed=Το μοτίβο «%s» δεν επιτρέπετ need_auth=Εξουσιοδότηση migrate_options=Ρυθμίσεις μεταφοράς -migrate_service=Υπηρεσία Μεταφοράς migrate_options_mirror_helper=Αυτό το repository θα είναι είδωλο migrate_options_lfs=Μεταφορά αρχείων LFS migrate_options_lfs_endpoint.label=Άκρο LFS @@ -1286,7 +1211,6 @@ branches=Κλάδοι tags=Ετικέτες issues=Ζητήματα pulls=Pull requests -project_board=Έργα packages=Πακέτα actions=Actions labels=Ταμπέλες @@ -1300,7 +1224,6 @@ release=Κυκλοφορία releases=Κυκλοφορίες tag=Ετικέτα released_this=κυκλοφόρησε -tagged_this=πρόσθεσε ετικέτα για το file.title=%s στο %s file_raw=Ακατέργαστο file_history=Ιστορικό @@ -1412,9 +1335,7 @@ commits.desc=Δείτε το ιστορικό αλλαγών του πηγαίο commits.commits=Commits commits.no_commits=Δεν υπάρχουν κοινά commit. Τα «%s» και «%s» έχουν εντελώς διαφορετικές ιστορίες. commits.nothing_to_compare=Αυτοί οι κλάδοι είναι όμοιοι. -commits.search=Αναζήτηση υποβολών… commits.search.tooltip=Μπορείτε να προθέτετε τις λέξεις-κλειδιά με "author:", "committer:", "after:", ή "before:", π.χ. "επαναφορά author:Alice before:2019-01-13". -commits.find=Αναζήτηση commits.search_all=Όλοι οι κλάδοι commits.author=Συγγραφέας commits.message=Μήνυμα @@ -1442,8 +1363,6 @@ commitstatus.pending=Εκκρεμεί commitstatus.success=Επιτυχές ext_issues=Πρόσβαση σε εξωτερικά ζητήματα -ext_issues.desc=Σύνδεση σε εξωτερικό εφαρμογή ζητημάτων. - projects=Έργα projects.desc=Διαχείριση ζητημάτων και pulls στους πίνακες των έργων. projects.description=Περιγραφή (προαιρετικό) @@ -1465,7 +1384,6 @@ projects.type.basic_kanban=Απλό Kanban projects.type.bug_triage=Διαλογή σφαλμάτων projects.template.desc=Πρότυπο έργου projects.template.desc_helper=Επιλέξτε ένα πρότυπο έργου για να ξεκινήσετε -projects.type.uncategorized=Χωρίς Κατηγορία projects.column.edit=Επεξεργασία στήλης projects.column.edit_title=Όνομα projects.column.new_title=Όνομα @@ -1473,8 +1391,6 @@ projects.column.new_submit=Δημιουργία στήλης projects.column.new=Νέα στήλη projects.column.set_default=Ορισμός προεπιλογής projects.column.set_default_desc=Ορίστε αυτή τη στήλη ως προεπιλεγμένη για ζητήματα και pull requests που δεν ανήκουν σε κάποια κατηγορία -projects.column.unset_default=Αφαίρεση προεπιλογής -projects.column.unset_default_desc=Αφαίρεση της προεπιλογής αυτής της στήλης projects.column.delete=Διαγραφή στήλης projects.column.deletion_desc=Όταν διαγράφεται κάποια στήλη έργου, όλα τα ζητήματα που ανήκουν σε αυτή θα μείνουν «Χωρίς Κατηγορία». Να γίνει συνέχεια; projects.column.color=Έγχρωμο @@ -1588,7 +1504,6 @@ issues.filter_sort.moststars=Περισσότερα αστέρια issues.filter_sort.feweststars=Λιγότερα αστέρια issues.filter_sort.mostforks=Περισσότερα forks issues.filter_sort.fewestforks=Λιγότερα forks -issues.keyword_search_unavailable=Η αναζήτηση με λέξεις κλειδιά δεν είναι διαθέσιμη. Παρακαλώ επικοινωνήστε με τον διαχειριστή. issues.action_open=Άνοιγμα issues.action_close=Κλείσιμο issues.action_label=Σήμα @@ -1633,11 +1548,8 @@ issues.ref_issue_from=`αναφέρθηκε σε αυτό το issues.ref_pull_from=`αναφέρθηκε σε αυτό το pull request %[3]s %[1]s` issues.ref_closing_from=`ανέφερε αυτό το ζήτημα σε ένα pull request %[3]s που στοχεύει να κλείσει το ζήτημα %[1]s` issues.ref_reopening_from=`αναφέρθηκε σε αυτό το ζήτημα σε ένα pull request %[3]s που θα ξαναανοίξει αυτό το ζήτημα %[1]s` -issues.ref_closed_from=`έκλεισε αυτό το ζήτημα %[4]s %[2]s` -issues.ref_reopened_from=`άνοιξε ξανά αυτό το ζήτημα %[4]s %[2]s` issues.ref_from=`από %[1]s` issues.author=Συγγραφέας -issues.author_helper=Αυτός ο χρήστης είναι ο συγγραφέας. issues.role.owner=Ιδιοκτήτης issues.role.owner_helper=Αυτός ο χρήστης είναι ο ιδιοκτήτης αυτού του αποθετηρίου. issues.role.member=Μέλος @@ -1732,18 +1644,13 @@ issues.add_time_sum_to_small=Δεν εισήχθη χρόνος. issues.time_spent_total=Συνολικός χρόνος issues.time_spent_from_all_authors=`Συνολικός χρόνος: %s` issues.due_date=Ημερομηνία παράδοσης -issues.invalid_due_date_format=Η ημερομηνίας παράδοσης πρέπει να έχει την μορφή «εεεε-μμ-ηη». -issues.error_modifying_due_date=Προέκυψε σφάλμα κατά την αλλαγή ημερομηνίας παράδοσης. -issues.error_removing_due_date=Προέκυψε σφάλμα κατά την κατάργηση ημερομηνίας παράδοσης. issues.push_commit_1=πρόσθεσε %d υποβολή %s issues.push_commits_n=πρόσθεσε %d υποβολές %s issues.force_push_codes=`έκανε force-push %[1]s από το %[2]s %[8]s στο %[4]s %[9]s %[6]s` issues.force_push_compare=Σύγκριση issues.due_date_form=εεεε-μμ-ηη -issues.due_date_form_add=Προσθήκη ημερομηνίας παράδοσης issues.due_date_form_edit=Αλλαγή issues.due_date_form_remove=Αφαίρεση -issues.due_date_not_writer=Χρειάζεστε πρόσβαση εγγραφής για να τροποποιήσετε την ημερομηνία παράδοσης του ζητήματος. issues.due_date_not_set=Δεν ορίστηκε ημερομηνία παράδοσης. issues.due_date_added=όρισε την ημερομηνία παράδοσης %s %s issues.due_date_modified=τροποποίησε την ημερομηνία παράδοσης από %[2]s σε %[1]s %[3]s @@ -1796,7 +1703,6 @@ issues.review.remove_review_request=αφαιρέθηκε αίτημα ελέγχ issues.review.remove_review_request_self=αρνήθηκε να ελέγξει %s issues.review.pending=Εκκρεμεί issues.review.pending.tooltip=Αυτό το σχόλιο προς το παρόν δεν είναι ορατό σε άλλους χρήστες. Για να υποβάλετε τα σχόλιά σας, επιλέξτε "%s" -> "%s/%s/%s" στη κορυφή της σελίδας. -issues.review.review=Αξιολόγηση issues.review.reviewers=Εξεταστές issues.review.outdated=Παρωχημένο issues.review.outdated_description=Το περιεχόμενο άλλαξε αφού έγινε αυτό το σχόλιο @@ -1809,7 +1715,6 @@ issues.review.hide_resolved=Απόκρυψη επιλυμένων issues.review.resolve_conversation=Επίλυση συνομιλίας issues.review.un_resolve_conversation=Ανεπίλυτη συνομιλία issues.review.resolved_by=σημείωση αυτή την συνομιλία ως επιλυμένη -issues.assignee.error=Δεν προστέθηκαν όλοι οι παραλήπτες λόγω απροσδόκητου σφάλματος. issues.reference_issue.body=Σώμα issues.content_history.deleted=διαγράφηκε issues.content_history.edited=επεξεργάστηκε @@ -1817,8 +1722,6 @@ issues.content_history.created=δημιουργήθηκε issues.content_history.delete_from_history=Διαγραφή από το ιστορικό issues.content_history.delete_from_history_confirm=Διαγραφή από το ιστορικό; issues.content_history.options=Επιλογές -issues.reference_link=Αναφορά: %s - compare.compare_base=βάση compare.compare_head=σύγκριση @@ -1852,8 +1755,6 @@ pulls.nothing_to_compare=Αυτοί οι κλάδοι είναι ίδιοι. Δ pulls.nothing_to_compare_and_allow_empty_pr=Αυτοί οι κλάδοι είναι ίδιοι. Αυτό το PR θα είναι κενό. pulls.has_pull_request=`Υπάρχει ήδη pull request μεταξύ αυτών των κλάδων: %[2]s#%[3]d` pulls.create=Δημιουργία pull request -pulls.title_desc_few=θέλει να συγχωνεύσει %[1]d υποβολές από %[2]s σε %[3]s -pulls.merged_title_desc_few=συγχώνευσε %[1]d υποβολές από %[2]s σε %[3]s %[4]s pulls.change_target_branch_at=`άλλαξε τον κλάδο προορισμού από %s σε %s %s` pulls.tab_conversation=Συζήτηση pulls.tab_commits=Commits @@ -2013,8 +1914,6 @@ signing.wont_sign.approved=Η συγχώνευση δε θα υπογραφεί signing.wont_sign.not_signed_in=Δεν είστε συνδεδεμένοι. ext_wiki=Πρόσβαση στο εξωτερικό wiki -ext_wiki.desc=Σύνδεση σε ένα εξωτερικό wiki. - wiki=Wiki wiki.welcome=Καλώς ήρθατε στο Wiki. wiki.welcome_desc=Το wiki σας επιτρέπει να γράψετε και να μοιραστείτε τεκμηριώσεις (documentation) με άλλους συνεργάτες. @@ -2110,17 +2009,6 @@ activity.git_stats_deletion_n=%d διαγραφές contributors.contribution_type.commits=Commits -search=Αναζήτηση -search.search_repo=Αναζήτηση αποθετηρίου -search.type.tooltip=Τύπος αναζήτησης -search.fuzzy=Όμοιο -search.fuzzy.tooltip=Συμπερίληψη και των αποτελεσμάτων που είναι πλησιέστερα με τον όρο αναζήτησης -search.match=Ταίριασμα -search.match.tooltip=Συμπερίληψη μόνο των αποτελεσμάτων που ταιριάζουν ακριβώς με τον όρο αναζήτησης -search.results=Αποτελέσματα αναζήτησης για «%s» σε %s -search.code_no_results=Δεν βρέθηκε πηγαίος κώδικας που να ταιριάζει με τον όρο αναζήτησης. -search.code_search_unavailable=Η αναζήτηση κώδικα δεν είναι διαθέσιμη αυτή τη στιγμή. Παρακαλώ επικοινωνήστε με το διαχειριστή. - settings=Ρυθμίσεις settings.desc=Στις Ρυθμίσεις μπορείτε να διαχειριστείτε τις ρυθμίσεις για το repository settings.options=Repository @@ -2227,7 +2115,6 @@ settings.transfer_abort=Ακύρωση μεταβίβασης settings.transfer_abort_invalid=Δεν μπορείτε να ακυρώσετε μια ανύπαρκτη μεταβίβαση αποθετηρίου. settings.transfer_abort_success=Η μεταφορά αποθετηρίου στο %s ακυρώθηκε με επιτυχία. settings.transfer_desc=Μεταβιβάστε αυτό το repository σε έναν χρήστη ή σε έναν οργανισμό για τον οποίο έχετε δικαιώματα διαχειριστή. -settings.transfer_form_title=Εισάγετε το όνομα του αποθετηρίου ως επιβεβαίωση: settings.transfer_in_progress=Αυτή τη στιγμή υπάρχει μια εν εξελίξει μεταβίβαση. Παρακαλούμε ακυρώστε την αν θέλετε να μεταβιβάσετε αυτό το repository σε άλλο χρήστη. settings.transfer_notices_1=- Θα χάσετε την πρόσβαση στο repository αν το μεταβιβάσετε σε έναν μεμονωμένο χρήστη. settings.transfer_notices_2=- Θα διατηρήσετε την πρόσβαση στο repository αν το μεταβιβάσετε σε έναν οργανισμό που είστε (συν)ιδιοκτήτης. @@ -2272,7 +2159,6 @@ settings.delete_collaborator=Κατάργηση settings.collaborator_deletion=Κατάργηση συνεργάτη settings.collaborator_deletion_desc=Η κατάργηση ενός συνεργάτη θα αφαιρέσει και την πρόσβασή του στο repository. Είστε βέβαιοι; settings.remove_collaborator_success=Ο συνεργάτης έχει καταργηθεί. -settings.search_user_placeholder=Αναζήτηση χρήστη… settings.org_not_allowed_to_be_collaborator=Δεν μπορείτε να προσθέσετε έναν οργανισμό ως συνεργάτη. settings.change_team_access_not_allowed=Η αλλαγή της πρόσβασης ομάδας για το repository έχει περιοριστεί στον ιδιοκτήτη του οργανισμού settings.team_not_in_organization=Η ομάδα δεν είναι στον ίδιο οργανισμό με το repository @@ -2280,7 +2166,6 @@ settings.teams=Ομάδες settings.add_team=Προσθήκη ομάδας settings.add_team_duplicate=Η ομάδα έχει ήδη το repository settings.add_team_success=Η ομάδα έχει πλέον πρόσβαση στο repository. -settings.search_team=Αναζήτηση Ομάδας… settings.change_team_permission_tip=Τα δικαιώματα της ομάδας έχουν οριστεί στη σελίδα ρυθμίσεων της ομάδας και δεν μπορούν να αλλάξουν ανά repository settings.delete_team_tip=Αυτή η ομάδα έχει πρόσβαση σε όλα τα αποθετήρια και δεν μπορεί να αφαιρεθεί settings.remove_team_success=Έχει αφαιρεθεί η πρόσβαση της ομάδας στο repository. @@ -2418,12 +2303,7 @@ settings.branches=Κλάδοι settings.protected_branch=Προστασία κλάδου settings.protected_branch.save_rule=Αποθήκευση κανόνα 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.protect_this_branch=Ενεργοποίηση προστασίας κλάδου -settings.protect_this_branch_desc=Αποτρέπει τη διαγραφή και περιορίζει το Git push και συγχώνευση στον κλάδο. settings.protect_disable_push=Απενεργοποίηση ωθήσεων settings.protect_disable_push_desc=Κανένα push δεν θα επιτρέπεται σε αυτόν τον κλάδο. settings.protect_enable_push=Ενεργοποίηση ωθήσεων @@ -2434,9 +2314,7 @@ settings.protect_whitelist_committers=Περιορισμένος κανονισ settings.protect_whitelist_committers_desc=Μόνο χρήστες ή ομάδες στη λίστα θα επιτρέπεται να κάνουν push σε αυτόν τον κλάδο (αλλά όχι να κάνουν force push). settings.protect_whitelist_deploy_keys=Έγκριση κλειδιών διάθεσης με πρόσβαση εγγραφής για ώθηση. settings.protect_whitelist_users=Λίστα χρηστών που επιτρέπεται να κάνουν push: -settings.protect_whitelist_search_users=Αναζήτηση χρηστών… settings.protect_whitelist_teams=Λίστα ομάδων που επιτρέπεται να κάνουν push: -settings.protect_whitelist_search_teams=Αναζήτηση ομάδων… settings.protect_merge_whitelist_committers=Ενεργοποίηση λίστας συγχώνευσης settings.protect_merge_whitelist_committers_desc=Επιτρέψτε μόνο σε χρήστες ή ομάδες στη λίστα να συγχωνεύσουν pull requests σε αυτό το κλάδο. settings.protect_merge_whitelist_users=Λίστα επιτρεπόμενων χρηστών για συγχώνευση: @@ -2466,8 +2344,6 @@ settings.protect_protected_file_patterns=Μοτίβα προστατευμένω settings.protect_protected_file_patterns_desc=Τα προστατευόμενα αρχεία δεν επιτρέπεται να αλλάξουν άμεσα, ακόμη και αν ο χρήστης έχει δικαιώματα να προσθέσει, να επεξεργαστεί ή να διαγράψει αρχεία σε αυτόν τον κλάδο. Επιπλέων μοτίβα μπορούν να διαχωριστούν με semicolon («;») (ΟΧΙ ερωτηματικό). Για να συντάξετε μοτίβα, συμβουλευτείται την τεκμηρίωση %[2]s. Παράδειγμα: .drone.yml, /docs/**/*.txt. settings.protect_unprotected_file_patterns=Μοτίβα μη προστατευμένων αρχείων (διαχωρισμένα με semicolon «;» και ΟΧΙ το ελληνικό ερωτηματικό): settings.protect_unprotected_file_patterns_desc=Μη προστατευμένα αρχεία που επιτρέπεται να αλλάξουν απευθείας εάν ο χρήστης έχει πρόσβαση εγγραφής, παρακάμπτοντας τον περιορισμό ώθησης. Επιπλέων μοτίβα μπορούν να διαχωριστούν με ερωτηματικό (';'). Δείτε την τεκμηρίωση %[2]s για τη σύνταξη του μοτίβου. Πχ: .drone.yml, /docs/**/*.txt. -settings.add_protected_branch=Ενεργοποίηση προστασίας -settings.delete_protected_branch=Απενεργοποίηση προστασίας settings.update_protect_branch_success=Η προστασία κλάδου για τον κανόνα «%s» ενημερώθηκε. settings.remove_protected_branch_success=Η προστασία κλάδου για τον κανόνα "%s" αφαιρέθηκε. settings.remove_protected_branch_failed=Η αφαίρεση του κανόνα προστασίας κλάδου «%s» απέτυχε. @@ -2546,8 +2422,6 @@ settings.lfs_pointers.associateAccessible=Συσχετισμός προσιτώ settings.rename_branch_failed_exist=Αδυναμία μετονομασίας του κλάδου, επειδή ο κλάδος προορισμού %s υπάρχει ήδη. settings.rename_branch_failed_not_exist=Αδυναμία μετονομασίας του κλάδου %s επειδή δεν υπάρχει. settings.rename_branch_success=Ο κλάδος %s μετονομάστηκε με επιτυχία σε %s. -settings.rename_branch_from=παλιό όνομα κλάδου -settings.rename_branch_to=νέο όνομα κλάδου settings.rename_branch=Μετονομασία κλάδου diff.browse_source=Προβολή πηγαίου κώδικα @@ -2556,7 +2430,6 @@ diff.commit=commit diff.git-notes=Σημειώσεις diff.data_not_available=Δεν υπάρχει διαθέσιμο περιεχόμενο diff diff.options_button=Επιλογές diff -diff.show_diff_stats=Εμφάνιση στατιστικών diff.download_patch=Λήψη αρχείου patch diff.download_diff=Λήψη αρχείου diff diff.show_split_view=Διαιρεμένη προβολή @@ -2649,7 +2522,6 @@ release.tag_name_invalid=Το όνομα της ετικέτας δεν είνα release.tag_name_protected=Το όνομα της ετικέτας προστατεύεται. release.tag_already_exist=Αυτό το όνομα ετικέτας υπάρχει ήδη. release.downloads=Λήψεις -release.download_count=Λήψεις: %s release.add_tag_msg=Χρησιμοποιήστε τον τίτλο και το περιεχόμενο της έκδοσης ως μήνυμα ετικέτας. release.add_tag=Δημιουργία ετικέτας release.releases_for=Κυκλοφορίες για %s @@ -2678,14 +2550,12 @@ branch.default_deletion_failed=Ο κλάδος «%s» είναι προεπιλ branch.restore=Επαναφορά κλάδου «%s» branch.download=Λήψη κλάδου «%s» branch.rename=Μετονομασία κλάδου «%s» -branch.search=Αναζήτηση Κλάδου branch.included_desc=Αυτός ο κλάδος είναι μέρος του προεπιλεγμένου κλάδου branch.included=Περιλαμβάνεται branch.create_new_branch=Δημιουργία κλάδου από κλάδο: branch.confirm_create_branch=Δημιουργία κλάδου branch.warning_rename_default_branch=Μετονομάζετε τον προεπιλεγμένο κλάδο. branch.rename_branch_to=Μετονομασία του "%s" σε: -branch.confirm_rename_branch=Μετονομασία κλάδου branch.create_branch_operation=Δημιουργία κλάδου branch.new_branch=Δημιουργία νέου κλάδου branch.new_branch_from=`Δημιουργία νέου κλάδου από το «%s»` @@ -2711,7 +2581,6 @@ error.csv.unexpected=Δεν είναι δυνατή η απόδοση αυτού error.csv.invalid_field_count=Δεν είναι δυνατή η απόδοση αυτού του αρχείου, επειδή έχει λάθος αριθμό πεδίων στη γραμμή %d. commits.renamed_from = Μετονομάστηκε από %σ settings.wiki_rename_branch_main_desc = Ο κλάδος, ο οποίος χρησιμοποιείται εσωτερικά από το wiki, θα μετονομαστεί (μόνιμα και μη αναστράψιμα) σε «%s». -issues.comment.blocked_by_user = Δεν μπορείτε να αφήσετε σχόλιο σε αυτό το ζήτημα, επειδή ο κάτοχος του αποθετηρίου ή το άτομο που δημιούργησε το ζήτημα σας έχει αποκλείσει. pulls.blocked_by_user = Δεν μπορείτε να δημιουργήσετε pull request σε αυτό το repository, επειδή ο κάτοχος του repository σας έχει αποκλείσει. pulls.made_using_agit = AGit wiki.cancel = Ακύρωση @@ -2728,7 +2597,6 @@ contributors.contribution_type.additions = Προσθήκες contributors.contribution_type.deletions = Διαγραφές migrate.forgejo.description = Μεταφορά δεδομένων από το codeberg.org ή άλλων υπηρεσιών Forgejo. rss.must_be_on_branch = Για να αποκτήσετε ένα RSS feed, πρέπει να βρίσκεστε σε έναν κλάδο. -clone_in_vscodium = Κλωνοποίηση στο VSCodium editor.invalid_commit_mail = Αυτή η διεύθυνση email δεν είναι έγκυρη για την δημιουργία commit. pulls.nothing_to_compare_have_tag = Ο επιλεγμένος κλάδος/tag είναι όμοιος. issues.blocked_by_user = Δεν μπορείτε να δημιουργήσετε ζητήματα σε αυτό το repository, επειδή ο κάτοχος του repository σας έχει αποκλείσει. @@ -2754,7 +2622,6 @@ settings.wiki_branch_rename_failure = Προέκυψε σφάλμα κατά τ settings.ignore_stale_approvals = Να αγνοούνται οι παρωχημένες εγκρίσεις pulls.reopen_failed.base_branch = Δεν είναι δυνατό το επανάνοιγμα του pull request, επειδή δεν υπάρχει πια ο κλάδος πάνω στο οποίο βασίζονται οι αλλαγές του (base branch). activity.navbar.pulse = Παλμός -error.broken_git_hook = Τα Git hook του αποθετηρίου δεν φαίνονται να λειτουργούν. Παρακαλώ ακολουθήστε τον οδηγό για να τα διορθώσετε, και μετά ωθήστε μερικές υποβολές (commits) για να γίνει επανέλεγχος. settings.add_collaborator_blocked_them = Δεν είναι δυνατή η προσθήκη του χρήστη ως συνεργάτη, καθώς έχει αποκλείσει τον κάτοχο του αποθετηρίου. settings.wiki_rename_branch_main_notices_2 = Αυτό θα αλλάξει το όνομα του κλάδου που χρησιμοποιείται «στο υπόβαθρο» για το wiki του αποθετηρίου %s. Αν έχετε ένα τοπικό αντίγραφο του αποθετηρίου, θα χρειαστεί να αλλάξετε τα checkout του. settings.add_collaborator_blocked_our = Δεν είναι δυνατή η προσθήκη του χρήστη ως συνεργάτη, καθώς ο κάτοχος του αποθετηρίου τον έχει αποκλείσει. @@ -2765,14 +2632,11 @@ n_commit_one = %s commit stars = Αστέρια n_branch_one = %s κλάδος commits.search_branch = Αυτός ο κλάδος -pulls.title_desc_one = : θα ήθελε να συγχωνεύσει %[1]d υποβολή από τον κλάδο %[2]s στον κλάδο %[3]s -pulls.merged_title_desc_one = συγχώνευσε %[1]d υποβολή από τον κλάδο %[2]s στον κλάδο %[3]s %[4]s n_commit_few = %s commits settings.sourcehut_builds.secrets = Μυστικά settings.add_webhook.invalid_path = Η τοποθεσία του αρχείου δεν μπορεί να περιέχει κενά, «.» ή «..». Δεν μπορεί να αρχίζει ή να τελειώνει με μία κάθετο. commits.browse_further = Περιήγηση περισσοτέρων issues.num_participants_one = %d συμμετέχων -settings.sourcehut_builds.graphql_url = Υπερσύνδεσμος GraphQL (π.χ. https://builds.sr.ht/query) settings.sourcehut_builds.manifest_path = Τοποθεσία build manifest size_format = %[1]s: %[2]s, %[3]s: %[4]s issues.archived_label_description = (Αρχειοθετημένη) %s @@ -2944,9 +2808,7 @@ teams.none_access_helper=Τα μέλη δεν μπορούν να δουν ή ν teams.general_access=Γενική πρόσβαση teams.general_access_helper=Τα δικαιώματα των μελών αποφασίζονται από το παρακάτω πίνακα αδειών. teams.read_access=Ανάγνωση -teams.read_access_helper=Τα μέλη μπορούν να δουν και να κλωνοποιήσουν τα αποθετήρια της ομάδας. teams.write_access=Εγγραφή -teams.write_access_helper=Τα μέλη μπορούν να δουν και να κλωνοποιήσουν τα αποθετήρια της ομάδας. teams.admin_access=Πρόσβαση διαχειριστή teams.admin_access_helper=Τα μέλη μπορούν να κάνουν push και pull στα αποθετήρια της ομάδας, καθώς και να προσθέσουν συνεργάτες σε αυτά. teams.no_desc=Η ομάδα δεν έχει περιγραφή @@ -2961,12 +2823,9 @@ teams.invite_team_member.list=Εκκρεμείς προσκλήσεις teams.delete_team_title=Διαγραφή ομάδας teams.delete_team_desc=Η διαγραφή μιας ομάδας ανακαλεί τη πρόσβαση στο repository από τα μέλη της. Συνέχεια; teams.delete_team_success=Η ομάδα έχει διαγραφεί. -teams.read_permission_desc=Αυτή η ομάδα χορηγεί πρόσβαση Ανάγνωσης: τα μέλη μπορούν να δουν και να κλωνοποιήσουν τα αποθετήρια της ομάδας. -teams.write_permission_desc=Αυτή η ομάδα χορηγεί πρόσβαση Εγγραφής: τα μέλη μπορούν να διαβάσουν και να κάνουν push στα αποθετήρια της ομάδας. teams.admin_permission_desc=Αυτή η ομάδα κατέχει δικαιώματα διαχειριστή: Τα μέλη της μπορούν να δουν αποθετήρια, να κάνουν push σε αυτά καθώς και να προσθέσουν συνεργάτες. teams.create_repo_permission_desc=Επιπλέον, αυτή η ομάδα χορηγεί άδεια Δημιουργία αποθετηρίου: τα μέλη μπορούν να δημιουργήσουν νέα αποθετήρια στον οργανισμό. teams.repositories=Αποθετήρια ομάδας -teams.search_repo_placeholder=Αναζήτηση αποθετηρίου… teams.remove_all_repos_title=Αφαίρεση όλων των αποθετηρίων της ομάδας teams.remove_all_repos_desc=Αυτό θα αφαιρέσει όλα τα αποθετήρια από την ομάδα. teams.add_all_repos_title=Προσθήκη όλων των αποθετηρίων @@ -2979,9 +2838,6 @@ teams.specific_repositories=Συγκεκριμένα αποθετήρια teams.specific_repositories_helper=Τα μέλη θα έχουν πρόσβαση μόνο σε αποθετήρια που προστίθενται ρητά στην ομάδα. Επιλέγοντας το δεν θα θα αφαιρεθούν αυτόματα τα αποθετήρια που έχουν ήδη προστεθεί με το Όλα τα αποθετήρια. teams.all_repositories=Όλα τα αποθετήρια teams.all_repositories_helper=Η ομάδα έχει πρόσβαση σε όλα τα αποθετήρια. Επιλέγοντας το θα προσθεθούν όλα τα υπάρχοντα αποθετήρια στην ομάδα. -teams.all_repositories_read_permission_desc=Αυτή η ομάδα χορηγεί πρόσβαση Ανάγνωσης σε όλα τα αποθετήρια: τα μέλη μπορούν να δουν και να κλωνοποιήσουν αποθετήρια. -teams.all_repositories_write_permission_desc=Αυτή η ομάδα χορηγεί πρόσβαση Εγγραφής σε όλα τα αποθετήρια: τα μέλη μπορούν να διαβάσουν και να κάνουν push σε αποθετήρια. -teams.all_repositories_admin_permission_desc=Αυτή η ομάδα παρέχει δικαιώματα διαχειριστή σε όλα τα αποθετήρια: Τα μέλη της μπορούν να δουν αποθετήρια, να κάνουν push σε αυτά, καθώς και να προσθέσουν συνεργάτες. teams.invite.title=Έχετε προσκληθεί να συμμετάσχετε στην ομάδα %s του οργανισμού %s. teams.invite.by=Προσκλήθηκε από %s teams.invite.description=Παρακαλώ κάντε κλικ στον παρακάτω σύνδεσμο για συμμετοχή στην ομάδα. @@ -3075,7 +2931,6 @@ dashboard.gc_metadata_obtained=Μεταδεδομένα GC που έχουν λ dashboard.other_system_allocation_obtained=Άλλες αναθέσεις συστήματος που έχουν ληφθεί dashboard.next_gc_recycle=Επόμενη ανακύκλωση GC dashboard.last_gc_time=Χρόνος από την τελευταία φορά που έγινε GC -dashboard.total_gc_time=Σύνολο Παύσης GC dashboard.total_gc_pause=Σύνολο παύσης GC dashboard.last_gc_pause=Τελευταία παύση GC dashboard.gc_times=Χρόνοι GC @@ -3174,9 +3029,6 @@ repos.unadopted.no_more=Δεν βρέθηκαν μη υιοθετημένα απ repos.owner=Ιδιοκτήτης repos.name=Όνομα repos.private=Ιδιωτικό -repos.watches=Παρακολουθήσεις -repos.stars=Αστέρια -repos.forks=Forks repos.issues=Ζητήματα repos.size=Μέγεθος repos.lfs_size=Μέγεθος LFS @@ -3281,17 +3133,6 @@ auths.oauth2_admin_group=Τιμή Group Claim για διαχειριστές. ( auths.oauth2_restricted_group=Τιμή Group Claim για περιορισμένους χρήστες (προαιρετικό - απαιτεί όνομα claim παραπάνω) auths.oauth2_map_group_to_team=Αντιστοίχιση των απαιτούμενων ομάδων σε ομάδες οργανισμού. (προαιρετικό - απαιτείται το όνομα της απαίτησης παραπάνω) auths.oauth2_map_group_to_team_removal=Αφαίρεση χρηστών από τις συγχρονισμένες ομάδες, εάν ένας χρήστης δεν ανήκει στην αντίστοιχη ομάδα. -auths.enable_auto_register=Ενεργοποίηση αυτόματης εγγραφής -auths.sspi_auto_create_users=Αυτόματη δημιουργία χρηστών -auths.sspi_auto_create_users_helper=Επιτρέψτε στη μέθοδο πιστοποίησης SSPI να δημιουργεί αυτόματα νέους λογαριασμούς για χρήστες που συνδέονται για πρώτη φορά -auths.sspi_auto_activate_users=Αυτόματη ενεργοποίηση χρηστών -auths.sspi_auto_activate_users_helper=Επιτρέψτε στη μέθοδο πιστοποίησης SSPI να ενεργοποιεί αυτόματα νέους χρήστες -auths.sspi_strip_domain_names=Αφαίρεση του ονόματος domain από το ονόμα χρήστη -auths.sspi_strip_domain_names_helper=Αν επιλεχθεί, τα ονόματα τομέα θα αφαιρεθούν από τα ονόματα σύνδεσης (π.χ. "DOMAIN\user" και "user@example.org" θα γίνουν μόνο "user"). -auths.sspi_separator_replacement=Διαχωριστικό για χρήση αντί του \, / και του @ -auths.sspi_separator_replacement_helper=Ο χαρακτήρας που θα χρησιμοποιηθεί για να αντικαταστήσει τους διαχωριστές των ονομάτων σύνδεσης (π.χ. το \ στο "DOMAIN\user") και κύρια ονόματα χρηστών (π.χ. το @ στο "user@example.org"). -auths.sspi_default_language=Προεπιλεγμένη γλώσσα χρήστη -auths.sspi_default_language_helper=Προεπιλεγμένη γλώσσα για τους χρήστες που δημιουργούνται αυτόματα με τη μέθοδο ταυτοποίησης SSPI. Αφήστε κενό αν προτιμάτε η γλώσσα να εντοπιστεί αυτόματα. auths.tips=Συμβουλές auths.tips.oauth2.general=Ταυτοποίηση μέσω OAuth2 auths.tips.oauth2.general.tip=Κατά την εγγραφή μιας νέας ταυτοποίησης OAuth2, το URL κλήσης/ανακατεύθυνσης πρέπει να είναι: @@ -3301,7 +3142,6 @@ auths.tip.nextcloud=Καταχωρήστε ένα νέο καταναλωτή OA auths.tip.dropbox=Δημιουργήστε μια νέα εφαρμογή στο %s auths.tip.facebook=Καταχωρήστε μια νέα εφαρμογή στο %s και προσθέστε το προϊόν "Facebook Login" auths.tip.github=Καταχωρήστε μια νέα εφαρμογή OAuth στο %s -auths.tip.gitlab=Καταχωρήστε μια νέα εφαρμογή στο https://gitlab.com/profile/applications auths.tip.google_plus=Αποκτήστε τα διαπιστευτήρια πελάτη OAuth2 από την κονσόλα API της Google στο %s auths.tip.openid_connect=Χρησιμοποιήστε το OpenID Connect Discovery URL (/.well known/openid-configuration) για να καθορίσετε τα τελικά σημεία auths.tip.twitter=Πηγαίνετε στο %s, δημιουργήστε μια εφαρμογή και βεβαιωθείτε ότι η επιλογή “Allow this application to be used to Sign in with Twitter” είναι ενεργοποιημένη @@ -3907,8 +3747,6 @@ variables.creation.success=Η μεταβλητή «%s» προστέθηκε. variables.update.failed=Αποτυχία επεξεργασίας μεταβλητής. variables.update.success=Η μεταβλητή έχει τροποποιηθεί. variables.id_not_exist = Η μεταβλητή με id %d δεν υπάρχει. -runs.no_workflows.documentation = Για περισσότερες πληροφορίες σχετικά με το Forgejo Actions, συμβουλευτείτε τον οδηγό. -runs.no_workflows.quick_start = Δεν ξέρετε από που να πρωτοξεκινήσετε με το Forgejo Actions; Για μια γρήγορη αρχή, συμβουλευτείτε τον οδηγό μας. runs.workflow = Ροή εργασίας runs.no_job_without_needs = Η ροή εργασίας πρέπει να περιέχει τουλάχιστον ένα έργο που δεν εξαρτάται από κάποιο άλλο έργο. runs.no_job = Η ροή εργασιών πρέπει να περιέχει τουλάχιστον μία εργασία (job) @@ -3940,7 +3778,6 @@ submodule=Υπομονάδα code_search_unavailable = Η αναζήτηση κώδικα δεν είναι επί του παρόντος διαθέσιμη. Παρακαλώ επικοινωνήστε με τον διαχειριστή σας. keyword_search_unavailable = Η αναζήτηση με την χρήση λέξεων-κλειδιών δεν είναι επί του παρόντος διαθέσιμη. Παρακαλώ επικοινωνήστε με τον διαχειριστή σας. runner_kind = Αναζήτηση runner… -code_search_by_git_grep = Για την αναζήτηση κώδικα, χρησιμοποιείται η εντολή «git grep». Ίσως να παρουσιαστούν καλύτερα αποτελέσματα, αν ο διαχειριστής σας ενεργοποιήσει ένα ευρετήριο για αποθετήρια («Repository Indexer»). package_kind = Αναζήτηση πακέτων… project_kind = Αναζήτηση έργων… branch_kind = Αναζήτηση κλάδων… @@ -3950,8 +3787,6 @@ search = Αναζήτηση… type_tooltip = Είδος αναζήτησης fuzzy = Στο περίπου fuzzy_tooltip = Να συμπεριληφθούν αποτελέσματα που μοιάζουν με τον όρο αναζήτησης -match = Ακριβής -match_tooltip = Να συμπεριληφθούν αποτελέσματα που ταιριάζουν με τον όρο αναζήτησης repo_kind = Αναζήτηση αποθετηρίων… user_kind = Αναζήτηση χρηστών… org_kind = Αναζήτηση οργανισμών… @@ -3961,7 +3796,6 @@ exact_tooltip = Να συμπεριληφθούν μόνο αποτελέσμα issue_kind = Αναζήτηση ζητημάτων… pull_kind = Αναζήτηση pull… exact = Ακριβής -milestone_kind = Αναζήτηση ορόσημων... union = Ένωση union_tooltip = Να συμπεριληφθούν αποτελέσματα που περιέχουν οποιαδήποτε από τις λέξεις χωρισμένες με κενό regexp = Κανονική Έκφραση diff --git a/options/locale/locale_eo.ini b/options/locale/locale_eo.ini index 5a06120e9e..df40c8eb93 100644 --- a/options/locale/locale_eo.ini +++ b/options/locale/locale_eo.ini @@ -12,9 +12,7 @@ user_profile_and_more = Profilo kaj agordoj… explore = Esplori return_to_forgejo = Reiri al Forgejo webauthn_error_unknown = Eraris pro nekonata kialo. Bonvolu reprovi. -webauthn_reload = Reenlegi twofa = Duobla aŭtentikigo -account_settings = Kontagordoj version = Versio help = Helpo webauthn_error_empty = Vi devas agordi nomon por la ŝlosilo. @@ -29,7 +27,6 @@ logo = Emblemo toc = Enhavotabelo admin_panel = Retejadministrado webauthn_unsupported_browser = Via retfoliumilo ne jam subtenas la salutmanieron WebAuthn. -new_org = Novan organizaĵon webauthn_error_insecure = La salutmaniero WebAuthn sole subtenas sekurajn konektiĝojn. Testante HTTP’e, oni uzu la retadreson «localhost» aŭ «127.0.0.1» new_project = Novan projekton notifications = Sciigoj @@ -38,8 +35,6 @@ webauthn_error = Ne povis legi vian sekurŝlosilon. active_stopwatch = Aktiva tempotrakilo organization = Organizaĵo sign_in_with_provider = Saluti per %s -manage_org = Mastrumi organizaĵojn -new_repo = Novan deponejon webauthn_error_unable_to_process = La servilo ne povis trakti vian peton. register = Registriĝi username = Uzantonomo @@ -112,7 +107,6 @@ new_mirror = Novan spegulon re_type = Retajpu pasvorton new_fork = Novan disbranĉiĝo de deponejo new_project_column = Novan kolumnon -new_migrate = Novan enporton mirror = Spegulo powered_by = Servas vin %s remove = Forigi @@ -187,9 +181,7 @@ string.desc = Z–A not_found = La celo ne troviĝis. report_message = Se vi pensas ke ĉi tio estas eraro je Forgejo mem, bonvolu traserĉi la erarraportojn ĉe Codeberg aŭ fari novan raporton, laŭnecese. network_error = Reteraro -invalid_csrf = Malvalida peto: malvalida CSRF-kodo occurred = Eraris iel -missing_csrf = Malvalida peto: neniu CSRF-kodo server_internal = Ena servila eraro [heatmap] @@ -334,7 +326,6 @@ config.allow_dots_in_usernames = Permesi ĉeeston de punktoj en uzantonomoj. Ne [home] filter = Aliaj filtriloj show_archived = Arĥivita -search_repos = Serĉi deponejon… my_orgs = Organizaĵoj uname_holder = Uzantnomo aŭ retpoŝtadreso my_repos = Deponejoj @@ -345,36 +336,21 @@ show_both_private_public = Montras publikajn kaj privatajn filter_by_team_repositories = Filtri laŭ grupaj deponejoj show_only_private = Montras sole privatajn show_private = Privata -password_holder = Pasvorto -show_more_repos = Montri pliajn deponejojn… show_only_public = Montras sole publikajn -collaborative_repos = Kunlaborataj deponejoj show_only_unarchived = Montras sole nearĥivitajn -my_mirrors = Miaj speguloj show_only_archived = Montras sole arĥivitajn view_home = Vidi %s switch_dashboard_context = Baskuli la kuntekston de la kontrolpanelo [explore] -search.match.tooltip = Inkluzivu sole rezultojn kiuj akordas precize la serĉomendon -search.type.tooltip = Serĉospeco go_to = Aliri repos = Deponejoj users = Uzantoj -code_search_unavailable = Nun, trafontkoda tekstserĉado ne fareblas. Bonvolu sciigi la retejestron. -search = Serĉi -user_no_results = Neniu akorda uzanto trovita. -org_no_results = Neniu akorda organizaĵo trovita. code = Fontkodo -search.match = Akordaj -search.fuzzy.tooltip = Inkluzivu rezultojn kiuj ankaŭ proksimume akordas la serĉmendon organizations = Organizaĵoj -repo_no_results = Neniu akorda deponejo trovita. relevant_repositories_tooltip = Deponejoj disbranĉiĝintaj, sentemaj, senemblemaj, kaj senpriskribaj estas kaŝitaj. -code_search_results = Serĉrezultoj je «%s» relevant_repositories = Sole montras aktualajn deponejojn, montri senfiltrajn rezultojn. code_last_indexed_at = Plejfreŝe esplorita je %s -code_no_results = Neniu fontkodo akorda laŭ via serĉomendo trovita. forks_few = %d disbranĉigoj stars_one = %d stelo forks_one = %d disbranĉigo @@ -384,12 +360,9 @@ stars_few = %d steloj disable_register_mail = Retpoŝta konfirmado dum registriĝo estas malaktivigita. sign_up_successful = Konto sukcese kreita. Bonvenon! forgot_password = Ĉu forgesis pasvorton? -sign_up_now = Ĉu bezonas konton? Registriĝu nun. forgot_password_title = Forgesis pasvorton -social_register_helper_msg = Ĉu vi jam havas konton? Alligu ĝin nun! create_new_account = Registri konton disable_register_prompt = Registrado estas malaktivigita. Bonvolu sciigi vian retejestron. -register_helper_msg = Ĉu vi jam havas konton? Salutu nun! manual_activation_only = Kunparolu vian retejestron por finpretigi vian konton. authorization_failed_desc = La aprobo malsukcesis ĉar ni rimarkis malvalidan peton. Bonvolu sciigi la prizorganton de la programo kiun vi provis aprobi. oauth_signin_tab = Ligi al jama konto @@ -397,7 +370,6 @@ invalid_password = Via pasvorto ne samas tiun uzitan dum kreiĝo de via konto. send_reset_mail = Sendi retleteron de rehavigo oauth_signin_title = Salutu por aprobi kontligiĝon reset_password_helper = Rehavigi konton -tab_openid = OpenID openid_connect_submit = Konekti authorization_failed = Aprobo malsukcesis oauth_signup_tab = Registri novan konton @@ -432,14 +404,12 @@ oauth.signin.error = Eraris traktante aprobpeton. Se plu eraros, bonvolu kunparo invalid_code = Via konfirmkodo malvalidas aŭ eksdatiĝis. oauth_signup_title = Finfari novan konton authorize_application = Aprobi programon -email_not_associate = Tiu retpoŝtadreso estas ligita al neniu konto. openid_signin_desc = Enmetu vian OpenID URI. Ekzemple: sofia.openid.example.org aŭ https://openid.example.org/sofia. disable_forgot_password_mail_admin = Rehavigo de konto sole uzeblas se retpoŝto estas agordita. Bonvolu agordi retpoŝton por ŝalti kontrehavigon. change_unconfirmed_email = Se vi donis la malĝustan retpoŝtadreson dum registriĝo, vi povas ŝanĝi ĝin sube, kaj konfirmletero sendiĝus al tiu anstataŭe. reset_password_mail_sent_prompt = Sendis konfirmleteron al %s. Por fini la rehavigon de konto, bonvolu kontroli vian retleterkeston kaj sekvi la provizotan ligilon antaŭ la venonta %s. openid_register_desc = La elektita OpenID URI estas nekonata. Ligi ĝin al nova konto ĉi tie. reset_password = Rehavigo de konto -sspi_auth_failed = SSPI aŭtentikigo malsukcesis must_change_password = Ŝanĝu vian pasvorton remember_me = Memoru ĉi tiun aparaton account_activated = Konto aktivigita @@ -482,13 +452,11 @@ release.new.text = @%[1]s eldonis %[2]s en %[3]s release.downloads = Elŝultoj: issue.action.reject = @%[1]s petis ŝanĝojn pri tiu ĉi tirpeto. issue.x_mentioned_you = @%s menciis vin: -register_notify.title = %[1]s, bonvenon al %[2]s release.download.zip = Fontkodo (ZIP) release.download.targz = Fontkodo (TAR.GZ) issue.action.review = @%[1]s komentis pri tiu ĉi tirpeto. activate_email = Konfirmi vian retpoŝtadreson issue.action.new = @%[1]s kreis #%[2]d. -activate_email.title = %s, bonvolu konfirmi vian retpoŝtadreson team_invite.text_2 = Bonvolu klaki la sekvontan ligilon por aliĝi al la grupo: issue.in_tree_path = En %s: admin.new_user.subject = Nova uzanto %s ĵus registriĝis @@ -497,7 +465,6 @@ release.new.subject = %s en %s eldoniĝis view_it_on = Vidu ĝin ĉe %s register_notify.text_2 = Vi povas saluti per la uzantonomo: %s team_invite.text_1 = %[1]s invitis vin aliĝi grupon %[2]s en organizaĵo %[3]s. -reset_password.title = %s, vi petis rehavigon de via konto repo.collaborator.added.text = Vi aldoniĝis kiel kunlaboranto de deponejo: release.note = Noto: issue.action.ready_for_review = @%[1]s markis ĉi tiun tirpeton preta por inspektiĝo. @@ -509,7 +476,6 @@ issue.action.merge = @%[1]s kunfandis #%[2]d al %[3]s. issue.action.push_1 = @%[1]s puŝis %[3]d enmeton al %[2]s issue.action.push_n = @%[1]s puŝis %[3]d enmetojn al %[2]s activate_account = Bonvolu aktivigi vian konton -activate_account.title = %s, bonvolu aktivigi vian konton activate_account.text_2 = Bonvolu klaki la jenan ligilon por aktivigi vian konton antaŭ %s: primary_mail_change.text_1 = La ĉefa retpoŝtadreso de via konto ĵus ŝanĝiĝis en %[1]s. Tio volas diri ke ĉi tiu retpoŝtadreso ne ricevos plu sciigojn pri via konto. totp_disabled.subject = TOTP ĵus malaktiviĝis @@ -533,22 +499,17 @@ Retype = Konfirmi pasvorton UserName = Uzantonomo NewBranchName = Nova branĉnomo Content = Enhavo -SSPISeparatorReplacement = Apartigo alpha_dash_error = ` enhavu sole literojn, numerojn, strekojn («-») kaj substrekojn («_»).` alpha_dash_dot_error = ` enhavu sole literojn, numerojn, strekojn («-»), substrekojn («_»), kaj punktojn («.»).` Email = Retpoŝtadreso -SSHTitle = SSH ŝlosilonomo AdminEmail = Retejestra retpostadreso require_error = ` ne povas malpleni.` TreeName = Dosiervojo -SSPIDefaultLanguage = Implicita lingvo Password = Pasvorto -HttpsUrl = HTTPS URL enterred_invalid_repo_name = La deponejnomo kiun vi enmetis malĝustas. url_error = `«%s» estas malvalida URL.` AuthName = Aproba nomo password_digit_one = Almenaŭ unu cifero -username_has_not_been_changed = Uzantonomo ne ŝanĝiĝis username_been_taken = Tiu uzantonomo estas jam prenita. enterred_invalid_password = La pasvorto kiun vi enmetis malĝustas. team_name_been_taken = Tiu gruponomo estas jam prenita. @@ -614,13 +575,11 @@ appearance = Aspekto repos = Deponejoj delete = Forigi konton twofa_disable_desc = Malŝalti duoblan aŭtentikigon igos vian konton malpli sekura. Ĉu bone? -social = Sociumaj kontoj twofa = Duobla aŭtentikigo (TOTP) uid = UID webauthn = Duobla aŭtentikigo (Sekurŝlosiloj) avatar = Profilbildo scan_this_image = Skanu ĉi tiun bildon per via aŭtentikigan programon: -account_link = Ligitaj kontoj organization = Organizaĵoj public_profile = Publika profilo openid_desc = OpenID povigas vin utiligi foran servilon por aŭtentikigo. @@ -665,7 +624,6 @@ continue = Daŭrigi update_profile = Konservi profilon hidden_comment_types = Kaŝitaj komentospecoj delete_key = Forigi -access_token_deletion_cancel_action = Nuligi openid_deletion = Forigi OpenID-adreson oauth2_applications_desc = OAuth2 programoj povigas vian fremdan programon sekure aŭtentikigi uzantojn ĉe ĉi tiu Forgejo-apero. activate_email = Sendi konfirmleteron @@ -680,7 +638,6 @@ add_openid = Aldoni OpenID URI theme_desc = Ĉi tio estos via implicita haŭto trans la tuta retejo. add_gpg_key_success = GPG-ŝlosilo «%s» aldoniĝis. new_password = Nova pasvorto -unbind = Malligi can_write_info = Skriba verify_ssh_key_success = SSH-ŝlosilo «%s» jam konfirmiĝis. edit_oauth2_application = Redakti OAuth2-programon @@ -691,7 +648,6 @@ ssh_key_deletion = Forigi SSH-ŝlosilon key_state_desc = Ĉi tiu ŝlosilo uziĝis dum la pasintaj 7 tagoj valid_forever = Validos dumĉiame can_read_info = Lega -access_token_deletion_confirm_action = Forigi delete_token = Forigi update_user_avatar_success = Profilbildo de uzanto ĝisdatigita. manage_oauth2_applications = Mastrumi OAuth2-programojn @@ -713,12 +669,10 @@ theme_update_success = Via haŭto konserviĝis. can_not_add_email_activations_pending = Jam atendas ian konfirmiĝon, bonvolu reprovi post kelkaj minutoj aldoni retpoŝtadreson. gpg_key_id_used = Publika GPG-ŝlosilo kun la sama ID jam ekzistas. valid_until_date = Validos ĝis %s -add_new_gpg_key = Aldoni GPG-ŝlosilon manage_gpg_keys = Mastrumi GPG-ŝlosilon ssh_key_deletion_success = SSH-ŝlosilo foriĝis. requires_activation = Postulas konfirmiĝon key_signature_ssh_placeholder = Komenciĝas per «-----BEGIN SSH SIGNATURE-----» -gpg_token_code = echo "%s" | gpg -a --default-key %s --detach-sig subkeys = Subŝlosiloj email_desc = Via ĉefa retpoŝtadreso uziĝos por sciigoj, pasvortrehavigo, kaj, se ĝi ne estas kaŝita, por Git-agoj per la retfasado. key_id = Ŝlosilo-ID @@ -737,7 +691,6 @@ email_deletion = Forigi retpoŝtadresojn key_content_ssh_placeholder = Komenciĝas per «ssh-ed25519», «ssh-rsa», «ecdsa-sha2-nistp256», «ecdsa-sha2-nistp384», «ecdsa-sha2-nistp521», «sk-ecdsa-sha2-nistp256@openssh.com», aŭ «sk-ssh-ed25519@openssh.com» add_openid_success = Nova OpenID-adreso aldoniĝis. password_incorrect = La nuna pasvorto malĝustas. -add_new_key = Aldoni SSH-ŝlosilon gpg_helper = Ĉu bezonas helpon? Legetu la gvidon pri GPG. choose_new_avatar = Elekti novan profilbildon activated = Konfirmita @@ -765,7 +718,6 @@ ssh_helper = Ĉu bezonas helpon? Legetu la gvidon pri Codeberg o abre una nueva incidencia si es necesario. -missing_csrf=Solicitud incorrecta: sin token CSRF -invalid_csrf=Solicitud incorrecta: el token CSRF no es válido not_found=El objetivo no pudo ser encontrado. network_error=Error de red server_internal = Error interno del servidor @@ -355,15 +346,10 @@ config_location_hint = Estas opciones de configuración se guardarán en: [home] uname_holder=Nombre de usuario o correo electrónico -password_holder=Contraseña switch_dashboard_context=Cambiar el contexto del dashboard my_repos=Repositorios -show_more_repos=Mostrar más repositorios… -collaborative_repos=Repositorios colaborativos my_orgs=Organizaciones -my_mirrors=Mis réplicas view_home=Ver %s -search_repos=Buscar un repositorio… filter=Otros filtros filter_by_team_repositories=Filtrar por repositorios de equipo feed_of=`Suministro de noticias de "%s"` @@ -384,20 +370,8 @@ issues.in_your_repos=En tus repositorios repos=Repositorios users=Usuarios organizations=Organizaciones -search=Buscar go_to=Ir a code=Código -search.type.tooltip=Tipo de búsqueda -search.fuzzy=Parcial -search.fuzzy.tooltip=Incluye los resultados que también coincidan con el término de búsqueda -search.match=Coincidir -search.match.tooltip=Incluye sólo los resultados que coincidan con el término de búsqueda exacto -code_search_unavailable=Actualmente la búsqueda de código no está disponible. Póngase en contacto con el administrador de su sitio. -repo_no_results=No se ha encontrado ningún repositorio coincidente. -user_no_results=No se ha encontrado ningún usuario coincidente. -org_no_results=No se ha encontrado ninguna organización coincidente. -code_no_results=No se ha encontrado código de fuente que coincida con su término de búsqueda. -code_search_results=Resultados de búsqueda para «%s» code_last_indexed_at=Indexado por última vez %s relevant_repositories_tooltip=Repositorios que son bifurcaciones o que no tienen ningún tema, ningún icono, y ninguna descripción están ocultos. relevant_repositories=Solo se muestran repositorios relevantes, mostrar resultados sin filtrar. @@ -408,15 +382,12 @@ stars_one = %d estrella [auth] create_new_account=Registrar cuenta -register_helper_msg=¿Ya tienes una cuenta? ¡Inicia sesión! -social_register_helper_msg=¿Ya tienes una cuenta? ¡Enlázala! disable_register_prompt=Registro deshabilitado. Por favor, póngase en contacto con el administrador del sitio. disable_register_mail=Correo electrónico de confirmación de registro deshabilitado. manual_activation_only=Póngase en contacto con el administrador del sitio para completar la activación. remember_me=Recordar este dispositivo forgot_password_title=Contraseña olvidada forgot_password=¿Has olvidado tu contraseña? -sign_up_now=¿Necesitas una cuenta? Regístrate ahora. sign_up_successful=La cuenta se ha creado correctamente. ¡Le damos la bienvenida! confirmation_mail_sent_prompt=Se ha enviado un nuevo correo de confirmación a %s. Para completar el proceso de registro, revisa tu bandeja de entrada y sigue el enlace proporcionado dentro de los próximos %s. Si la dirección no es correcto, puedes iniciar sesión y solicitar otro correo de confirmación para ser enviado a una dirección diferente. must_change_password=Actualizar su contraseña @@ -429,7 +400,6 @@ prohibit_login_desc=Se ha suspendido la interacción de su cuenta con la instanc resent_limit_prompt=Ya ha solicitado recientemente un correo de activación. Por favor, espere 3 minutos y vuelva a intentarlo. has_unconfirmed_mail=Hola %s, su correo electrónico (%s) no está confirmado. Si no ha recibido un correo de confirmación o necesita que lo enviemos de nuevo, por favor, haga click en el siguiente botón. resend_mail=Haga click aquí para reenviar su correo electrónico de activación -email_not_associate=Esta dirección de correo electrónico no esta asociada a ninguna cuenta. send_reset_mail=Enviar correo de recuperación de cuenta reset_password=Recuperación de cuenta invalid_code=Su código de confirmación no es válido o ha caducado. @@ -446,7 +416,6 @@ twofa_scratch_used=Ya ha utilizado su código de respaldo. Ha sido redirigido a twofa_passcode_incorrect=Su código de acceso es incorrecta. Si extravió el dispositivo, use su código de respaldo para iniciar sesión. twofa_scratch_token_incorrect=El código de respaldo es incorrecto. login_userpass=Iniciar sesión -tab_openid=OpenID oauth_signup_tab=Registrar nueva cuenta oauth_signup_title=Completar cuenta nueva oauth_signup_submit=Completar cuenta @@ -472,7 +441,6 @@ authorize_application_description=Si concede el acceso, podrá acceder y escribi authorize_title=¿Autorizar a "%s" a acceder a su cuenta? authorization_failed=Autorización fallida authorization_failed_desc=La autorización ha fallado porque hemos detectado una solicitud no válida. Por favor, póngase en contacto con el responsable de la aplicación que ha intentado autorizar. -sspi_auth_failed=Fallo en la autenticación SSPI password_pwned=La contraseña que eligió está en una lista de contraseñas robadas previamente expuestas en violaciones de datos públicos. Por favor, inténtelo de nuevo con una contraseña diferente y considere cambiar esta contraseña también en otros lugares. password_pwned_err=No se pudo completar la solicitud a HaveIBeenPwned change_unconfirmed_email = Si has proporcionado una dirección de correo electrónico errónea durante el registro, la puedes cambiar debajo y se enviará una confirmación a la nueva dirección. @@ -484,7 +452,6 @@ hint_login = ¿Ya tienes cuenta? ¡Ingresa ahora! hint_register = ¿Necesitas una cuenta? Regístrate ahora. back_to_sign_in = Volver a Iniciar sesión sign_in_openid = Proceder con OpenID -remember_me.compromised = El identificador de inicio de sesión ya no es válido, lo que puede indicar una cuenta comprometida. Por favor, verifica si tu cuenta presenta actividades sospechosas. unauthorized_credentials = Las credenciales son incorrectas o han expirado. Reintenta el comando o visita %s para más información use_onetime_code = Usar código de un solo uso @@ -495,22 +462,18 @@ link_not_working_do_paste=¿No funciona el enlace? Intenta copiarlo y pega hi_user_x=Hola %s, activate_account=Por favor, active su cuenta -activate_account.title=%s, por favor activa tu cuenta activate_account.text_1=¡Hola %[1]s, gracias por registrarse en %[2]s! activate_account.text_2=Por favor, haga clic en el siguiente enlace para activar su cuenta dentro de %s: activate_email=Verifique su correo electrónico -activate_email.title=%s, por favor verifique su dirección de correo electrónico activate_email.text=Por favor, haga clic en el siguiente enlace para verificar su dirección de correo electrónico dentro de %s: register_notify=Bienvenido a %s -register_notify.title=%[1]s, bienvenido a %[2]s register_notify.text_1=este es tu correo de confirmación de registro para %s! register_notify.text_2=Puede iniciar sesión con su nombre de usuario: %s register_notify.text_3=Si otra persona creó esta cuenta para usted, tendrá que establecer su contraseña primero. reset_password=Recupera tu cuenta -reset_password.title=%s, has solicitado recuperar tu cuenta reset_password.text=Haga clic en el siguiente enlace para recuperar su cuenta dentro de %s: register_success=Registro completado @@ -585,8 +548,6 @@ RepoName=Nombre del repositorio Email=Dirección de correo electrónico Password=Contraseña Retype=Confirmar contraseña -SSHTitle=Nombre de la Clave de SSH -HttpsUrl=URL HTTPS PayloadUrl=URL de carga TeamName=Nombre del equipo AuthName=Nombre de autorización @@ -599,9 +560,6 @@ CommitChoice=Hacer commit de la elección TreeName=Ruta del archivo Content=Contenido -SSPISeparatorReplacement=Separador -SSPIDefaultLanguage=Idioma por defecto - require_error=` no puede estar vacío.` alpha_dash_error=` solo debe contener caracteres alfanuméricos, guiones ("-"), y guiones bajos ("_").` alpha_dash_dot_error=` solo debe contener caracteres alfanuméricos, guiones ("-"), guiones bajos ("_"), y puntos (".").` @@ -623,7 +581,6 @@ lang_select_error=Seleccione un idioma de la lista. username_been_taken=El nombre de usuario ya está en uso. username_change_not_local_user=Los usuarios que no son locales no tienen permitido cambiar su nombre de usuario. -username_has_not_been_changed=El nombre de usuario no ha sido cambiado repo_name_been_taken=El nombre del repositorio ya está usado. repository_force_private=Forzar Privado está habilitado: los repositorios privados no pueden hacerse públicos. repository_files_already_exist=Ya existen archivos para este repositorio. Póngase en contacto con el administrador del sistema. @@ -703,7 +660,6 @@ unfollow=Dejar de seguir user_bio=Biografía disabled_public_activity=Este usuario ha desactivado la visibilidad pública de la actividad. email_visibility.limited=Tu dirección de correo electrónico es visible para todos los usuarios autenticados -email_visibility.private=Tu dirección de correo electrónico solo es visible para ti y los administradores show_on_map=Mostrar este lugar en un mapa settings=Configuración del usuario @@ -738,13 +694,11 @@ password=Contraseña security=Seguridad avatar=Avatar ssh_gpg_keys=Claves SSH / GPG -social=Redes sociales applications=Aplicaciones orgs=Organizaciones repos=Repositorios delete=Eliminar cuenta twofa=Autenticación de dos factores (TOTP) -account_link=Cuentas vinculadas organization=Organizaciones uid=UID webauthn=Autenticación de dos factores (claves de seguridad) @@ -791,10 +745,7 @@ comment_type_group_issue_ref=Referencia del incidente saved_successfully=Su configuración se ha guardado correctamente. privacy=Privacidad keep_activity_private=Ocultar actividad de la página de perfil -keep_activity_private_popup=Hace la actividad visible sólo para ti y los administradores - lookup_avatar_by_mail=Buscar avatar por dirección de correo electrónico -federated_avatar_lookup=Búsqueda de avatar federado enable_custom_avatar=Usar avatar personalizado choose_new_avatar=Selecciona nuevo avatar update_avatar=Actualizar avatar @@ -812,7 +763,6 @@ password_incorrect=Contraseña actual incorrecta. change_password_success=Su contraseña ha sido actualizada. Desde ahora, use su nueva contraseña para iniciar sesión. password_change_disabled=Los usuarios no locales no pueden actualizar su contraseña a través de la interfaz web de Forgejo. -emails=Direcciones de correo electrónico manage_emails=Administrar direcciones de correo electrónico manage_themes=Tema por defecto manage_openid=Direcciones OpenID @@ -855,8 +805,6 @@ principal_desc=Estos principales de certificado SSH están asociados con su cuen gpg_desc=Estas claves GPG públicas están asociadas a tu cuenta y se utilizan para verificar tus commits. Mantén a salvo tus claves privadas, ya que permiten firmar commits con tu identidad. ssh_helper=¿Necesitas ayuda? Echa un vistazo en la guía de GitHub para crear tus propias claves SSH o resolver problemas comunes que puede encontrar al usar SSH. gpg_helper=¿Necesitas ayuda? Echa un vistazo en la guía de GitHub sobre GPG. -add_new_key=Añadir clave SSH -add_new_gpg_key=Añadir clave GPG key_content_ssh_placeholder=Comienza con "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com", o "sk-ssh-ed25519@openssh.com" key_content_gpg_placeholder=Comienza con "-----BEGIN PGP PUBLIC KEY BLOCK-----" add_new_principal=Añadir principal @@ -874,7 +822,6 @@ gpg_invalid_token_signature=La clave GPG proporcionada, la firma y el token no c gpg_token_required=Debe proporcionar una firma para el token de abajo gpg_token=Token gpg_token_help=Puede generar una firma de la siguiente manera: -gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=Firma GPG armadura key_signature_gpg_placeholder=Comienza con "-----BEGIN PGP SIGNATURE-----" verify_gpg_key_success=La clave GPG "%s" ha sido verificada. @@ -921,11 +868,6 @@ hide_openid=Esconderse de perfil ssh_disabled=SSH deshabilitado ssh_signonly=SSH está desactivado actualmente, por lo que estas claves sólo se utilizan para la verificación de la firma de confirmación. ssh_externally_managed=Esta clave SSH está administrada externamente para este usuario -manage_social=Gestionar Redes Sociales asociadas -social_desc=Estas cuentas sociales se pueden utilizar para iniciar sesión en tu cuenta. Asegúrate de que las reconoces todas. -unbind=Desvincular -unbind_success=La cuenta social se ha eliminado correctamente. - manage_access_token=Tokens de acceso generate_new_token=Generar nuevo token tokens_desc=Estos tokens otorgan acceso a su cuenta usando la API de Forgejo. @@ -935,8 +877,6 @@ generate_token_success=Su nuevo token ha sido generado. Cópielo ahora, ya que n generate_token_name_duplicate=%s ya se ha utilizado como nombre de la aplicación. Por favor, utilice una nueva. delete_token=Eliminar access_token_deletion=Eliminar token de acceso -access_token_deletion_cancel_action=Cancelar -access_token_deletion_confirm_action=Eliminar access_token_deletion_desc=Eliminar un token revocará el acceso a su cuenta para las aplicaciones que lo usen. Esto no se puede deshacer. ¿Continuar? delete_token_success=El token ha sido eliminado. Las aplicaciones que lo usen ya no tienen acceso a su cuenta. repo_and_org_access=Acceso al Repositorio y a la Organización @@ -1007,7 +947,6 @@ webauthn_delete_key_desc=Si elimina una llave de seguridad ya no podrá utilizar manage_account_links=Cuentas vinculadas manage_account_links_desc=Estas cuentas externas están vinculadas a su cuenta de Forgejo. -account_links_not_available=Actualmente no hay cuentas externas vinculadas a su cuenta de Forgejo. link_account=Vincular cuenta remove_account_link=Eliminar cuenta vinculada remove_account_link_desc=Eliminar una cuenta vinculada revocará su acceso a su cuenta de Forgejo. ¿Continuar? @@ -1048,7 +987,6 @@ blocked_users = Usuarios bloqueados blocked_users_none = No hay usuarios bloqueados. update_hints = Actualizar sugerencias pronouns = Pronombres -pronouns_custom = Personalizados additional_repo_units_hint = Sugerir la habilitación de unidades de repositorio adicionales additional_repo_units_hint_description = Mostrar la sugerencia "Habilitar más" para los repositorios que no tengan habilitadas todas las unidades disponibles. language.title = Idioma por defecto @@ -1059,7 +997,6 @@ change_password = Cambiar contraseña keep_activity_private.description = Tu actividad pública solo será visible para ti y para los administradores de la instancia. language.description = Este idioma se guardará en tu cuenta y se utilizará como predeterminado cuando te conectes. language.localization_project = ¡Ayúdanos a traducir Forgejo a tu idioma! Más información. -pronouns_custom_label = Pronombres personalizados user_block_yourself = No puede bloquearse a sí mismo. quota = Cuota quota.sizes.assets.attachments.all = Archivos adjuntos @@ -1115,7 +1052,6 @@ fork_branch=Rama a clonar en la bifurcación all_branches=Todas las ramas fork_no_valid_owners=Este repositorio no puede ser bifurcado porque no hay propietarios válidos. use_template=Utilizar esta plantilla -clone_in_vsc=Clonar en VS Code download_zip=Descargar ZIP download_tar=Descargar TAR.GZ download_bundle=Descargar BUNDLE @@ -1135,11 +1071,6 @@ readme=LÉAME readme_helper=Selecciona una plantilla de archivo README readme_helper_desc=Este es el lugar donde puedes escribir una descripción completa de su proyecto. auto_init=Inicializar el repositorio -trust_model_helper=Seleccionar modelo de confianza para la verificación de la firma. Las opciones posibles son: -trust_model_helper_collaborator=Colaborador: Confiar en firmas de colaboradores -trust_model_helper_committer=Comitter: Firmas de confianza que coinciden con los committers -trust_model_helper_collaborator_committer=Colaborador+Comitter: Confiar en firmas de colaboradores que coincidan con el committer -trust_model_helper_default=Predeterminado: Utilice el modelo de confianza por defecto para esta instalación create_repo=Crear repositorio default_branch=Rama por defecto default_branch_label=por defecto @@ -1212,9 +1143,6 @@ template.invalid=Debe seleccionar una plantilla de repositorio archive.title=Este repositorio está archivado. Puede ver los archivos y clonarlos, pero no puede hacer push o, abrir incidencias o pull requests. archive.title_date=Este repositorio ha sido archivado en %s. Puedes ver archivos y clonarlo, pero no puedes hacer push o abrir incidencias o pull request. -archive.issue.nocomment=Este repositorio está archivado. No se puede comentar en las incidencias. -archive.pull.nocomment=Este repositorio está archivado. No se puede comentar en los pull requests. - form.reach_limit_of_creation_1=Ya han alcanzado su límite de %d repositorios. form.reach_limit_of_creation_n=Ya han alcanzado su límite de repositorios de %d. form.name_reserved=El nombre del repositorio "%s" está reservado. @@ -1222,7 +1150,6 @@ form.name_pattern_not_allowed=El patrón "%s" no está permitido en un nombre de need_auth=Autorización migrate_options=Opciones de migración -migrate_service=Servicio de Migración migrate_options_mirror_helper=Este repositorio será una réplica migrate_options_lfs=Migrar archivos LFS migrate_options_lfs_endpoint.label=Destino LFS @@ -1308,7 +1235,6 @@ branches=Ramas tags=Etiquetas issues=Incidencias pulls=Pull requests -project_board=Proyectos packages=Paquetes actions=Acciones labels=Etiquetas @@ -1322,7 +1248,6 @@ release=Lanzamiento releases=Lanzamientos tag=Etiqueta released_this=publicó esto -tagged_this=etiquetó esto file.title=%s de %s file_raw=Original file_history=Histórico @@ -1434,9 +1359,7 @@ commits.desc=Ver el historial de cambios de código fuente. commits.commits=Commits commits.no_commits=No hay commits en común. "%s" y "%s" tienen historias totalmente diferentes. commits.nothing_to_compare=Estas ramas son iguales. -commits.search=Buscar commits… commits.search.tooltip=Puede prefijar palabras clave con "author:", "committer:", "after:", o "before:", p. ej., "revertir author:Alice before:2019-01-13". -commits.find=Buscar commits.search_all=Todas las ramas commits.author=Autor commits.message=Mensaje @@ -1464,8 +1387,6 @@ commitstatus.pending=Pendiente commitstatus.success=Éxito ext_issues=Incidencias externas -ext_issues.desc=Enlace a un gestor de incidencias externo. - projects=Proyectos projects.desc=Gestionar problemas y pulls en los tablones del proyecto. projects.description=Descripción (opcional) @@ -1487,7 +1408,6 @@ projects.type.basic_kanban=Kanban básico projects.type.bug_triage=Triaje de errores projects.template.desc=Plantilla projects.template.desc_helper=Selecciona una plantilla de proyecto para empezar -projects.type.uncategorized=Sin categorizar projects.column.edit=Editar columna projects.column.edit_title=Nombre projects.column.new_title=Nombre @@ -1495,8 +1415,6 @@ projects.column.new_submit=Crear columna projects.column.new=Nueva columna projects.column.set_default=Establecer como predeterminado projects.column.set_default_desc=Establecer esta columna como predeterminada para incidencias no categorizadas y pulls -projects.column.unset_default=Anular valor predeterminado -projects.column.unset_default_desc=Anular esta columna como la predeterminada projects.column.delete=Borrar columna projects.column.deletion_desc=Eliminar una columna del proyecto mueve todos los problemas relacionados a la columna por defecto. ¿Continuar? projects.column.color=Color @@ -1610,7 +1528,6 @@ issues.filter_sort.moststars=Mas estrellas issues.filter_sort.feweststars=Menor número de estrellas issues.filter_sort.mostforks=La mayoría de bifurcaciones issues.filter_sort.fewestforks=Menor número de bifurcaciones -issues.keyword_search_unavailable=La búsqueda por palabra clave no está disponible actualmente. Por favor, contacte con el administrador de su sitio. issues.action_open=Abrir issues.action_close=Cerrar issues.action_label=Etiqueta @@ -1655,11 +1572,8 @@ issues.ref_issue_from=`referenció esta incidencia %[3]s %[1 issues.ref_pull_from=`referenció este pull request %[3]s %[1]s` issues.ref_closing_from=`hizo referencia a esta incidencia desde un pull request %[3]s que lo cerrará , %[1]s` issues.ref_reopening_from=`hizo referencia a esta incidencia desde un pull request %[3]s que lo reabrirá, %[1]s` -issues.ref_closed_from=`cerró esta incidencia %[4]s %[2]s` -issues.ref_reopened_from=`reabrió esta incidencia %[4]s %[2]s` issues.ref_from=`de %[1]s` issues.author=Autor -issues.author_helper=Este usuario es el autor. issues.role.owner=Propietario issues.role.owner_helper=Este usuario es el dueño de este repositorio. issues.role.member=Miembro @@ -1754,18 +1668,13 @@ issues.add_time_sum_to_small=No se ha entrado tiempo. issues.time_spent_total=Tiempo total gastado issues.time_spent_from_all_authors=`Tiempo total gastado: %s` issues.due_date=Fecha límite -issues.invalid_due_date_format=El formato de la fecha de vencimiento debe ser 'aaaa-mm-dd'. -issues.error_modifying_due_date=Fallo al modificar la fecha de vencimiento. -issues.error_removing_due_date=Fallo al eliminar la fecha de vencimiento. issues.push_commit_1=añadió %d commit %s issues.push_commits_n=añadió %d commits %s issues.force_push_codes=`empujó forzosamente %[1]s de %[2]s %[8]s a %[4]s %[9]s %[6]s` issues.force_push_compare=Comparar issues.due_date_form=aaaa-mm-dd -issues.due_date_form_add=Añadir fecha de vencimiento issues.due_date_form_edit=Editar issues.due_date_form_remove=Eliminar -issues.due_date_not_writer=Necesitas acceso de escritura a este repositorio para actualizar la fecha límite de una incidencia. issues.due_date_not_set=Fecha límite no definida. issues.due_date_added=añadió la fecha límite %s %s issues.due_date_modified=modificó la fecha límite de %[2]s a %[1]s %[3]s @@ -1818,7 +1727,6 @@ issues.review.remove_review_request=eliminó la solicitud de revisión para %[1] issues.review.remove_review_request_self=se negó a revisar %s issues.review.pending=Pendiente issues.review.pending.tooltip=Este comentario no es visible actualmente para otros usuarios. Para enviar sus comentarios pendientes, seleccione "%s" -> "%s/%s/%s" en la parte superior de la página. -issues.review.review=Revisar issues.review.reviewers=Revisores issues.review.outdated=Obsoleto issues.review.outdated_description=El contenido ha cambiado desde que se hizo este comentario @@ -1831,7 +1739,6 @@ issues.review.hide_resolved=Ocultar resueltos issues.review.resolve_conversation=Resolver conversación issues.review.un_resolve_conversation=Marcar conversación sin resolver issues.review.resolved_by=ha marcado esta conversación como resuelta -issues.assignee.error=No todos los asignados fueron añadidos debido a un error inesperado. issues.reference_issue.body=Cuerpo issues.content_history.deleted=borrado issues.content_history.edited=editado @@ -1839,8 +1746,6 @@ issues.content_history.created=creado issues.content_history.delete_from_history=Eliminar del historial issues.content_history.delete_from_history_confirm=¿Eliminar del historial? issues.content_history.options=Opciones -issues.reference_link=Referencia: %s - compare.compare_base=base compare.compare_head=comparar @@ -1874,8 +1779,6 @@ pulls.nothing_to_compare=Estas ramas son iguales. No hay necesidad para crear un pulls.nothing_to_compare_and_allow_empty_pr=Estas ramas son iguales. Este PR estará vacío. pulls.has_pull_request=`Ya existe un pull request entre estas ramas: %[2]s#%[3]d` pulls.create=Crear pull request -pulls.title_desc_few=quiere fusionar %[1]d commits de %[2]s en %[3]s -pulls.merged_title_desc_few=fusionó %[1]d commits de %[2]s en %[3]s %[4]s pulls.change_target_branch_at=`cambió la rama objetivo de %s a %s %s` pulls.tab_conversation=Conversación pulls.tab_commits=Confirmaciones @@ -2028,8 +1931,6 @@ signing.wont_sign.approved=La fusión no se firmará ya que el PR no está aprob signing.wont_sign.not_signed_in=No ha iniciado sesión. ext_wiki=Wiki externa -ext_wiki.desc=Enlace a una wiki externa. - wiki=Wiki wiki.welcome=Bienvenido a la Wiki. wiki.welcome_desc=Esta wiki le permite escribir y compartir documentación con otros colaboradores. @@ -2125,17 +2026,6 @@ activity.git_stats_deletion_n=%d eliminaciones contributors.contribution_type.commits=Confirmaciones -search=Buscar -search.search_repo=Buscar repositorio -search.type.tooltip=Tipo de búsqueda -search.fuzzy=Parcial -search.fuzzy.tooltip=Incluye los resultados que también coinciden aproximadamente con el término de búsqueda -search.match=Coincidir -search.match.tooltip=Incluye sólo los resultados que coincidan con el término de búsqueda exacto -search.results=Resultados de la búsqueda para "%s" en %s -search.code_no_results=No se ha encontrado código de fuente que coincida con su término de búsqueda. -search.code_search_unavailable=Actualmente la búsqueda de código no está disponible. Póngase en contacto con el administrador de su sitio. - settings=Configuración settings.desc=La configuración es donde puede administrar la configuración del repositorio settings.options=Repositorio @@ -2242,7 +2132,6 @@ settings.transfer_abort=Cancelar transferencia settings.transfer_abort_invalid=No puede cancelar una transferencia de repositorio inexistente. settings.transfer_abort_success=La transferencia del repositorio a %s fue cancelada. settings.transfer_desc=Transferir este repositorio a un usuario o una organizacion de la cual disponga de privilegios administrativos. -settings.transfer_form_title=Escriba el nombre del repositorio como confirmación: settings.transfer_in_progress=Actualmente hay una transferencia en curso. Por favor, cancela si quieres transferir este repositorio a otro usuario. settings.transfer_notices_1=- Perderá el acceso al repositorio si lo transfiere a un usuario individual. settings.transfer_notices_2=- Mantendrá el acceso al repositorio si lo transfiere a una organización que usted (co-)posee. @@ -2287,7 +2176,6 @@ settings.delete_collaborator=Eliminar settings.collaborator_deletion=Eliminar colaborador settings.collaborator_deletion_desc=Eliminar un colaborador revocará su acceso a este repositorio. ¿Continuar? settings.remove_collaborator_success=El colaborador ha sido eliminado. -settings.search_user_placeholder=Buscar usuario… settings.org_not_allowed_to_be_collaborator=Las organizaciones no pueden ser añadidas como colaboradoras. settings.change_team_access_not_allowed=Cambiar el acceso del equipo al repositorio se ha restringido al propietario de la organización settings.team_not_in_organization=El equipo no pertenece a la misma organización que el repositorio @@ -2295,7 +2183,6 @@ settings.teams=Equipos settings.add_team=Añadir equipo settings.add_team_duplicate=El equipo ya tiene acceso al repositorio settings.add_team_success=Ahora el equipo ya tiene acceso al repositorio. -settings.search_team=Buscar equipos… settings.change_team_permission_tip=El permiso del equipo está establecido en la página de configuración del equipo y no puede ser cambiado por repositorio settings.delete_team_tip=Este equipo tiene acceso a todos los repositorios y no puede ser eliminado settings.remove_team_success=Se ha eliminado el acceso del equipo al repositorio. @@ -2433,12 +2320,7 @@ settings.branches=Ramas settings.protected_branch=Protección de rama settings.protected_branch.save_rule=Guardar regla settings.protected_branch.delete_rule=Eliminar regla -settings.protected_branch_can_push=¿Permitir hacer push? -settings.protected_branch_can_push_yes=Puede hacer push -settings.protected_branch_can_push_no=No puede hacer push settings.branch_protection=Reglas de protección de la rama "%s" -settings.protect_this_branch=Activar protección de rama -settings.protect_this_branch_desc=Evita la eliminación y restringe hacer push y fusionar contra la rama. settings.protect_disable_push=Deshabilitar push settings.protect_disable_push_desc=No se permitirá hacer push a esta rama. settings.protect_enable_push=Habilitar push @@ -2449,9 +2331,7 @@ settings.protect_whitelist_committers=Push restringido a la lista blanca settings.protect_whitelist_committers_desc=Sólo se permitirá a los usuarios o equipos de la lista blanca hacer push a esta rama (pero no forzar push). settings.protect_whitelist_deploy_keys=Lista blanca de claves de despliegue con acceso de escritura a push. settings.protect_whitelist_users=Usuarios en la lista blanca para hacer push -settings.protect_whitelist_search_users=Buscar usuarios… settings.protect_whitelist_teams=Equipos en la lista blanca para hacer push -settings.protect_whitelist_search_teams=Buscar equipos… settings.protect_merge_whitelist_committers=Activar lista blanca para fusionar settings.protect_merge_whitelist_committers_desc=Permitir a los usuarios o equipos de la lista a fusionar peticiones pull dentro de esta rama. settings.protect_merge_whitelist_users=Usuarios en la lista blanca para fusionar @@ -2480,8 +2360,6 @@ settings.protect_protected_file_patterns=Patrones de archivos protegidos (separa settings.protect_protected_file_patterns_desc=No está permitido cambiar archivos directamente incluso si el usuario tiene permiso para agregar, editar o borrar archivos en esta rama. Múltiples patrones pueden separarse usando punto y coma (';'). Refvisa la documentación de %[2]s para la sintaxis de patrones. Ejemplos: .drone.yml, /docs/**/*.txt. settings.protect_unprotected_file_patterns=Patrones de archivos sin protección (separados con punto y coma ";") settings.protect_unprotected_file_patterns_desc=Los archivos sin protección se pueden cambiar directamente si el usuario tiene acceso de escritura, evitando la restricción push. Múltiples patrones pueden separarse usando punto y coma (';'). Vea la documentación de %[2]s para la sintaxis de patrones. Ejemplos: .drone.yml, /docs/**/*.txt. -settings.add_protected_branch=Activar protección -settings.delete_protected_branch=Desactivar protección settings.update_protect_branch_success=Se ha actualizado la protección de la rama para la regla "%s". settings.remove_protected_branch_success=Se ha eliminado la protección de la rama para la regla "%s". settings.remove_protected_branch_failed=Error al eliminar la regla de protección de rama "%s". @@ -2560,8 +2438,6 @@ settings.lfs_pointers.associateAccessible=Asociar %d OID accesibles settings.rename_branch_failed_exist=No se puede renombrar la rama porque la rama destino %s ya existe. settings.rename_branch_failed_not_exist=No se puede renombrar la rama %s porque no existe. settings.rename_branch_success=La rama %s se renombró correctamente a %s. -settings.rename_branch_from=nombre de la rama vieja -settings.rename_branch_to=nombre de la rama nueva settings.rename_branch=Renombrar rama diff.browse_source=Explorar el código @@ -2570,7 +2446,6 @@ diff.commit=commit diff.git-notes=Notas diff.data_not_available=El contenido del diff no está disponible diff.options_button=Opciones de diferencias -diff.show_diff_stats=Mostrar estadísticas diff.download_patch=Descargar archivo de parche diff.download_diff=Descargar archivo de diferencias diff.show_split_view=Dividir vista @@ -2663,7 +2538,6 @@ release.tag_name_invalid=El nombre de la etiqueta no es válido. release.tag_name_protected=El nombre de la etiqueta está protegido. release.tag_already_exist=Este nombre de etiqueta ya existe. release.downloads=Descargas -release.download_count=Descargas: %s release.add_tag_msg=Utilice el título y el contenido de la liberación como mensaje de etiqueta. release.add_tag=Crear tag release.releases_for=Lanzamientos para %s @@ -2692,14 +2566,12 @@ branch.default_deletion_failed=La rama "%s" es la rama por defecto. No se puede branch.restore=Restaurar rama "%s" branch.download=Descargar rama "%s" branch.rename=Renombrar rama "%s" -branch.search=Buscar rama branch.included_desc=Esta rama forma parte de la predeterminada branch.included=Incluida branch.create_new_branch=Crear rama desde la rama: branch.confirm_create_branch=Crear rama branch.warning_rename_default_branch=Estás renombrando la rama por defecto. branch.rename_branch_to=Renombrar "%s" a: -branch.confirm_rename_branch=Renombrar rama branch.create_branch_operation=Crear rama branch.new_branch=Crear nueva rama branch.new_branch_from=`Crear nueva rama de "%s"` @@ -2773,13 +2645,10 @@ issues.author.tooltip.issue = Este usuario es el autor de esta incidencia. mirror_use_ssh.not_available = La autenticación por SSH no está disponible. issues.author.tooltip.pr = Este usuario es el autor de esta solicitud de incorporación de cambios. issues.blocked_by_user = No puedes crear una incidencia en este repositorio porque estas bloqueado por el propietario del repositorio. -pulls.merged_title_desc_one = fusionó %[1]d commit de %[2]s en %[3]s %[4]s pulls.fast_forward_only_merge_pull_request = Sólo fast-forward pulls.blocked_by_user = No puedes crear una pull request en este repositorio porque estas bloqueado por el propietario del repositorio. -issues.comment.blocked_by_user = No puedes crear un comentario en esta incidencia porque estás bloqueado por el propietario del repositorio o el autor de la incidencia. comments.edit.already_changed = No fue posible guardar los cambios al comentario. Parece que el contenido ya fue modificado por otro usuario. Actualiza la página e intenta editar de nuevo para evitar sobrescribir los cambios pulls.edit.already_changed = No fue posible guardar los cambios al pull request. Parece que el contenido ya fue modificado por otro usuario. Actualiza la página e intenta editar de nuevo para evitar sobrescribir los cambios -pulls.title_desc_one = quiere fusionar %[1]d commit de %[2]s en %[3]s pulls.ready_for_review = Listo para revisar? activity.navbar.contributors = Contribuidores pulls.cmd_instruction_hint = Ver instrucciones para la línea de comandos @@ -2981,9 +2850,7 @@ teams.none_access_helper=Los miembros no pueden ver o hacer ninguna otra acción teams.general_access=Acceso personalizado teams.general_access_helper=Los permisos de los miembros se decidirán por debajo de la tabla de permisos. teams.read_access=Leer -teams.read_access_helper=Los miembros pueden ver y clonar los repositorios del equipo. teams.write_access=Escribir -teams.write_access_helper=Los miembros pueden leer y hacer push a los repositorios del equipo. teams.admin_access=Acceso administrativo teams.admin_access_helper=Los miembros pueden hacer pull y push a los repositorios del equipo y añadir colaboradores a ellos. teams.no_desc=Este equipo no tiene descripción @@ -2998,12 +2865,9 @@ teams.invite_team_member.list=Invitaciones pendientes teams.delete_team_title=Eliminar equipo teams.delete_team_desc=Eliminar un equipo revoca el acceso de repositorio a sus miembros ¿Continuar? teams.delete_team_success=El equipo ha sido eliminado. -teams.read_permission_desc=Este equipo tiene permisos de Lectura: los miembros pueden ver y clonar los repositorios del equipo. -teams.write_permission_desc=Este equipo tiene permisos de Escritura: los miembros pueden ver y hacer push a los repositorios del equipo. teams.admin_permission_desc=Este equipo tiene permisos de Administración: los miembros pueden ver, hacer push y añadir colaboradores a los repositorios del equipo. teams.create_repo_permission_desc=Adicionalmente, este equipo concede permiso Crear repositorio: los miembros pueden crear nuevos repositorios en la organización. teams.repositories=Repositorios del equipo -teams.search_repo_placeholder=Buscar repositorio… teams.remove_all_repos_title=Eliminar todos los repositorios del equipo teams.remove_all_repos_desc=Esto eliminará todos los repositorios del equipo. teams.add_all_repos_title=Añadir todos los repositorios @@ -3016,9 +2880,6 @@ teams.specific_repositories=Repositorios específicos teams.specific_repositories_helper=Los miembros sólo tendrán acceso a repositorios explícitamente agregados al equipo. Seleccionar este no eliminará automáticamente los repositorios ya añadidos con Todos los repositorios. teams.all_repositories=Todos los repositorios teams.all_repositories_helper=El equipo tiene acceso a todos los repositorios. Seleccionar esto añadirá todos los repositorios existentes al equipo. -teams.all_repositories_read_permission_desc=Este equipo concede Leer a todos los repositorios: los miembros pueden ver y clonar repositorios. -teams.all_repositories_write_permission_desc=Este equipo concede Escribir a todos los repositorios: los miembros pueden leer y enviar a los repositorios. -teams.all_repositories_admin_permission_desc=Este equipo concede a Administrador acceso a todos los repositorios: los miembros pueden leer, enviar y agregar colaboradores a los repositorios. teams.invite.title=Has sido invitado a unirte al equipo %s en la organización %s. teams.invite.by=Invitado por %s teams.invite.description=Por favor, haga clic en el botón de abajo para unirse al equipo. @@ -3114,7 +2975,6 @@ dashboard.gc_metadata_obtained=Metadatos del Recolector de Basuras Obtenidos dashboard.other_system_allocation_obtained=Otros Recursos del Sistema Asignados dashboard.next_gc_recycle=Siguiente Reciclado del Recolector de Basuras dashboard.last_gc_time=Tiempo desde el Último GC -dashboard.total_gc_time=Pausa Total por GC dashboard.total_gc_pause=Pausa Total por GC dashboard.last_gc_pause=Última Pausa por GC dashboard.gc_times=Ejecuciones GC @@ -3212,9 +3072,6 @@ repos.unadopted.no_more=No se encontraron repositorios no adoptados. repos.owner=Propietario repos.name=Nombre repos.private=Privado -repos.watches=Vigilantes -repos.stars=Estrellas -repos.forks=Forks repos.issues=Incidencias repos.size=Tamaño repos.lfs_size=Tamaño LFS @@ -3318,17 +3175,6 @@ auths.oauth2_admin_group=Valor de notificación de grupo para los usuarios admin auths.oauth2_restricted_group=Valor de notificación de grupo para usuarios restringidos. (Opcional - requiere nombre de notificación arriba) auths.oauth2_map_group_to_team=Mapear grupos reclamados a equipos de la organización. (Opcional - requiere nombre de reclamación arriba) auths.oauth2_map_group_to_team_removal=Eliminar usuarios de equipos sincronizados si el usuario no pertenece al grupo correspondiente. -auths.enable_auto_register=Hablilitar Auto-Registro -auths.sspi_auto_create_users=Crear usuarios automáticamente -auths.sspi_auto_create_users_helper=Permitir al método de autenticación SSPI crear automáticamente nuevas cuentas para los usuarios que se conectan por primera vez -auths.sspi_auto_activate_users=Activar los usuarios automáticamente -auths.sspi_auto_activate_users_helper=Permitir al método de autenticación SSPI activar automáticamente los nuevos usuarios -auths.sspi_strip_domain_names=Eliminar los nombres de dominio de nombres de usuario -auths.sspi_strip_domain_names_helper=Si está marcado, los nombres de dominio se eliminarán de los nombres de inicio de sesión (por ejemplo, "DOMINIO\usuario" y "usuario@ejemplo.org" se convertirán en sólo "usuario"). -auths.sspi_separator_replacement=Separador a usar en lugar de \, / y @ -auths.sspi_separator_replacement_helper=El carácter a usar para reemplazar los separadores de los nombres de inicio de sesión de nivel inferior (por ejemplo, la \ en "DOMINIO\usuario") y en los nombres principales del usuario (por ejemplo, la @ en "user@example.org"). -auths.sspi_default_language=Idioma predeterminado del usuario -auths.sspi_default_language_helper=Idioma predeterminado para los usuarios creados automáticamente por el método de autenticación SSPI. Deje vacío si prefiere que el idioma sea detectado automáticamente. auths.tips=Consejos auths.tips.oauth2.general=Autenticación OAuth2 auths.tips.oauth2.general.tip=Al registrar una nueva autenticación de OAuth2, la URL de devolución de llamada/redirección debe ser: @@ -3338,7 +3184,6 @@ auths.tip.nextcloud=`Registre un nuevo consumidor OAuth en su instancia usando e auths.tip.dropbox=Crear nueva aplicación en %s auths.tip.facebook=`Registre una nueva aplicación en %s y agregue el producto "Facebook Login"` auths.tip.github=Registre una nueva aplicación OAuth en %s -auths.tip.gitlab=Registrar nueva solicitud en https://gitlab.com/profile/applications auths.tip.google_plus=Obtener credenciales de cliente OAuth2 desde la consola API de Google en %s auths.tip.openid_connect=Use el OpenID Connect Discovery URL (/.well-known/openid-configuration) para especificar los puntos finales auths.tip.twitter=Ir a %s, crear una aplicación y asegurarse de que la opción "Permitir que esta aplicación sea usada para iniciar sesión con Twitter" está activada @@ -3980,11 +3825,9 @@ team_kind = Buscar equipos… code_kind = Buscar código… package_kind = Buscar paquetes… code_search_unavailable = La búsqueda de código no está disponible actualmente. Por favor contacta al administrador del sitio. -code_search_by_git_grep = Los resultados actuales de la búsqueda de código son proporcionados por "git grep". Es posible que se obtengan mejores resultados si el administrador del sitio habilita el indexador de código. no_results = No se encontraron resultados coincidentes. keyword_search_unavailable = La búsqueda por palabra clave no está disponible actualmente. Por favor contacta al administrador del sitio. fuzzy_tooltip = Incluir resultados que también coincidan estrechamente con el término de búsqueda -milestone_kind = Buscar hitos… pull_kind = Buscar extracciones… union = Unión union_tooltip = Incluir resultados correspondientes a cualquiera de las palabras clave separadas por espacios en blanco diff --git a/options/locale/locale_et.ini b/options/locale/locale_et.ini index 6dcda1c9ba..ca52962b8e 100644 --- a/options/locale/locale_et.ini +++ b/options/locale/locale_et.ini @@ -154,7 +154,6 @@ user_kind = Otsi kasutajaid… org_kind = Otsi organisatsioone… team_kind = Otsi tiime… code_kind = Otsi koodi… -code_search_by_git_grep = Praeguse koodi otsingu tulemused annab "git grep". Paremaid tulemusi võib saada, kui saidi administraator lubab koodi indekseerija. package_kind = Otsi pakette… project_kind = Otsi projekte… branch_kind = Otsi harusid… @@ -162,7 +161,6 @@ commit_kind = Otsi kommiteid… runner_kind = Otsi jooksjaid… no_results = Sobivaid tulemusi ei leitud. issue_kind = Otsi probleeme… -milestone_kind = Otsi verstapostid... type_tooltip = Otsingu tüüp code_search_unavailable = Koodiotsing ei ole praegu saadaval. Palun võta ühendust saidi administraatoriga. union_tooltip = Kaasa tulemusi, mis vastavad mis tahes tühikutega eraldatud märksõnadele @@ -220,7 +218,6 @@ string.desc = Z - A [error] occurred = Tekkis viga -invalid_csrf = Halb taotlus: vigane CSRF token not_found = Sihtmärki ei leitud. network_error = Võrguviga server_internal = Serveri sisemine viga diff --git a/options/locale/locale_eu.ini b/options/locale/locale_eu.ini index 8b13789179..7df55f2761 100644 --- a/options/locale/locale_eu.ini +++ b/options/locale/locale_eu.ini @@ -1 +1 @@ - +[common] diff --git a/options/locale/locale_fa-IR.ini b/options/locale/locale_fa-IR.ini index 9d568ba2e4..d554834fc8 100644 --- a/options/locale/locale_fa-IR.ini +++ b/options/locale/locale_fa-IR.ini @@ -37,15 +37,10 @@ passcode=رمز عبور repository=مخزن organization=سازمان mirror=قرینه -new_repo=مخزن جدید -new_migrate=انتقال جدید new_mirror=آینه جدید new_fork=انشعاب جدید از مخزن -new_org=سازمان جدید new_project=پروژه جدید -manage_org=مدیریت سازمان‌ها admin_panel=مدیریت سایت -account_settings=تنظیمات حساب settings=تنظيمات your_profile=نمایه your_starred=ستاره‌دار @@ -107,7 +102,6 @@ webauthn_press_button = لطفاً دکمۀ روی کلید امنیتی را ف webauthn_unsupported_browser = مرورگر شما در حال حاضر از WebAuthn پشتیبانی نمی‌کند. webauthn_error_unknown = خطایی ناشناخته رخ داد. لطفاً دوباره سعی کنید. webauthn_error_unable_to_process = کارساز نتوانست درخواست شما را پردازش کند. -webauthn_reload = تازه‌سازی new_project_column = ستون جدید retry = سعی دوباره rerun = اجرای دوباره @@ -217,7 +211,6 @@ string.asc = آ - ی string.desc = ی - آ [error] -missing_csrf=درخواست بد: بلیط CSRF ندارد not_found = هدف را نمی‌توان یافت. network_error = خطای شبکه report_message = اگر گمان می‌برید این اشکال از فورججو است، لطفا در مشکلات در کدبرگ را بگردید یا اگر لازم است یک مشکل باز کنید. @@ -343,15 +336,10 @@ app_slogan = شعار نمونه [home] uname_holder=نام کاربری یا نشانی ایمیل -password_holder=گذرواژه switch_dashboard_context=تغییر محتوای پیشخوان my_repos=مخازن -show_more_repos=نمایش مخازن بیشتر… -collaborative_repos=مخازن همکاری my_orgs=سازمان های من -my_mirrors=قرینه‌های من view_home=نمایش %s -search_repos=یافتن مخزن… filter=فیلترهای دیگر filter_by_team_repositories=فیلتر کردن با مخازن تیم‌ها feed_of=`خوراک از "%s"` @@ -372,26 +360,16 @@ issues.in_your_repos=در مخازن شما repos=مخازن users=کاربران organizations=سازمان ها -search=جستجو code=کد -search.fuzzy=نادقیق -search.match=تطابق -repo_no_results=مخزنی مطابق با این مورد یافت نشد. -user_no_results=کاربری مطابق با این مورد یافت نشد. -org_no_results=سازمانی مطابق با این مورد یافت نشد. -code_no_results=کد منبعی مطابق با جستجوی شما یافت نشد. code_last_indexed_at=آخرین به روزرسانی در %s [auth] create_new_account=نام‌نویسی حساب کاربری -register_helper_msg=قبلا ثبت نام کردید؟ از اینجا وارد شوید! -social_register_helper_msg=از قبل حساب دارید؟ آن را متصل کنید! disable_register_prompt=با عرض پوزش، ثبت نام غیرفعال شده است. لطفا با مدیر سایت تماس بگیرید. disable_register_mail=ایمیل تایید برای ثبت نام غیر فعال است. remember_me=این دستگاه را بخاطر بسپار forgot_password_title=گذرواژه خود را فراموش کرده ام forgot_password=گذرواژه خود را فراموش کرده‌اید؟ -sign_up_now=نیاز به یک حساب دارید؟ هم‌اکنون ثبت نام کنید. confirmation_mail_sent_prompt=ایمیل تاییدیه جدیدی به %s ارسال شد. لطفا صندوق ورودی خود را در %d ساعت آینده برای تکمیل فرایند ثبت نام بررسی کنید. must_change_password=گذرواژه خود را به روز کنید allow_password_change=نیاز به کاربر برای تغییرگذرواژه (توصیه می شود) @@ -402,7 +380,6 @@ prohibit_login=ورود به سیستم ممنوع است resent_limit_prompt=با عرض پوزش، شما به تازگی یک ایمیل فعالسازی را درخواست کرده اید. لطفا سه دقیقه منتظر بمانید سپس درخواست خود را تکرار کنید. has_unconfirmed_mail=سلام %s, شما آدرس ایمیل (%s) را تایید نکرده اید. لطفا اگر شما ایمیلی دریافت نکرداید و یا نیاز به ارسال دوباره دارید، بر روید دکمه زیر کلیک نمایید. resend_mail=برای ارسال نامه فعال سازی اینجا را کلیک کنید -email_not_associate=این نشانی ایمیل در سیستم ثبت نشده است. send_reset_mail=ارسال ایمیل بازیابی حساب کاربری reset_password=بازیابی حساب invalid_code=کد تایید غیرمعتبر بوده و یا منقضی شده است. @@ -416,7 +393,6 @@ twofa_scratch_used=شما کد ابتدا خود استفاده کرده اند. twofa_passcode_incorrect=گذرواژه شما اشتباه است. اگر شما دستگاه خود را در جای اشتباه قرار داده اید, از کد ابتدای خود برای ورود به سیستم استفاده کنید. twofa_scratch_token_incorrect=کد ابتدا شما نادرست است. login_userpass=ورود -tab_openid=OpenID oauth_signup_tab=ثبت نام یک حساب جدید oauth_signup_title=تکمیل حساب جدید oauth_signup_submit=تکمیل حساب کاربری @@ -437,7 +413,6 @@ authorize_application_created_by=این برنامه توسط %s ساخته شد authorize_application_description=اگر شما دسترسی داشته باشید. میتوانید تمامی فیلد های حساب کاربری خود را تغییر دهید. از جمله مخازن و سازمان های خصوصی. authorize_title=تاییدیه "%s" برای دسترسی به اکانت شما؟ authorization_failed=احراز هویت انجام نشد -sspi_auth_failed=SSPI عدم احراز هویت password_pwned_err=برقراری ارتباط با HaveIBeenPwend ممکن نیست [mail] @@ -446,7 +421,6 @@ link_not_working_do_paste=کار نمی‌کنی؟ کپی کردن و چسبان hi_user_x=سلام %s activate_account=لطفا حساب خود را فعال کنید -activate_account.title=%s، لطفاً حساب خود را فعال کنید activate_account.text_1=سلام %[1]s، ممنون به‌خاطر عضویت در %[2]s! activate_account.text_2=لطفاً روی پیوند زیر کلیک کنید تا حساب خود را در %s فعال کنید: @@ -454,13 +428,11 @@ activate_email=نشانی ایمیل خود را تایید کنید activate_email.text=لطفاً روی پیوند زیر کلیک کنید تا رایانامه‌ی خود را در %s تأیید کنید: register_notify=به گیتی یا گیت‌گو خوش آمدید -register_notify.title=%[1]s، به %[2]s خوش‌آمدید register_notify.text_1=این رایانامه‌ی تأیید عضویت شما در %s است! register_notify.text_2=حالا شما می‌توانید با نام کاربری وارد شوید: %s. register_notify.text_3=اگر این حساب برای شما ایجاد شده، لطفاً ابتدا گذرواژه‌ی خود را تنظیم کنید. reset_password=حساب خود را دوباره فعال کنید -reset_password.title=%s، شما برای بازیابی حسابتان درخواست کرده‌اید reset_password.text=لطفاً روی پیوند زیر کلیک کنید تا حساب خود را در %s بازیابی کنید: register_success=ثبت‌نام با موفقیت انجام شد @@ -512,8 +484,6 @@ RepoName=نام مخزن Email=نشانی رایانامه (ایمیل) Password=گذرواژه Retype=تکرارگذواژه -SSHTitle=نام کلید SSH -HttpsUrl=نشانی HTTPS PayloadUrl=نشانی Payload TeamName=نام تیم AuthName=نام احراز هویت @@ -526,9 +496,6 @@ CommitChoice=انتخاب کامیت TreeName=مسیر پرونده Content=محتوا -SSPISeparatorReplacement=جدا کننده -SSPIDefaultLanguage=زبان پیش فرض - require_error=` نمی تواند خالی باشد.` alpha_dash_error=باید فقط عدد و الفبایی، فاصله باشد ('-') و کاراکتر خط تیره پایین ('_'). alpha_dash_dot_error=باید فقط عدد و الفبایی، فاصله باشد ('-') و کاراکتر خط تیره پایین ('_') و نقطه ('.') @@ -606,13 +573,11 @@ password=گذرواژه security=امنیت avatar=آواتار ssh_gpg_keys=کلید‌های SSH / GPG -social=حساب های اجتماعی applications=برنامه‌ها orgs=سازمان‌ها repos=مخازن delete=حذف حساب کاربری twofa=احراز هویت دوگانه -account_link=حساب‌های مرتبط organization=سازمان ها public_profile=نمایه عمومی @@ -632,10 +597,7 @@ language=زبان ui=پوسته comment_type_group_title=عنوان privacy=حریم خصوصی -keep_activity_private_popup=نمایان ساختن فعالیت ها برای شما و مدیران - lookup_avatar_by_mail=جست و جو آواتار توسط نشانی ایمیل -federated_avatar_lookup=جستجو برای آواتار مشترک enable_custom_avatar=استفاده از آواتار دلخواه choose_new_avatar=انتخاب آواتار جدید update_avatar=بروزرسانی آواتار @@ -651,7 +613,6 @@ password_incorrect=گذرواژه فعلی شما اشتباه است. change_password_success=گذرواژه شما تغییر کرد. از این پس با گذرواژه جدید خود وارد شوید. password_change_disabled=کاربران غیر محلی نمیتوانند گذرواژه خود را از طریق واسط وب گیتی به روز کنند. -emails=نشانی‌های ایمیل manage_emails=مدیریت نشانی‌های ایمیل manage_themes=تم پیش فرض manage_openid=آدرس‌های OpenID @@ -690,8 +651,6 @@ principal_desc=این گواهی‌های SSH اصلی برای حساب کار gpg_desc=این کلید های عمومی GPG به حساب کاربری شما مرتبط مرتبط است. کلید خصوصی خود را محرمانه نگهدارید لذا با آن امکان ارسال commit تایید شده است. ssh_helper=آیا نمی دانید چگونه؟راهنمایی Github را برای ساخت کلید SSH برای خود ببینیدیا ممکن است با راه حل استفاده از SSH در مشکلات متداول مواجه شوید. gpg_helper=به کمک نیاز دارید؟ نگاهی به در GitHub را راهنمای مورد 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_gpg_placeholder=با عبارت -----BEGIN PGP PUBLIC KEY BLOCK----- شروع می‌شود add_new_principal=یک کلید اصلی اضافه کنید @@ -709,7 +668,6 @@ gpg_invalid_token_signature=کلید GPG ارائه شده، امضا و ژتو gpg_token_required=باید یک امضا برای ژتون زیر ارائه کنید gpg_token=توکن gpg_token_help=با این میتوانید یک امضاء بسازید: -gpg_token_code=‪echo "%s" | gpg -a --default-key %s --detach-sig‬ gpg_token_signature=امضای GPG زره‌پوش key_signature_gpg_placeholder=با '-----BEGIN PGP SIGNATURE-----' شروع می‌شود ssh_key_verified=کلید تأیید شده @@ -744,9 +702,6 @@ show_openid=نمایش بر روی نمایه hide_openid=مخفی کردن از نمایه ssh_disabled=SSH غیر فعل شد ssh_externally_managed=کلید ssh به صورت بیرونی برای این یوزر مدیریت می شود -manage_social=مدیریت حساب های اجتماعی مرتبط -unbind=لغو ارتباط - manage_access_token=مدیریت توکن های دسترسی generate_new_token=تولید توکن جدید tokens_desc=این token قابلیت دسترسی به اکانت شما را توسط API میدهد. @@ -756,8 +711,6 @@ generate_token_success=اکنون token جدید ساخته شد. همینک آ generate_token_name_duplicate=%s قبلا بعنوان نام یک برنامه استفاده شده است. لطفا از یک نام دیگر استفاده کنید. delete_token=حذف access_token_deletion=حذف توکن -access_token_deletion_cancel_action=انصراف -access_token_deletion_confirm_action=حذف delete_token_success=token مورد نظر حذف شد. برنامه هایی که از آن استفاده می‎کنند به زودی دسترسی به حساب کاربری شما را از دست می‎دهند. permission_read=خواندن @@ -803,7 +756,6 @@ twofa_failed_get_secret=خطا در دریافت رمز. manage_account_links=مدیریت حساب های مرتبط شده manage_account_links_desc=این حساب های خارجی به حساب Forgejo ارتباط دارد. -account_links_not_available=اکنون دیگر هیچ پیوند حساب‌های کاربری خارجی به حساب کاربری شما وجود ندارد. link_account=پیوند به حساب remove_account_link=حذف حساب پیوند خرده remove_account_link_desc=با حذف پیوند خارجی حساب کاربری دسترسی شما به حساب کابریتان توسط آن از بین میرود. آیا ادامه می‌دهید؟ @@ -848,7 +800,6 @@ fork_repo=انشعاب از مخزن fork_from=انشعاب از fork_visibility_helper=نمایان بودن مخزن منشعب شده غیر قابل تغییر است. use_template=استفاده از این الگو -clone_in_vsc=کلون کردن در VS Code download_zip=دانلود ZIP download_tar=دانلود TAR.GZ download_bundle=بارگیری باندل @@ -868,11 +819,6 @@ readme=README readme_helper=یک قالب README انتخاب کنید. readme_helper_desc=اینجا جایی است که می‌توانید شرح کاملی از پروژه‌تان را بنویسید. auto_init=راه اندازی مخزن (.gitignore, License و README را اضافه میکند) -trust_model_helper=مدل اعتماد را برای تأیید امضا انتخاب کنید. گزینه های ممکن عبارتند از: -trust_model_helper_collaborator=Collaborator: به امضای همکاران اعتماد میکند -trust_model_helper_committer=Committer: به امضایی اعتماد میکند که با کامیتر ها مطابقت داشته باشد -trust_model_helper_collaborator_committer=Collaborator+Committer: به امضای همکارانی که با committer مطابقت دارند اعتماد میکند -trust_model_helper_default=پیش فرض: از مدل اعتماد پیش فرض برای این نصب استفاده میکند create_repo=ایجاد مخزن default_branch=شاخه پیش‌فرض default_branch_helper=شاخه پیش‌فرض، شاخه پایه برای درخواست‌های pull و کدهای commit است. @@ -928,15 +874,11 @@ template.issue_labels=برچسب‌های مسئله template.one_item=شما بایستی حداقل یک الگو را انتخاب کنید template.invalid=شما بایستی یک الگو مخزن را انتخاب کنید -archive.issue.nocomment=این مخزن بایگانی شده است. شما نمی‎توانید در مورد مسائل اظهار نظر کنید. -archive.pull.nocomment=این مخزن بایگانی شده. شما نمی توانید دیدگاهی بر روی این تقاضای واکشی ارسال کنید. - form.reach_limit_of_creation_1=شما قبلاً به بیشینه مخزن - %d - رسیده‎‌اید. form.reach_limit_of_creation_n=شما قبلا به بیشینه مخزن‌ها - %d - رسیده‌اید. need_auth=دسترسی migrate_options=تنظیمات مهاجرت -migrate_service=سرویس مهاجرت migrate_options_lfs=مهاجرت فایلهای LFS migrate_options_lfs_endpoint.label=نشانهای پایانی LFS migrate_options_lfs_endpoint.description=Migration سعی خواهد کرد از کنترل از راه دور Git شما برای تعیین سرور LFS استفاده کند. همچنین اگر داده های LFS مخزن در جای دیگری ذخیره شده باشد، می توانید یک نقطه پایانی سفارشی را مشخص کنید. @@ -1011,7 +953,6 @@ branches=شاخه‎ها tags=برچسب‎ها issues=مسائل pulls=تقاضاهای واکشی -project_board=پروژه‌ها labels=برچسب‌ها org_labels_desc=برچسب های سطح سازمان که می توانند برای تمامی مخازن ذیل این سازمان استفاده شوند org_labels_desc_manage=مدیریت @@ -1090,8 +1031,6 @@ editor.require_signed_commit=شاخه یک کامیت امضا شده لازم commits.desc=تاریخچه تغییرات کد منبع را مرور کنید. commits.commits=کامیت‌ها commits.nothing_to_compare=این شاخه ها برابرند. -commits.search=جست‌وجو کامیت‌ها… -commits.find=جستجو commits.search_all=همه شاخه ها commits.author=مولف commits.message=پیام @@ -1107,8 +1046,6 @@ commits.gpg_key_id=شناسه کلید GPG commitstatus.error=خطا commitstatus.pending=در انتظار -ext_issues.desc=پیوند به ردیاب خارجی برای موضوع. - projects=پروژه‌ها projects.desc=مدیریت مشکلات و درخواست‌های درج در بورد پروژه. projects.description=توضیحات (دلخواه) @@ -1128,7 +1065,6 @@ projects.type.basic_kanban=پایه بر اساس سیستم کانبان (یک projects.type.bug_triage=اشکال Triage projects.template.desc=قالب پروژه projects.template.desc_helper=برای شروع یک قالب پروژه را انتخاب کنید -projects.type.uncategorized=دسته‌بندی نشده projects.column.edit_title=نام projects.column.new_title=نام projects.column.color=رنگ @@ -1257,8 +1193,6 @@ issues.ref_issue_from=` ارجاعات این مسائله %[3]< issues.ref_pull_from=` ارجاعات این تقاضای ادغام %[4] %[1]s` issues.ref_closing_from=` ارجاعات این تقاضای واکشی %[4] %[1]s` issues.ref_reopening_from=` تقاضای واکشی ارجاع شده %[3]sکه مسائله بازگشایی خواهد کرد %[2] ` -issues.ref_closed_from=` بسته شده این مسائله %[4] %[2]s` -issues.ref_reopened_from=` بازگشایی این مسائله %[4] %[2]s` issues.ref_from=`از %[1]` issues.role.owner=مالک issues.role.member=عضو @@ -1333,15 +1267,11 @@ issues.add_time_sum_to_small=هیچ زمانی وارد نشده. issues.time_spent_total=کل زمان صرف شده issues.time_spent_from_all_authors=`زمان صرف شده: %s` issues.due_date=موعد مقرر -issues.invalid_due_date_format=موعد مقرر، باید به سبک 'yyyy-mm-dd' باشد. -issues.error_modifying_due_date=تغییر موعد مقرر با شکست مواجه شد. -issues.error_removing_due_date=حذف موعد مقرر با شکست مواجه شد. issues.push_commit_1=%d اعمال تغییر اضافه شده است %s issues.push_commits_n=%d اعمال تغییرات اضافه شده است %s issues.force_push_codes=`پوش شده اجباری %[1]s از %[2]s %[8]s به %[4]s %[9]s %[6]s` issues.force_push_compare=مقایسه issues.due_date_form=yyyy-mm-dd -issues.due_date_form_add=افزودن موعد مقرر issues.due_date_form_edit=ویرایش issues.due_date_form_remove=حذف/ساقط کردن issues.due_date_not_set=هیچ موعد مقرری ثبت نشده. @@ -1388,7 +1318,6 @@ issues.review.add_review_request=از %s %s درخواست بازبینی کرد issues.review.remove_review_request=برای %s %s درخواست بازبینی را حذف کرد issues.review.remove_review_request_self=%s از بازبینی خودداری کرد issues.review.pending=در انتظار -issues.review.review=بازبینی issues.review.reviewers=بازبینی‌کنندگان issues.review.outdated=کهنه issues.review.show_outdated=نمایش از رده خارج‌ها @@ -1398,7 +1327,6 @@ issues.review.hide_resolved=مخفی کردن حل شده ها issues.review.resolve_conversation=مکالمه را بعنوان حل شده علامت گذاری کردن issues.review.un_resolve_conversation=مکالمه را بعنوان حل نشده علامت گذاری کردن issues.review.resolved_by=علامت گذاری این مکالمه بعنوان حل شده -issues.assignee.error=به دلیل خطای غیرمنتظره همه تکالیف اضافه نشد. issues.reference_issue.body=Body issues.content_history.deleted=حذف شده issues.content_history.edited=ویرایش شده @@ -1424,8 +1352,6 @@ pulls.nothing_to_compare=این شاخه‎ها یکی هستند. نیازی ب pulls.nothing_to_compare_and_allow_empty_pr=این شاخه ها برابر هستند. این PR خالی خواهد بود. pulls.has_pull_request=`A درخواست pull بین این شاخه ها از قبل وجود دارد: %[2]s#%[3]d` pulls.create=ایجاد تقاضای واکشی -pulls.title_desc_few=قصد ادغام %[1]d تغییر را از %[2]s به %[3]s دارد -pulls.merged_title_desc_few=%[1]d کامیت ادغام شده از %[2]s به %[3]s %[4]s pulls.change_target_branch_at=`هدف شاخه از %s به %s %s تغییر کرد` pulls.tab_conversation=گفتگو pulls.tab_commits=کامیت‌ها @@ -1527,8 +1453,6 @@ milestones.filter_sort.most_issues=بیشترین مسائل milestones.filter_sort.least_issues=کمترین مسائل -ext_wiki.desc=پیوند به یک دانشنامه خارجی. - wiki=دانشنامه wiki.welcome=به دانشنامه خوش آمدید. wiki.welcome_desc=به دانشنامه خوش آمدید! @@ -1619,13 +1543,6 @@ activity.git_stats_deletion_n=%d مذحوف contributors.contribution_type.commits=کامیت‌ها -search=جستجو -search.search_repo=جستجوی مخزن -search.fuzzy=درهم -search.match=مطابق -search.results=نتیجه جستجو برای "%s" در %s -search.code_no_results=کد منبعی مطابق با جستجوی شما یافت نشد. - settings=تنظيمات settings.desc=تنظیمات جایی است که شما می‌توانید تنظیمات مخزن خود را مدیریت کنید settings.options=مخزن @@ -1699,7 +1616,6 @@ settings.transfer.success=انتقال انبار موفق بود. settings.transfer_abort=لغو انتقال settings.transfer_abort_invalid=شما نمی توانید یک انتقال انبار موجود را لغو کنید. settings.transfer_desc=انتقال مالکیت این مخزن به کاربر بانی یا سازمانی که شما حق مدیریت در آن دارید. -settings.transfer_form_title=نام مخزن را برای تایید عمل خورد اینجا وارد کنید: settings.transfer_in_progress=در حال حاضر یک انتقال در حال انجام است. اگر می خواهید این انبار را به کاربر دیگری منتقل کنید، لطفاً آن را لغو کنید. settings.transfer_notices_1=- شما دسترسی خود را نسبت مخزن را از دست میدهید اگر مالکیت آن را به یک کاربری مفرد انتقال دهید. settings.transfer_notices_2=- شما دسترسی خود را نسبت مخزن را حفظ میکنید. اگر مالکیت آن را به یک سازمانی که در آن مالکیت دارید انتقال دهید. @@ -1741,7 +1657,6 @@ settings.delete_collaborator=حذف settings.collaborator_deletion=حذف‌کردن همکار settings.collaborator_deletion_desc=حذف یک همکار از مخزن دسترسی‌های آنها را را مجدد لغو می‌کند. آیا ادامه می‌دهید؟ settings.remove_collaborator_success=همكار حذف شد. -settings.search_user_placeholder=جستجوی کاربر… settings.org_not_allowed_to_be_collaborator=سازمان ها را نمیتوان به عنوان همکار افزود. settings.change_team_access_not_allowed=تغییر دسترسی های تیم برای این مخزن توسط مالک ارگان محدود شده است settings.team_not_in_organization=تیم همانند ارگان برای این مخزن نیست @@ -1749,7 +1664,6 @@ settings.teams=تیم ها settings.add_team=افزودن تیم settings.add_team_duplicate=تیم پیش از این مخزن داشته settings.add_team_success=تیم هم‌اکنون به مخزن دسترسی دارد. -settings.search_team=جستجوی تیم… settings.change_team_permission_tip=دسترسی تیم در صفحه تنظیمات تیم انجام شده و برای هر مخزن نمی تواند تغییر یابد settings.delete_team_tip=این تیم به تمامی مخازن دسترسی دارد و نمی تواند حذف شود settings.remove_team_success=دسترسی تیم به مخزن حذف شد. @@ -1852,12 +1766,7 @@ settings.deploy_key_deletion_desc=حذف کلید استقرار از مخزن settings.deploy_key_deletion_success=کلید استقرار حذف شد. settings.branches=شاخه‎ها settings.protected_branch=حفاظت از شاخه -settings.protected_branch_can_push=اجازه درج؟ -settings.protected_branch_can_push_yes=شما می‎توانید درج کنید -settings.protected_branch_can_push_no=شما نمی‎توانید درج کنید settings.branch_protection=محافظ شاخه برای شاخه‌ی '%s' -settings.protect_this_branch=فعال کردن حفاظت از شاخه -settings.protect_this_branch_desc=جلوگیری از حذف و محدود کردن درج و ادغام Git به شاخه. settings.protect_disable_push=غیرفعال کردن درج settings.protect_disable_push_desc=هیچ موردی اجازه درج در این شاخه را نخواهد داشت. settings.protect_enable_push=فعال کردن درج @@ -1866,9 +1775,7 @@ settings.protect_whitelist_committers=لیست سفید برای درج محدو settings.protect_whitelist_committers_desc=فقط به کاربران یا تیم‌های موجود لیست سفید برای درج در این شاخه اجازه خواهند داشت (اما نه درج اجباری). settings.protect_whitelist_deploy_keys=فهرست سفید کلیدهای استقرار با دسترسی نوشتن برای push کردن. settings.protect_whitelist_users=کاربران لیست سفید برای درج در مخزن: -settings.protect_whitelist_search_users=جستجوی کاربر… settings.protect_whitelist_teams=تیم‌های لیست سفید برای درج در مخزن: -settings.protect_whitelist_search_teams=جستجوی تیم ها… settings.protect_merge_whitelist_committers=فعال کردن لیست سفید ادغام settings.protect_merge_whitelist_committers_desc=اجازه به کاربران یا تیم‌های موجود لیست سفید برای تقاضا ادغام واکشی در این شاخه. settings.protect_merge_whitelist_users=کاربران لیست سفید برای ادغام: @@ -1886,8 +1793,6 @@ settings.dismiss_stale_approvals=تاییدیه های قدیمی را رد کن settings.dismiss_stale_approvals_desc=وقتی commit های جدیدی که محتوای درخواست pull را تغییر می‌دهند به شاخه ارسال می‌شوند، تأییدیه‌های قدیمی رد می‌شوند. settings.require_signed_commits=نیاز به commit های امضا شده settings.require_signed_commits_desc=در صورتی که push ها به این شاخه بدون امضا یا غیرقابل تأیید باشند، رد شوند. -settings.add_protected_branch=فعال‌سازی محافظ -settings.delete_protected_branch=غیر فعال‌سازی محافظ settings.protected_branch_deletion=غیرفعال‌کردن حفاظت از شاخه settings.protected_branch_deletion_desc=غیر‌فعال کردن محافظت از شاخه به کاربرانی که دسترسی نوشتن دارند اجازه درج در شاخه را می‌دهد. آیا ادامه می‌دهید؟ settings.block_rejected_reviews=ادغام نظرات رد شده را مسدود شود @@ -1952,8 +1857,6 @@ settings.lfs_pointers.associateAccessible=در دسترس %d sOID settings.rename_branch_failed_exist=نمی‌توان نام شاخه را عوض کرد زیرا شاخه %s وجود دارد. settings.rename_branch_failed_not_exist=نمی‌توان نام شاخه %s را عوض کرد زیرا وجود ندارد. settings.rename_branch_success=نام شاخه %s با موفقیت به %s تغییر کرد. -settings.rename_branch_from=نام شاخه‌ی قدیمی -settings.rename_branch_to=نام شاخه‌ی جدید settings.rename_branch=تغییر نام شاخه diff.browse_source=فهرست منبع @@ -1962,7 +1865,6 @@ diff.commit=کامیت diff.git-notes=یادداشت‌ها diff.data_not_available=محتوای تفاوت ها در دسترس نیست diff.options_button=تنظیمات (diff) تغییرات -diff.show_diff_stats=نمایش وضعیت diff.download_patch=دانلود پرونده وصله diff.download_diff=دانلود فایل تغییرات diff diff.show_split_view=مشاهده تقسیم شده @@ -2042,7 +1944,6 @@ release.tag_name_invalid=نام برچسب معتبر نمی‌باشد. release.tag_name_protected=نام تگ محافظت می شود. release.tag_already_exist=این نام تگ از قبل وجود دارد. release.downloads=بارگیری‌ها -release.download_count=دانلودها: %s release.add_tag_msg=از عنوان و محتوای انتشار به عنوان پیام تگ استفاده کنید. release.add_tag=فقط تگ ایجاد کنید @@ -2055,7 +1956,6 @@ branch.included_desc=این شاخه بخشی از شاخه پیش فرض است branch.included=مشمول شده branch.create_new_branch=ایجاد شاخه از شاخه: branch.confirm_create_branch=ایجاد شاخه -branch.confirm_rename_branch=تغییر نام شاخه branch.create_branch_operation=ایجاد شاخه branch.new_branch=شاخه جدید ایجاد کنید branch.renamed=شاخه %s قبلا به %s تغییر کرده است. @@ -2148,8 +2048,6 @@ teams.leave.detail=ترک %s؟ teams.can_create_org_repo=ایجاد مخزن teams.can_create_org_repo_helper=اعضا می توانند مخازن جدیدی را در سازمان ایجاد کنند. خالق دسترسی سرپرست به مخزن جدید را دریافت می کند. teams.read_access=خواندن -teams.read_access_helper=اعضا می‌توانند مخازن مربوط به تیم را مشاهده و از آن همسان تهیه کنند. -teams.write_access_helper=اعضا می‌توانند مخازن مربوط به تیم را بخوانند و کامیت ها در آن درج کنند. teams.admin_access=دسترسی مدیریت teams.admin_access_helper=اعضا می‌توانند واکشی یا درج بر روی مخازن تیم را انجام دهند و می‌توانند به آنها همکار اضافه کنند. teams.no_desc=توضیحی برای این تیم ثبت نشده‌است @@ -2162,12 +2060,9 @@ teams.add_team_member=افزودن عضو به تیم teams.delete_team_title=حذف تیم teams.delete_team_desc=حذف یک تیم از مخزن تمامی دسترسی اعضای آن را از بین می‌برد. آیا مطمئن هستید؟ teams.delete_team_success=تیم حذف شد. -teams.read_permission_desc=این تیم دسترسی خواندن خواهد داشت: اعضا خواهند توانست مخازن را مشاهده و کپی نمایند. -teams.write_permission_desc=این تیم دسترسی نوشتن خواهد داشت: اعضا خواهند توانست مخازن تیم را خوانده و تغییراتی در آنها اعمال نمایند. teams.admin_permission_desc=این تیم دسترسی نوشتن خواهد داشت: اعضا خواهند توانست مخازن تیم را خوانده ، تغییراتی در آنها اعمال کرده و یا همکارانشان را به مخازن اضافه نمایند. teams.create_repo_permission_desc=علاوه بر این ، این تیم اجازه ساخت مخزن دسترسی : اعضا می توانند مخازن جدیدی را در سازمان ایجاد کنند. teams.repositories=مخازن تیم -teams.search_repo_placeholder=جستجوی مخزن... teams.remove_all_repos_title=حذف تمام مخازن تیم teams.remove_all_repos_desc=با این کار همه مخازن از تیم حذف می شوند. teams.add_all_repos_title=افزودن همه مخازن @@ -2179,9 +2074,6 @@ teams.specific_repositories=مخازن خاص teams.specific_repositories_helper=اعضا فقط به مخازن صراحتاً اضافه شده به تیم دسترسی خواهند داشت. انتخاب این نخواهد توانست مخزن هایی که قبلاً با آن اضافه شده به طور خودکار حذف شود همه مخازن teams.all_repositories=همه مخازن teams.all_repositories_helper=تیم به کلیه مخازن دسترسی دارد. با انتخاب این ، همه مخازن موجود به تیم اضافه می شود. -teams.all_repositories_read_permission_desc=این تیم دسترسی خواندن مخازن همه را می بخشد: اعضا می توانند مخازن را مشاهده و همزاد سازی کنند. -teams.all_repositories_write_permission_desc=این تیم دسترسی نوشتن مخازن همه را می بخشد: اعضا می توانند مخازن را مشاهده و درج کنند. -teams.all_repositories_admin_permission_desc=این تیم دسترسی مدیر به مخازن همه را می بخشد: اعضا می توانند مخازن را بخواند، همکار و مخزن اضافه کنند. [admin] dashboard=پیشخوان @@ -2260,7 +2152,6 @@ dashboard.gc_metadata_obtained=متادیتاهای بدست امده از GC dashboard.other_system_allocation_obtained=تخصیص های حافظه در سایر قسمت های سیستم dashboard.next_gc_recycle=بازیافت GC بعدی dashboard.last_gc_time=زمان از آخرین GC -dashboard.total_gc_time=کل زمان مکث GC dashboard.total_gc_pause=کل زمان مکث GC dashboard.last_gc_pause=واپسین مکث در GC dashboard.gc_times=زمان های GC @@ -2340,9 +2231,6 @@ repos.unadopted.no_more=هیچ مخزن تایید نشده دیگری یافت repos.owner=مالک repos.name=نام repos.private=خصوصی -repos.watches=تماشا شده -repos.stars=ستاره ها -repos.forks=انشعاب‌ها repos.issues=مسائل repos.size=اندازه @@ -2422,17 +2310,6 @@ auths.oauth2_emailURL=نشانی ایمیل (رایانامه) auths.skip_local_two_fa=از 2FA محلی رد شوید auths.skip_local_two_fa_helper=تنظیم نشده به این معنی است که کاربران محلی با مجموعه 2FA همچنان باید 2FA را برای ورود به سیستم ارسال کنند auths.oauth2_tenant=مستاجر -auths.enable_auto_register=فعال سازی ثبت نام خودکار -auths.sspi_auto_create_users=ساخت کاربر خودکار -auths.sspi_auto_create_users_helper=به روش SSPI auth اجازه دهید تا برای اولین بار به طور خودکار حساب های جدیدی را برای کاربرانی ایجاد کند که وارد سایت شوند -auths.sspi_auto_activate_users=فعال سازی خودکار کاربران -auths.sspi_auto_activate_users_helper=به روش SSPI auth اجازه دهید تا کاربران جدید را به طور خودکار فعال کند -auths.sspi_strip_domain_names=نام دامنه را از نام کاربری حذف کنید -auths.sspi_strip_domain_names_helper=اگر بررسی شود ، نام دامنه از نامهای ورود به سیستم حذف می شود(eg. "DOMAIN\user" and "user@example.org" هر برای کاربر خواهند شد "user"). -auths.sspi_separator_replacement=جداکننده برای استفاده به جای \, / و @ -auths.sspi_separator_replacement_helper=کاراکتر مورد استفاده برای جایگزینی جداکنندگان نامهای ورود به سطح پایین (eg. the \ in "DOMAIN\user") و نامهای اصلی کاربر (eg. the @ in "user@example.org"). -auths.sspi_default_language=زبان پیش فرض کاربر -auths.sspi_default_language_helper=زبان پیش فرض برای کاربران بطور خودکار با روش SSPI auth ایجاد شده است. اگر ترجیح می دهید زبان به طور خودکار شناسایی شود ، خالی بگذارید. auths.tips=ﻧﮑﺎﺕ auths.tips.oauth2.general=احراز هویت OAuth2 auths.tip.oauth2_provider=تامین کننده OAuth2 @@ -2441,7 +2318,6 @@ auths.tip.nextcloud=با استفاده از منوی زیر "تنظیمات -> auths.tip.dropbox=یک برنامه جدید در %s بسازید auths.tip.facebook=`یک برنامه جدید در %s بسازید برای ورود از طریق فیس بوک قسمت محصولات "Facebook Login"` auths.tip.github=یک برنامه OAuth جدید در %s ثبت کنید -auths.tip.gitlab=ثبت یک برنامه جدید در https://gitlab.com/profile/applications auths.tip.google_plus=اطلاعات مربوط به مشتری OAuth2 را از کلاینت API Google در %s auths.tip.openid_connect=برای مشخص کردن نقاط پایانی از آدرس OpenID Connect Discovery URL ( /.well-known/openid-configuration) استفاده کنید. auths.tip.twitter=به %s بروید ، برنامه ای ایجاد کنید و اطمینان حاصل کنید که گزینه "اجازه استفاده از این برنامه برای ورود به سیستم با Twitter" را فعال کنید diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini index 263fab8774..0ab686daf9 100644 --- a/options/locale/locale_fi-FI.ini +++ b/options/locale/locale_fi-FI.ini @@ -45,20 +45,13 @@ webauthn_error_unable_to_process=Palvelin ei pystynyt käsittelemään pyyntöä webauthn_error_duplicated=Turva-avainta ei ole sallittu tässä pyynnössä. Varmista, ettei avainta ole jo rekisteröity. webauthn_error_empty=Sinun täytyy asettaa nimi tälle avaimelle. webauthn_error_timeout=Aikakatkaisu ennen kuin avaintasi voitiin lukea. Lataa tämä sivu uudelleen ja yritä uudelleen. -webauthn_reload=Päivitä - repository=Tietovarasto organization=Organisaatio mirror=Peili -new_repo=Uusi repo -new_migrate=Uusi migraatio new_mirror=Uusi peili new_fork=Uusi tietovarastoforkki -new_org=Uusi organisaatio new_project=Uusi projekti -manage_org=Ylläpidä organisaatioita admin_panel=Sivuston ylläpito -account_settings=Tilin asetukset settings=Asetukset your_profile=Profiili your_starred=Tähdelliset @@ -217,8 +210,6 @@ string.desc = Ö - A [error] occurred=Tapahtui virhe -missing_csrf=Virheellinen pyyntö: CSRF-tunnusta ei ole olemassa -invalid_csrf=Virheellinen pyyntö: Virheellinen CSRF-tunniste not_found=Kohdetta ei löytynyt. network_error=Verkkovirhe server_internal = Palvelinvirhe @@ -355,15 +346,10 @@ err_admin_name_pattern_not_allowed = Ylläpitäjän käyttäjänimi on epäkelpo [home] uname_holder=käyttäjänimi tai sähköpostiosoite -password_holder=Salasana switch_dashboard_context=Vaihda kojelaudan kontekstia my_repos=Tietovarastot -show_more_repos=Näytä lisää repoja… -collaborative_repos=Yhteistyö repot my_orgs=Organisaatiot -my_mirrors=Peilini view_home=Näytä %s -search_repos=Etsi repo… filter=Muut suodattimet filter_by_team_repositories=Suodata tiimin tietovarastojen mukaan feed_of=`Syöte "%s"` @@ -384,13 +370,7 @@ issues.in_your_repos=Tietovarastoissasi repos=Tietovarastot users=Käyttäjät organizations=Organisaatiot -search=Hae code=Koodi -search.match=Osuma -repo_no_results=Vastaavia repoja ei löydy. -user_no_results=Vastaavia käyttäjiä ei löytynyt. -org_no_results=Ei löytynyt vastaavia organisaatioita. -code_no_results=Hakuehtoasi vastaavaa lähdekoodia ei löytynyt. code_last_indexed_at=Viimeksi indeksoitu %s stars_one = %d tähti stars_few = %d tähteä @@ -402,14 +382,11 @@ relevant_repositories_tooltip = Tietovarastot, jotka ovat forkkeja tai joilla ei [auth] create_new_account=Rekisteröi tili -register_helper_msg=On jo tili? Kirjaudu sisään nyt! -social_register_helper_msg=Onko sinulla jo tili? Linkitä se nyt! disable_register_prompt=Rekisteröinti on estetty. Ota yhteys sivuston ylläpitäjään. disable_register_mail=Sähköpostivahvistus rekisteröinnille on estetty. remember_me=Muista tämä laite forgot_password_title=Unohtuiko salasana forgot_password=Unohtuiko salasana? -sign_up_now=Tarvitsetko tilin? Rekisteröidy nyt. confirmation_mail_sent_prompt=Uusi vahvistussähköposti on lähetetty osoitteeseen %s. Tarkista sähköpostisi ja seuraa saamaasi linkkiä seuraavan %s aikana viimeistelläksesi rekisteröinnin. Mikäli annettu sähköpostiosoite on väärin, voit kirjautua sisään ja pyytää uutta vahvistussähköpostia toiseen osoitteeseen. must_change_password=Vaihda salasanasi allow_password_change=Vaadi käyttäjää vaihtamaan salasanansa (suositeltava) @@ -420,7 +397,6 @@ prohibit_login=Tili on jäädytetty resent_limit_prompt=Olet jo tilannut aktivointisähköpostin äskettäin. Odota kolme minuuttia ja yritä sitten uudelleen. has_unconfirmed_mail=Hei %s, sinulla on vahvistamaton sähköpostiosoite (%s). Jos et ole saanut vahvistussähköpostia tai tarvitset uudelleenlähetyksen, ole hyvä ja napsauta alla olevaa painiketta. resend_mail=Napsauta tästä lähettääksesi aktivointisähköpostin uudelleen -email_not_associate=Tätä sähköpostiosoitetta ei ole liitetty mihinkään tiliin. send_reset_mail=Lähetä palautussähköposti reset_password=Tilin palautus invalid_code=Vahvistuskoodi on virheellinen tai vanhentunut. @@ -434,7 +410,6 @@ twofa_scratch_used=Olet käyttänyt kertakäyttökoodisi. Sinut on uudelleenohja twofa_passcode_incorrect=Pääsykoodi on väärä. Jos olet hukannut laitteesi, käytäthän kertakäyttökoodia sisäänkirjautumiseen. twofa_scratch_token_incorrect=Kertakäyttökoodisi on virheellinen. login_userpass=Kirjaudu sisään -tab_openid=OpenID oauth_signup_tab=Rekisteröi uusi tili oauth_signup_title=Viimeistele uusi tili oauth_signup_submit=Viimeistele tili @@ -454,7 +429,6 @@ authorize_application_created_by=Tämän sovelluksen on luonut %s. authorize_application_description=Jos myönnät valtuuden, se pystyy pääsemään kaikkiin tilitietoihisi ja kirjoittamaan niihin, mukaan lukien yksityiset tietovarastot ja organisaatiot. authorize_title=Valtuutatko "%s" pääsemään tilillesi? authorization_failed=Valtuuttaminen epäonnistui -sspi_auth_failed=SSPI todennus epäonnistui sign_up_successful = Käyttäjätili luotiin onnistuneesti. Tervetuloa! hint_login = Onko sinulla jo käyttäjätili? Kirjaudu sisään! hint_register = Tarvitsetko käyttäjätilin? Rekisteröidy nyt. @@ -494,8 +468,6 @@ register_notify=Tervetuloa %s-palveluun register_notify.text_2=Voit nyt kirjautua tilillesi käyttäjänimellä: %s reset_password=Palauta käyttäjätili -reset_password.title=%s, olet pyytänyt tilisi palauttamista - register_success=Rekisteröinti onnistui @@ -575,8 +547,6 @@ RepoName=Tietovaraston nimi Email=Sähköpostiosoite Password=Salasana Retype=Vahvista salasana -SSHTitle=SSH avain nimi -HttpsUrl=HTTPS-osoite TeamName=Tiimin nimi AuthName=Luvan nimi AdminEmail=Ylläpitäjän sähköposti @@ -588,9 +558,6 @@ CommitChoice=Kommitin valinta TreeName=Tiedostopolku Content=Sisältö -SSPISeparatorReplacement=Erotin -SSPIDefaultLanguage=Oletuskieli - require_error=` ei voi olla tyhjä.` size_error=` täytyy olla kokoa %s.` min_size_error=` täytyy sisältää vähintään %s merkkiä.` @@ -726,13 +693,11 @@ password=Salasana security=Turvallisuus avatar=Profiilikuva ssh_gpg_keys=SSH-/GPG-avaimet -social=Sosiaaliset tilit applications=Sovellukset orgs=Organisaatiot repos=Tietovarastot delete=Poista tili twofa=Kaksivaiheinen todennus (TOTP) -account_link=Linkitetyt tilit organization=Organisaatiot webauthn=Kaksivaiheinen todennus (Turva-avaimet) @@ -767,10 +732,7 @@ comment_type_group_pull_request_push=Lisätyt kommitit comment_type_group_project=Projekti saved_successfully=Asetuksesi tallennettiin onnistuneesti. privacy=Yksityisyys -keep_activity_private_popup=Tekee toiminnon näkyvän vain sinulle ja ylläpitäjille - lookup_avatar_by_mail=Hae profiilikuva sähköpostin perusteella -federated_avatar_lookup=Ulkopuolinen profiilikuvan haku enable_custom_avatar=Käytä mukautettua profiilikuvaa choose_new_avatar=Valitse uusi profiilikuva update_avatar=Päivitä profiilikuva @@ -784,7 +746,6 @@ new_password=Uusi salasana password_incorrect=Nykyinen salasana on virheellinen. password_change_disabled=Ei-lokaalit käyttäjät eivät voi päivittää salasanojaan Forgejon web-käyttöliittymän kautta. -emails=Sähköposti osoitteet manage_emails=Hallitse sähköpostiosoitteita manage_themes=Oletusteema manage_openid=OpenID-osoitteet @@ -820,8 +781,6 @@ ssh_desc=Nämä julkiset SSH-avaimet on liitetty tiliisi. Vastaavat yksityiset a gpg_desc=Nämä julkiset GPG-avaimet liitetään tiliisi ja niitä käytetään tekemiesi kommittien vahvistamiseen. Pidä yksityiset avaimesi turvassa, koska niiden avulla voit allekirjoittaa kommitteja henkilöllisyytesi kanssa. ssh_helper=Tarvitsetko apua? Tutustu GitHubin oppaaseen omien SSH-avainten luonnista tai yleisistä ongelmista, joita voit kohdata SSH:n kanssa. gpg_helper=Tarvitsetko apua? Katso GitHubin opas GPG:stä. -add_new_key=Lisää SSH avain -add_new_gpg_key=Lisää GPG-avain key_content_ssh_placeholder=Alkaa sanoilla "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com" tai "sk-ssh-ed25519@openssh.com" key_content_gpg_placeholder=Alkaa sanoilla "-----BEGIN PGP PUBLIC KEY BLOCK-----" ssh_key_name_used=SSH-avain samalla nimellä on jo olemassa tililläsi. @@ -833,7 +792,6 @@ gpg_key_verify=Vahvista gpg_token_required=Sinun täytyy antaa allekirjoitus alla olevalle poletille gpg_token=Poletti gpg_token_help=Voit luoda allekirjoituksen käyttäen: -gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=Panssaroitu GPG-allekirjoitus key_signature_gpg_placeholder=Alkaa sanoilla "-----BEGIN PGP SIGNATURE-----" ssh_key_verified=Vahvistettu avain @@ -862,8 +820,6 @@ can_write_info=Kirjoitus show_openid=Näytä profiilissa hide_openid=Piilota profiilista ssh_disabled=SSH on pois käytöstä -manage_social=Hallitse liitettyjä sosiaalisia tilejä - manage_access_token=Pääsypoletit generate_new_token=Luo uusi poletti token_name=Poletin nimi @@ -871,8 +827,6 @@ generate_token=Luo pääsypoletti generate_token_success=Uusi pääsypolettisi on nyt luotu. Kopioi se nyt, koska sitä ei näytetä enää uudelleen. delete_token=Poista access_token_deletion=Poista pääsypoletti -access_token_deletion_cancel_action=Peruuta -access_token_deletion_confirm_action=Poista permission_read=Lue edit_oauth2_application=Muokkaa OAuth2-sovellusta @@ -928,7 +882,6 @@ webauthn_delete_key = Poista turva-avain delete_account_desc = Haluatko varmasti poistaa tämän käyttäjätilin pysyvästi? visibility.public_tooltip = Näkyvissä kaikille pronouns = Pronomini -pronouns_custom = Mukautettu language.title = Oletuskieli webauthn_delete_key_desc = Jos poistat turva-avaimen, et voi enää kirjautua sillä. Jatketaanko? authorized_oauth2_applications = Valtuutetut OAuth2-sovellukset @@ -1002,7 +955,6 @@ oauth2_application_create_description = OAuth2-sovellukset mahdollistavat kolman oauth2_confidential_client = Luottamuksellinen sovellus. Valitse sovelluksille, jotka pitävät salaisuuden luottamuksellisena, kuten web-sovelluksille. Älä valitse natiiveille sovelluksille mukaan lukien työpöytä- ja mobiilisovellukset. ssh_key_deletion_desc = SSH-avaimen poistaminen kumoaa pääsyn tilillesi kyseistä avainta käyttäen. Jatketaanko? add_email_confirmation_sent = Vahvistusviesti on lähetetty osoitteeseen "%s". Vahvista sähköpostiosoitteesi seuraavan %s sisällä. -pronouns_custom_label = Mukautetut pronominit openid_deletion_desc = Tämän OpenID-osoitteen poistaminen tililtäsi estää kirjautumisen sitä käyttäen. Jatketaanko? generate_token_name_duplicate = Nimeä %s on jo käytetty sovelluksen nimenä. Käytä eri nimeä. ssh_signonly = SSH on tällä hetkellä poistettu käytöstä, joten näitä avaimia käytetään vain kommittien allekirjoituksen vahvistamiseen. @@ -1061,7 +1013,6 @@ visibility_helper_forced=Sivuston ylläpitäjä pakottaa uudet tietovarastot ole fork_repo=Forkkaa tietovarasto fork_from=Forkkaa lähteestä fork_visibility_helper=Forkatun tietovaraston näkyvyyttä ei voi muuttaa. -clone_in_vsc=Kloonaa VS Codessa download_zip=Lataa ZIP download_tar=Lataa TAR.GZ repo_desc=Kuvaus @@ -1135,7 +1086,6 @@ branches=Haarat tags=Tagit issues=Ongelmat pulls=Vetopyynnöt -project_board=Projektit packages=Paketit labels=Nimilaput @@ -1183,7 +1133,6 @@ editor.require_signed_commit=Haara vaatii allekirjoitetun kommitin commits.commits=Kommitit commits.nothing_to_compare=Nämä haarat vastaavat toisiaan. -commits.find=Haku commits.search_all=Kaikki haarat commits.author=Tekijä commits.message=Viesti @@ -1210,7 +1159,6 @@ projects.edit=Muokkaa projektia projects.modify=Muokkaa projektia projects.type.basic_kanban=Yksinkertainen kanban projects.template.desc=Mallipohja -projects.type.uncategorized=Luokittelematon projects.column.edit_title=Nimi projects.column.new_title=Nimi projects.open=Avaa @@ -1392,8 +1340,6 @@ pulls.nothing_to_compare=Nämä haarat vastaavat toisiaan. Ei ole tarvetta luoda pulls.nothing_to_compare_and_allow_empty_pr=Nämä haarat vastaavat toisiaan. Vetopyyntö tulee olemaan tyhjä. pulls.has_pull_request=`Vetopyyntö haarojen välillä on jo olemassa: %[2]s#%[3]d` pulls.create=Luo vetopyyntö -pulls.title_desc_few=haluaa yhdistää %[1]d committia lähteestä %[2]s kohteeseen %[3]s -pulls.merged_title_desc_few=yhdistetty %[1]d committia lähteestä %[2]s kohteeseen %[3]s %[4]s pulls.tab_conversation=Keskustelu pulls.tab_commits=Kommitit pulls.tab_files=Muuttuneet tiedostot @@ -1481,10 +1427,6 @@ activity.git_stats_deletion_n=%d poistoa contributors.contribution_type.commits=Kommitit -search=Haku -search.match=Osuma -search.code_no_results=Hakuehtoasi vastaavaa lähdekoodia ei löytynyt. - settings=Asetukset settings.options=Tietovarasto settings.collaboration.admin=Ylläpitäjä @@ -1511,7 +1453,6 @@ settings.enable_timetracker=Ota ajanseuranta käyttöön settings.danger_zone=Vaaravyöhyke settings.new_owner_has_same_repo=Uudella omistajalla on jo samanniminen tietovarasto. Valitse toinen nimi. settings.transfer.title=Siirrä omistajuus -settings.transfer_form_title=Syötä repon nimi vahvistuksena: settings.transfer_notices_3=- Jos tietovarasto on yksityinen ja se siirretään yksittäiselle käyttäjälle, tämä toiminto varmistaa, että käyttäjällä on ainakin lukuoikeudet (ja muuttaa käyttöoikeuksia tarvittaessa). settings.transfer_owner=Uusi omistaja settings.wiki_delete=Poista wikidata @@ -1523,7 +1464,6 @@ settings.delete_desc=Tietovaraston poistaminen on pysyvä, eikä sitä voi perua settings.delete_notices_1=- Tätä toimintoa EI VOI perua myöhemmin. settings.update_settings_success=Tietovaraston asetukset on päivitetty. settings.delete_collaborator=Poista -settings.search_user_placeholder=Etsi käyttäjä… settings.teams=Tiimit settings.add_team=Lisää tiimi settings.add_webhook=Lisää webkoukku @@ -1605,10 +1545,8 @@ settings.deploy_key_deletion_success=Toimitusavain on poistettu. settings.branches=Haarat settings.protected_branch=Haaran suojaus settings.branch_protection=Haaran "%s" suojaussäännöt -settings.protect_this_branch=Ota haaran suojaus käyttöön settings.protect_whitelist_deploy_keys=Lisää toimitusavaimet sallittujen listalle mahdollistaaksesi tietovarastoihin kirjoituksen. settings.protect_whitelist_users=Työntämiseen oikeutettujen käyttäjien lista -settings.protect_whitelist_search_users=Etsi käyttäjiä… settings.protect_merge_whitelist_committers_desc=Salli vain listaan merkittyjen käyttäjien ja tiimien yhdistää vetopyynnöt tähän haaraan. settings.protect_merge_whitelist_users=Yhdistämiseen oikeutettujen käyttäjien lista settings.protect_required_approvals=Vaadittavat hyväksynnät @@ -1969,7 +1907,6 @@ branch.deleted_by = Poistanut %s branch.create_success = Haara "%s" on luotu. branch.delete = Poista haara "%s" release.add_tag = Luo tagi -diff.show_diff_stats = Näytä tilastot settings.rename_branch = Nimeä haara uudelleen settings.rename_branch_success = Haaran %s uudeksi nimeksi asetettiin %s. settings.rename_branch_failed_not_exist = Haaraa %s ei voi nimetä uudelleen, koska sitä ei ole olemassa. @@ -2117,8 +2054,6 @@ reactions_more = ja %d lisää mirror_address = Kloonaa URL-osoitteesta migrate_items_merge_requests = Yhdistämispyynnöt stars_remove_warning = Tämä poistaa kaikki tähdet tästä tietovarastosta. -archive.issue.nocomment = Tämä repo on arkistoitu. Et voi kommentoida ongelmia. -archive.pull.nocomment = Tämä repo on arkistoitu. Et voi kommentoida vetopyyntöjä. settings.webhook_deletion_desc = Webkoukun poistaminen poistaa sen asetukset ja toimitushistorian. Jatketaanko? settings.discord_icon_url.exceeds_max_length = Kuvakkeen URL-osoite voi sisältää enintään 2048 merkkiä settings.event_wiki_desc = Wiki-sivu luotu, nimetty uudelleen, muokattu tai poistettu. @@ -2138,7 +2073,6 @@ settings.webhook.test_delivery_desc = Testaa tätä webkoukkua tekaistulla tapah pulls.switch_comparison_type = Vaihda vertailutyyppiä settings.hooks_desc = Webkoukut tekevät automaattisesti HTTP POST -pyyntöjä palvelimelle, kun jotkin Forgejo-tapahtumat käynnistyvät. Lue lisää webkoukkujen oppaasta. issues.num_participants_one = %d osallistuja -issues.reference_link = Viittaus: %s settings.transfer_desc = Siirrä tämä tietovarasto käyttäjälle tai organisaatiolle, johon sinulla on ylläpito-oikeudet. settings.add_collaborator = Lisää avustaja settings.mirror_settings.push_mirror.none = Työntöpeilejä ei ole määritetty @@ -2531,7 +2465,6 @@ settings.unarchive.error = Tietovaraston arkistointia kumotessa tapahtui virhe. settings.rename_branch_failed_exist = Haaraa ei voi nimetä uudelleen, koska kohdehaara %s on olemassa. release.tag_helper_new = Uusi tagi. Tämä tagi luodaan kohteesta. diff.review = Viimeistele katselmointi -error.broken_git_hook = Tämän tietovaraston Git-koukut vaikuttavat olevan rikki. Seuraa dokumentaation ohjeita korjataksesi koukut, sen jälkeen työnnä kommitteja päivittääksesi tilan. error.csv.unexpected = Tätä tiedostoa ei voi renderöidä, koska se sisältää odottamattoman merkin rivillä %d ja sarakkeessa %d. settings.archive.error = Tietovarastoa arkistoitaessa tapahtui virhe. Katso lisätietoja lokista. diff.comment.add_line_comment = Lisää rivikommentti @@ -2569,8 +2502,6 @@ editor.directory_is_a_file = Hakemiston nimi "%s" on jo käytössä tiedoston ni projects.desc = Hallitse ongelmia ja vetoja projektitauluilla. ext_issues = Ulkoiset ongelmat issues.label_archive_tooltip = Arkistoidut nimilaput on suljettu pois ehdotuksista oletusarvoisesti, kun haku suoritetaan nimilapulla. -issues.ref_reopened_from = `avasi uudelleen tämän ongelman %[4]s %[2]s` -issues.ref_closed_from = `sulki tämän ongelman %[4]s %[2]s` migrate_options_lfs_endpoint.description = Migraatio yrittää käyttää Git-etätietovarastoasi LFS-palvelimen määrittämiseen. Voit määrittää omavalintaisen päätepisteen, jos tietovarastosi LFS-data on talletettu jonnekin muualle. settings.mirror_settings.docs.pull_mirror_instructions = Vetopeilin määrittämiseksi konsultoi: issues.archived_label_description = (Arkistoitu) %s @@ -2656,8 +2587,6 @@ members.invite_now=Kutsu nyt teams.join=Liity teams.leave=Poistu teams.read_access=Lue -teams.read_access_helper=Tiimin jäsenet voivat katsella ja kloonata tiimin varastoja. -teams.write_access_helper=Tiimin jäsenet voivat lukea ja työntää tiimin varastoja/varastoihin. teams.admin_access=Ylläpitopääsy teams.admin_access_helper=Tiimin jäsenet voivat työntää (push) ja vetää (pull) tiimin varastoista/varastoihin ja lisätä avustajia. teams.no_desc=Tällä tiimillä ei ole kuvausta @@ -2670,8 +2599,6 @@ teams.add_team_member=Lisää tiimin jäsen teams.delete_team_title=Poista tiimi teams.delete_team_desc=Tiimin poisto peruuttaa sen jäseniltä oikeuden päästä tiimin tietovarastoihin. Jatketaanko? teams.delete_team_success=Tiimi on poistettu. -teams.read_permission_desc=Tämä tiimi myöntää jäsenille Lue-oikeuden: tiimin jäsenet voivat katsella ja kloonata tiimin tietovarastoja. -teams.write_permission_desc=Tämä tiimi myöntää jäsenille Kirjoita-oikeuden: tiimin jäsenet voivat lukea ja kirjoittaa tiimin tietovarastoihin. teams.admin_permission_desc=Tämä tiimi myöntää Ylläpito-oikeuden: jäsenet voivat lukea tiimin tietovarastoista, työntää ja lisätä avustajia niihin. teams.repositories=Tiimin tietovarastot teams.members.none=Ei jäseniä tässä tiimissä. @@ -2760,7 +2687,6 @@ dashboard.gc_metadata_obtained=Roskienkeruumetatiedot saatu dashboard.other_system_allocation_obtained=Muu järjestestelmän varaus saatu dashboard.next_gc_recycle=Seuraava roskienkeruukierrätys dashboard.last_gc_time=Aika edellisestä roskienkeruusta -dashboard.total_gc_time=Yhteensä GC tauko dashboard.total_gc_pause=Yhteensä roskienkeruutauko dashboard.last_gc_pause=Viimeinen roskienkeruutauko dashboard.gc_times=Roskienkeruuajat @@ -2824,9 +2750,6 @@ repos.repo_manage_panel=Tietovarastojen hallinta repos.owner=Omistaja repos.name=Nimi repos.private=Yksityinen -repos.watches=Tarkkailijat -repos.stars=Tähdet -repos.forks=Haarat repos.issues=Ongelmat repos.size=Koko @@ -2864,7 +2787,6 @@ auths.allowed_domains=Sallitut verkkotunnukset auths.skip_tls_verify=Ohita TLS-vahvistus auths.pam_service_name=PAM-palvelun nimi auths.oauth2_tokenURL=Pääsypoletin URL-osoite -auths.enable_auto_register=Ota käyttöön automaattinen rekisteröinti auths.tips=Vinkit auths.tips.oauth2.general=OAuth2-autentikointi auths.edit=Muokkaa todennuslähdettä @@ -2979,7 +2901,6 @@ notices.type=Tyyppi notices.type_1=Tietovarasto notices.desc=Kuvaus notices.op=Toiminta -auths.sspi_auto_create_users = Luo käyttäjät automaattisesti integrations = Integraatiot emails.change_email_header = Päivitä sähköpostin ominaisuudet emails.change_email_text = Haluatko varmasti päivittää tämän sähköpostiosoitteen? @@ -3021,11 +2942,9 @@ packages.total_size = Koko yhteensä: %s auths.oauth2_provider = OAuth2-palveluntarjoaja auths.tips.gmail_settings = Gmail-asetukset: config.mailer_sendmail_path = Sendmail-polku -auths.sspi_default_language = Käyttäjän oletuskieli config_settings = Asetukset monitor.queue.settings.remove_all_items = Poista kaikki config.skip_tls_verify = Ohita TLS-vahvistus -auths.sspi_auto_activate_users = Aktivoi käyttäjät automaattisesti dashboard.new_version_hint = Forgejo %s on nyt saatavilla. Käytössäsi on %s. Lue lisätietoja blogista. defaulthooks.add_webhook = Lisää oletusarvoinen webkoukku monitor.execute_times = Suoritukset @@ -3453,7 +3372,6 @@ variables.deletion = Poista muuttuja runners.new_notice = Testinajajan aloitusohjeet workflow.dispatch.input_required = Arvo syötteelle "%s" vaadittu. runners.status.active = Aktiivinen -runs.no_workflows.documentation = Katso lisätietoja Forgejo Actions -ohjelmistosta dokumentaatiosta. variables.description = Muuttujat asetetaan tietyille toiminnoille eikä niitä voida lukea muutoin. runners.labels = Nimilaput runners.delete_runner_failed = Testinajajan poisto epäonnistui @@ -3478,7 +3396,6 @@ runners.runner_manage_panel = Hallinnoi testinajajia variables = Muuttujat variables.management = Hallitse muuttujia variables.creation = Lisää muuttuja -runs.no_workflows.quick_start = Etkö tiedä kuinka Forgejo Actions toimii? Katso aloitusohje. runners.new = Luo uusi testinajaja runners.version = Versio runs.expire_log_message = Lokitiedostot on tyhjätty vanhenemisen vuoksi. @@ -3556,13 +3473,10 @@ user_kind = Etsi käyttäjiä… org_kind = Etsi organisaatioita… branch_kind = Etsi haaroja… issue_kind = Etsi ongelmia… -milestone_kind = Etsi merkkipaaluja... pull_kind = Etsi vetoja… commit_kind = Etsi kommitteja… fuzzy = Sumea runner_kind = Etsi ajajia… -code_search_by_git_grep = Nykyiset koodin hakutulokset pohjautuvat komentoon "git grep". Parempia tuloksia on mahdollista saada, jos sivuston ylläpitäjä ottaa käyttöön koodin indeksoijan. - [repo.permissions] code.read = Lue: Pääsy koodiin ja tietovaraston kloonaaminen. diff --git a/options/locale/locale_fil.ini b/options/locale/locale_fil.ini index ed1128ceb6..be52386039 100644 --- a/options/locale/locale_fil.ini +++ b/options/locale/locale_fil.ini @@ -73,19 +73,14 @@ webauthn_error_unknown = May nangyaring hindi alam na error. Magyaring subukan m webauthn_error_unable_to_process = Hindi maproseso ng server ang iyong hiling. webauthn_error_duplicated = Hindi pinapayagan ang security key na ito para sa hiling na ito. Mangyaring siguraduhin na ang key na ito ay hindi ito nakarehistro na. webauthn_error_empty = Kailangan mong maglapat ng pangalan para sa key na ito. -webauthn_reload = I-reload repository = Repositoryo organization = Organisasyon mirror = Salamin -new_repo = Bagong repositoryo -new_migrate = Bagong paglipat new_mirror = Bagong salamin new_fork = Bagong repositoryong fork -new_org = Bagong organisasyon new_project = Bagong proyekto new_project_column = Bagong column admin_panel = Pangangasiwa ng site -account_settings = Mga setting ng Account settings = Mga Setting your_profile = Profile your_starred = Naka-bituin @@ -149,15 +144,10 @@ new_org.title = Bagong organisasyon copy_path = Kopyahin ang path [home] -search_repos = Maghanap ng Repository… switch_dashboard_context = Palitan ang dashboard context show_only_unarchived = Pinapakita lang ang hindi naka-archive -password_holder = Password my_repos = Mga Repositoryo -show_more_repos = Magpakita ng higit pang mga repositoryo… -collaborative_repos = Mga pagtutulungan na repositoryo my_orgs = Mga Organisasyon -my_mirrors = Aking Mga Mirror view_home = Itignan ang %s filter = Iba pang mga filter filter_by_team_repositories = I-filter sa mga repositoryo ng koponan @@ -174,24 +164,12 @@ uname_holder = Username o email address [explore] organizations = Mga Organisasyon -search.fuzzy.tooltip = Isali ang mga resulta na tumutugma sa search term nang malapit repos = Mga Repositoryo users = Mga User -search = Maghanap go_to = Pumunta sa code = Code -search.type.tooltip = Uri ng paghahanap -search.fuzzy = Fuzzy -search.match = Tugma -search.match.tooltip = Isali lamang ang mga resulta na tugma sa eksaktong search term -repo_no_results = Walang tugmang repository na nahanap. -user_no_results = Walang tugmang user na nahanap. -org_no_results = Walang tugmang mga organisasyon na nahanap. -code_search_results = Mga resulta ng paghahanap para sa "%s" code_last_indexed_at = Huling na-index %s relevant_repositories_tooltip = Mga repositoryo na isang fork o walang topic, icon, at deskripsyon ay nakatago. -code_search_unavailable = Kasalukuyang hindi available ang code search. Mangyaring makipag-ugnayan sa site administrator. -code_no_results = Walang source code na tumutugma sa iyong search term na nahanap. relevant_repositories = Ang mga kaugnay na repositoryo ay pinapakita, ipakita ang hindi naka-filter na resulta. stars_few = %d mga bitwin forks_one = %d fork @@ -207,8 +185,6 @@ footer.links = Mga link [error] report_message = Kung naniniwala ka na ito ay isang bug ng Forgejo, mangyaring maghanap ng mga isyu sa Codeberg o magbukas ng bagong isyu kapag kailangan. occurred = May nangyaring error -missing_csrf = Masamang Kahilingan: walang CSRF token -invalid_csrf = Masamang Kahilingan: hindi angkop na CSRF token not_found = Hindi mahanap ang target. network_error = Error sa network server_internal = Panloob na error sa server @@ -331,7 +307,6 @@ app_slogan_helper = Ilagay ang slogan ng iyong instansya. Iwanang walang laman p [heatmap] number_of_contributions_in_the_last_12_months = %s mga kontribusyon sa nakalipas na 12 buwan -no_contributions = Walang mga kontribusyon less = Kaunti more = Marami contributions_one = kontribusyon @@ -384,14 +359,11 @@ license_desc = Kunin ang listahan ng mga ninakaw na password na dating napakita sa mga publikong data breach. Mangyaring subukang muli gamit ng ibang password at isaalang-alang palitan din ang password sa ibang lugar. password_pwned_err = Hindi makumpleto ang request sa HaveIBeenPwned last_admin = Hindi mo matatanggal ang pinakahuling admin. Kailangan may hindi bababa sa isang admin. -tab_signin = Mag-sign In -tab_signup = Mag-sign Up -tab_openid = OpenID hint_register = Kailangan ng account? Magrehistro ngayon. sign_up_button = Magrehistro ngayon. back_to_sign_in = Bumalik sa sign in @@ -482,11 +447,9 @@ admin.new_user.subject = Nag-sign up lang ngayon ang user na si %s admin.new_user.user_info = Impormasyon ng user admin.new_user.text = Mangyaring mag-click dito para ipamahala ang user na ito sa admin panel. register_notify = Maligayang Pagdating sa %s -register_notify.title = %[1]s, maligayang pagdating sa %[2]s register_notify.text_1 = ito ang iyong registration confirmation email para sa %s! register_notify.text_2 = Maaari kang mag-sign in sa iyong account gamit ng iyong username: %s reset_password = I-recover ang iyong account -reset_password.title = %s, nagkaroon kami ng hiling para i-recover ang iyong account reset_password.text = Kung ikaw ito, paki-click ang sumusunod na link para i-recover ang iyong account sa loob ng %s: register_success = Matagumpay ang pag-rehistro issue_assigned.issue = Itinalaga ka ni @%[1]s sa isyu na %[2]s sa repositoryo na %[3]s. @@ -514,9 +477,7 @@ team_invite.text_1 = Inimbitahan ka ni %[1]s para sumali sa koponang %[2]s sa or team_invite.text_2 = Mangyaring i-click ang sumusunod na link para sumali sa koponan: activate_email.text = Mangyaring i-click ang sumusunod na link para i-verify ang iyong email address sa loob ng %s: repo.collaborator.added.text = Idinagdag ka bilang tagatulong sa repositoryo: -activate_email.title = %s, paki-verify ang iyong email address issue.action.reject = Humingi ng mga pagbabago si @%[1]s sa pull request na ito. -activate_account.title = %s, paki-activate ang iyong account register_notify.text_3 = Kung ginawa ng ibang tao ang account na ito para sa iyo, kailangan mong itakda ang iyong password muna. issue_assigned.pull = Itinalaga ka ni @%[1]s sa pull request na %[2]s sa repositoryo na %[3]s. issue.action.push_1 = Nag-push si @%[1]s ng %[3]d commit sa %[2]s @@ -525,7 +486,6 @@ release.new.text = Inilabas ni @%[1]s ang %[2]s sa %[3]s repo.transfer.subject_to = Gusto ni %s na ilipat ang repositoryo na "%s" sa %s team_invite.text_3 = Tandaan: Ang imbitasyong ito ay inilaan para sa %[1]s. Kung hindi mo inaasahan ang imbitasyong ito, maaari mong balewalain ang email na ito. removed_security_key.no_2fa = Wala nang mga ibang paraan ng 2FA ang naka-configure, nangangahulugan na hindi na kailangang mag-log in sa iyong account gamit ang 2FA. -reset_password.text_1 = Ngayon lang napalitan ang password ng iyong account. password_change.subject = Napalitan ang iyong password primary_mail_change.text_1 = Ngayon lang napalitan ang iyong pangunahing mail sa %[1]s. Nangangahulugan ito na ang e-mail address na ito ay hindi na makakatanggap ng mga abiso sa e-mail para sa iyong account. password_change.text_1 = Ngayon lang napalitan ang password ng iyong account. @@ -554,8 +514,6 @@ RepoName = Pangalan ng repositoryo Email = Email address Password = Password Retype = Kumpirmahin ang password -SSHTitle = Pangalan ng SSH key -HttpsUrl = HTTPS URL PayloadUrl = URL ng payload TeamName = Pangalan ng koponan AuthName = Pangalan ng awtorisasyon @@ -565,8 +523,6 @@ CommitMessage = Mensahe ng commit CommitChoice = Pagpili ng commit TreeName = Path ng file Content = Nilalaman -SSPISeparatorReplacement = Pang-hiwalay -SSPIDefaultLanguage = Default na wika CommitSummary = Pangkalahatang-ideya ng commit glob_pattern_error = ` hindi angkop ang glob pattern: %s` require_error = ` hindi maaaring walang laman.` @@ -584,7 +540,6 @@ password_not_match = Hindi tumutugma ang mga password. lang_select_error = Pumili ng wika sa listahan. username_been_taken = Kinuha na ang username. username_change_not_local_user = Ang mga hindi lokal na user ay hindi pinapayagang palitan ang kanilang username. -username_has_not_been_changed = Hindi pinalitan ang username repo_name_been_taken = Ginamit na ang pangalan ng repositoryo. repository_force_private = Naka-enable ang Force Private: hindi maaaring gawing pampubliko ang mga pribadong repositoryo. repository_files_already_exist = Ang mga file ay umiiral na sa repositoryo na ito. Makipag-ugnayan sa tagapangaiswa ng sistema. @@ -671,7 +626,6 @@ block = Harangan unblock = I-unblock user_bio = Byograpya email_visibility.limited = Ang iyong email address ay makikita ng lahat ng mga naka-authenticate na user -email_visibility.private = Makikita mo lang at mga tagapangasiwa ang iyong email address show_on_map = Ipakita ang lugar na ito sa mapa settings = Mga setting ng user form.name_pattern_not_allowed = Ang pattern na "%s" ay hindi pinapayagan sa username. @@ -703,7 +657,6 @@ orgs = Mga organisasyon repos = Mga Repositoryo delete = Burahin ang account twofa = Authentikasyong two-factor (TOTP) -account_link = Mga naka-link na account uid = UID webauthn = Authentikasyong two-factor (Mga security key) blocked_users = Mga hinarang na user @@ -743,14 +696,12 @@ saved_successfully = Matagumpay na na-save ang iyong mga setting. privacy = Privacy keep_activity_private = Itago ang aktibidad mula sa pahina ng profile lookup_avatar_by_mail = Hanapin ang avatar sa pamamagitan ng email address -federated_avatar_lookup = Naka-federate na paghahanap ng avatar enable_custom_avatar = Gumamit ng custom na avatar choose_new_avatar = Pumili ng bagong avatar update_avatar = I-update ang avatar delete_current_avatar = Burahin ang kasalukuyang avatar uploaded_avatar_not_a_image = Ang na-upload na file ay hindi isang larawan. comment_type_group_assignee = Mangangasiwa -social = Mga social account biography_placeholder = Sabihin sa iba ng kaunti tungkol sa iyong sarili! (Sinusuportahan ang Markdown) change_username_prompt = Tandaan: Ang pagpalit ng username ay papalitan din ang URL ng iyong account. organization = Mga Organisasyon @@ -758,11 +709,9 @@ profile_desc = Tungkol sa iyo hidden_comment_types_description = Ang mga uri ng komento na naka-check dito ay hindi ipapakita sa loob ng mga pahina ng isyu. Halimbawa ang pag-check ng "Label" ay tatanggalin lahat ng mga "Idinagdag/tinanggal ni ang
    patungong %[3]s -pulls.title_desc_few = hiniling na isama ang %[1]d mga commit mula sa %[2]s patungong %[3]s issues.review.add_review_request = hiniling ang pagsuri mula kay %[1]s %[2]s pulls.status_checks_details = Mga detalye activity.git_stats_author_n = %d mga may-akda @@ -1820,7 +1743,6 @@ pulls.commit_ref_at = `isinangguni ang hiling sa paghila mula sa isang commit %s wiki.last_commit_info = Binago ni %s ang pahinang ito %s issues.content_history.edited = binago issues.ref_pull_from = `isinangguni ang hiling sa paghila na ito %[3]s %[1]s` -pulls.merged_title_desc_few = isinali ang %[1]d mga commit mula sa %[2]s patungong %[3]s %[4]s settings.org_not_allowed_to_be_collaborator = Hindi maaaring idagdag ang mga organisasyon bilang tagatulong. settings.add_collaborator_success = Naidagdag ang tagatulong. settings.federation_following_repos = Mga URL ng Mga Sinusundang Repositoryo. Hinihiwalay ng ";", walang whitespace. @@ -1839,12 +1761,10 @@ pulls.closed = Sarado ang hiling sa paghila pulls.is_closed = Naisara na ang hiling sa paghila. issues.ref_closing_from = `nagsangguni ang isyu mula sa hiling sa paghila %[3]s na magsasara sa isyu, %[1]s` issues.ref_reopening_from = `nagsangguni ang isyu na ito mula sa hiling sa paghila %[3]s na muling bubukas nito, %[1]s` -issues.ref_closed_from = `isinara ang isyung ito %[4]s%[2]s` issues.review.wait = hiniling sa pagsuri %s issues.review.reject = hinihiling ang mga pagbago %s issues.review.remove_review_request = tinatanggal ang hiling sa pagsuri para sa/kay %[1]s %[2]s pulls.reopen_to_merge = Mangyaring buksan muli ang hiling sa paghila upang gawin ang pagsali. -pulls.merged_title_desc_one = isinali ang %[1]d commit mula%[2]s patungong %[3]s %[4]s pull.deleted_branch = (binura):%s issues.dependency.pr_close_blocks = Hinarang ng hiling sa paghila na ito mula sa pagsara ng mga sumusunod na isyu issues.reference_issue.body = Katawan @@ -1862,15 +1782,11 @@ issues.dependency.issue_no_dependencies = Walang nakatakdang mga dependency. issues.dependency.pr_no_dependencies = Walang nakatakdang mga dependency. issues.due_date_not_set = Walang nakatakdang takdang petsa. issues.due_date_added = dinagdag ang takdang petsa %s %s -issues.error_removing_due_date = Nabigong tanggalin ang takdang petsa. -issues.error_modifying_due_date = Nabigong baguhin ang takdang petsa. issues.due_date_remove = tinanggal ang takdang petsa %s %s issues.due_date_overdue = Overdue na issues.due_date_invalid = Ang takdang petsa ay hindi wasto o wala sa saklaw. Mangyaring gamitin ang format na "yyyy-mm-dd". issues.dependency.title = Mga dependency issues.due_date_form = yyyy-mm-dd -issues.due_date_form_add = Magdagdag ng takdang petsa -issues.due_date_not_writer = Kailangang may write access ka sa repositoryo na ito upang baguhin ang takdang petsa ng isang isyu. issues.due_date_modified = binago ang takdang petsa mula %[2]s sa %[1]s %[3]s issues.due_date = Takdang petsa issues.add_time_sum_to_small = Walang inilagay na oras. @@ -1880,7 +1796,6 @@ subscribe.issue.guest.tooltip = Mag-sign in para mag-subscribe sa isyung ito. issues.time_spent_from_all_authors = `Kabuuang nilaan na oras: %s` issues.start_tracking = Simulan ang pagsubaybay ng oras issues.add_time_history = `dinagdag ang nilaan na oras %s` -issues.invalid_due_date_format = Ang format ng takdang petsa ay dapat "yyyy-mm-dd". subscribe.pull.guest.tooltip = Mag-sign in para mag-subscribe sa hiling sa paghila na ito. issues.edit.already_changed = Hindi maimbak ang mga pagbabago sa isyu. Mukhang nabago na ng ibang tagagamit ang nilalaman. Mangyaring i-refresh ang pahina at subukang baguhin muli upang maiwasang ma-overwrite ang kanilang pagbago signing.wont_sign.not_signed_in = Hindi ka naka-sign in. @@ -1910,7 +1825,6 @@ 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 = itinulak ang -issues.reference_link = Pagsangguni: %s activity.git_stats_pushed_1 = ang itinulak activity.git_stats_commit_n = %d mga commit issues.dependency.add = Magdagdag ng dependency… @@ -1992,7 +1906,6 @@ wiki.wiki_page_revisions = Mga rebisyon ng pahina settings.federation_not_enabled = Hindi naka-enable ang federation sa instansya na ito. pulls.filter_changes_by_commit = I-filter ayon sa commit settings.githooks = Mga Git hook -issues.comment.blocked_by_user = Hindi ka maaaring gumawa ng komento sa isyu na ito dahil hinarang ka ng may-ari ng repositoryo o ng gumawa ng isyu. pulls.view = Tignan ang hiling sa paghila activity.navbar.contributors = Mga contributor activity.navbar.recent_commits = Mga kamakailang commit @@ -2546,7 +2459,6 @@ settings.protected_branch_required_approvals_min = Hindi maaaring negatibo ang m settings.lfs_lock_path = File path na kakandaduhin… settings.lfs_force_unlock = Pilitin ang pag-unlock settings.lfs_pointers.accessible = Naa-access ng user -diff.show_diff_stats = Ipakita ang mga stats release.releases = Mga release settings.protect_merge_whitelist_committers_desc = Payagan lamang ang mga naka-whitelist na user at koponan na magsama ng mga hiling sa paghila sa branch na ito. settings.protect_merge_whitelist_users = Mga naka-whitelist na user para sa pagsasama @@ -2715,7 +2627,6 @@ branch.create_from = mula "%s" settings.archive.branchsettings_unavailable = Hindi available ang mga setting ng branch sa mga naka-archive na repo. diff.file_suppressed = Napigilan ang file diff dahil masyado itong malaki release.deletion_desc = Ang pagbura ng release ay binubura lang sa Forgejo. Hindi nito aapektuhan ang Git tag, ang nilalaman ng repositoryo o ang history nito. Magpatuloy? -error.broken_git_hook = Mukhang sira ang mga Git hook sa repositoryo na ito. Mangyaring sundan ang dokumentasyon para ayusin sila, at magtulak ng mga ilang commit para i-refresh ang status. settings.unarchive.error = May naganap na error habang sinusubukang i-unarchive ang repo. Tignan ang log para sa mga detalye. branch.branch_name_conflict = Sumasalungat ang pangalan ng branch na "%s" sa umiiral na branch na "%s". branch.protected_deletion_failed = Nakaprotekta ang branch na "%s". Hindi ito mabubura. @@ -2765,7 +2676,6 @@ commits.view_single_diff = Tignan ang mga pagbabago sa file na ito na ipinakilal pulls.editable = Nababago pulls.editable_explanation = Pinapayagan ng hiling sa paghila na ito ang mga pagbabago mula sa mga tagapangasiwa. Maaari kang direktang mag-ambag dito. issues.reopen.blocked_by_user = Hindi mo maaaring buksan muli ang isyung ito dahil hinarang ka ng may-ari ng repositoryo o ng may-akda ng isyung ito. -pulls.comment.blocked_by_user = Hindi ka maaaring magkomento sa hiling sa paghila na ito dahil hinarang ka ng may-ari ng repositoryo o ng may-akda ng hiling sa paghila. issues.filter_no_results = Walang mga resulta issues.filter_no_results_placeholder = Subukang ayusin ang iyong mga filter sa paghahanap. migrate.repo_desc_helper = Iwanang walang laman para i-import ang umiiral na paglalarawan @@ -2790,8 +2700,6 @@ search = Maghanap… type_tooltip = Uri ng paghahanap fuzzy = Humigit-kumulang fuzzy_tooltip = Samahan ang mga resulta na tumutugma rin sa search term nang malapit -match = Tugma -match_tooltip = Samahan lang ang mga resulta na tumutugma sa eksaktong search term repo_kind = Maghanap ng mga repo… user_kind = Maghanap ng mga user… org_kind = Maghanap ng mga org… @@ -2803,14 +2711,12 @@ project_kind = Maghanap ng mga proyekto… branch_kind = Maghanap ng mga branch… runner_kind = Maghanap ng mga runner… no_results = Walang mga tumutugma na resulta na nahanap. -code_search_by_git_grep = Ang kasalukuyang mga resulta ng paghahanap ng code ay ibinibigay ng "git grep*. Maaring may mga mas magandang resulta kapag na-enable ng tagapangasiwa ng site ang Indexer ng Repositoryo. pull_kind = Maghanap ng mga paghila… issue_kind = Maghanap ng mga isyu… exact = Eksakto exact_tooltip = Samahan lamang ang mga resulta na tutugma sa eksaktong search term union = Kaugnay union_tooltip = Isama ang mga resulta na tumutugma sa anumang mga nahiwalay ng whitespace na keyword -milestone_kind = Maghanap ng mga milestone… regexp = RegExp regexp_tooltip = Bigyang-kahulugan ang termino para sa paghahanap bilang isang regular na ekspresyon @@ -3214,14 +3120,6 @@ auths.oauth2_required_claim_value = Kinakailangan na claim value auths.oauth2_group_claim_name = Claim name na nagbibigay ng mga group name para sa source. (Opsyonal) auths.oauth2_restricted_group = Group claim value para sa mga pinahihigpitang user (Opsyonal - kinakailangan ang claim name sa itaas) auths.oauth2_map_group_to_team = I-map ang mga claimed groups sa mga koponan ng organisasyon. (Opsyonal, kinakailangan ang claim name sa itaas) -auths.sspi_auto_create_users = Awtomatikong gumawa ng mga user -auths.sspi_auto_create_users_helper = Payagan ang SSPI auth method na awtomatikong gumawa ng mga bagong account para sa mga user na maglo-log in sa unang panahon -auths.sspi_auto_activate_users = Awtomatikong i-activate ang mga user -auths.sspi_auto_activate_users_helper = Payagan ang SSPI auth method na awtomatikong i-activate ang mga bagong user -auths.sspi_strip_domain_names = Tanggalin ang mga domain name sa mga username -auths.sspi_separator_replacement = Separator na gagamitin sa halip ng \, / at @ -auths.sspi_default_language = Default na wika ng user -auths.sspi_default_language_helper = Default na wiki para sa mga user na awtomatikong ginawa ng SSPI auth method. Iwanang walang laman kung gusto mo na ang wika ay awtomatikong ma-detect. auths.tip.oauth2_provider = Tagabigay ng OAuth2 auths.tip.nextcloud = Magrehistro nf bagong OAuth consumer sa iyong instansya gamit ang sumusunod na menu "Settings -> Security -> OAuth 2.0 client" auths.edit = I-edit ang source ng authentikasyon @@ -3289,7 +3187,6 @@ auths.still_in_used = Ginagamit pa ang authentication source. I-convert o burahi monitor.queue.settings.remove_all_items_done = Tinanggal na ang lahat ng mga item sa queue. monitor.queue.settings.changed = Na-update ang mga setting auths.oauth2_map_group_to_team_removal = Tanggalin ang user sa mga naka-synchronize na team kung ang user ay hindi kasama sa katumbas na groupo. -auths.sspi_strip_domain_names_helper = Kung naka-check, ang mga domain name ay tatanggalin sa mga logon name (hal. "STARRY\kita" at "kita@example.org" ay parehong magiging "kita"). config.cache_test_succeeded = Matagumpay ang pagsubok ng cache, nakakuha ng tugon sa %s. config.open_with_editor_app_help = Ang mga "Open with" editor para sa clone menu. Kung iniwang walang laman, ang default ang gagamitin. I-expand para makita ang default. config.set_setting_failed = Nabigo ang pagtakda ng setting na %s @@ -3326,7 +3223,6 @@ config.require_sign_in_view = Kailanganin ang pag-sign in para itignan ang nilal auths.tip.mastodon = Mag-input ng custom na instance URL para sa Mastodon instance na gusto mong mag-authenticate sa (o gamitin ang default) auths.tips.gmail_settings = Mga setting sa Gmail: config.git_max_diff_lines = Pinakamataas na mga linya ng diff bawat file -auths.sspi_separator_replacement_helper = Ang character na gagamitin para palitan ang mga separator ng mga down-level na logon name (hal. ang \ sa "KESSOKUBAND\kita" at ang user principal name (hal. ang @ sa "kita@example.org"). auths.oauth2_required_claim_name_helper = Itakda ang pangalan na ito para i-restrict ang pag-login mula sa source na ito sa mga user na may claim na may pangalan na ito auths.invalid_openIdConnectAutoDiscoveryURL = Hindi wastong Auto Discovery URL (ito ay dapat isang wastong URL na nagsisimula sa http:// o https://) emails.delete_desc = Sigurado ka bang gusto mong burahin ang email address na ito? @@ -3419,12 +3315,10 @@ teams.invite.by = Inimbita ni %s teams.delete_team_title = Burahin ang koponan teams.members.none = Walang mga miyembro sa koponan na ito. teams.remove_all_repos_title = Tanggalin ang lahat ng mga repositoryo ng koponan -teams.read_permission_desc = Ang koponan na ito ay nagbibigay ng read access: ang mga miyembro ay makakatingin at makaka-clone ng mga repositoryo ng koponan. teams.invite.title = Inimbita kang sumali sa koponan na %s sa organisasyon na %s. teams.specific_repositories_helper = Magkakaroon lang ng access ang mga miyembro sa mga repository na tahasang idinagdag sa koponan. Ang pagpili nito ay hindi awtomatikong mag-aalis ng mga repositoryo na naidagdag na kasama ng Lahat ng mga repositoryo. teams.create_repo_permission_desc = Bilang karagdagan, ang koponan na ito ay nagbibigay ng gumawa ng repositoryo na pahintulot: ang mga miyembro ay makakagawa ng mga bagong repositoryo sa organisasyon. teams.general_access = Custom na access -teams.write_permission_desc = Ang koponan na ito ay nagbibigay ng write access: ang mga miyembro ay makakabasa mula at magtulak sa mga repositoryo ng koponan. teams.none_access_helper = Ang "walang access* na opsyon ay may epekto lang sa mga pribadong repositoryo. teams.general_access_helper = Ang mga pahintulot ng mga miyembro ay pagpapasya sa pamamagitan ng talahanayan ng pahintulot sa ibaba. teams.write_access = Baguhin @@ -3637,8 +3531,6 @@ alt.repository.multiple_groups = Available ang package na ito sa iba't ibang gru [actions] runners.last_online = Huling oras na online -runs.no_workflows.quick_start = Hindi alam kung paano magsimula gamit ang Forgejo Actions? Tingnan ang gabay sa mabilis na pagsisimula. -runs.no_workflows.documentation = Para sa higit pang impormasyon tungkol sa Forgejo Actions, tingnan ang Dokumentasyon. status.waiting = Hinihintay runners.task_list.run = Patakbuhin runners.description = Paglalarawan diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 89b1e9907a..2a387b3827 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -49,21 +49,14 @@ webauthn_error_unable_to_process=Le serveur n'a pas pu traiter votre demande. webauthn_error_duplicated=La clé de sécurité n'est pas autorisée pour cette demande. Veuillez vous assurer que la clé n'est pas déjà enregistrée. webauthn_error_empty=Vous devez définir un nom pour cette clé. webauthn_error_timeout=Le délai d'attente imparti a été atteint avant que votre clé ne puisse être lue. Veuillez recharger la page pour réessayer. -webauthn_reload=Recharger - repository=Dépôt organization=Organisation mirror=Miroir -new_repo=Nouveau dépôt -new_migrate=Nouvelle migration new_mirror=Nouveau miroir new_fork=Nouvelle bifurcation -new_org=Nouvelle organisation new_project=Nouveau projet new_project_column=Nouvelle colonne -manage_org=Gérer les organisations admin_panel=Administration du site -account_settings=Paramètres du compte settings=Paramètres your_profile=Profil your_starred=Favoris @@ -217,8 +210,6 @@ string.desc=Z - A [error] occurred=Une erreur s’est produite report_message=Si vous pensez qu'il s'agit d'un bug Forgejo, veuillez consulter les tickets de Codeberg ou ouvrir un nouveau ticket si nécessaire. -missing_csrf=Requête incorrecte : aucun jeton CSRF présent -invalid_csrf=Requête incorrecte : jeton CSRF invalide not_found=La cible n'a pu être trouvée. network_error=Erreur réseau server_internal = Erreur interne du serveur @@ -354,15 +345,10 @@ allow_only_external_registration = Utiliser uniquement l'enregistrement via un s [home] uname_holder=Nom d’utilisateur ou adresse courriel -password_holder=Mot de passe switch_dashboard_context=Basculer le contexte du tableau de bord my_repos=Dépôts -show_more_repos=Afficher plus de dépôts… -collaborative_repos=Dépôts collaboratifs my_orgs=Organisations -my_mirrors=Mes miroirs view_home=Voir %s -search_repos=Trouver un dépôt … filter=Autres filtres filter_by_team_repositories=Dépôts filtrés par équipe feed_of=Flux de « %s » @@ -383,20 +369,8 @@ issues.in_your_repos=Dans vos dépôts repos=Dépôts users=Utilisateurs organizations=Organisations -search=Rechercher go_to=Atteindre code=Code -search.type.tooltip=Type de recherche -search.fuzzy=Approximative -search.fuzzy.tooltip=Inclure également les résultats proches de la recherche -search.match=Exacte -search.match.tooltip=Inclure uniquement les résultats exacts -code_search_unavailable=Actuellement, la recherche de code n'est pas disponible. Veuillez contacter l'administrateur de votre site. -repo_no_results=Aucun dépôt correspondant n'a été trouvé. -user_no_results=Aucun utilisateur correspondant n'a été trouvé. -org_no_results=Aucune organisation correspondante n'a été trouvée. -code_no_results=Aucun code source correspondant à votre terme de recherche n'a été trouvé. -code_search_results=Résultats de la recherche pour « %s » code_last_indexed_at=Dernière indexation %s relevant_repositories_tooltip=Les dépôts qui sont des forks ou qui n'ont aucun sujet, aucune icône et aucune description sont cachés. relevant_repositories=Seuls les dépôts pertinents sont affichés, afficher les résultats non filtrés. @@ -407,16 +381,12 @@ forks_few = %d bifurcations [auth] create_new_account=Créer un compte -register_helper_msg=Déjà enregistré ? Connectez-vous ! -social_register_helper_msg=Déjà inscrit ? Connectez-vous ! disable_register_prompt=Les inscriptions sont désactivées. Veuillez contacter l'administrateur du site. disable_register_mail=La confirmation par courriel à l’inscription est désactivée. manual_activation_only=Contactez l'administrateur de votre site pour terminer l'activation. remember_me=Mémoriser cet appareil -remember_me.compromised = Le jeton de login n'est plus valide ce qui pourrait indiquer une compromission de compte. Veuillez vérifier d'éventuelles activités inhabituelles. forgot_password_title=Mot de passe oublié forgot_password=Mot de passe oublié ? -sign_up_now=Pas de compte ? Inscrivez-vous maintenant. sign_up_successful=Le compte a été créé avec succès. Bienvenue ! confirmation_mail_sent_prompt=Un nouveau mail de confirmation a été envoyé à %s. Pour terminer votre enregistrement, veuillez vérifier votre boîte de réception dans les prochaines %s . Si le courriel est incorrect, vous pouvez vous connecter et demander l'envoi d'un autre courriel de confirmation à une différente adresse. must_change_password=Réinitialisez votre mot de passe @@ -429,7 +399,6 @@ prohibit_login_desc=Votre compte a été suspendu et ne peut interagir avec cett resent_limit_prompt=Désolé, vous avez récemment demandé un courriel d'activation. Veuillez réessayer dans 3 minutes. has_unconfirmed_mail=Bonjour %s, votre adresse courriel (%s) n’a pas été confirmée. Si vous n’avez reçu aucun mail de confirmation ou souhaitez renouveler l’envoi, cliquez sur le bouton ci-dessous. resend_mail=Cliquez ici pour renvoyer un mail de confirmation -email_not_associate=L’adresse courriel n’est associée à aucun compte. send_reset_mail=Envoyer un courriel de récupération du compte reset_password=Récupération du compte invalid_code=Votre code de confirmation est invalide ou a expiré. @@ -446,7 +415,6 @@ twofa_scratch_used=Vous avez utilisé votre code de secours. Vous avez été red twofa_passcode_incorrect=Votre code d’accès n’est pas correct. Si vous avez égaré votre appareil, utilisez votre code de secours pour vous connecter. twofa_scratch_token_incorrect=Votre code de secours est incorrect. login_userpass=Connexion -tab_openid=OpenID oauth_signup_tab=Créer un compte oauth_signup_title=Compléter le nouveau compte oauth_signup_submit=Finaliser la création du compte @@ -472,15 +440,12 @@ authorize_application_description=Si vous accordez l'accès, il sera en mesure d authorize_title=Autoriser "%s" à accéder à votre compte ? authorization_failed=L’autorisation a échoué authorization_failed_desc=L'autorisation a échoué car nous avons détecté une demande incorrecte. Veuillez contacter le responsable de l'application que vous avez essayé d'autoriser. -sspi_auth_failed=Échec de l'authentification SSPI password_pwned=Le mot de passe que vous avez choisi se trouve sur la liste des mots de passe ayant fuité sur internet. Veuillez réessayer avec un mot de passe différent et considérer remplacer ce mot de passe si vous l'utilisez ailleurs. password_pwned_err=Impossible d'envoyer la demande à HaveIBeenPwned change_unconfirmed_email_error = Le courriel %v n'a pu être modifié change_unconfirmed_email = Si vous avez donné un courriel incorrect à l'inscription, vous pouvez le changer ci-dessous. La confirmation sera envoyée à cette nouvelle adresse. change_unconfirmed_email_summary = Modifier l'adresse à laquelle le courriel d'activation est envoyé. last_admin = Vous ne pouvez pas supprimer le dernier compte administrateur. Il doit exister au moins un compte administrateur. -tab_signup = Enregistrement -tab_signin = Connexion hint_register = Besoin d'un compte ? Enregistrez vous. sign_up_button = Creation d'un compte. hint_login = Vous avez déjà un compte ? Connectez vous maintenant ! @@ -496,22 +461,18 @@ link_not_working_do_paste=Le lien ne fonctionne pas ? Essayez de le copier-coll hi_user_x=Bonjour %s, activate_account=Veuillez activer votre compte -activate_account.title=%s, veuillez activer votre compte activate_account.text_1=Bonjour %[1]s, merci de votre inscription chez %[2]s ! activate_account.text_2=Veuillez cliquer sur ce lien pour activer votre compte chez %s : activate_email=Veuillez vérifier votre adresse courriel -activate_email.title=%s, veuillez vérifier votre adresse courriel activate_email.text=Veuillez cliquer sur le lien suivant pour vérifier votre adresse courriel dans %s : register_notify=Bienvenue sur %s -register_notify.title=%[1]s, bienvenue à %[2]s register_notify.text_1=ceci est votre courriel de confirmation d'inscription pour %s ! register_notify.text_2=Vous pouvez maintenant vous connecter avec le nom d'utilisateur : %s register_notify.text_3=Si ce compte a été créé pour vous par une autre personne, veuillez définir votre mot de passe d'abord. reset_password=Récupérer votre compte -reset_password.title=%s, nous avons reçu une demande de récupération de votre compte reset_password.text=Si cela vient de vous, veuillez cliquer sur le lien suivant pour récupérer votre compte dans %s : register_success=Inscription réussie @@ -557,7 +518,6 @@ team_invite.text_3=Remarque : Cette invitation était destinée à %[1]s. Si vou admin.new_user.user_info = Information à propos de l'utilisateur admin.new_user.text = Veuillez cliquer ici afin de gérer l'utilisateur depuis la page d'administration. admin.new_user.subject = L'utilisateur %s vient de créer un compte -reset_password.text_1 = Le mot de passe de votre compte vient d'être modifié. password_change.subject = Votre mot de passe a été modifié password_change.text_1 = Le mot de passe de votre compte vient d'être modifié. primary_mail_change.subject = Votre courriel principal a été modifié @@ -587,8 +547,6 @@ RepoName=Nom du dépôt Email=Courriel Password=Mot de passe Retype=Confirmez le mot de passe -SSHTitle=Nom de la clé SSH -HttpsUrl=URL HTTPS PayloadUrl=URL des données utiles TeamName=Nom de l'équipe AuthName=Nom d'autorisation @@ -601,9 +559,6 @@ CommitChoice=Choix de la révision TreeName=Chemin du fichier Content=Contenu -SSPISeparatorReplacement=Séparateur -SSPIDefaultLanguage=Langue par défaut - require_error=` ne peut être vide.` alpha_dash_error=` ne peut contenir que des caractères alphanumériques, trait d'union « - » et tiret bas « _ ».` alpha_dash_dot_error=` ne peut contenir que des caractères alphanumériques, trait d'union « - », tiret bas « _ » et point « . »` @@ -625,7 +580,6 @@ lang_select_error=Sélectionnez une langue dans la liste. username_been_taken=Le nom d'utilisateur est déjà pris. username_change_not_local_user=Les utilisateurs non-locaux n'ont pas le droit de modifier leur nom d'utilisateur. -username_has_not_been_changed=Le nom d'utilisateur n'a pas été modifié repo_name_been_taken=Ce nom de dépôt est déjà utilisé. repository_force_private=Force Private est activé : les dépôts privés ne peuvent pas être rendus publics. repository_files_already_exist=Les fichiers existent déjà pour ce dépôt. Contactez l'administrateur système. @@ -704,7 +658,6 @@ unfollow=Ne plus suivre user_bio=Biographie disabled_public_activity=Cet utilisateur a désactivé la visibilité publique de l'activité. email_visibility.limited=Votre adresse courriel est visible pour tous les utilisateurs authentifiés -email_visibility.private=Votre adresse courriel n'est visible que pour vous et les administrateurs show_on_map=Afficher ce lieu sur une carte settings=Paramètres utilisateur @@ -739,13 +692,11 @@ password=Mot de passe security=Sécurité avatar=Avatar ssh_gpg_keys=Clés SSH / GPG -social=Réseaux sociaux applications=Applications orgs=Organisations repos=Dépôts delete=Supprimer le compte twofa=Authentification à deux facteurs (TOTP) -account_link=Comptes liés organization=Organisations uid=UID webauthn=Clés de sécurité à deux facteurs @@ -792,10 +743,7 @@ comment_type_group_issue_ref=Référence du ticket saved_successfully=Vos paramètres ont été enregistrés avec succès. privacy=Confidentialité keep_activity_private=Masquer l'activité de la page de profil -keep_activity_private_popup=Rend l'activité visible uniquement pour vous et les administrateurs - lookup_avatar_by_mail=Rechercher un avatar par courriel -federated_avatar_lookup=Recherche d'avatars fédérés enable_custom_avatar=Utiliser un avatar personnalisé choose_new_avatar=Sélectionner un nouvel avatar update_avatar=Appliquer l’avatar @@ -813,7 +761,6 @@ password_incorrect=Le mot de passe actuel est incorrect. change_password_success=Votre mot de passe a été mis à jour. Désormais, connectez-vous avec votre nouveau mot de passe. password_change_disabled=Les mots de passes des comptes utilisateurs externes ne peuvent pas être modifiées depuis l'interface web Forgejo. -emails=Adresses courriels manage_emails=Gérer les adresses courriels manage_themes=Thème par défaut manage_openid=Adresses OpenID @@ -856,8 +803,6 @@ principal_desc=Ces Principaux de certificats SSH sont associés à votre compte gpg_desc=Ces clés GPG sont associées à votre compte et utilisées pour vérifier vos révisions. Conservez les clés privées en lieu sûr, car elles permettent de signer vos révisions. ssh_helper=Besoin d'aide ? Consultez le guide de GitHub pour créer vos propres clés SSH ou résoudre les problèmes courants que vous pourriez rencontrer en utilisant SSH. gpg_helper=Besoin d'aide ? Consultez le guide de GitHub sur GPG. -add_new_key=Ajouter une clé SSH -add_new_gpg_key=Ajouter une clé GPG key_content_ssh_placeholder=Commence par 'ssh-ed25519', 'ssh-rsa', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', 'ecdsa-sha2-nistp521', 'sk-ecdsa-sha2-nistp256@openssh.com' ou par 'sk-ssh-ed25519@openssh.com' key_content_gpg_placeholder=Commence par '-----BEGIN PGP PUBLIC KEY BLOCK-----' add_new_principal=Ajouter le principal @@ -875,7 +820,6 @@ gpg_invalid_token_signature=La clé GPG, la signature et le jeton fournis ne cor gpg_token_required=Vous devez fournir une signature pour le jeton ci-dessous gpg_token=Jeton gpg_token_help=Vous pouvez générer une signature en utilisant : -gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=Signature GPG renforcée key_signature_gpg_placeholder=Commence par "-----BEGIN PGP SIGNATURE-----" verify_gpg_key_success=La clé GPG "%s" a été vérifiée. @@ -922,11 +866,6 @@ hide_openid=Masquer du profil ssh_disabled=SSH est désactivé ssh_signonly=SSH étant désactivé, ces clés ne servent qu'à vérifier la signature des révisions. ssh_externally_managed=Cette clé SSH est gérée de manière externe pour cet utilisateur -manage_social=Gérer les réseaux sociaux associés -social_desc=Ces comptes sociaux peuvent être utilisés pour vous connecter à votre compte. Assurez-vous de les reconnaître tous. -unbind=Dissocier -unbind_success=Le compte social a été supprimé avec succès. - manage_access_token=Jetons d'accès generate_new_token=Générer un nouveau jeton tokens_desc=Ces jetons permettent l'accès à votre compte à travers l'API Forgejo. @@ -936,8 +875,6 @@ generate_token_success=Votre nouveau jeton a été généré. Copiez-le maintena generate_token_name_duplicate=%s a déjà été utilisé comme nom d'application. Veuillez en utiliser un autre. delete_token=Supprimer access_token_deletion=Supprimer le jeton d'accès -access_token_deletion_cancel_action=Annuler -access_token_deletion_confirm_action=Supprimer access_token_deletion_desc=Supprimer un jeton révoquera l'accès à votre compte pour toutes les applications l'utilisant. Cette action est irréversible. Continuer ? delete_token_success=Ce jeton a été supprimé. Les applications l'utilisant n'ont plus accès à votre compte. repo_and_org_access=Accès aux Organisations et Dépôts @@ -1011,7 +948,6 @@ webauthn_alternative_tip=Vous devriez configurer une méthode d’authentificati manage_account_links=Comptes liés manage_account_links_desc=Ces comptes externes sont liés à votre compte Forgejo. -account_links_not_available=Il n'y a pour l'instant pas de compte externe connecté à votre compte Forgejo. link_account=Lier un compte remove_account_link=Supprimer un compte lié remove_account_link_desc=La suppression d'un compte lié révoquera son accès à votre compte Forgejo. Continuer ? @@ -1053,7 +989,6 @@ additional_repo_units_hint_description = Afficher un bouton "Ajouter en plus..." additional_repo_units_hint = Suggérer l'ajout de nouvelles unités pour le dépôt update_hints = Mettre à jour les suggestions update_hints_success = Les suggestions ont été mises à jour. -pronouns_custom = Personnalisés pronouns = Pronoms pronouns_unspecified = Non spécifiés language.title = Langue par défaut @@ -1061,7 +996,6 @@ keep_activity_private.description = Vous seul pourrez voir votre ac language.localization_project = Aidez-nous à traduire Forgejo dans votre langue ! En savoir plus. language.description = Cette langue sera enregistrée dans votre compte et utilisée comme langue par défaut après votre connexion. user_block_yourself = Vous ne pouvez pas vous bloquer vous même. -pronouns_custom_label = Pronoms personnalisés change_username_redirect_prompt.with_cooldown.one = L'ancien pseudonyme sera disponible pour n'importe qui après une période d'%[1]d jour. Vous pouvez toujours réclamer votre ancien pseudonyme pendant cette période. change_username_redirect_prompt.with_cooldown.few = L'ancien pseudonyme sera disponible pour n'importe qui après une période de %[1]d jours. Vous pouvez toujours réclamer votre ancien pseudonyme pendant cette période. quota.rule.exceeded = Dépassé @@ -1118,7 +1052,6 @@ fork_branch=Branche à cloner sur la bifurcation all_branches=Toutes les branches fork_no_valid_owners=Ce dépôt ne peut pas être bifurqué car il n’a pas de propriétaire valide. use_template=Utiliser ce modèle -clone_in_vsc=Cloner dans VS Code download_zip=Télécharger le ZIP download_tar=Télécharger le TAR.GZ download_bundle=Télécharger le BUNDLE @@ -1138,11 +1071,6 @@ readme=LISEZMOI readme_helper=Choisissez un modèle de fichier LISEZMOI readme_helper_desc=Le README est l'endroit idéal pour décrire votre projet et accueillir des contributeurs. auto_init=Initialiser le dépôt -trust_model_helper=Choisissez, parmi les éléments suivants, les règles de confiance des signatures paraphant les révisions : -trust_model_helper_collaborator=Collaborateur : ne se fier qu'aux signatures des collaborateurs du dépôt -trust_model_helper_committer=Auteur : ne se fier qu'aux signatures des auteurs de révisions -trust_model_helper_collaborator_committer=Collaborateur et Auteur : ne se fier qu'aux signatures des auteurs collaborant au dépôt -trust_model_helper_default=Par défaut : valeur configurée par défaut pour cette instance Forgejo create_repo=Créer un dépôt default_branch=Branche par défaut default_branch_label=défaut @@ -1216,9 +1144,6 @@ template.invalid=Vous devez sélectionner un modèle de dépôt archive.title=Ce dépôt est archivé. Vous pouvez voir ses fichiers ou le cloner, mais pas ouvrir de ticket ou de demandes d'ajout, ni soumettre des changements ou des commentaires. archive.title_date=Ce dépôt a été archivé le %s. Vous pouvez voir ses fichiers et le cloner, mais pas ouvrir de ticket ou de demandes d'ajout, ni soumettre de changements ou faire des commentaires. -archive.issue.nocomment=Ce dépôt est archivé. Vous ne pouvez pas commenter de tickets. -archive.pull.nocomment=Ce dépôt est archivé. Vous ne pouvez pas commenter de demande d'ajout. - form.reach_limit_of_creation_1=Vous avez déjà atteint la limite d'%d dépôt. form.reach_limit_of_creation_n=Vous avez déjà atteint la limite de %d dépôts. form.name_reserved=Ce nom de dépôt "%s" est réservé. @@ -1226,7 +1151,6 @@ form.name_pattern_not_allowed=Le motif « %s » n’est pas autorisé dans un need_auth=Autorisation migrate_options=Options de migration -migrate_service=Service de migration migrate_options_mirror_helper=Rendre ce dépôt mirroir migrate_options_lfs=Migrer les fichiers LFS migrate_options_lfs_endpoint.label=Point d'accès LFS @@ -1312,7 +1236,6 @@ branches=Branches tags=Étiquettes issues=Tickets pulls=Demandes d'ajout -project_board=Projets packages=Paquets actions=Actions labels=Labels @@ -1326,7 +1249,6 @@ release=Publications releases=Publications tag=Étiquette released_this=a publié ceci -tagged_this=a étiqueté file.title=%s sur %s file_raw=Brut file_history=Historique @@ -1440,9 +1362,7 @@ commits.desc=Naviguer dans l'historique des modifications. commits.commits=Révisions commits.no_commits=Pas de révisions en commun. "%s" et "%s" ont des historiques entièrement différents. commits.nothing_to_compare=Ces branches sont égales. -commits.search=Rechercher des révisions… commits.search.tooltip=Vous pouvez utiliser les mots-clés "author :", "committer :", "after :", ou "before :" pour filtrer votre recherche, ex. : "revert author :Alice before :2019-01-13". -commits.find=Chercher commits.search_all=Toutes les branches commits.author=Auteur commits.message=Message @@ -1470,8 +1390,6 @@ commitstatus.pending=En attente commitstatus.success=Succès ext_issues=Tickets externes -ext_issues.desc=Lien vers un gestionnaire de tickets externe. - projects=Projets projects.desc=Gérer les tickets et les demandes d’ajouts dans les tableaux de projet. projects.description=Description (facultative) @@ -1493,7 +1411,6 @@ projects.type.basic_kanban=Kanban basique projects.type.bug_triage=Bug à trier projects.template.desc=Modèle projects.template.desc_helper=Sélectionnez un modèle de projet pour débuter -projects.type.uncategorized=Non catégorisé projects.column.edit=Modifier la colonne projects.column.edit_title=Nom projects.column.new_title=Nom @@ -1501,8 +1418,6 @@ projects.column.new_submit=Créer une colonne projects.column.new=Nouvelle colonne projects.column.set_default=Définir par défaut projects.column.set_default_desc=Les tickets et demandes d’ajout non-catégorisés seront placés dans cette colonne -projects.column.unset_default=Défaire par défaut -projects.column.unset_default_desc=Les tickets et demandes d'ajouts non-catégorisés seront placés dans une colonne idoine. projects.column.delete=Supprimer la colonne projects.column.deletion_desc=La suppression d'une colonne de projet déplace tous les tickets liés à la colonne par défaut. Continuer ? projects.column.color=Couleur @@ -1616,7 +1531,6 @@ issues.filter_sort.moststars=Favoris (décroissant) issues.filter_sort.feweststars=Favoris (croissant) issues.filter_sort.mostforks=Bifurcations (décroissant) issues.filter_sort.fewestforks=Bifurcations (croissant) -issues.keyword_search_unavailable=La recherche par mot clé n'est pas disponible. Veuillez contacter l'administrateur de votre instance Forgejo. issues.action_open=Ouvrir issues.action_close=Fermer issues.action_label=Label @@ -1661,11 +1575,8 @@ issues.ref_issue_from=`a fait référence à ce ticket %[3]s issues.ref_pull_from=`a fait référence à cette demande d'ajout %[3]s %[1]s` issues.ref_closing_from=`a fait référence à une demande d'ajout %[3]s qui clora ce ticket, %[1]s` issues.ref_reopening_from=`a référencé ce ticket dans une pull request %[3]s qui va ré-ouvrir ce ticket, %[1]s` -issues.ref_closed_from=`a fermé ce ticket %[4]s %[2]s` -issues.ref_reopened_from=`a rouvert ce ticket %[4]s %[2]s.` issues.ref_from=`de %[1]s` issues.author=Auteur -issues.author_helper=Cet utilisateur est l’auteur. issues.role.owner=Propriétaire issues.role.owner_helper=Cet utilisateur est le propriétaire de ce dépôt. issues.role.member=Membre @@ -1760,18 +1671,13 @@ issues.add_time_sum_to_small=Aucun minuteur n'a été saisi. issues.time_spent_total=Temps passé total issues.time_spent_from_all_authors=`Temps passé total : %s` issues.due_date=Échéance -issues.invalid_due_date_format=Le format de la date d'échéance est invalide, il doit être comme suit "aaaa-mm-jj". -issues.error_modifying_due_date=Impossible de modifier l'échéance. -issues.error_removing_due_date=Impossible de supprimer l'échéance. issues.push_commit_1=a ajouté %d révision %s issues.push_commits_n=a ajouté %d révisions %s issues.force_push_codes=`a forcé %[1]s de %[2]s %[8]s à %[4]s %[9]s %[6]s.` issues.force_push_compare=Comparer issues.due_date_form=aaaa-mm-jj -issues.due_date_form_add=Ajouter une échéance issues.due_date_form_edit=Éditer issues.due_date_form_remove=Supprimer -issues.due_date_not_writer=Vous avez besoin d’un accès en écriture à ce dépôt pour modifier l’échéance de ses tickets. issues.due_date_not_set=Aucune échéance n'a été définie. issues.due_date_added=a ajouté l'échéance %s %s issues.due_date_modified=a modifié l'échéance de %[2]s à %[1]s %[3]s @@ -1824,7 +1730,6 @@ issues.review.remove_review_request=demande d’évaluation retirée pour %[1]s issues.review.remove_review_request_self=a refusé d’évaluer cette demande d’ajout %s issues.review.pending=En attente issues.review.pending.tooltip=Ce commentaire n'est pas encore visible par les autres utilisateurs. Pour soumettre vos commentaires en attente, sélectionnez "%s" → "%s/%s/%s" en haut de la page. -issues.review.review=Évaluation issues.review.reviewers=Évaluateurs issues.review.outdated=Périmé issues.review.outdated_description=Le contenu a changé depuis que ce commentaire a été fait @@ -1837,7 +1742,6 @@ issues.review.hide_resolved=Réduire issues.review.resolve_conversation=Clore la conversation issues.review.un_resolve_conversation=Rouvrir la conversation issues.review.resolved_by=a marqué cette conversation comme résolue -issues.assignee.error=Tous les assignés n'ont pas été ajoutés en raison d'une erreur inattendue. issues.reference_issue.body=Corps issues.content_history.deleted=a supprimé issues.content_history.edited=a édité @@ -1845,8 +1749,6 @@ issues.content_history.created=a créé issues.content_history.delete_from_history=Supprimer de l’historique issues.content_history.delete_from_history_confirm=Supprimer de l’historique ? issues.content_history.options=Options -issues.reference_link=Référence : %s - compare.compare_base=base compare.compare_head=comparer @@ -1880,8 +1782,6 @@ pulls.nothing_to_compare=Ces branches sont identiques. Il n’y a pas besoin de pulls.nothing_to_compare_and_allow_empty_pr=Ces branches sont égales. Cette demande d'ajout sera vide. pulls.has_pull_request='Il existe déjà une demande d'ajout entre ces deux branches : %[2]s#%[3]d' pulls.create=Créer une demande d'ajout -pulls.title_desc_few=souhaite fusionner %[1]d révision(s) depuis %[2]s vers %[3]s -pulls.merged_title_desc_few=a fusionné %[1]d révision(s) à partir de %[2]s vers %[3]s %[4]s pulls.change_target_branch_at=`a remplacée la branche cible %s par %s %s` pulls.tab_conversation=Discussion pulls.tab_commits=Révisions @@ -2042,8 +1942,6 @@ signing.wont_sign.approved=La fusion ne sera pas signée car la demande d'ajout signing.wont_sign.not_signed_in=Vous n'êtes pas connecté. ext_wiki=Wiki externe -ext_wiki.desc=Lier un wiki externe. - wiki=Wiki wiki.welcome=Bienvenue sur le wiki. wiki.welcome_desc=Le wiki vous permet d'écrire ou de partager de la documentation avec vos collaborateurs. @@ -2142,17 +2040,6 @@ contributors.contribution_type.filter_label = Type de contributeur : contributors.contribution_type.commits = Commits contributors.contribution_type.additions = Ajouts contributors.contribution_type.deletions = Suppressions -search=Chercher -search.search_repo=Rechercher dans le dépôt -search.type.tooltip=Type de recherche -search.fuzzy=Approximative -search.fuzzy.tooltip=Inclure également les résultats proches de la recherche -search.match=Exacte -search.match.tooltip=Inclure uniquement les résultats exacts -search.results=Résultats de la recherche « %s » dans %s -search.code_no_results=Aucun code source correspondant à votre terme de recherche n'a été trouvé. -search.code_search_unavailable=Actuellement, la recherche de code n'est pas disponible. Veuillez contacter l'administrateur de votre site. - settings=Paramètres settings.desc=Les paramètres sont l'endroit où gérer les options du dépôt settings.options=Dépôt @@ -2259,7 +2146,6 @@ settings.transfer_abort=Annuler le transfert settings.transfer_abort_invalid=Vous ne pouvez pas annuler un transfert de dépôt inexistant. settings.transfer_abort_success=Le transfert du dépôt vers %s a bien été stoppé. settings.transfer_desc=Transférer ce dépôt à un autre utilisateur ou une organisation dont vous possédez des droits d'administrateur. -settings.transfer_form_title=Entrez le nom du dépôt pour confirmer : settings.transfer_in_progress=Il y a actuellement un transfert en cours. Veuillez l'annuler si vous souhaitez transférer ce dépôt à un autre utilisateur. settings.transfer_notices_1=- Vous perdrez l'accès à ce dépôt si vous le transférez à un autre utilisateur. settings.transfer_notices_2=- Vous conserverez l'accès à ce dépôt si vous le transférez à une organisation dont vous êtes (co-)propriétaire. @@ -2304,7 +2190,6 @@ settings.delete_collaborator=Supprimer settings.collaborator_deletion=Supprimer le collaborateur settings.collaborator_deletion_desc=La suppression d'un collaborateur révoque son accès à ce dépôt. Continuer ? settings.remove_collaborator_success=Le collaborateur a été retiré. -settings.search_user_placeholder=Rechercher un utilisateur… settings.org_not_allowed_to_be_collaborator=Les organisations ne peuvent être ajoutées en tant que collaborateur. settings.change_team_access_not_allowed=La modification de l'accès de l'équipe au dépôt a été limitée au propriétaire de l'organisation settings.team_not_in_organization=L'équipe n'est pas dans la même organisation que le dépôt @@ -2312,7 +2197,6 @@ settings.teams=Équipes settings.add_team=Ajouter une équipe settings.add_team_duplicate=L'équipe a déjà le dépôt settings.add_team_success=L'équipe a maintenant accès au dépôt. -settings.search_team=Rechercher une équipe… settings.change_team_permission_tip=La permission de l'équipe est définie sur la page de configuration de l'équipe et ne peut pas être modifiée par dépôt settings.delete_team_tip=Cette équipe a accès à tous les dépôts et ne peut pas être supprimée settings.remove_team_success=L'accès de l'équipe au dépôt a été supprimé. @@ -2450,12 +2334,7 @@ settings.branches=Branches settings.protected_branch=Protection de branche settings.protected_branch.save_rule=Enregistrer la règle settings.protected_branch.delete_rule=Supprimer la règle -settings.protected_branch_can_push=Autoriser la soumission ? -settings.protected_branch_can_push_yes=Vous pouvez pousser -settings.protected_branch_can_push_no=Vous ne pouvez pas pousser settings.branch_protection=Paramètres de protection pour les branches du motif "%s" -settings.protect_this_branch=Activer la protection de branche -settings.protect_this_branch_desc=Empêche les suppressions et limite les poussées et fusions sur cette branche. settings.protect_disable_push=Désactiver la soumission (push) settings.protect_disable_push_desc=Aucune soumission ne sera possible sur cette branche. settings.protect_enable_push=Activer la soumission (push) @@ -2466,9 +2345,7 @@ settings.protect_whitelist_committers=Liste blanche des soumissions (push) settings.protect_whitelist_committers_desc=Seuls les utilisateurs ou les équipes autorisés pourront soumettre sur cette branche (sans forcer). settings.protect_whitelist_deploy_keys=Mettez les clés de déploiement sur liste blanche avec accès en écriture pour soumettre. settings.protect_whitelist_users=Utilisateurs sur liste blanche pour pousser -settings.protect_whitelist_search_users=Rechercher des utilisateurs… settings.protect_whitelist_teams=Équipes sur liste blanche pour pousser -settings.protect_whitelist_search_teams=Rechercher des équipes… settings.protect_merge_whitelist_committers=Activer la liste blanche pour la fusion settings.protect_merge_whitelist_committers_desc=N'autoriser que les utilisateurs et les équipes en liste blanche d'appliquer les demandes de fusion sur cette branche. settings.protect_merge_whitelist_users=Utilisateurs en liste blanche pour fusionner @@ -2500,8 +2377,6 @@ settings.protect_protected_file_patterns=Motifs de fichiers protégés (séparé settings.protect_protected_file_patterns_desc=Les fichiers protégés ne peuvent être modifiés, même si l'utilisateur a le droit d'ajouter, éditer ou supprimer des fichiers dans cette branche. Plusieurs motifs peuvent être séparés par un point-virgule (";"). Veuillez voir %[2]s la documentation pour la syntaxe des motifs. Exemples : .drone.yml, /docs/**/*.txt. settings.protect_unprotected_file_patterns=Motifs de fichiers non protégés (séparés par un point virgule ";") settings.protect_unprotected_file_patterns_desc=Les fichiers non-protégés qui peuvent être modifiés si l'utilisateur a le droit d'écriture, prenant le pas sur les restrictions de push. Plusieurs motifs peuvent être séparés par un point-virgule (";"). Veuillez voir %[2]s la documentation pour la syntaxe des motifs. Exemples : .drone.yml, /docs/**/*.txt. -settings.add_protected_branch=Activer la protection -settings.delete_protected_branch=Désactiver la protection settings.update_protect_branch_success=La règle de protection de branche "%s" a été mise à jour. settings.remove_protected_branch_success=La règle de protection de branche "%s" a été retirée. settings.remove_protected_branch_failed=Impossible de retirer la règle de protection de branche "%s". @@ -2581,8 +2456,6 @@ settings.lfs_pointers.associateAccessible=Associer %d OID accessibles settings.rename_branch_failed_exist=Impossible de renommer la branche car la branche %s existe déjà. settings.rename_branch_failed_not_exist=Impossible de renommer la branche %s car elle n’existe pas. settings.rename_branch_success=La branche %s à été renommée avec succès en %s. -settings.rename_branch_from=ancien nom de la branche -settings.rename_branch_to=nouveau nom de la branche settings.rename_branch=Renommer la branche diff.browse_source=Parcourir la source @@ -2591,7 +2464,6 @@ diff.commit=révision diff.git-notes=Notes diff.data_not_available=Contenu de la comparaison (diff) indisponible diff.options_button=Option de comparaison (diff) -diff.show_diff_stats=Voir les statistiques diff.download_patch=Télécharger le patch en tant que fichier diff.download_diff=Télécharger le fichier diff diff.show_split_view=Vue séparée @@ -2684,7 +2556,6 @@ release.tag_name_invalid=Le nom de l'étiquette est invalide. release.tag_name_protected=Ce nom d'étiquette est protégé. release.tag_already_exist=Ce nom d'étiquette existe déjà. release.downloads=Téléchargements -release.download_count=Télécharger: %s release.add_tag_msg=Utiliser le titre et le contenu de la publication comme message d’étiquette. release.add_tag=Créer l'étiquette release.releases_for=Publications pour %s @@ -2713,14 +2584,12 @@ branch.default_deletion_failed=La branche "%s" est la branche par défaut. Elle branch.restore=Restaurer la branche "%s" branch.download=Télécharger la branche "%s" branch.rename=Renommer la branche "%s" -branch.search=Rechercher une branche branch.included_desc=Cette branche fait partie de la branche par défaut branch.included=Incluses branch.create_new_branch=Créer une branche à partir de la branche : branch.confirm_create_branch=Créer une branche branch.warning_rename_default_branch=Vous renommez la branche par défaut. branch.rename_branch_to=Renommer "%s" en : -branch.confirm_rename_branch=Renommer la branche branch.create_branch_operation=Créer une branche branch.new_branch=Créer une nouvelle branche branch.new_branch_from=`Créer une nouvelle branche à partir de "%s"` @@ -2750,11 +2619,9 @@ admin.flags_replaced = Drapeaux du dépôt remplacés rss.must_be_on_branch = Vous devez vous trouver sur une branche pour obtenir un flux RSS. admin.manage_flags = Gérer les drapeaux admin.enabled_flags = Drapeaux actifs pour le dépôt : -clone_in_vscodium = Clone dans VSCodium object_format_helper = Format des objets d'un dépôt. Ne peut pas être changé. SHA1 est le plus compatible. object_format = Format de l'objet migrate.forgejo.description = Migrer les données depuis codeberg.org ou une autre instance Forgejo. -issues.comment.blocked_by_user = Vous ne pouvez pas créer un commentaire sur ce ticket car vous avez été bloqué par le propriétaire du dépôt ou l'auteur du ticket. editor.invalid_commit_mail = Courriel invalide pour la création d'un commit. commits.browse_further = Continuer la navigation commits.renamed_from = Renommé depuis %s @@ -2786,11 +2653,8 @@ pulls.made_using_agit = AGit activity.navbar.code_frequency = Fréquence de code activity.navbar.recent_commits = Commits récents file_follow = Suivre le lien symbolique -error.broken_git_hook = Les hooks Git de ce dépôt semblent cassés. Référez vous à la documentation pour les réparer, puis poussez des commits pour mettre à jour le statut. settings.confirmation_string = Chaine de confirmation pulls.agit_explanation = Créé par le workflow AGit. AGit permet aux contributeurs de proposer des modifications en utilisant "git push" sans créer une bifurcation ou une nouvelle branche. -pulls.merged_title_desc_one = fusionné %[1]d commit depuis %[2]s vers %[3]s %[4]s -pulls.title_desc_one = veut fusionner %[1]d commit depuis %[2]s vers %[3]s stars = Étoiles n_tag_few = %s étiquettes editor.commit_id_not_matching = Le fichier a été modifié pendant que vous l'éditiez. Appliquez les modifications à une nouvelle branche puis procédez à la fusion. @@ -2811,7 +2675,6 @@ size_format = %[1]s : %[2]s, %[3]s : %[4]s ; %[3]s : %[4]s settings.sourcehut_builds.visibility = Visibilité du job settings.sourcehut_builds.secrets = Secrets settings.sourcehut_builds.manifest_path = Chemin du manifest de build -settings.sourcehut_builds.graphql_url = URL GraphQL (e.g. https://builds.sr.ht/query) release.download_count_one = %s téléchargement release.download_count_few = %s téléchargements release.system_generated = Cet attachement a été généré automatiquement. @@ -3016,9 +2879,7 @@ teams.none_access_helper=L'option "Aucun accès" n'a pas d'effet sur les dépôt teams.general_access=Accès personnalisé teams.general_access_helper=Les permissions des membres seront déterminées par la table des permissions ci-dessous. teams.read_access=Lecture -teams.read_access_helper=Les membres peuvent voir et cloner les dépôts de l'équipe. teams.write_access=Écriture -teams.write_access_helper=Les membres peuvent voir et pousser dans les dépôts de l'équipe. teams.admin_access=Accès administrateur teams.admin_access_helper=Les membres peuvent tirer et pousser des modifications vers les dépôts de l'équipe, et y ajouter des collaborateurs. teams.no_desc=Aucune description @@ -3033,12 +2894,9 @@ teams.invite_team_member.list=Invitations en attente teams.delete_team_title=Supprimer l'équipe teams.delete_team_desc=Supprimer une équipe supprime l'accès aux dépôts à ses membres. Continuer ? teams.delete_team_success=L’équipe a été supprimée. -teams.read_permission_desc=Cette équipe permet l'accès en lecture : les membres peuvent voir et dupliquer ses dépôts. -teams.write_permission_desc=Cette équipe permet l'accès en écriture : les membres peuvent participer à ses dépôts. teams.admin_permission_desc=Cette équipe permet l'accès administrateur : les membres peuvent voir, participer et ajouter des collaborateurs à ses dépôts. teams.create_repo_permission_desc=De plus, cette équipe accorde la permission Créer un dépôt : les membres peuvent créer de nouveaux dépôts dans l'organisation. teams.repositories=Dépôts de l'équipe -teams.search_repo_placeholder=Rechercher dans le dépôt… teams.remove_all_repos_title=Supprimer tous les dépôts de l'équipe teams.remove_all_repos_desc=Ceci supprimera tous les dépôts de l'équipe. teams.add_all_repos_title=Ajouter tous les dépôts @@ -3051,9 +2909,6 @@ teams.specific_repositories=Dépôts spécifiques teams.specific_repositories_helper=Les membres auront seulement accès aux dépôts explicitement ajoutés à l'équipe. Sélectionner ceci ne supprimera pas automatiquement les dépôts déjà ajoutés avec Tous les dépôts. teams.all_repositories=Tous les dépôts teams.all_repositories_helper=L'équipe a accès à tous les dépôts. Sélectionner ceci ajoutera tous les dépôts existants à l'équipe. -teams.all_repositories_read_permission_desc=Cette équipe accorde l'accès en lecture à tous les dépôts : les membres peuvent voir et cloner les dépôts. -teams.all_repositories_write_permission_desc=Cette équipe accorde l'accès en écriture à tous les dépôts : les membres peuvent lire et écrire dans les dépôts. -teams.all_repositories_admin_permission_desc=Cette équipe accorde l'accès administrateur à tous les dépôts : les membres peuvent lire, écrire dans et ajouter des collaborateurs aux dépôts. teams.invite.title=Vous avez été invité à rejoindre l'équipe %s dans l'organisation %s. teams.invite.by=Invité par %s teams.invite.description=Veuillez cliquer sur le bouton ci-dessous pour rejoindre l’équipe. @@ -3151,7 +3006,6 @@ dashboard.gc_metadata_obtained=Métadonnées GC obtenues dashboard.other_system_allocation_obtained=Autres allocation système obtenue dashboard.next_gc_recycle=Prochain recyclage GC dashboard.last_gc_time=Temps depuis le dernier GC -dashboard.total_gc_time=Pause GC dashboard.total_gc_pause=Pause totale GC dashboard.last_gc_pause=Dernière pause GC dashboard.gc_times=Nombres de GC @@ -3251,9 +3105,6 @@ repos.unadopted.no_more=Aucun dépôt candidat à l'adoption n'a été trouvé. repos.owner=Propriétaire repos.name=Nom repos.private=Privé -repos.watches=Suivi par -repos.stars=Votes -repos.forks=Bifurcations repos.issues=Tickets repos.size=Taille repos.lfs_size=Taille LFS @@ -3358,17 +3209,6 @@ auths.oauth2_admin_group=Valeur de réclamation de groupe pour les administrateu auths.oauth2_restricted_group=Valeur de réclamation de groupe pour les utilisateurs restreints. (Optionnel, nécessite un nom de réclamation) auths.oauth2_map_group_to_team=Associe les groupes réclamés avec les équipes de l'organisation. (Optionnel, nécessite un nom de réclamation) auths.oauth2_map_group_to_team_removal=Supprimer les utilisateurs des équipes synchronisées si l'utilisateur n'appartient pas au groupe correspondant. -auths.enable_auto_register=Connexion Automatique -auths.sspi_auto_create_users=Créer automatiquement des utilisateurs -auths.sspi_auto_create_users_helper=Autoriser la méthode d'authentification SSPI à créer automatiquement de nouveaux comptes pour les utilisateurs qui se connectent pour la première fois -auths.sspi_auto_activate_users=Activer automatiquement les utilisateurs -auths.sspi_auto_activate_users_helper=Autoriser la méthode d'authentification SSPI à activer automatiquement les nouveaux utilisateurs -auths.sspi_strip_domain_names=Supprimer les noms de domaine des utilisateurs -auths.sspi_strip_domain_names_helper=Si cette case est cochée, les noms de domaine seront supprimés des noms de connexion (par exemple "DOMAIN\user" et "user@example.org" ne deviendront que "user"). -auths.sspi_separator_replacement=Séparateur à utiliser au lieu de \, / et @ -auths.sspi_separator_replacement_helper=Le caractère à utiliser pour remplacer les séparateurs des noms de connexion au niveau inférieur (par ex. le \ dans "DOMAIN\user") et les noms principaux de l'utilisateur (par exemple le @ dans "user@example.org"). -auths.sspi_default_language=Langue par défaut de l'utilisateur -auths.sspi_default_language_helper=Langue par défaut pour les utilisateurs créés automatiquement par la méthode d'authentification SSPI. Laissez vide si vous préférez que la langue soit déterminée automatiquement. auths.tips=Conseils auths.tips.oauth2.general=Authentification OAuth2 auths.tips.oauth2.general.tip=Lors de l'enregistrement d'une nouvelle authentification OAuth2, l'URL de rappel/redirection doit être : @@ -3378,7 +3218,6 @@ auths.tip.nextcloud=`Enregistrez un nouveau consommateur OAuth sur votre instanc auths.tip.dropbox=Créez une nouvelle application sur %s auths.tip.facebook=`Enregistrez une nouvelle application sur %s et ajoutez le produit "Facebook Login"` auths.tip.github=Créez une nouvelle application OAuth sur %s -auths.tip.gitlab=Créez une nouvelle application sur https://gitlab.com/profile/applications auths.tip.google_plus=Obtenez des identifiants OAuth2 sur la console API de Google (%s) auths.tip.openid_connect=Utilisez l'URL de découvert OpenID (/.well-known/openid-configuration) pour spécifier les points d'accès auths.tip.twitter=Rendez-vous sur %s, créez une application et assurez-vous que l'option "Autoriser l'application à être utilisée avec Twitter Connect" est activée @@ -3966,8 +3805,6 @@ runs.actors_no_select=Tous les acteurs runs.status_no_select=Touts les statuts runs.no_results=Aucun résultat correspondant. runs.no_workflows=Il n'y a pas encore de workflows. -runs.no_workflows.quick_start = Vous ne savez pas comment commencer avec Forgejo Action ? Consultez le guide de démarrage rapide. -runs.no_workflows.documentation = Pour plus d’informations sur Forgejo Actions, voir la documentation. runs.no_runs=Le flux de travail n'a pas encore d'exécution. runs.empty_commit_message=(message de révision vide) @@ -4029,13 +3866,10 @@ submodule=Sous-module search = Rechercher… type_tooltip = Type de recherche fuzzy = Approximatif -code_search_by_git_grep = Les résultats de recherche dans le code sont fournis par "git grep". Les résultats pourraient être plus pertinents si l'administrateur du site active les indexeurs de code source. runner_kind = Chercher les runners… no_results = Aucun résultat n'a été trouvé. keyword_search_unavailable = La recherche par mot-clé n'est pas disponible actuellement. Veuillez contacter l'administrateur du site. fuzzy_tooltip = Inclure les résultats proches des termes recherchés -match = Correspondance -match_tooltip = Uniquement inclure les résultats correspondant exactement aux termes recherchés repo_kind = Chercher dans les dépôts… user_kind = Chercher les utilisateurs… org_kind = Chercher les organisations… @@ -4052,7 +3886,6 @@ issue_kind = Rechercher dans les tickets… union = Union union_tooltip = Inclus les résultats contenant au moins un des mots clé séparés par des espaces pull_kind = Rechercher dans les demande d'ajout… -milestone_kind = Recherche dans les jalons... regexp_tooltip = Interpréter le terme de recherche comme une expression régulière regexp = RegExp diff --git a/options/locale/locale_ga-IE.ini b/options/locale/locale_ga-IE.ini index 1d7414a0d8..f4595d3aef 100644 --- a/options/locale/locale_ga-IE.ini +++ b/options/locale/locale_ga-IE.ini @@ -419,8 +419,6 @@ CommitMessage = Tiomantas teachtaireacht CommitChoice = Rogha tiomanta TreeName = Cosán comhaid Content = Ábhar -SSPISeparatorReplacement = Deighilteoir -SSPIDefaultLanguage = Teanga Réamhshocraithe require_error = ` ní féidir a bheith folamh.` git_ref_name_error = ` caithfidh gur ainm tagartha Git dea-chruthaithe é.` size_error = ` ní mór méid %s.` @@ -1224,8 +1222,6 @@ issues.reopened_at = `athoscail an t-eagrán seo %s` issues.commit_ref_at = `rinne tagairt don cheist seo ó ghealltanas %s` issues.ref_issue_from = `rinne dagairt don cheist seo %[3]s %[1]s` issues.ref_pull_from = `rinne dagairt don iarratas tarraingthe seo %[3]s %[1]s` -issues.ref_closed_from = `dhún an cheist seo %[4]s %[2]s` -issues.ref_reopened_from = `d'athoscail an eagrán seo %[4]s %[2]s` issues.ref_from = `ó %[1]s` issues.author = Údar issues.role.owner = Úinéir @@ -1356,7 +1352,6 @@ issues.content_history.created = cruthaithe issues.content_history.delete_from_history = Scrios ón stair issues.content_history.delete_from_history_confirm = Scrios ón stair? issues.content_history.options = Roghanna -issues.reference_link = Tagairt: %s compare.compare_base = bonn compare.compare_head = déan comparáid pulls.desc = Cumasaigh iarratais tarraingthe agus athbhreithnithe cód. @@ -2104,7 +2099,6 @@ find_file.no_matching = Níl aon chomhad meaitseála le fáil error.csv.too_large = Ní féidir an comhad seo a rinneadh toisc go bhfuil sé ró-mhór. error.csv.unexpected = Ní féidir an comhad seo a rindreáil toisc go bhfuil carachtar ann gan súil leis i líne %d agus i gcolún %d. error.csv.invalid_field_count = Ní féidir an comhad seo a rindreáil toisc go bhfuil líon mícheart réimsí i líne %d. -error.broken_git_hook = Is cosúil go bhfuil crúcaí git den stór seo briste. Lean an doiciméadúchán chun iad a cheartú, ansin brúigh roinnt gealltanas chun an stádas a athnuachan. [graphs] component_loading = Á lódáil %s... @@ -2200,8 +2194,6 @@ teams.invite_team_member.list = Cuirí ar Feitheamh teams.delete_team_title = Scrios Foireann teams.delete_team_desc = Cúlghairtear rochtain stórais óna baill a scriosadh foirne. Lean ar aghaidh? teams.delete_team_success = Tá an fhoireann scriosta. -teams.read_permission_desc = Deonaíonn an fhoireann seo rochtain Léamh: is féidir le baill stórtha foirne a fheiceáil agus a chlónáil. -teams.write_permission_desc = Tugann an fhoireann seo rochtain do Scríobh: is féidir le baill léamh ó stórtha foirne agus iad a bhrú chucu. teams.create_repo_permission_desc = Ina theannta sin, tugann an fhoireann seo cead Cruthaigh Stóras: is féidir le baill stórtha nua a chruthú san eagraíocht. teams.repositories = Stórais Foirne teams.remove_all_repos_title = Bain gach stórais foirne @@ -2466,16 +2458,6 @@ auths.oauth2_admin_group = Luach Éilimh Grúpa d'úsáideoirí riarthóra. (Rog auths.oauth2_restricted_group = Luach Éilimh Grúpa d'úsáideoirí srianta. (Roghnach - teastaíonn ainm éilimh thuas) auths.oauth2_map_group_to_team = Map mhaígh grúpaí chuig foirne Eagraíochta. (Roghnach - éilíonn ainm an éilimh thuas) auths.oauth2_map_group_to_team_removal = Bain úsáideoirí ó fhoirne sioncronaithe mura mbaineann an t-úsáideoir leis an ngrúpa comhfhreagrach. -auths.sspi_auto_create_users = Cruthaigh úsáideoirí go huathoibríoch -auths.sspi_auto_create_users_helper = Lig do mhodh auth SSPI cuntais nua a chruthú go huathoibríoch d'úsáideoirí a logálann isteach den chéad uair -auths.sspi_auto_activate_users = Gníomhachtaigh úsáideoirí go huathoibríoch -auths.sspi_auto_activate_users_helper = Lig modh auth SSPI úsáideoirí nua a ghníomhachtú go huathoibríoch -auths.sspi_strip_domain_names = Bain ainmneacha fearann ó ainm úsáideora -auths.sspi_strip_domain_names_helper = Má dhéantar iad a sheiceáil, bainfear ainmneacha fearainn ó ainmneacha logála isteach (m.sh. Beidh “DOMAIN\ user” agus "user@example.org" araon ní bheidh ach “úsáideoir”). -auths.sspi_separator_replacement = Deighilteoir le húsáid in ionad\,/agus @ -auths.sspi_separator_replacement_helper = An carachtar a úsáidfear chun na deighilteoirí a chur in ionad na n-ainmneacha logála síos-leibhéil (m.sh. an \ i "DOMAIN\úsáideoir") agus ainmneacha príomhoidí úsáideora (m.sh. an @ in "user@example.org"). -auths.sspi_default_language = Teanga úsáideora réamhshocraithe -auths.sspi_default_language_helper = Teanga réamhshocraithe d'úsáideoirí cruthaithe go huathoibríoch ag modh auth SSPI. Fág folamh más fearr leat teanga a bhrath go huathoibríoch. auths.tips = Leideanna auths.tips.oauth2.general = OAuth2 Fíordheimhniú auths.tips.oauth2.general.tip = Agus fíordheimhniú OAuth2 nua á chlárú agat, ba chóir go mbeadh an URL glaonna ais/atreoraithe: diff --git a/options/locale/locale_gl.ini b/options/locale/locale_gl.ini index e5b5d0f26a..f63fb17543 100644 --- a/options/locale/locale_gl.ini +++ b/options/locale/locale_gl.ini @@ -40,20 +40,14 @@ webauthn_error_unknown = Produciuse un erro descoñecido. Ténteo de novo. webauthn_error_unable_to_process = O servidor non puido procesar a súa solicitude. webauthn_error_duplicated = A clave de seguridade non está permitida para esta solicitude. Asegúrese de que a clave non estea xa rexistrada. webauthn_error_empty = Debe definir un nome para esta clave. -webauthn_reload = Recarga repository = Repositorio organization = Organización mirror = Espello -new_repo = Novo Repositorio -new_migrate = Nova Migración new_mirror = Novo Espello new_fork = Nova Bifurcación do Repositorio -new_org = Nova Organización new_project = Novo proxecto new_project_column = Nova columna -manage_org = Xestionar Organizacións admin_panel = Administración da páxina -account_settings = Axustes da Conta settings = Configuración your_profile = Perfil your_starred = Destacado @@ -233,9 +227,7 @@ platform_desc = Forgejo funciona en sistemas operativos libres como Linux e Free [error] occurred = Ocorreu un erro -missing_csrf = Solicitude incorrecta: non hai ningún token CSRF presente server_internal = Erro interno do servidor -invalid_csrf = Solicitude incorrecta: token CSRF non válido not_found = Non se puido atopar o obxectivo. network_error = Erro de rede report_message = Se cres que se trata dun erro de Forgejo, busca problemas en Codeberg ou abre un novo problema Se é necesario. diff --git a/options/locale/locale_he.ini b/options/locale/locale_he.ini index 8a5bc86163..6909c91a17 100644 --- a/options/locale/locale_he.ini +++ b/options/locale/locale_he.ini @@ -1,6 +1,3 @@ - - - [common] webauthn_error_unable_to_process = שרת זה נכשל בעיבוד בקשתך. help = עזרה @@ -163,7 +160,6 @@ commit_kind = חיפוש קומיטים… issue_kind = חיפוש סוגיות… fuzzy_tooltip = תוצאות יתאימו לתוכן תיבת החיפוש בקירוב; מומלץ כנגד שגיאות כתיב repo_kind = חיפוש קרפיפים… -code_search_by_git_grep = תוצאות החיפוש יוצרו על ידי "git grep"; יכול להיות שיתקבלו תוצאות טובות יותר אם מנהלי המערכת יפעילו את המפתחן. runner_kind = חיפוש מריצים… keyword_search_unavailable = חיפוש מילות מפתח לא זמין. נא לדווח למנהלי המערכת. code_search_unavailable = חיפוש קוד לא זמין. נא לדווח למנהלי המערכת. @@ -318,7 +314,6 @@ repo_name_been_taken = כבר יש קרפיף בשם זה. repository_files_already_exist = כבר יש קבצים בקרפיף זה. יש לדבר עם מנהל המערכת כדי לתקן את הבעיה. AccessToken = קוד גישה Content = תוכן -SSPIDefaultLanguage = שפת ברירת מחדל [projects] deleted.display_name = פרויקט נמחק @@ -471,7 +466,7 @@ uploaded_avatar_not_a_image = הקובץ שהועלה לא תמונה. [repo] new_advanced = הגדרות מתקדמות -new_advanced_expand = +new_advanced_expand = owner = בעלים repo_name = שם הקרפיף repo_name_helper = שמות קרפיפים טובים הם זכירים, קצרים וייחודיים. @@ -519,7 +514,6 @@ desc.private = פרטי desc.public = ציבורי desc.internal = פנימי desc.archived = בארכיון -archive.issue.nocomment = קרפיף זה בארכיון. אי אפשר להגיב לסוגיות. archive.pull.noreview = קרפיף זה בארכיון. אי אפשר לבקר בקשות מיזוג. form.reach_limit_of_creation_n = החשבון של הבעלים כבר הגיע לכמות הקרפיפים המקסימלית (%s). form.name_reserved = שם הקרפיף "%s" שמור. @@ -589,7 +583,6 @@ template.topics = נושאים stars_remove_warning = פעולה זו תסיר מהקרפיף את כל הכוכבים. owner_helper = ארגונים שכבר יצרו את כמות הקרפיפים המקסימלית לא מוצגים בתפריט. fork_to_different_account = מזלוג לחשבון אחר -archive.pull.nocomment = קרפיף זה בארכיון. אי אפשר להגיב לבקשות מיזוג. migrate_items_releases = גרסאות migrate.permission_denied = אין לך הרשאה לייבא קרפיפים מהשרת הנוכחי. fork_repo = מזלוג diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini index 841fb76bbe..3d73336fc4 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -35,15 +35,10 @@ passcode=Jelkód repository=Tároló organization=Szervezet mirror=Tükör -new_repo=Új tároló -new_migrate=Új migráció new_mirror=Új tükör new_fork=Új másolat -new_org=Új szervezet new_project=Új projekt -manage_org=Szervezetek kezelése admin_panel=Rendszergazdai felület -account_settings=Fiók beállítások settings=Beállítások your_profile=Profil your_starred=Csillagozott @@ -298,16 +293,10 @@ domain = Szerver domain [home] uname_holder=Felhasználónév vagy e-mail cím -password_holder=Jelszó switch_dashboard_context=Műszerfal nézőpont váltás my_repos=Tárolók -show_more_repos=Több tároló mutatása… -collaborative_repos=Együttműködési tárolók my_orgs=Szervezeteim -my_mirrors=Tükreim view_home=Nézet %s -search_repos=Tároló keresés… - show_archived=Archivált show_private=Privát @@ -321,24 +310,16 @@ issues.in_your_repos=A tárolóidban repos=Tárolók users=Felhasználók organizations=Szervezetek -search=Keresés code=Kód -repo_no_results=Nincs ilyen tároló. -user_no_results=Nincs ilyen felhasználó. -org_no_results=Nincs ilyen szervezet. -code_no_results=Nincs találat a keresési kifejezésedre. code_last_indexed_at=Utoljára indexelve: %s [auth] create_new_account=Fiók regisztrálása -register_helper_msg=Van már felhasználói fiókja? Jelentkezzen be! -social_register_helper_msg=Van már felhasználói fiókja? Csatlakoztassa most! disable_register_prompt=Regisztráció le van tiltva. Kérjük, lépjen kapcsolatba az oldal adminisztrátorával. disable_register_mail=Ki van kapcsolva a visszaigazoló e-mail küldése a regisztrációnál. remember_me=Eszköz megjegyzése forgot_password_title=Elfelejtett jelszó forgot_password=Elfelejtette a jelszavát? -sign_up_now=Szeretne bejelentkezni? Regisztráljon most. confirmation_mail_sent_prompt=Új megerősítő email lett küldve ide: %s. Ellenőrizze postafiókját az elkövetkező %s a regisztrációs folyamat befejezéséhez. must_change_password=Jelszó módosítása allow_password_change=A felhasználóknak meg kell változtatniuk a jelszavukat(ajánlott) @@ -349,7 +330,6 @@ prohibit_login=Bejelentkezés letiltva resent_limit_prompt=Elnézést, de nemrég már kért aktivációs emailt. Kérem várjon 3 percet és utána próbálja újra. has_unconfirmed_mail=Tisztelt %s, az email címe (%s) nincsen megerősítve. Amennyiben nem kapta még meg a megerősítő email-t, vagy egy újra van szüksége, az alábbi gombra kattintson. resend_mail=Kattintson ide az aktivációs email újraküldéséhez -email_not_associate=Az email cím nincsen hozzárendelve egyetlen fiókhoz sem. send_reset_mail=Felhasználó visszaállítási email küldése reset_password=Fiók Visszaállítás invalid_code=Az ellenőrző kód érvénytelen vagy lejárt. @@ -363,7 +343,6 @@ twofa_scratch_used=Ön már használta a kaparós kódját. Visszairányítottuk twofa_passcode_incorrect=A kód hibás. Ha nem találja az eszközét, akkor használja a kaparós kódját a bejelentkezéshez. twofa_scratch_token_incorrect=A kaparós kód nem megfelelő. login_userpass=Bejelentkezés -tab_openid=OpenID oauth_signup_tab=Új fiók létrehozása oauth_signup_submit=Fiók befejezése oauth_signin_tab=Csatlakoztatás egy már meglévő fiókhoz @@ -380,7 +359,6 @@ authorize_redirect_notice=Ha engedélyezi ezt az alkalmazást, akkor átirányí authorize_application_created_by=Ezt az alkalmazást %s készítette. authorize_title=Engedélyezi hozzáférését "%s"-nek a fiókjához? authorization_failed=Az engedélyezés nem sikerült -sspi_auth_failed=SSPI hitelesítés sikertelen [mail] activate_account=Kérjük aktiválja a fiókját @@ -411,8 +389,6 @@ RepoName=Tároló neve Email=E-mail cím Password=Jelszó Retype=Jelszó megerősítése -SSHTitle=SSH kulcs neve -HttpsUrl=HTTPS URL PayloadUrl=Tartalom URL-címe TeamName=Csoport neve AuthName=Engedélyezési név @@ -425,9 +401,6 @@ CommitChoice=Commit választás TreeName=Elérési útvonal Content=Tartalom -SSPISeparatorReplacement=Elválasztó -SSPIDefaultLanguage=Alapértelmezett nyelv - require_error=` nem lehet üres` alpha_dash_error=` csak alfanumerikus, kötőjel("-") és alsóvonal("_") karaktert használhat.` alpha_dash_dot_error=` csak alfanumerikus, kötőjel("-") malsóvonal("_") és pont(".") karaktert tartalmazhat.` @@ -489,13 +462,11 @@ password=Jelszó security=Biztonság avatar=Profilkép ssh_gpg_keys=SSH / GPG kulcsok -social=Közösségi fiókok applications=Alkalmazások orgs=Szervezetek repos=Tárolók delete=Fiók törlése twofa=Kétlépcsős hitelesítés -account_link=Kapcsolt fiókok organization=Szervezetek public_profile=Nyilvános profil @@ -515,7 +486,6 @@ comment_type_group_title=Cím privacy=Adatvédelem lookup_avatar_by_mail=Avatar mutatása email cím alapján -federated_avatar_lookup=Összevont profilkép keresés enable_custom_avatar=Egyéni profilkép használata choose_new_avatar=Új profilkép kiválasztása update_avatar=Profilkép Frissítése @@ -530,7 +500,6 @@ password_incorrect=A megadott jelenlegi jelszó helytelen. change_password_success=A jelszava frissítve lett. Mostantól ezzel jelentkezhet be. password_change_disabled=A nem helyi felhasználók nem frissíthetik jelszavukat a webes felületen keresztül. -emails=E-mail címek manage_emails=E-mail címek kezelése manage_themes=Alapértelmezett téma manage_openid=OpenID címek @@ -562,8 +531,6 @@ manage_gpg_keys=GPG kulcsok kezelése add_key=Kulcs hozzáadása ssh_helper=Segítség kell? Nézd meg a következő cikket a GitHub oldalán: saját SSH kulcs létrehozása. Vagy oldj meg gyakran előforduló problémákat az SSH használatakor. gpg_helper=Segítség kell? Nézd meg a GitHub GPG-s cikkjét. -add_new_key=SSH kulcs hozzáadása -add_new_gpg_key=GPG kulcs hozzáadása ssh_key_been_used=Ezt az SSH kulcsot már hozzáadták a ehhez a szerverhez. gpg_key_id_used=Ilyen azonosítóval már létezik nyilvános GPG kulcs. gpg_key_verify=Ellenőrzés @@ -592,9 +559,6 @@ token_state_desc=Ez a token volt használva az elmúlt 7 napban show_openid=Megjelenítés a profilon hide_openid=Elrejtés a profilról ssh_disabled=SSH kikapcsolva -manage_social=Kapcsolódó fiókok kezelése -unbind=Szétválasztás - manage_access_token=Hozzáférési Token kezelése generate_new_token=Új token generálása tokens_desc=Ezek a tokenek hozzáférést nyújtanak a fiókodhoz a Forgejo API használatával. @@ -604,8 +568,6 @@ generate_token_success=Új token létrehozva. Másold le most, mivel többször generate_token_name_duplicate=A %s nevet már használja egy alkalmazás. Válassz kérlek más nevet. delete_token=Törlés access_token_deletion=Hozzáférési Token Törlése -access_token_deletion_cancel_action=Mégse -access_token_deletion_confirm_action=Törlés delete_token_success=A token törölve lett. Az ezt használó alkalmazásoknak többé nincs hozzáférése a fiókodhoz. permission_read=Olvasott @@ -723,10 +685,6 @@ template.issue_labels=Hibajegy címkék template.one_item=Legalább egy sablonelemet ki kell választani template.invalid=Ki kell választani egy sablon tárolót -archive.issue.nocomment=Ez a tároló archiválva van. Nem szólhat hozzá ehhez a problémához. -archive.pull.nocomment=Ez a tároló archíválva van. Nem szólhat hozzá ehhez az egyesítési kéréshez. - - migrate_items_wiki=Wiki migrate_items_milestones=Mérföldkövek migrate_items_labels=Címkék @@ -768,7 +726,6 @@ branches=Ágak tags=Címkék issues=Hibajegyek pulls=Egyesítési kérések -project_board=Projektek labels=Címkék org_labels_desc_manage=kezelés @@ -821,8 +778,6 @@ editor.no_changes_to_show=Nincsen megjeleníthető változás. editor.add_subdir=Mappa hozzáadása… commits.commits=Commit-ok -commits.search=Commit-ok keresése… -commits.find=Keresés commits.search_all=Minden ág commits.author=Szerző commits.message=Üzenet @@ -835,8 +790,6 @@ commits.gpg_key_id=GPG kulcs azonosító commitstatus.pending=Függőben -ext_issues.desc=Külső hibakövető csatlakoztatás. - projects=Projektek projects.description_placeholder=Leírás projects.title=Cím @@ -987,12 +940,8 @@ issues.add_time_sum_to_small=Nem volt idő megadva. issues.time_spent_total=Teljes ráfordított idő issues.time_spent_from_all_authors=`Teljes ráfordított idő: %s` issues.due_date=Határidő -issues.invalid_due_date_format=A határidőt 'éééé-hh-nn' formátumban kell megadni. -issues.error_modifying_due_date=Határidő módosítása sikertelen. -issues.error_removing_due_date=Határidő eltávolítása sikertelen. issues.force_push_compare=Összehasonlítás issues.due_date_form=éééé-hh-nn -issues.due_date_form_add=Határidő hozzáadása issues.due_date_form_edit=Szerkesztés issues.due_date_form_remove=Eltávolítás issues.due_date_not_set=Nincs beállítva határidő. @@ -1016,13 +965,9 @@ issues.dependency.add_error_dep_not_same_repo=Mindkét hibajegynek ugyanabban a issues.review.comment=Értékelve: %s issues.review.reject=%s változtatások kérése issues.review.pending=Függőben -issues.review.review=Értékelés issues.review.reviewers=Véleményezők issues.review.show_outdated=Elavultak mutatása issues.review.hide_outdated=Elavultak elrejtése -issues.assignee.error=Nem minden megbízott lett hozzáadva egy nem várt hiba miatt. - - pulls.new=Egyesítési kérés pulls.compare_changes=Új egyesítési kérés pulls.compare_base=egyesítés ide @@ -1031,8 +976,6 @@ pulls.filter_branch=Ágra szűrés pulls.no_results=Nincs találat. pulls.nothing_to_compare=Ezek az ágak egyenlőek. Nincs szükség egyesítési kérésre. pulls.create=Egyesítési kérés létrehozása -pulls.title_desc_few=egyesíteni szeretné %[1]d változás(oka)t a(z) %[2]s-ból %[3]s-ba -pulls.merged_title_desc_few=egyesítve %[1]d változás(ok) a %[2]s-ból %[3]s-ba %[4]s pulls.tab_conversation=Beszélgetés pulls.tab_commits=Commit-ok pulls.tab_files=Módosított fájlok @@ -1076,8 +1019,6 @@ milestones.filter_sort.most_issues=Legtöbb hibajegy milestones.filter_sort.least_issues=Legkevesebb hibajegy -ext_wiki.desc=Külső wiki csatolása. - wiki=Wiki wiki.welcome=Üdvözöljük a Wiki-ben. wiki.welcome_desc=A wiki lehetővé teszi, hogy dokumentációt írjon és osszon meg a közreműködőkkel. @@ -1155,11 +1096,6 @@ activity.git_stats_deletion_n=%d törlés contributors.contribution_type.commits=Commit-ok -search=Keresés -search.search_repo=Tároló keresés -search.results=`"%s" találatok keresése itt: %s` -search.code_no_results=Nincs találat a keresési kifejezésedre. - settings=Beállítások settings.options=Tároló settings.collaboration.read=Olvasott @@ -1199,13 +1135,7 @@ settings.title=Cím settings.deploy_key_content=Tartalom settings.branches=Ágak settings.protected_branch=Ág védeleme -settings.protected_branch_can_push=Push engedélyezése? -settings.protected_branch_can_push_yes=Most már push-olhatja -settings.protect_whitelist_search_users=Felhasználó keresése… -settings.protect_whitelist_search_teams=Csoportok keresése… settings.protect_check_status_contexts=Állapotellenőrzés engedélyezése -settings.add_protected_branch=Védelem engedélyezése -settings.delete_protected_branch=Védelem letiltása settings.choose_branch=Válasszon egy ágat… settings.edit_protected_branch=Szerkesztés settings.bot_token=Bot Token @@ -1225,7 +1155,6 @@ diff.parent=szülő diff.commit=commit diff.git-notes=Megjegyzések diff.data_not_available=A különbségek nem megjeleníthetőek -diff.show_diff_stats=Statisztikák mutatása diff.show_split_view=Osztott nézet diff.show_unified_view=Egyesített nézet diff.stats_desc=%d fájl változott, egészen pontosan %d új sor hozzáadva és %d régi sor törölve @@ -1256,8 +1185,6 @@ release.deletion_success=A kiadás törölve. release.deletion_tag_success=A cimke törölve lett. release.tag_name_invalid=Ez a címkenév érvénytelen. release.downloads=Letöltések -release.download_count=Letöltések: %s - branch.delete_head=Törlés branch.delete_html=Ág törlése branch.create_branch=Ág %s létrehozása @@ -1335,7 +1262,6 @@ teams.leave=Távozás teams.can_create_org_repo=Tárolók létrehozása teams.can_create_org_repo_helper=A tagok létrehozhatnak új tárolókat a szervezetben. A létrehozó adminisztrátor hozzáférést fog kapni az új tárolóhoz. teams.read_access=Olvasott -teams.read_access_helper=A tagok megtekinthetik és klónozhatják a csapat tárolóit. teams.admin_access=Adminisztrátori hozzáférés teams.no_desc=Ennek a csoportnak nincs leírása teams.settings=Beállítások @@ -1347,9 +1273,7 @@ teams.add_team_member=Csapattag hozzáadása teams.delete_team_title=Csapat törlése teams.delete_team_desc=Egy csapat törlése visszavonja a tagjai hozzáférését a tárolókhoz. Folytatható? teams.delete_team_success=A csoport törölve lett. -teams.read_permission_desc=Ez a csoport Olvasási jogosultságot biztosít: a tagok megtekinthetik és klónozhatják a csoport tárolóit. teams.repositories=Csoport tárolói -teams.search_repo_placeholder=Tároló keresése… teams.remove_all_repos_title=Összes csapattároló eltávolítása teams.remove_all_repos_desc=Ez el fogja távolítani az összes tárolót a csoportból. teams.add_all_repos_title=Minden tároló hozzáadása @@ -1408,7 +1332,6 @@ dashboard.gc_metadata_obtained=GC Metaadat Megszerezve dashboard.other_system_allocation_obtained=Másik Rendszer Allokáció Megszerezve dashboard.next_gc_recycle=Következő GC Újrahasznosítás dashboard.last_gc_time=Utolsó GC óta eltelt idő -dashboard.total_gc_time=Teljes GC szünet dashboard.total_gc_pause=Teljes GC szünet dashboard.last_gc_pause=Utolsó GC szünet dashboard.gc_times=GC Idők @@ -1453,8 +1376,6 @@ repos.repo_manage_panel=Tárolók Kezelése repos.owner=Tulajdonos repos.name=Név repos.private=Privát -repos.watches=Figyelők -repos.stars=Csillagok repos.issues=Hibajegyek repos.size=Méret @@ -1508,7 +1429,6 @@ auths.oauth2_tokenURL=Token URL auths.oauth2_authURL=Engedélyezési URL auths.oauth2_profileURL=Profil URL auths.oauth2_emailURL=E-mail URL -auths.enable_auto_register=Automatikus regisztráció engedélyezése auths.tips=Tippek auths.tips.oauth2.general=OAuth2 hitelesítés auths.tip.oauth2_provider=OAuth2 szolgáltató @@ -1516,7 +1436,6 @@ auths.tip.bitbucket=Igényeljen egy új OAuth jogosultságot itt: %s auths.tip.dropbox=Vegyen fel új alkalmazást itt: %s auths.tip.facebook=Vegyen fel új alkalmazást itt: %s majd adja hozzá a "Facebook Login"-t auths.tip.github=Vegyen fel új OAuth alkalmazást itt: %s -auths.tip.gitlab=Vegyen fel új alkalmazást itt: https://gitlab.com/profile/applications auths.tip.google_plus=Szerezzen OAuth2 kliens hitelesítési adatokat a Google API konzolban (%s) auths.tip.openid_connect=Használja az OpenID kapcsolódás felfedező URL-t (/.well-known/openid-configuration) a végpontok beállításához auths.tip.twitter=Menyjen ide: %s, hozzon létre egy alkalmazást és győződjön meg róla, hogy az “Allow this application to be used to Sign in with Twitter” opció be van kapcsolva @@ -1788,8 +1707,6 @@ repo_kind = Tárak keresése… org_kind = Szervezetek keresése… team_kind = Csapatok keresése… exact = Pontos -code_search_by_git_grep = A kódkeresés jelenleg a "git grep" parancsot használja. Lehet, hogy jobb találatok is lennének, ha a webhely adminisztrátora bekapcsolja a forráskód indexelését. -milestone_kind = Mérföldkövek keresése... fuzzy_tooltip = A keresési kifejezéshez hasonló találatok mutatása fuzzy = Hasonlók union = Kulcsszavakra diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini index c935bd9540..c8ad014ac8 100644 --- a/options/locale/locale_id-ID.ini +++ b/options/locale/locale_id-ID.ini @@ -32,14 +32,9 @@ passcode=Kode Akses repository=Repositori organization=Organisasi mirror=Duplikat -new_repo=Repositori Baru -new_migrate=Migrasi Baru new_mirror=Duplikat Baru new_fork=Fork Repositori Baru -new_org=Organisasi Baru -manage_org=Mengelola Organisasi admin_panel=Administrasi Situs -account_settings=Pengaturan Akun settings=Pengaturan your_profile=Profil your_starred=Dibintangi @@ -207,17 +202,10 @@ smtp_from = Kirim Email Sebagai [home] uname_holder=Nama pengguna atau alamat surel -password_holder=Kata Sandi switch_dashboard_context=Alihkan dasbor konteks my_repos=Repositori -show_more_repos=Tampilkan repositori lainnya… -collaborative_repos=Repositori Kolaboratif my_orgs=Organisasi Saya -my_mirrors=Duplikat Saya view_home=Lihat %s -search_repos=Cari repositori… - - show_private=Pribadi issues.in_your_repos=Dalam repositori anda @@ -228,22 +216,14 @@ show_archived = Diarsipkan repos=Repositori users=Pengguna organizations=Organisasi -search=Cari code=Kode -repo_no_results=Tidak ditemukan repositori yang cocok. -user_no_results=Tidak ditemukan pengguna yang cocok. -org_no_results=Tidak ada organisasi yang cocok ditemukan. -code_no_results=Tidak ada kode sumber yang cocok dengan istilah yang anda cari. [auth] create_new_account=Daftar akun -register_helper_msg=Sudah memiliki akun? Masuk sekarang! -social_register_helper_msg=Sudah memiliki akun? Hubungkan sekarang! disable_register_prompt=Maaf, pendaftaran telah dinonaktifkan. Silakan hubungi administrator situs. disable_register_mail=Konfirmasi lewat email untuk pengguna baru dimatikan. forgot_password_title=Lupa Kata Sandi forgot_password=Lupa kata sandi? -sign_up_now=Butuh akun? Daftar sekarang. confirmation_mail_sent_prompt=Surel konfirmasi baru telah dikirim ke %s. Silakan periksa kotak masuk anda dalam %s ke depan untuk menyelesaikan proses pendaftaran. must_change_password=Perbarui kata sandi Anda allow_password_change=Wajibkan pengguna untuk mengganti kata sandi (disarankan) @@ -254,7 +234,6 @@ prohibit_login=Dilarang Masuk resent_limit_prompt=Anda telah meminta sebuah aktivasi surel beberapa saat lalu. Silakan tunggu 3 menit dan coba lagi. has_unconfirmed_mail=Hai %s, anda memiliki sebuah alamat surel yang belum dikonfirmasi (%s). Jika anda belum menerima surel konfirmasi atau perlu untuk mengirim ulang yang baru, silakan klik pada tombol di bawah. resend_mail=Klik di sini untuk mengirim ulang surel aktivasi anda -email_not_associate=Alamat surel tidak terhubung dengan akun apapun. send_reset_mail=Kirim Surel Pemulihan Akun reset_password=Pemulihan Akun invalid_code=Kode konfirmasi Anda tidak valid atau sudah kadaluarsa. @@ -268,7 +247,6 @@ twofa_scratch_used=Anda telah menggunakan kode coretan anda. Anda telah dialihka twofa_passcode_incorrect=Kata sandi Anda salah. Jika Anda salah tempatkan perangkat Anda, gunakan kode gosok Anda untuk masuk. twofa_scratch_token_incorrect=Kode coretan anda tidak tepat. login_userpass=Masuk -tab_openid=OpenID oauth_signup_tab=Daftar akun baru oauth_signup_submit=Akun lengkap oauth_signin_tab=Tautkan ke akun yang tersedia @@ -286,7 +264,6 @@ authorize_application_created_by=Aplikasi ini dibuat oleh %s. authorize_application_description=Jika Anda memberikan akses, itu akan bisa mengakses dan menulis semua informasi akun Anda, termasuk repositori pribadi dan organisasi. authorize_title=Izinkan "%s" untuk mengakses akun Anda? authorization_failed=Otorisasi gagal -sspi_auth_failed=Autentikasi SSPI gagal [mail] activate_account=Silakan aktifkan akun anda @@ -316,8 +293,6 @@ UserName=Nama Pengguna RepoName=Nama repositori Email=Alamat surel Password=Kata Sandi -SSHTitle=Nama kunci SSH -HttpsUrl=HTTPS URL PayloadUrl=Muatan URL TeamName=Nama tim AuthName=Nama otorisasi @@ -330,9 +305,6 @@ CommitChoice=Pilihan Commit TreeName=Jalur berkas Content=Konten -SSPISeparatorReplacement=Pemisah -SSPIDefaultLanguage=Bahasa Utama - require_error=` tidak boleh kosong.` alpha_dash_error=` seharusnya hanya mengandung karakter alfanumerik, tanda pisah ('-'), dan tanda garis bawah ('_').` alpha_dash_dot_error=` seharusnya hanya mengandung karakter alfanumerik, tanda pisah ('-'), tanda garis bawah ('_'), dan titik ('.')` @@ -396,13 +368,11 @@ password=Kata Sandi security=Keamanan avatar=Avatar ssh_gpg_keys=Kunci SSH / GPG -social=Akun Sosial applications=Aplikasi orgs=Organisasi repos=Repositori delete=Hapus akun twofa=Otentikasi Dua-Faktor -account_link=Akun Tertaut organization=Organisasi public_profile=Profil publik @@ -421,7 +391,6 @@ ui=Tema comment_type_group_title=Judul lookup_avatar_by_mail=Cari Avatar melalui Alamat Email -federated_avatar_lookup=Aktifkan Pencarian Avatar Representasi enable_custom_avatar=Gunakan Avatar Pilihan choose_new_avatar=Pilih avatar baru update_avatar=Perbarui Avatar @@ -436,7 +405,6 @@ password_incorrect=Kata sandi saat ini salah. change_password_success=Sandi Anda telah diperbarui. Mulai dari sekarang gunakan kata sandi yang baru. password_change_disabled=Pengguna non-lokal tidak dapat mengganti kata sandi mereka melalui antarmuka web Forgejo. -emails=Alamat Surel manage_emails=Kelola Alamat Surel manage_themes=Tema default manage_openid=Alamat OpenID @@ -469,8 +437,6 @@ ssh_desc=Kunci publik SSH berikut terasosiasi dengan akun Anda. Kunci publik yan gpg_desc=Kunci publik GPG berikut terasosiasi dengan akun Anda. Jaga kunci pribadi Anda aman oleh karena akan membolehkan komit untuk diverifikasi. ssh_helper=Butuh bantuan? Lihatlah pada petunjuk GitHub untuk menciptakan kunci SSH anda sendiri atau pecahkan permasalahan umum yang mungkin anda hadapi menggunakan SSH. gpg_helper=Butuh bantuan? Lihatlah pada petunjuk GitHub tentang GPG. -add_new_key=Tambahkan Kunci SSH -add_new_gpg_key=Tambahkan Kunci GPG ssh_key_been_used=Kunci SSH ini telah ditambahkan ke peladen. gpg_key_id_used=Kunci publik GPG dengan ID yang sama sudah ada. gpg_key_verify=Verifikasi @@ -499,9 +465,6 @@ token_state_desc=Token ini telah digunakan dalam 7 hari terakhir show_openid=Tampilkan pada profil hide_openid=Sembunyikan dari profil ssh_disabled=SSH Dimatikan -manage_social=Kelola Akun Sosial Yang Terhubung -unbind=Putuskan - manage_access_token=Kelola Token Akses generate_new_token=Hasilkan Token Baru tokens_desc=Token berikut akan memberikan akses ke Akun Anda menggunakan API Forgejo. @@ -510,8 +473,6 @@ generate_token=Hasilkan Token generate_token_success=Token baru Anda telah dibuat. Salin sekarang oleh karena tidak akan ditampilkan lagi. delete_token=Hapus access_token_deletion=Hapus Token Akses -access_token_deletion_cancel_action=Membatalkan -access_token_deletion_confirm_action=Hapus delete_token_success=Token telah dihapus. Aplikasi yang menggunakannya tidak lagi memiliki akses ke akun Anda. permission_read=Dibaca @@ -554,7 +515,6 @@ passcode_invalid=Kode sandi salah. Coba lagi. manage_account_links=Kelola akun tertaut manage_account_links_desc=Semua akun eksternal ini sementara tertaut dengan akun Forgejo Anda. -account_links_not_available=Saat ini tidak ada akun eksternal yang tertaut ke akun Forgejo ini. link_account=Tautan Akun remove_account_link=Hapus Akun Tertaut remove_account_link_desc=Menghapus akun tertaut akan membuat akun itu tidak bisa mengakses akun Forgejo Anda. Lanjutkan? @@ -624,10 +584,6 @@ template.topics=Topik template.avatar=Avatar template.issue_labels=Label Masalah -archive.issue.nocomment=Repositori ini diarsipkan. Anda tidak dapat mengomentari masalah. -archive.pull.nocomment=Repositori ini diarsipkan. Anda tidak dapat mengomentari permintaan tarik. - - migrate_items=Ihwal Migrasi migrate_items_wiki=Wiki migrate_items_milestones=Tonggak @@ -715,7 +671,6 @@ editor.cancel=Membatalkan editor.no_changes_to_show=Tidak ada perubahan untuk ditampilkan. commits.commits=Melakukan -commits.find=Telusuri commits.author=Penulis commits.message=Pesan commits.date=Tanggal @@ -835,8 +790,6 @@ pulls.compare_changes=Permintaan Tarik Baru pulls.filter_branch=Penyaringan cabang pulls.no_results=Hasil tidak ditemukan. pulls.create=Buat Permintaan Tarik -pulls.title_desc_few=ingin menggabungkan komit %[1]d dari %[2]s menuju %[3]s -pulls.merged_title_desc_few=commit %[1]d telah digabungkan dari %[2]s menjadi %[3]s %[4]s pulls.tab_conversation=Percakapan pulls.tab_commits=Melakukan pulls.reopen_to_merge=Tolong buka kembali permintaan tarik ini untuk melaksanakan penggabungan. @@ -925,11 +878,6 @@ activity.published_release_label=Dikeluarkan contributors.contribution_type.commits=Melakukan -search=Cari -search.search_repo=Cari repositori -search.results=Cari hasil untuk "%s" dalam %s -search.code_no_results=Tidak ada kode sumber yang cocok dengan istilah yang anda cari. - settings=Pengaturan settings.desc=Pengaturan dimana anda dapat mengelola pengaturan untuk repositori settings.options=Repositori @@ -957,7 +905,6 @@ settings.transfer_owner=Pemilik Baru settings.delete=Menghapus Repositori Ini settings.delete_notices_1=- Operasi ini TIDAK BISA dibatalkan. settings.delete_collaborator=Menghapus -settings.search_user_placeholder=Cari pengguna… settings.teams=Tim settings.add_webhook=Tambahkan Webhook settings.webhook.test_delivery=Percobaan Pengiriman @@ -995,11 +942,6 @@ settings.title=Judul settings.deploy_key_content=Konten settings.branches=Cabang settings.protected_branch=Perlindungan cabang -settings.protected_branch_can_push=Mengizinkan mendorong? -settings.protected_branch_can_push_yes=Anda dapat mendorong -settings.protected_branch_can_push_no=Anda tidak dapat mendorong -settings.add_protected_branch=Aktifkan perlindungan -settings.delete_protected_branch=Nonaktifkan perlindungan settings.choose_branch=Pilih branch… settings.edit_protected_branch=Edit @@ -1098,8 +1040,6 @@ teams.update_settings=Memperbarui pengaturan teams.add_team_member=Tambahkan Anggota Tim teams.delete_team_success=Tim sudah di hapus. teams.repositories=Tim repositori -teams.search_repo_placeholder=Cari repositori… - settings.visibility.public = Publik [admin] @@ -1143,7 +1083,6 @@ dashboard.gc_metadata_obtained=Metadata GC didapatkan dashboard.other_system_allocation_obtained=Alokasi Sistem Lainnya Yang Diperoleh dashboard.next_gc_recycle=Selanjutnya GC Recycle dashboard.last_gc_time=Sejak waktu GC terakhir -dashboard.total_gc_time=Total GC di jeda dashboard.total_gc_pause=Total GC di jeda dashboard.last_gc_pause=GC di jeda terakhir dashboard.gc_times=Waktu GC @@ -1169,8 +1108,6 @@ repos.repo_manage_panel=Manajemen Repositori repos.owner=Pemilik repos.name=Nama repos.private=Pribadi -repos.watches=Jam tangan -repos.stars=Bintang repos.issues=Masalah repos.size=Ukuran @@ -1213,14 +1150,12 @@ auths.oauth2_tokenURL=Token URL auths.oauth2_authURL=Mengizinkan URL auths.oauth2_profileURL=Profil URL auths.oauth2_emailURL=Email URL -auths.enable_auto_register=Mengaktifkan pendaftaran otomatis auths.tips=Cara auths.tips.oauth2.general=Otentikasi OAuth2 auths.tip.oauth2_provider=Penyediaan OAuth2 auths.tip.dropbox=Membuat aplikasi baru di %s auths.tip.facebook=`Daftarkan sebuah aplikasi baru di %s dan tambakan produk "Facebook Masuk"` auths.tip.github=Mendaftar aplikasi OAuth baru di %s -auths.tip.gitlab=Mendaftar aplikasi baru di https://gitlab.com/profile/applications auths.tip.openid_connect=Gunakan membuka ID yang terhubung ke jelajah URL (/.well-known/openid-configuration) untuk menentukan titik akhir auths.delete=Menghapus Otentikasi Sumber auths.delete_auth_title=Menghapus Otentikasi Sumber diff --git a/options/locale/locale_is-IS.ini b/options/locale/locale_is-IS.ini index f3333dbea2..ecfe386936 100644 --- a/options/locale/locale_is-IS.ini +++ b/options/locale/locale_is-IS.ini @@ -45,20 +45,13 @@ webauthn_error_unable_to_process=Netþjónninn gat ekki ráðið við beiðni þ webauthn_error_duplicated=Öryggislykillinn er ekki leyfður fyrir þessa beiðni. Gakktu úr skugga um að lykillinn sé ekki þegar skráður. webauthn_error_empty=Þú verður að setja nafn fyrir þennan lykil. webauthn_error_timeout=Tímamörk náð áður en hægt var að lesa lykilinn þinn. Vinsamlegast endurhlaðið þessa síðu og reyndu aftur. -webauthn_reload=Endurhlaða - repository=Hugbúnaðarsafn organization=Stofnun mirror=Speglun -new_repo=Nýtt Hugbúnaðarsafn -new_migrate=Nýr Flutningur new_mirror=Ný Speglun new_fork=Ný Hugbúnaðarskipting -new_org=Ný Stofnun new_project=Nýtt Verkefni -manage_org=Stjórna Stofnunum admin_panel=Stjórnborð -account_settings=Notandastillingar settings=Stillingar your_profile=Notandasíða your_starred=Eftirlæti @@ -128,8 +121,6 @@ filter.public = Opinbert [error] occurred=Villa kom upp -missing_csrf=Slæm beiðni: enginn CSRF lykill -invalid_csrf=Slæm beiðni: ógildur CSRF lykill not_found=Markmiðið fannst ekki. network_error=Netkerfisvilla @@ -224,13 +215,9 @@ no_reply_address_helper=Lén fyrir notendur með falið netfang. Til dæmis nota [home] uname_holder=Notandanafn eða netfang -password_holder=Lykilorð my_repos=Hugbúnaðarsöfn -show_more_repos=Sýna fleiri hugbúnaðarsöfn… my_orgs=Stofnanir Mínar -my_mirrors=Speglanir Mínar view_home=Skoða %s -search_repos=Finna hugbúnaðarsafn… filter=Aðrar Síur show_archived=Safnvistað @@ -245,24 +232,14 @@ issues.in_your_repos=Í hugbúnaðarsöfnum þínum repos=Hugbúnaðarsöfn users=Notendur organizations=Stofnanir -search=Leita code=Kóði -search.fuzzy=Óljóst -code_search_unavailable=Sem stendur er kóðaleit ekki í boði. Vinsamlegast hafðu samband við síðustjórann þinn. -repo_no_results=Engin samsvarandi hugbúnaðarsöfn fundust. -user_no_results=Engir samsvarandi notendur fundust. -org_no_results=Engar samsvarandi stofnanir fundust. -code_no_results=Enginn samsvarandi frumkóði fannst eftur þínum leitarorðum. [auth] create_new_account=Skrá notanda -register_helper_msg=Ertu nú þegar með notanda? Skráðu þig inn núna! -social_register_helper_msg=Ertu nú þegar með reikning? Tengdu hann núna! manual_activation_only=Hafðu samband við stjórnanda vefsvæðisins til að ljúka virkjun. remember_me=Muna eftir þessu Tæki forgot_password_title=Gleymt Lykilorð forgot_password=Gleymdirðu Lykilorðinu? -sign_up_now=Vantar þig notanda? Nýskráðu núna! must_change_password=Uppfærðu lykilorðið þitt active_your_account=Virkjaðu Aðganginn Þinn account_activated=Aðgangur hefur verið virkjaður @@ -277,7 +254,6 @@ scratch_code=Skrapkóði use_scratch_code=Nota skrapkóða twofa_scratch_token_incorrect=Skrapkóði þinn er rangur. login_userpass=Skrá inn -tab_openid=OpenID oauth_signup_tab=Skrá nýjan notanda oauth_signup_title=Klára nýjum notanda oauth_signup_submit=Klára notanda @@ -291,7 +267,6 @@ authorize_application=Heimilda Forrit authorize_application_created_by=Þetta forrit var stofnað af %s. authorize_title=Veita „%s“ aðgang að reikningnum þínum? authorization_failed=Heimild mistókst -sspi_auth_failed=SSPI auðkenning mistókst password_pwned_err=Gat ekki klárað beiðni til HaveIBeenPwned [mail] @@ -300,7 +275,6 @@ link_not_working_do_paste=Virkar ekki? Prófaðu að afrita og líma slóðina hi_user_x=Halló, %s, activate_account=Vinsamlegast virkjaðu aðganginn þinn -activate_account.title=%s, vinsamlegast virkjaðu aðganginn þinn activate_account.text_1=Halló, %[1]s, takk fyrir að nýskrá á %[2]s! activate_account.text_2=Vinsamlegast smelltu á eftirfarandi tengil til að virkja reikninginn þinn innan %s: @@ -308,13 +282,11 @@ activate_email=Staðfestu netfangið þitt activate_email.text=Vinsamlegast smelltu á eftirfarandi tengil til að staðfesta netfangið þitt innan %s: register_notify=Velkomin(n) í %s -register_notify.title=%[1]s, velkomin(n) í %[2]s register_notify.text_1=þetta er staðfestingarpóstur þinn fyrir skráningu á %s! register_notify.text_2=Þú getur nú skráð þig inn með notandanafni: %s. register_notify.text_3=Ef þessi reikningur hefur verið búinn til fyrir þig, vinsamlegast stilltu lykilorðið þitt fyrst. reset_password=Endurheimta reikning þinn -reset_password.title=%s, þú hefur beðið um að endurheimta reikninginn þinn reset_password.text=Vinsamlegast smelltu á eftirfarandi tengil til að endurheimta reikninginn þinn innan %s: register_success=Nýskráning tókst @@ -363,7 +335,6 @@ RepoName=Heiti Hugbúnaðarsafns Email=Netfang Password=Lykilorð Retype=Staðfestu Lykilorðið -HttpsUrl=HTTPS vefslóð TeamName=Liðsheiti AdminEmail=Netfang stjórnanda @@ -374,9 +345,6 @@ CommitChoice=Framlagsval TreeName=Skráarslóð Content=Innihald -SSPISeparatorReplacement=Aðgreinir -SSPIDefaultLanguage=Sjálfgefið Tungumál - require_error=` Getur ekki verið tómt.` alpha_dash_dot_error=` ætti aðeins að innihalda tölustafi, strik ('-'), undirstrik ('_') og punkta ('.').` size_error=` þarf að vera stærð %s.` @@ -432,13 +400,11 @@ password=Lykilorð security=Öryggi avatar=Notandamynd ssh_gpg_keys=SSH og GPG Lyklar -social=Félagsreikningar applications=Forrit orgs=Stofnanir repos=Hugbúnaðarsöfn delete=Eyða reikningi twofa=Tvíþætt Auðkenning -account_link=Tengdir Reikningar organization=Stofnanir webauthn=Öryggislyklar @@ -483,7 +449,6 @@ old_password=Núverandi Lykilorð new_password=Nýtt Lykilorð password_incorrect=Núverandi lykilorðið er rangt. -emails=Netföng manage_emails=Stjórna Netföngum primary=Aðal requires_activation=Krefst virkjunar @@ -508,7 +473,6 @@ manage_gpg_keys=Stjórna GPG Lyklum add_key=Bæta við lykli ssh_helper=Vantar þér aðstoð? Skoðaðu leiðbeiningarnar frá GitHub um að skapa þína eigin SSH lykla eða um að laga algeng vandamál þú getur rekist á við þegar þú ert að vinna með SSH. gpg_helper=Vantar þér aðstoð? Skoðaðu leiðbeiningarnar frá GitHub um GPG. -add_new_key=Bæta við SSH lykli key_content_ssh_placeholder=Byrjar með 'ssh-ed25519', 'ssh-rsa', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', 'ecdsa-sha2-nistp521', 'sk-ecdsa-sha2-nistp256@openssh.com' eða 'sk-ssh-ed25519@openssh.com' gpg_key_verify=Staðfesta gpg_token=Táknlykill @@ -531,14 +495,10 @@ can_write_info=Skrifa show_openid=Sýna á notandasíðu hide_openid=Fela frá notandasíðu ssh_disabled=SSH Óvirkt -unbind=Aftengja - token_name=Táknlykills Heiti generate_token=Mynda Táknlykil delete_token=Eyða access_token_deletion=Eyða Aðgangslykli -access_token_deletion_cancel_action=Hætta við -access_token_deletion_confirm_action=Eyða permission_no_access=Engin Aðgangur permission_read=Lesnar @@ -666,7 +626,6 @@ branches=Greinar tags=Merki issues=Vandamál pulls=Sameiningarbeiðnir -project_board=Verkefni packages=Pakkar labels=Skýringar @@ -710,7 +669,6 @@ editor.cancel=Hætta við editor.fail_to_update_file_summary=Villuskilaboð: commits.commits=Framlög -commits.find=Leita commits.author=Höfundur commits.message=Skilaboð commits.date=Dagsetning @@ -734,7 +692,6 @@ projects.edit=Breyta Verkefnum projects.modify=Uppfæra Verkefni projects.type.none=Ekkert projects.template.desc=Sniðmát -projects.type.uncategorized=Óflokkuð projects.column.edit_title=Heiti projects.column.new_title=Heiti projects.column.color=Litað @@ -807,7 +764,6 @@ issues.reopen_comment_issue=Senda ummæli og Enduropna issues.create_comment=Senda Ummæli issues.closed_at=`lokaði þessu vandamáli %s` issues.reopened_at=`enduropnaði þetta vandamál %s` -issues.ref_reopened_from=`enduropnaði þetta vandamál %[4]s %[2]s` issues.author=Höfundur issues.role.owner=Eigandi issues.role.member=Meðlimur @@ -851,7 +807,6 @@ issues.due_date=Eindagi issues.push_commit_1=bætti við %d framlag %s issues.push_commits_n=bætti við %d framlög %s issues.due_date_form=áááá-mm-dd -issues.due_date_form_add=Bæta við eindaga issues.due_date_form_edit=Breyta issues.due_date_form_remove=Fjarlægja issues.due_date_not_set=Enginn eindagi settur. @@ -894,7 +849,6 @@ pulls.new=Ný Sameiningarbeiðni pulls.view=Skoða Sameiningarbeiðni pulls.compare_changes=Ný Sameiningarbeiðni pulls.create=Skapa Sameiningarbeiðni -pulls.title_desc_few=vill sameina %[1]d framlög frá %[2]s í %[3]s pulls.tab_conversation=Umræða pulls.tab_commits=Framlög pulls.tab_files=Skráum Breytt @@ -998,11 +952,6 @@ activity.git_stats_deletion_n=%d eyðingar contributors.contribution_type.commits=Framlög -search=Leita -search.fuzzy=Óljóst -search.code_no_results=Enginn samsvarandi frumkóði fannst eftur þínum leitarorðum. -search.code_search_unavailable=Sem stendur er kóðaleit ekki í boði. Vinsamlegast hafðu samband við síðustjórann þinn. - settings=Stillingar settings.options=Hugbúnaðarsafn settings.collaboration.write=Skrifa @@ -1210,9 +1159,6 @@ orgs.members=Meðlimar repos.owner=Eigandi repos.name=Heiti -repos.watches=Fylgist með -repos.stars=Eftirlæti -repos.forks=Skiptingar repos.issues=Vandamál repos.size=Stærð diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index ca1d1433b6..a6d4646bae 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -46,20 +46,13 @@ 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. webauthn_error_timeout=Timeout raggiunto prima che la tua chiave possa essere letta. Ricarica la pagina e riprova. -webauthn_reload=Ricarica - repository=Repositorio organization=Organizzazione mirror=Mirror -new_repo=Nuovo repository -new_migrate=Nuova migrazione new_mirror=Nuovo mirror new_fork=Nuova biforcazione -new_org=Nuova organizzazione new_project=Nuovo progetto -manage_org=Gestisci le organizzazioni admin_panel=Amministrazione sito -account_settings=Impostazioni del profilo settings=Impostazioni your_profile=Profilo your_starred=Preferiti @@ -217,8 +210,6 @@ string.desc = Z - A [error] occurred=Si è verificato un errore -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 si pensa che questo sia un errore di Forgejo, controllare le segnalazioni su Codeberg o aprine una nuova se necessario. @@ -355,15 +346,10 @@ app_slogan_helper = Inserisci qui lo slogan della tua istanza. Lasciala vuota pe [home] uname_holder=Nome utente o indirizzo e-mail -password_holder=Password switch_dashboard_context=Cambia dashboard context my_repos=Repositori -show_more_repos=Mostra altre repositories… -collaborative_repos=Repository condivisi my_orgs=Organizzazioni -my_mirrors=I miei Mirror view_home=Vedi %s -search_repos=Trova un repository… filter=Altri filtri filter_by_team_repositories=Filtra per repositorio del team feed_of=`Feed di "%s"` @@ -384,23 +370,11 @@ issues.in_your_repos=Nei tuoi repositori repos=Repositori users=Utenti organizations=Organizzazioni -search=Cerca code=Codice -search.fuzzy=Fuzzy -search.match=Corrispondenze -code_search_unavailable=Attualmente la ricerca di codice non è disponibile. Contatta l'amministratore del sito. -repo_no_results=Nessuna repository corrispondente. -user_no_results=Nessun utente corrispondente. -org_no_results=Nessun'organizzazione corrispondente trovata. -code_no_results=Nessun codice sorgente corrispondente ai termini di ricerca. code_last_indexed_at=Ultimo indicizzato %s go_to = Vai a -search.type.tooltip = Tipo di ricerca -search.fuzzy.tooltip = Includi anche i risultati che corrispondono parzialmente ai termini di ricerca -code_search_results = Risultati di ricerca per "%s" relevant_repositories_tooltip = I repositori che sono biforcazioni o che non hanno argomento, icona, né descrizione sono nascosti. relevant_repositories = Sono visibili solo i repositori pertinenti, mostra risultati non filtrati. -search.match.tooltip = Includi solo risultati che combaciano perfettamente con i termini di ricerca stars_few = %d stelle forks_one = %d biforcazioni forks_few = %d biforcazioni @@ -408,15 +382,12 @@ stars_one = %d stella [auth] create_new_account=Registra un account -register_helper_msg=Hai già un account? Accedi ora! -social_register_helper_msg=Hai già un account? Accedi ora! disable_register_prompt=La registrazione è disabilitata. Si prega di contattare l'amministratore del sito. 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=Password dimenticata? -sign_up_now=Hai bisogno di un account? Registrati adesso. confirmation_mail_sent_prompt=Una nuova e-mail di conferma è stata inviata a %s. Per completare la registrazione, controlla la tua posta in arrivo e clicca sul link in allegato entro i prossimi %s secondi. Se la tua e-mail è errata o incorretta, puoi accedere all'account e richiedere un'altra e-mail di conferma ad un'altro indirizzo. must_change_password=Aggiorna la tua password allow_password_change=Richiede all'utente di cambiare la password (scelta consigliata) @@ -427,7 +398,6 @@ prohibit_login=L'account è sospeso 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=Invia email di recupero reset_password=Recupero account invalid_code=Il tuo codice di conferma è invalido oppure è scaduto. @@ -441,7 +411,6 @@ twofa_scratch_used=Hai usato il tuo codice zero. Sei stato reindirizzato alla pa twofa_passcode_incorrect=Il tuo passcode non è corretto. Se hai smarrito il tuo dispositivo, utilizza il tuo scratch code per accedere. twofa_scratch_token_incorrect=I tuo codice scratch non è corretto. login_userpass=Accedi -tab_openid=OpenID oauth_signup_tab=Crea nuovo account oauth_signup_title=Completa il nuovo account oauth_signup_submit=Completa l'account @@ -465,13 +434,11 @@ authorize_application_created_by=Questa applicazione è stata creata da %s. authorize_application_description=Se concedi l'accesso, l'app sarà in grado di accedere e modificare tutte le informazioni del tuo profilo, inclusi i repositori privati e le organizzazioni. authorize_title=Vuoi autorizzare "%s" ad accedere al tuo account? authorization_failed=Autorizzazione fallita -sspi_auth_failed=Autenticazione SSPI fallita password_pwned_err=Impossibile completare la richiesta a HaveIBeenPwned authorization_failed_desc = L'autorizzazione è fallita perchè abbiamo rilevato una richiesta non valida. Contatta il gestore dell'app che hai provato ad autorizzare. change_unconfirmed_email = Se hai fornito l'indirizzo e-mail sbagliato durante la registrazione, puoi cambiarlo sotto, e una mail di conferma sarà inviata al nuovo indirizzo. change_unconfirmed_email_error = Impossibile cambiare l'indirizzo e-mail: %v invalid_code_forgot_password = Il tuo codice di conferma non è valido oppure è scaduto. Clicca qui per avviare una nuova sessione. -remember_me.compromised = Il token di login non è più valido, il che potrebbe indicare un profilo compromesso. Verifica la presenza di attività insolite dal tuo profilo. sign_up_successful = Il profilo è stato creato con successo. Benvenuto! change_unconfirmed_email_summary = Modifica l'indirizzo e-mail a cui deve essere inviata la mail di attivazione. invalid_password = La tua password non combacia con la password usata in fase di creazione del profilo. @@ -480,8 +447,6 @@ last_admin = Non puoi rimuovere l'ultimo amministratore. Deve esserci almeno un prohibit_login_desc = Al tuo profilo non è consentito effettuare l'accesso, contatta l'amministratore del sito. openid_signin_desc = Inserisci il tuo URI OpenID. Per esempio: alice.openid.example.org o https://openid.example.org/alice. password_pwned = La password che hai scelto è in un elenco di password rubate precedentemente esposte a violazioni di dati pubblici. Riprova con una password diversa e valuta di modificare questa password anche altrove. -tab_signup = Registrati -tab_signin = Accedi back_to_sign_in = Torna alla schermata d'accesso sign_in_openid = Procedi con OpenID hint_login = Hai già un'utenza? Accedi! @@ -496,7 +461,6 @@ link_not_working_do_paste=Il link non funziona? Prova a copiarlo e incollarlo ne hi_user_x=Ciao %s, activate_account=Per favore attiva il tuo account -activate_account.title=%s, si prega di attivare il tuo account activate_account.text_1=Ciao %[1]s, grazie per essersi registrato al %[2]s! activate_account.text_2=Clicca sul seguente link per attivare il tuo account entro %s: @@ -504,13 +468,11 @@ activate_email=Verifica il tuo indirizzo e-mail activate_email.text=Clicca sul seguente link per verificare il tuo indirizzo email entro %s: register_notify=Benvenutə su %s -register_notify.title=%[1]s, benvenuto in %[2]s register_notify.text_1=questa è la tua email di conferma di registrazione per %s! register_notify.text_2=Puoi accedere al tuo profilo tramite il tuo nome utente: %s register_notify.text_3=Se qualcun altro ha impostato questo profilo per te, dovrai prima impostare la tua password. reset_password=Recupera il tuo account -reset_password.title=%s, abbiamo ricevuto una richiesta di recupero del tuo profilo reset_password.text=Se sei stato tu, clicca sul seguente link per recuperare il tuo profilo entro %s: register_success=Registrazione completata con successo @@ -553,7 +515,6 @@ admin.new_user.subject = Il nuovo utente %s si è appena registrato admin.new_user.user_info = Informazioni utente team_invite.text_2 = Fai click sul seguente link per far parte del team: team_invite.subject = %[1]s ti ha invitato a far parte dell'organizzazione %[2]s -activate_email.title = %s, verifica il tuo indirizzo email admin.new_user.text = Clicca qui per gestire questo utente dal pannello di amministrazione. team_invite.text_1 = %[1]s ti ha invitato a far parte del team %[2]s nell'organizzazione %[3]s. team_invite.text_3 = Nota: Questo invito è destinato a %[1]s. Se non ti aspettavi questo invito, puoi ignorare questa email. @@ -587,8 +548,6 @@ RepoName=Nome repositorio Email=Indirizzo E-mail Password=Password Retype=Conferma password -SSHTitle=Nome chiave SSH -HttpsUrl=URL HTTPS PayloadUrl=URL Payload TeamName=Nome Team AuthName=Nome autorizzazione @@ -601,9 +560,6 @@ CommitChoice=Scelta di commit TreeName=Percorso del file Content=Contenuto -SSPISeparatorReplacement=Separatore -SSPIDefaultLanguage=Lingua predefinita - require_error=` non può essere vuoto.` alpha_dash_error=` può contenere solo caratteri alfanumerici, trattini ("-") e underscore ("_").` alpha_dash_dot_error=` può contenere solo caratteri alfanumerici, trattini("-"), underscore ("_") e punti (".").` @@ -668,7 +624,6 @@ organization_leave_success = Hai lasciato con successo l'organizzazione %s. unable_verify_ssh_key = Non è stato possibile verificare la chiave SSH, ricontrollala per eventuali errori. admin_cannot_delete_self = Non puoi eliminare il tuo profilo mentre sei un amministratore. Devi prima abbandonare i tuoi privilegi di amministratore. username_error_no_dots = ` può solo contenere caratteri alfanumerici ("0-9","a-z","A-Z"), trattini ("-") e underscore ("_"). Non può iniziare o finire con caratteri non-alfanumerici, e sono vietati anche più caratteri non-alfanumerici consecutivi.` -username_has_not_been_changed = Il nome utente non è stato cambiato must_use_public_key = La chiave che hai fornito è una chiave privata. Non caricare la tua chiave privata da nessuna parte. Usa invece la tua chiave pubblica. still_own_repo = Il tuo profilo possiede uno o più repositori; devi prima eliminarli o trasferirli. duplicate_invite_to_team = L'utente è già stato invitato ad essere un membro del team. @@ -711,7 +666,6 @@ code = Codice block = Blocca unblock = Sblocca email_visibility.limited = Il tuo indirizzo email è visibile a tutti gli utenti autenticati -email_visibility.private = Il tuo indirizzo email è visibile solo a te e agli amministratori show_on_map = Mostra questo posto su una mappa settings = Impostazioni utente form.name_reserved = Il nome utente "%s" è riservato. @@ -740,13 +694,11 @@ password=Password security=Sicurezza avatar=Avatar ssh_gpg_keys=Chiavi SSH / GPG -social=Account Sociali applications=Applicazioni orgs=Organizzazioni repos=Repositori delete=Elimina account twofa=Verifica in due passaggi -account_link=Account collegati organization=Organizzazioni webauthn=Autenticazione a due passaggi (Chiavi di sicurezza) @@ -782,10 +734,7 @@ comment_type_group_project=Progetto comment_type_group_issue_ref=Riferimento alla segnalazione saved_successfully=Le impostazioni sono state salvate correttamente. privacy=Privacy -keep_activity_private_popup=La tua attività sarà visibile solo a te e agli amministratori dell'istanza - lookup_avatar_by_mail=Cerca avatar per indirizzo email -federated_avatar_lookup=Ricerca federata dell'avatar enable_custom_avatar=Abilita avatar personalizzato choose_new_avatar=Scegli un nuovo avatar update_avatar=Aggiorna avatar @@ -801,7 +750,6 @@ password_incorrect=La password attuale non è corretta. change_password_success=La password è stata aggiornata. Utilizza la nuova password la prossima volta che effettui il login. password_change_disabled=Gli utenti non locali non possono cambiare la loro password attraverso l'interfaccia web. -emails=Indirizzi email manage_emails=Gestisci indirizzi email manage_themes=Tema predefinito manage_openid=Indirizzi OpenID @@ -840,8 +788,6 @@ principal_desc=Queste entità di certificato SSH sono associate al tuo profilo e gpg_desc=Queste chiavi GPG pubbliche sono associate con il tuo profilo e sono usate per verificare i tuoi commit. Proteggi le tue chiavi private perché permettono di firmare i commit con la tua identità. ssh_helper= Hai bisogno di aiuto? Dài un'occhiata alla guida percreare le tue chiavi SSH o risolvere quei problemi comuni in cui potresti imbatterti utilizzando SSH. gpg_helper=Hai bisogno di aiuto? Dai un'occhiata alla guida di GitHub riguardo il GPG. -add_new_key=Aggiungi chiave SSH -add_new_gpg_key=Aggiungi chiave GPG key_content_ssh_placeholder=Inizia con "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com", o "sk-ssh-ed25519@openssh.com" key_content_gpg_placeholder=Inizia con "-----BEGIN PGP PUBLIC KEY BLOCK-----" add_new_principal=Aggiungi Principal @@ -859,7 +805,6 @@ gpg_invalid_token_signature=La chiave GPG fornita, la firma e il token non corri gpg_token_required=Devi fornire una firma per il token sottostante gpg_token=Token gpg_token_help=È possibile generare una firma utilizzando: -gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=Firma GPG corazzata key_signature_gpg_placeholder=Inizia con "-----BEGIN PGP SIGNATURE-----" ssh_key_verified=Chiave verificata @@ -898,9 +843,6 @@ show_openid=Mostra nel profilo hide_openid=Nascondi dal profilo ssh_disabled=SSH disabilitato ssh_externally_managed=Questa chiave SSH è gestita esternamente per questo utente -manage_social=Gestisci gli Account Sociali Associati -unbind=Rimuovi il collegamento - manage_access_token=Gestisci i token di accesso generate_new_token=Genera nuovo token tokens_desc=Questi tokens garantiscono l'accesso al tuo account utilizzando l'API di Forgejo. @@ -910,8 +852,6 @@ generate_token_success=Il nuovo token è stato generato. Copia ora in quanto non generate_token_name_duplicate=%s è già stato utilizzato come nome dell'applicazione. Si prega di usarne uno nuovo. delete_token=Elimina access_token_deletion=Elimina token di accesso -access_token_deletion_cancel_action=Annulla -access_token_deletion_confirm_action=Elimina access_token_deletion_desc=L'eliminazione di un token annullerà l'accesso al tuo account per le applicazioni che lo utilizzano. Questo non può essere annullato. Continuare? delete_token_success=Il token è stato eliminato. Le applicazioni che lo utilizzavano non hanno più accesso al tuo account. permission_no_access=Nessun accesso @@ -964,7 +904,6 @@ webauthn_delete_key_desc=Se si rimuove una chiave di sicurezza non è più possi manage_account_links=Gestisci gli account collegati manage_account_links_desc=Questi account esterni sono collegati al tuo account Forgejo. -account_links_not_available=Attualmente non è collegato alcun account esterno al tuo account Forgejo. link_account=Collega Account remove_account_link=Rimuovi Profilo Collegato remove_account_link_desc=Rimuovere un profilo collegato ne revoca l'accesso al tuo profilo Forgejo. Continuare? @@ -1009,12 +948,10 @@ profile_desc = Controlla come il tuo profilo viene mostrato agli altri utenti. I email_desc = Il tuo indirizzo email principale sarà usato per inviarti notifiche, ripristino di password e, se non è stato nascosto, per le operazioni Git effettuate da web. add_email_confirmation_sent = Una email di conferma è stata inviata a "%s". Verifica la posta in arrivo entro %s per confermare il tuo indirizzo email. hidden_comment_types_description = I tipi di commenti spuntati qui non saranno mostrati nelle pagine delle segnalazioni. Per esempio, spuntare "Etichetta" rimuove tutti i commenti " ha aggiunto/rimosso ". -unbind_success = Il profilo social è stato rimosso con successo. hidden_comment_types.ref_tooltip = Commenti in cui questa issue è stata citata da un altra issue/commit/… verify_ssh_key_success = La chiave SSH "%s" è stata verificata. valid_until_date = Valido fino a %s ssh_signonly = SSH è attualmente disabilitato quindi queste chiavi sono usate solo per la firma di verifica dei commit. -social_desc = Questi profili social possono essere usati per accedere al tuo profilo. Assicurati di riconoscerli tutti. permission_write = Leggi e scrivi access_token_desc = I permessi token selezionati limitano l'autorizzazione solo alle corrispondenti vie API. Leggi la documentazione per ulteriori informazioni. create_oauth2_application_success = Hai correttamente creato una nuova applicazione OAuth2. @@ -1055,7 +992,6 @@ update_hints_success = I suggerimenti sono stati aggiornati. additional_repo_units_hint_description = Visualizza un suggerimento “Abilita altro” per i repositori che non hanno tutte le unità disponibili abilitate. hints = Suggerimenti pronouns = Pronomi -pronouns_custom = Personalizzato pronouns_unspecified = Non specificato language.title = Lingua predefinita language.description = Questa lingua verrà salvata nella tua utenza e verrà usata come predefinita ogni volta che farai l'accesso. @@ -1110,7 +1046,6 @@ already_forked=Hai già fatto il fork di %s fork_to_different_account=Fai Fork a un account diverso fork_visibility_helper=La visibilità di un repositorio derivato non può essere modificata. use_template=Usa questo modello -clone_in_vsc=Clona nel codice VS download_zip=Scarica ZIP download_tar=Scarica TAR.GZ download_bundle=Scarica BUNDLE @@ -1130,11 +1065,6 @@ readme=LEGGIMI readme_helper=Seleziona un template per il file LEGGIMI. readme_helper_desc=Qui puoi scrivere una descrizione completa del progetto. auto_init=Inizializza repositorio (Aggiunge .gitignore, licenza e README) -trust_model_helper=Seleziona il modello di fiducia per la verifica della firma. Le opzioni possibili sono: -trust_model_helper_collaborator=Collaboratore: Fidati delle firme da parte dei collaboratori -trust_model_helper_committer=Committer: Fidati delle Firme che corrispondono ai committenti -trust_model_helper_collaborator_committer=Collaboratore+Committer: Fidati delle firme da parte dei collaboratori che corrispondono al committer -trust_model_helper_default=Predefinito: utilizzare il modello di trust predefinito per questa installazione create_repo=Crea repositorio default_branch=Ramo predefinito default_branch_helper=Il ramo predefinito è il ramo base per le richieste di modifica e i commit. @@ -1193,15 +1123,11 @@ template.issue_labels=Etichette segnalazioni template.one_item=Deve selezionare almeno un elemento del modello template.invalid=Devi selezionare un modello di repositorio -archive.issue.nocomment=Questo repositorio è archiviato. Non puoi commentare le segnalazioni. -archive.pull.nocomment=Questo repositorio è archiviato. Non puoi commentare le richieste di modifica. - form.reach_limit_of_creation_1=Lə proprietariə ha già raggiunto il limite di %d repositori. form.reach_limit_of_creation_n=Lə proprietariə ha già raggiunto il limite di %d repositori. need_auth=Autorizzazione migrate_options=Opzioni di migrazione -migrate_service=Servizio migrazione migrate_options_mirror_helper=Questo repositorio sarà un mirror migrate_options_lfs=Migra file LFS migrate_options_lfs_endpoint.label=Punto d'accesso LFS @@ -1280,7 +1206,6 @@ branches=Rami tags=Tag issues=Segnalazioni pulls=Richieste di modifica -project_board=Progetti packages=Pacchetti labels=Etichette org_labels_desc=Etichette a livello di organizzazione che possono essere utilizzate su tutti i repositori di questa organizzazione @@ -1374,8 +1299,6 @@ editor.revert=Ripristina %s su: commits.desc=Sfoglia la cronologia di modifiche del codice rogente. commits.commits=Commit commits.nothing_to_compare=Questi rami sono uguali. -commits.search=Ricerca commits… -commits.find=Cerca commits.search_all=Tutti i Rami commits.author=Autore commits.message=Messaggio @@ -1399,8 +1322,6 @@ commitstatus.error=Errore commitstatus.pending=In sospeso ext_issues=Accesso a segnalazioni esterne -ext_issues.desc=Collegamento al puntatore di una issue esterna. - projects=Progetti projects.desc=Gestisci segnalazioni e richieste di modifica nelle schede di progetto. projects.description=Descrizione (opzionale) @@ -1420,7 +1341,6 @@ projects.type.basic_kanban=Kanban semplice projects.type.bug_triage=Bug triage projects.template.desc=Modello projects.template.desc_helper=Seleziona un modello di progetto per iniziare -projects.type.uncategorized=Senza categoria projects.column.edit_title=Nome projects.column.new_title=Nome projects.column.color=Colore @@ -1556,8 +1476,6 @@ issues.ref_issue_from=`ha fatto riferimento a questa segnalazion issues.ref_pull_from=`ha fatto riferimento a questa richiesta di modifica %[3]s %[1]s` issues.ref_closing_from=`ha fatto riferimento a questa segnalazione da una richiesta di modifica %[3]s che la chiuderà, %[1]s` issues.ref_reopening_from=`ha fatto riferimento a questa segnalazione da una richiesta di modifica %[3]s che la riaprirà, %[1]s` -issues.ref_closed_from=`chiuso questa segnalazione %[4]s %[2]s` -issues.ref_reopened_from=`ha riaperto questa segnalazione %[4]s %[2]s` issues.ref_from=`da %[1]s` issues.author=Autore issues.role.owner=Proprietario @@ -1635,15 +1553,11 @@ issues.add_time_sum_to_small=Non è stato inserito alcun tempo. issues.time_spent_total=Tempo totale trascorso issues.time_spent_from_all_authors=`Totale tempo trascorso: %s` issues.due_date=Scadenza -issues.invalid_due_date_format=Il formato della scadenza deve essere "aaaa-mm-dd". -issues.error_modifying_due_date=Impossibile modificare la scadenza. -issues.error_removing_due_date=Impossibile rimuovere la scadenza. issues.push_commit_1=ha aggiunto %d commit %s issues.push_commits_n=ha aggiunto %d commit %s issues.force_push_codes=`ha forzato l'immissione %[1]s da %[2]s %[8]s a %[4]s %[9]s %[6]s` issues.force_push_compare=Confronta issues.due_date_form=aaaa-mm-dd -issues.due_date_form_add=Aggiungi scadenza issues.due_date_form_edit=Modifica issues.due_date_form_remove=Rimuovi issues.due_date_not_set=Nessuna scadenza impostata. @@ -1693,7 +1607,6 @@ issues.review.add_review_request=revisione richiesta da %s %s issues.review.remove_review_request=ha rimosso la richiesta di revisione per %s %s issues.review.remove_review_request_self=ha rifiutato di revisionare %s issues.review.pending=In sospeso -issues.review.review=Revisiona issues.review.reviewers=Revisori issues.review.outdated=Scaduto issues.review.show_outdated=Visualizza obsoleti @@ -1703,7 +1616,6 @@ issues.review.hide_resolved=Nascondi risolte issues.review.resolve_conversation=Risolvi la conversazione issues.review.un_resolve_conversation=Segnala la conversazione come non risolta issues.review.resolved_by=ha contrassegnato questa conversazione come risolta -issues.assignee.error=Non tutte le assegnazioni sono state aggiunte a causa di un errore imprevisto. issues.reference_issue.body=Corpo issues.content_history.deleted=eliminato issues.content_history.edited=modificato @@ -1711,8 +1623,6 @@ issues.content_history.created=creato issues.content_history.delete_from_history=Elimina dalla cronologia issues.content_history.delete_from_history_confirm=Eliminare dalla cronologia? issues.content_history.options=Opzioni -issues.reference_link=Riferimento: %s - compare.compare_base=base compare.compare_head=confronta @@ -1737,8 +1647,6 @@ pulls.nothing_to_compare=Questi rami sono uguali. Non c'è bisogno di creare una pulls.nothing_to_compare_and_allow_empty_pr=Questi rami sono uguali. Questa richiesta sarà vuota. pulls.has_pull_request=`Una richiesta di modifica fra questi rami esiste già: %[2]s#%[3]d` pulls.create=Crea richiesta di modifica -pulls.title_desc_few=vuole unire %[1]d commit da %[2]s a %[3]s -pulls.merged_title_desc_few=ha unito %[1]d commit da %[2]s a %[3]s %[4]s pulls.change_target_branch_at=`cambiato il ramo di destinazione da %s a %s %s` pulls.tab_conversation=Conversazione pulls.tab_commits=Commit @@ -1857,8 +1765,6 @@ milestones.filter_sort.least_issues=Con meno segnalazioni ext_wiki=Accesso al Wiki esterno -ext_wiki.desc=Collegamento a una wiki esterna. - wiki=Wiki wiki.welcome=Benvenuti nella Wiki. wiki.welcome_desc=La wiki ti permette di scrivere e condividere documentazione con lɜ collaboranti. @@ -1949,14 +1855,6 @@ activity.git_stats_deletion_n=%d cancellazioni contributors.contribution_type.commits=Commit -search=Ricerca -search.search_repo=Ricerca repository -search.fuzzy=Fuzzy -search.match=Corrispondenze -search.results=Risultati della ricerca per "%s" in %s -search.code_no_results=Nessun codice sorgente corrispondente al termine di ricerca trovato. -search.code_search_unavailable=Attualmente la ricerca di codice non è disponibile. Contatta l'amministratore del sito. - settings=Impostazioni settings.desc=Impostazioni ti permette di gestire le impostazioni del repository settings.options=Repository @@ -2041,7 +1939,6 @@ settings.transfer.success=Il trasferimento del repositorio è andato a buon fine settings.transfer_abort=Annulla trasferimento settings.transfer_abort_invalid=Non è possibile annullare il trasferimento di un repositorio non esistente. settings.transfer_desc=Trasferisci questo repositorio a un altro utente o a un'organizzazione nella quale hai diritti d'amministratore. -settings.transfer_form_title=Inserisci il nome del repository come conferma: settings.transfer_in_progress=Al momento c'è un trasferimento in corso. Si prega di annullarlo se si desidera trasferire questo repository a un altro utente. settings.transfer_notices_1=-Si perderà l'accesso al repository se lo si trasferisce ad un utente singolo. settings.transfer_notices_2=-Si manterrà l'accesso al repository se si trasferisce in un'organizzazione che possiedi (o condividi con qualcun'altro). @@ -2083,7 +1980,6 @@ settings.delete_collaborator=Rimuovi settings.collaborator_deletion=Rimuovi collaborante settings.collaborator_deletion_desc=Rimuovere unə collaborante ne revocherà l'accesso a questo repositorio. Continuare? settings.remove_collaborator_success=Lə collaborante è statə rimossə. -settings.search_user_placeholder=Ricerca utente… settings.org_not_allowed_to_be_collaborator=Le organizzazioni non possono essere aggiunte come collaborante. settings.change_team_access_not_allowed=La modifica dell'accesso al team per il repository è stato limitato al solo proprietario dell'organizzazione settings.team_not_in_organization=Il team non è nella stessa organizzazione del repository @@ -2091,7 +1987,6 @@ settings.teams=Gruppi settings.add_team=Aggiungi squadra settings.add_team_duplicate=Il team ha già il repository settings.add_team_success=Il team ha ora accesso al repository. -settings.search_team=Cerca squadra… settings.change_team_permission_tip=Il permesso del team è impostato sulla pagina delle impostazioni del team e non può essere modificato per repository settings.delete_team_tip=Questo team ha accesso a tutte le repository e non può essere rimosso settings.remove_team_success=L'accesso del team al repository è stato rimosso. @@ -2217,12 +2112,7 @@ settings.deploy_key_deletion_desc=Rimuovere una chiave di distribuzione ne revoc settings.deploy_key_deletion_success=La chiave di distribuzione è stata rimossa. settings.branches=Rami settings.protected_branch=Protezione ramo -settings.protected_branch_can_push=Consentire push? -settings.protected_branch_can_push_yes=Puoi pushare -settings.protected_branch_can_push_no=Non puoi pushare settings.branch_protection=Regole di protezione per il ramo "%s" -settings.protect_this_branch=Attiva protezione ramo -settings.protect_this_branch_desc=Impedisce l'eliminazione e limita il merge di Git effettuando il push e l'unione verso questo ramo. settings.protect_disable_push=Disabilita immissione settings.protect_disable_push_desc=Nessun push sarà consentito in questo ramo. settings.protect_enable_push=Abilita immissione @@ -2231,9 +2121,7 @@ settings.protect_whitelist_committers=Limita immissione alla whitelist settings.protect_whitelist_committers_desc=Solo gli utenti o i team nella whitelist potranno pushare su questo ramo (ma non forzare il push). settings.protect_whitelist_deploy_keys=Chiavi di deploy in whitelist con permessi di scrittura per il push. settings.protect_whitelist_users=Utenti nella whitelist per pushare -settings.protect_whitelist_search_users=Cerca utenti… settings.protect_whitelist_teams=Team nella whitelist per pushare -settings.protect_whitelist_search_teams=Ricerca team… settings.protect_merge_whitelist_committers=Attiva la whitelist per le fusioni settings.protect_merge_whitelist_committers_desc=Consentire soltanto agli utenti o ai team in whitelist il permesso di unire le pull request di questo branch. settings.protect_merge_whitelist_users=Utenti nella whitelist per il merging @@ -2251,8 +2139,6 @@ settings.dismiss_stale_approvals=Ignora impostazione vecchie settings.dismiss_stale_approvals_desc=Quando i nuovi commit che cambiano il contenuto della pull request vengono pushati nel branch, le vecchie approvazioni verranno eliminate. settings.require_signed_commits=Richiedi commit firmati settings.require_signed_commits_desc=Rifiuta i push a questo ramo se non sono firmati o verificabili. -settings.add_protected_branch=Attiva protezione -settings.delete_protected_branch=Disattiva protezione settings.protected_branch_deletion=Disattiva protezione del ramo settings.protected_branch_deletion_desc=Disattivare la protezione branch permette agli utenti con permesso di scrittura di pushare sul branch. Continuare? settings.block_rejected_reviews=Blocca il merge di revisioni rifiutate @@ -2317,8 +2203,6 @@ settings.lfs_pointers.associateAccessible=Associa %d OID accessibili settings.rename_branch_failed_exist=Impossibile rinominare il ramo perché il ramo di destinazione %s esiste. settings.rename_branch_failed_not_exist=Impossibile rinominare il ramo %s perché non esiste. settings.rename_branch_success=Il ramo %s è stato rinominato con successo in %s. -settings.rename_branch_from=vecchio nome del ramo -settings.rename_branch_to=nuovo nome del ramo settings.rename_branch=Rinomina ramo diff.browse_source=Sfoglia il codice sorgente @@ -2327,7 +2211,6 @@ diff.commit=commit diff.git-notes=Note diff.data_not_available=Differenze non disponibili diff.options_button=Opzioni differenze -diff.show_diff_stats=Mostra statistiche diff.download_patch=Scarica file .patch diff.download_diff=Scarica file .diff diff.show_split_view=Visualizzazione separata @@ -2410,7 +2293,6 @@ release.tag_name_invalid=Il nome tag non è valido. release.tag_name_protected=Il nome dell'etichetta è protetto. release.tag_already_exist=Questo nome tag esiste già. release.downloads=Download -release.download_count=Scarica: %s release.add_tag_msg=Utilizzare il titolo e il contenuto del rilascio come messaggio di tag. release.add_tag=Crea Solo Branch @@ -2423,7 +2305,6 @@ branch.included_desc=Questo ramo fa parte del ramo predefinito branch.included=Incluso branch.create_new_branch=Crea un ramo dal ramo: branch.confirm_create_branch=Crea ramo -branch.confirm_rename_branch=Rinomina ramo branch.create_branch_operation=Crea ramo branch.new_branch=Crea nuovo ramo branch.renamed=Il ramo %s è stato rinominato in %s. @@ -2474,7 +2355,6 @@ projects.column.edit = Modifica colonna projects.column.new_submit = Crea colonna projects.column.new = Nuova colonna projects.column.set_default = Imposta default -projects.column.unset_default = Annulla Default projects.column.delete = Elimina colonna projects.card_type.desc = Anteprima carte projects.card_type.text_only = Solo testo @@ -2486,7 +2366,6 @@ issues.role.contributor = Contributore issues.label_exclusive = Esclusivo pulls.made_using_agit = AGit milestones.create_success = Il traguardo "%s" è stato creato. -search.fuzzy.tooltip = Includi risultati di ricerca che combaciano anche approssimativamente al termine di ricerca default_branch_label = predefinito pulls.cmd_instruction_checkout_title = Checkout pull.deleted_branch = (eliminato):%s @@ -2502,7 +2381,6 @@ branch.protected_deletion_failed = Il ramo "%s" è protetto. Non può essere eli branch.default_deletion_failed = Il ramo "%s" è il ramo predefinito. Non può essere eliminato. branch.tag_collision = Il ramo "%s" non può essere creato perché esiste già un'etichetta con lo stesso nome nel repositorio. topic.format_prompt = Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ("-") e punti ("."), possono arrivare fino a 35 caratteri di lunghezza. Le lettere devono essere minuscole. -error.broken_git_hook = Le hook Git di questo progetto sembrano rotte. Segui la documentazione per ripararli, poi immetti alcuni commit per aggiornare lo stato. wiki.reserved_page = La nome della pagina della wiki "%s" è riservato. wiki.delete_page_notice_1 = La rimozione della pagina della wiki "%s" non può essere annullata. Continuare? settings.webhook.test_delivery_desc_disabled = Per testare questo richiamo HTTP con un evento finto, attivalo. @@ -2554,12 +2432,10 @@ issues.pin_comment = ha fissato questo %s issues.max_pinned = Non puoi fissare ulteriori segnalazioni issues.unpin_comment = ha sbloccato questo %s issues.cancel_tracking_history = `disabilitato tracciamento del tempo %s` -issues.due_date_not_writer = Ti serve il permesso di scrittura a questo progetto per poter aggiornare la scadenza di una segnalazione. issues.dependency.no_permission_1 = Non hai il permesso per leggere %s dipendenza issues.dependency.issue_batch_close_blocked = Non puoi chiudere segnalazioni in gruppo perché la segnalazione #%d ha ancora dipendenze aperte issues.review.option.show_outdated_comments = Mostra commenti vecchi issues.review.option.hide_outdated_comments = Nascondi commenti vecchi -issues.comment.blocked_by_user = Non puoi creare un commento su questa segnalazione perché sei bloccato dal proprietario del progetto o dall'autore della segnalazione. pulls.expand_files = Espandi tutti i file pulls.collapse_files = Collassa tutti i file pulls.show_all_commits = Mostra tutti i commit @@ -2592,8 +2468,6 @@ activity.navbar.pulse = Battito activity.navbar.code_frequency = Frequenza del codice activity.navbar.recent_commits = Commit recenti contributors.contribution_type.filter_label = Tipi di contributo: -search.type.tooltip = Cerca tipo -search.match.tooltip = Includi solo risultati che corrispondono esattamente ai termini di ricerca settings.mirror_settings.docs.disabled_push_mirror.instructions = Imposta il tuo progetto in modo che prelevi commit, etichette e rami da un'altra repo. settings.mirror_settings.docs.no_new_mirrors = Il tuo progetto sta specchiando i cambiamenti a/da un altro progetto. Tieni a mente che non puoi creare nuovi specchi al momento. settings.mirror_settings.docs.can_still_use = Nonostante tu non possa modificare specchi esistenti o crearne di nuovi puoi comunque il tuo specchio esistente. @@ -2653,13 +2527,11 @@ commits.renamed_from = Rinomina da %s invisible_runes_description = `Questo file contiene caratteri Unicode invisibili che sono indistinguibili agli umani ma potrebbero essere processati diversamente da un computer. Se pensi che questo sia intenzionale puoi tranquillamente ignorare questo avviso. Usa il tasto Escape per rivelarli.` issues.filter_type.reviewed_by_you = Revisionati da te projects.edit_success = Il progetto "%s" è stato aggiornato. -issues.keyword_search_unavailable = La ricerca per parola chiave non è attualmente disponibile. Contatta l'amministratore del sito. issues.role.collaborator_helper = Quest*utente è statə invitatə a collaborare al progetto. pulls.commit_ref_at = `ha fatto riferimento a questa richiesta di modifica da un commit %s` settings.thread_id = ID della discussione release.title = Titolo del rilascio visibility_helper = Rendi il repositorio privato -clone_in_vscodium = Clona in VSCodium blame.ignore_revs.failed = Impossibile ignorare le revisioni in .git-blame-ignore-revs. author_search_tooltip = Mostra un massimo di 30 utenti tree_path_not_found_commit = Il percorso %[1]s non esiste nel commit %[2]s @@ -2673,7 +2545,6 @@ editor.filename_is_invalid = Nome file invalido: "%s". editor.unable_to_upload_files = Impossibile caricare i file su "%s" con errore: %v projects.create_success = Il progetto "%s" è stato creato. projects.column.set_default_desc = Imposta questa colonna come predefinita per segnalazioni e richieste di modifica non categorizzate -projects.column.unset_default_desc = Disattiva questa colonna come predefinita projects.column.deletion_desc = L'eliminazione della colonna di un progetto sposta tutte le relative segnalazioni nella colonna di default. Continuare? issues.choose.ignore_invalid_templates = I modelli non validi sono stati ignorati issues.choose.invalid_templates = trovati %v modello/i non valido/i @@ -2717,7 +2588,6 @@ branch.restore = Ripristina il ramo "%s" issues.dependency.no_permission.can_remove = Non ha il permesso per leggere questa dipendenza ma puoi rimuovere questa dipendenza issues.review.outdated_description = Il contenuto è cambiato da quando questo commento è stato fatto settings.tags.protection.pattern.description = Puoi usare un singolo nome o un glob pattern o un'espressione regolare per selezionare più etichette. Leggi di più nella guide sulle etichette protette. -issues.author_helper = Questo utente è l'autore. issues.comment_pull_merged_at = ha fuso il commit %[1]s in %[2]s %[3]s issues.comment_manually_pull_merged_at = ha fuso manualmente il commit %[1]s in %[2]s %[3]s pulls.review_only_possible_for_full_diff = La revisione è possibile solo quando visualizzando le differenze complete @@ -2732,7 +2602,6 @@ branch.create_from = da "%s" branch.create_success = Il ramo "%s" non può essere creato. branch.download = Scarica il ramo "%s" branch.rename = Rinomina il ramo "%s" -branch.search = Cerca ramo issues.blocked_by_user = Non puoi creare una segnalazione su questo progetto perché sei bloccato dal proprietario. settings.archive.text = Archiviare il progetto lo renderà unicamente di sola lettura. Sarà nascosto nel pannello di controllo. Nessuno (neanche tu!) potrai fare nuovi commit, o aprire segnalazioni o richieste di modifica. settings.unarchive.header = Disarchivia questo progetto @@ -2763,7 +2632,6 @@ settings.merge_style_desc = Modalità di fusione settings.remove_protected_branch_failed = Impossibile rimuovere la regola di protezione del ramo "%s". settings.remove_protected_branch_success = La regola di protezione del ramo "%s" è stata rimossa. settings.update_protect_branch_success = La regola di protezione del ramo "%s" è stata aggiornata. -pulls.merged_title_desc_one = ha fuso %[1]d commit da %[2]s in %[3]s %[4]s settings.event_pull_request_approvals = Approvazioni della richiesta di modifica settings.event_pull_request_merge = Fusione della richiesta di modifica settings.authorization_header = Intestazione dell'autorizzazione @@ -2784,7 +2652,6 @@ settings.ignore_stale_approvals = Ignora approvazioni stantie settings.protected_branch_required_rule_name = Nome regola richiesta settings.protect_status_check_patterns_desc = Inserisci sequenze per specificare quali controlli dello stato devono passare prima che i rami possano essere fusi con i rami che soddisfano questa regola. Ogni riga specifica una sequenza. Le sequenze non possono essere vuote. settings.authorization_header_desc = Verrà inclusa come intestazione dell'autorizzazione per le richieste quando presente. Esempi: %s. -pulls.title_desc_one = vuole fondere %[1]d commit da %[2]s in %[3]s settings.protect_unprotected_file_patterns_desc = File non protetti dei quali è consentita la modifica direttamente se l'utente ha permesso di scrittura, saltandole restrizioni di immissione. Più sequenze possono essere separate usando il punto e virgola (";"). Vedi la documentazione su %[2]s per la sintassi delle sequenze glob. Esempi .drone.yml, /docs/**/*.txt. settings.protect_protected_file_patterns_desc = I file non protetti non possono essere modificati direttamente neanche se l'utente ha il permesso di aggiungere, modificare o eliminare file in questo ramo. Più sequenze possono essere separate usando il punto e virgola (";"). Vedi la documentazione su %s per la sintassi della sequenze. Esempi: .drone.yml, /docs/**/*.txt. settings.protect_no_valid_status_check_patterns = Nessuna sequenza valida per il controllo dello stato. @@ -2806,7 +2673,6 @@ issues.archived_label_description = (Archiviato) %s settings.sourcehut_builds.secrets_helper = Fornisci l'accesso ai segreti della build all'incarico (richiede il permesso SECRETS:RO) settings.add_webhook.invalid_path = Il percorso non deve contenere dei componenti quali ".", "..", o una stringa vuota. Non può iniziare o finire con uno slash. n_commit_one = %s commit -settings.sourcehut_builds.graphql_url = URL GraphQL (e.g. https://builds.sr.ht/query) settings.enforce_on_admins = Imponi questa regola agli amministratori del repository release.download_count_one = %s download release.download_count_few = %s downloads @@ -3004,9 +2870,7 @@ teams.none_access_helper=I membri non possono visualizzare o fare altre azioni s teams.general_access=Accesso generale teams.general_access_helper=I permessi dei membri saranno decisi dalla seguente tabella dei permessi. teams.read_access=Lettura -teams.read_access_helper=I membri possono visualizzare e clonare i repository del team. teams.write_access=Scrittura -teams.write_access_helper=I membri possono leggere e pushare sui repository del team. teams.admin_access=Accesso amministratore teams.admin_access_helper=I membri possono prelevare e immettere sui repositori del team e aggiungere collaboranti. teams.no_desc=Questo team non ha alcuna descrizione @@ -3019,12 +2883,9 @@ teams.add_team_member=Aggiungi un membro alla squadra teams.delete_team_title=Elimina squadra teams.delete_team_desc=Eliminare un team revocherà l'accesso al repository da parte dei suoi membri. Continuare? teams.delete_team_success=Il team è stato eliminato. -teams.read_permission_desc=Questo team concede l'accesso di lettura: i membri possono visualizzare e clonare i repository del team. -teams.write_permission_desc=Questo team concede l'accesso di Scrittura: i membri possono leggere da e pushare sui repository del team. teams.admin_permission_desc=Questo team concede l'accesso di Amministrante: i membri possono leggere da, immettere in e aggiungere collaboranti ai repositori del team. teams.create_repo_permission_desc=Inoltre, questo team concede il permesso di Creare repository: i membri possono creare nuove repository nell'organizzazione. teams.repositories=Progetti della squadra -teams.search_repo_placeholder=Ricerca repository… teams.remove_all_repos_title=Rimuovi tutti i repository del team teams.remove_all_repos_desc=Questo rimuoverà tutte le repository dal team. teams.add_all_repos_title=Aggiungi tutti i repository @@ -3036,9 +2897,6 @@ teams.specific_repositories=Repository specifiche teams.specific_repositories_helper=I membri avranno accesso solo alle repository aggiunte esplicitamente al team. Selezionando questo non si rimuoveranno automaticamente le repository già aggiunte con tutte le repository. teams.all_repositories=Tutte le repository teams.all_repositories_helper=Il team ha accesso a tutti i repository. Selezionando questo aggiungerà tutti le repository esistenti al team. -teams.all_repositories_read_permission_desc=Questo team concede permessi lettura l'accesso a tutte le repository: i membri possono visualizzare e clonare i repository. -teams.all_repositories_write_permission_desc=Questo team concede permessi di scrittura accesso a tutte le repository: i membri possono leggere e pushare le repository. -teams.all_repositories_admin_permission_desc=Questo team concede a Amministratore l'accesso a tutte le repository: i membri possono leggere, pushare e aggiungere collaboratori alle repository. code = Codice form.name_pattern_not_allowed = La sequenza "%s" non è consentita nel nome di un'organizzazione. settings.change_orgname_prompt = Nota: cambiare il nome dell'organizzazione cambierà anche l'URL dell'organizzazione e libererà il vecchio nome. @@ -3132,7 +2990,6 @@ dashboard.gc_metadata_obtained=Metadata del GC ottenuto dashboard.other_system_allocation_obtained=Altre allocazioni di sistema ottenute dashboard.next_gc_recycle=Prossimo riciclaggio GC dashboard.last_gc_time=Dall'ultimo GC -dashboard.total_gc_time=Pausa Totale della GC dashboard.total_gc_pause=Pausa totale del GC dashboard.last_gc_pause=Ultima pausa del GC dashboard.gc_times=Esecuzioni GC @@ -3217,9 +3074,6 @@ repos.unadopted.no_more=Nessun repository non adottato trovato repos.owner=Proprietario repos.name=Nome repos.private=Privati -repos.watches=Segue -repos.stars=Voti -repos.forks=Fork repos.issues=Segnalazioni repos.size=Dimensione @@ -3316,17 +3170,6 @@ auths.oauth2_required_claim_value_helper=Imposta questo valore per limitare il l auths.oauth2_group_claim_name=Riscatta nome che fornisce nomi di gruppo per questa fonte (facoltativo) auths.oauth2_admin_group=Valore del reclamo di gruppo per gli utenti amministratori. (Opzionale - richiede il nome della richiesta sopra) auths.oauth2_restricted_group=Valore di reclamo di gruppo per utenti ristretti. (Facoltativo - richiede il nome di reclamo sopra) -auths.enable_auto_register=Abilita registrazione automatica -auths.sspi_auto_create_users=Crea automaticamente gli utenti -auths.sspi_auto_create_users_helper=Permetti al metodo di autenticazione SSPI di creare automaticamente nuovi account per gli utenti che accedono per la prima volta -auths.sspi_auto_activate_users=Attiva automaticamente gli utenti -auths.sspi_auto_activate_users_helper=Consenti al metodo di autenticazione SSPI di attivare automaticamente i nuovi utenti -auths.sspi_strip_domain_names=Rimuovi nomi dominio dai nomi utente -auths.sspi_strip_domain_names_helper=Se selezionato, i nomi di dominio verranno rimossi dai nomi di accesso (es. "DOMAIN\user" e "user@example.org" entrambi diventeranno solo "user"). -auths.sspi_separator_replacement=Separatore da utilizzare al posto di \, / e @ -auths.sspi_separator_replacement_helper=Il carattere da utilizzare per sostituire i separatori dei nomi di logon di livello inferiore (es. il \ in "DOMAIN\user") e i nomi dell'utente principale (es. il @ in "user@example.org"). -auths.sspi_default_language=Lingua predefinita dell'utente -auths.sspi_default_language_helper=Lingua predefinita per gli utenti creati automaticamente dal metodo di autenticazione SSPI. Lascia vuoto se preferisci che la lingua venga rilevata automaticamente. auths.tips=Consigli auths.tips.oauth2.general=Autenticazione OAuth2 auths.tip.oauth2_provider=Fornitore OAuth2 @@ -3335,7 +3178,6 @@ auths.tip.nextcloud=`Registra un nuovo OAuth sulla tua istanza utilizzando il se auths.tip.dropbox=Crea una nuova applicazione su %s auths.tip.facebook=`Registra una nuova applicazione su %s e aggiungi il prodotto "Facebook Login"` auths.tip.github=Registra una nuova applicazione OAuth su %s -auths.tip.gitlab=Registra una nuova applicazione su https://gitlab.com/profile/applications auths.tip.google_plus=Ottieni le credenziali del client OAuth2 dalla console API di Google su %s auths.tip.openid_connect=Utilizza l'OpenID Connect Discovery URL (/.well-known/openid-configuration) per specificare gli endpoint auths.tip.twitter=Vai su %s, crea una applicazione e assicurati che l'opzione "Allow this application to be used to Sign In with Twitter" sia abilitata @@ -3974,8 +3816,6 @@ runs.no_runs = Il flusso di lavoro non è stato ancora eseguito. variables.creation.success = La variabile "%s" è stata aggiunta. variables.description = Le variabili saranno passate a determinate azioni e non possono essere lette altrimenti. need_approval_desc = È necessaria l'approvazione per eseguire flussi di lavoro per richieste di modifica da biforcazioni. -runs.no_workflows.documentation = Per ulteriori informazioni sulle Forgejo Actions vedi la documentazione. -runs.no_workflows.quick_start = Non sai come iniziare con le Forgejo Actions? Vedi la guida rapida. runners.delete_runner_notice = Se un'attività è in esecuzione su questo esecutore sarà terminata ed etichettata fallito. Potrebbe rompere flussi di lavoro di costruzione. runners.task_list = Attività recenti su questo esecutore runs.no_job_without_needs = Il flusso di lavoro deve contenere almeno un incarico senza dipendenze. @@ -4013,20 +3853,17 @@ changed_filemode = %[1]s → %[2]s type_tooltip = Tipo ricerca search = Cerca… fuzzy = Approssimativa -match = Precisa org_kind = Cerca organizzazioni… package_kind = Ricerca pacchetti… code_search_unavailable = La ricerca del codice non è attualmente disponibile. Contatta l'amministratorə del sito. code_kind = Cerca nel codice… team_kind = Cerca team… -code_search_by_git_grep = I risultati della ricerca del codice sono forniti da "git grep". Potrebbero esserci risultati migliori se l'amministratore del sito avesse abilitato l'indicizzatore del codice. project_kind = Ricerca progetti… commit_kind = Ricerca commit… branch_kind = Ricerca rami… no_results = Non è stato trovato alcun risultato. keyword_search_unavailable = La ricerca per parole chiave non è attualmente disponibile. Contatta l'amministratore del sito. runner_kind = Ricerca esecutori… -match_tooltip = Includi solo risultati che corrispondono precisamente al termine di ricerca fuzzy_tooltip = Includi anche risultati che corrispondono approssimativamente al termine di ricerca user_kind = Cerca utenti… repo_kind = Cerca repo… @@ -4034,7 +3871,6 @@ exact_tooltip = Includi solo i risultati che corrispondono esattamente al termin issue_kind = Cerca segnalazioni… pull_kind = Cerca richieste… exact = Esatto -milestone_kind = Ricerca tappe... regexp_tooltip = Interpreta i termini di ricerca come un'espressione regolare regexp = Espressione Regolare union_tooltip = Include i risultati che combaciano con una qualsiasi delle parole chiave separata da spazi diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index 5b8e8019f2..e1d9b78061 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -49,21 +49,14 @@ webauthn_error_unable_to_process=サーバーがリクエストを処理でき webauthn_error_duplicated=このリクエストに対しては、許可されていないセキュリティキーです。 キーが未登録であることを確認してください。 webauthn_error_empty=このキーに名前を設定する必要があります。 webauthn_error_timeout=キーを読み取る前にタイムアウトになりました。 このページをリロードしてもう一度やり直してください。 -webauthn_reload=リロード - repository=リポジトリ organization=組織 mirror=ミラー -new_repo=新しいリポジトリ -new_migrate=新しいマイグレーション new_mirror=新しいミラー new_fork=新しいフォーク -new_org=新しい組織 new_project=新しいプロジェクト new_project_column=新しい列 -manage_org=組織を管理 admin_panel=サイト管理 -account_settings=アカウント設定 settings=設定 your_profile=プロフィール your_starred=スター @@ -209,8 +202,6 @@ string.desc=Z - A [error] occurred=エラーが発生しました. report_message=Forgejo のバグが疑われる場合は、CodebergでIssueを検索して、見つからなければ新しいIssueを作成してください。 -missing_csrf=不正なリクエスト: CSRFトークンが不明です -invalid_csrf=不正なリクエスト: CSRFトークンが無効です not_found=ターゲットが見つかりませんでした。 network_error=ネットワークエラー server_internal = 内部サーバーエラー @@ -345,15 +336,10 @@ app_slogan_helper = ここにインスタンスのスローガンを入力しま [home] uname_holder=ユーザー名またはメールアドレス -password_holder=パスワード switch_dashboard_context=ダッシュボードのコンテキスト切替 my_repos=リポジトリ -show_more_repos=リポジトリをさらに表示… -collaborative_repos=共同リポジトリ my_orgs=組織 -my_mirrors=自分のミラー view_home=%s を表示 -search_repos=リポジトリを探す… filter=その他のフィルター filter_by_team_repositories=チームリポジトリで絞り込み feed_of=`"%s" のフィード` @@ -374,20 +360,8 @@ issues.in_your_repos=あなたのリポジトリ repos=リポジトリ users=ユーザー organizations=組織 -search=検索 go_to=開く code=コード -search.type.tooltip=検索タイプ -search.fuzzy=あいまい -search.fuzzy.tooltip=検索ワードにおおよそ一致している結果も含めます -search.match=一致 -search.match.tooltip=検索ワードに一致する結果だけを含めます -code_search_unavailable=現在コード検索は利用できません。 サイト管理者にお問い合わせください。 -repo_no_results=一致するリポジトリが見つかりません。 -user_no_results=一致するユーザーが見つかりません。 -org_no_results=一致する組織が見つかりません。 -code_no_results=検索ワードに一致するソースコードが見つかりません。 -code_search_results=`"%s" の検索結果` code_last_indexed_at=最終取得 %s relevant_repositories_tooltip=フォークリポジトリや、トピック、アイコン、説明のいずれも無いリポジトリは表示されません。 relevant_repositories=妥当と思われるリポジトリのみを表示しています。 フィルタリングしない結果を表示。 @@ -398,16 +372,12 @@ forks_few = %d のフォーク [auth] create_new_account=アカウントを登録 -register_helper_msg=既にアカウントをお持ちですか? 今すぐサインインしましょう! -social_register_helper_msg=既にアカウントをお持ちですか? 今すぐ連携しましょう! disable_register_prompt=登録は無効になっています。 サイト管理者にお問い合わせください。 disable_register_mail=登録でのメール確認は無効になっています。 manual_activation_only=アクティベーションを完了するにはサイト管理者に連絡してください。 remember_me=このデバイスで自動サインイン -remember_me.compromised=ログイントークンはもう有効ではなく、アカウントが侵害されたことを示している可能性があります。 異常なアクティビティがないかアカウントを確認してください。 forgot_password_title=パスワードを忘れた forgot_password=パスワードをお忘れですか? -sign_up_now=アカウントが必要ですか? 今すぐ登録しましょう。 sign_up_successful=アカウントは無事に作成されました。ようこそ! confirmation_mail_sent_prompt=新しい確認メールが %s に送信されました。登録プロセスを完了するには、受信トレイを確認し、 %s 以内に提供されたリンクをクリックして下さい。メールが間違っている場合は、ログインして別のアドレスに確認メールを再送信するようリクエストできます。 must_change_password=パスワードの更新 @@ -420,7 +390,6 @@ prohibit_login_desc=あなたのアカウントはインスタンスとのやり resent_limit_prompt=少し前に、あなたからアクティベーションメールが要求されています。 3分待ったのち、もう一度試してください。 has_unconfirmed_mail=こんにちは %s さん、あなたのメール アドレス (%s) は確認がとれていません。 確認メールを受け取っていない場合や、改めて送信したい場合は、下のボタンをクリックしてください。 resend_mail=アクティベーションメールを再送信するにはここをクリック -email_not_associate=このメールアドレスは、どのアカウントにも関連付けられていません。 send_reset_mail=アカウント回復メールを送信 reset_password=アカウントの回復 invalid_code=確認コードが無効か期限切れです。 @@ -437,7 +406,6 @@ twofa_scratch_used=あなたはスクラッチコードを使用しました。 twofa_passcode_incorrect=パスコードが正しくありません。デバイスを紛失した場合は、スクラッチコードを使ってサインインしてください。 twofa_scratch_token_incorrect=スクラッチコードが正しくありません。 login_userpass=サインイン -tab_openid=OpenID oauth_signup_tab=新規アカウント登録 oauth_signup_title=新規アカウントの仕上げ oauth_signup_submit=アカウント登録完了 @@ -463,15 +431,12 @@ authorize_application_description=アクセスを許可すると、プライベ authorize_title=`"%s"にあなたのアカウントへのアクセスを許可しますか?` authorization_failed=認可失敗 authorization_failed_desc=無効なリクエストを検出したため認可が失敗しました。 認可しようとしたアプリの開発者に連絡してください。 -sspi_auth_failed=SSPI認証に失敗しました password_pwned=あなたが選択したパスワードは、過去の情報漏洩事件で流出した盗まれたパスワードのリストに含まれています。 別のパスワードでもう一度試してください。 また他の登録でもこのパスワードからの変更を検討してください。 password_pwned_err=HaveIBeenPwnedへのリクエストを完了できませんでした change_unconfirmed_email = 登録時に間違ったメール アドレスを入力した場合は、以下で変更できます。代わりに確認メールが新しいアドレスに送信されます。 change_unconfirmed_email_error = メール アドレスを変更できません: %v change_unconfirmed_email_summary = アクティベーションメールの送信先メールアドレスを変更します。 last_admin=最後の管理者は削除できません。少なくとも一人の管理者が必要です。 -tab_signin = サインイン -tab_signup = サインアップ sign_in_openid = OpenIDで続行 back_to_sign_in = サインインに戻る unauthorized_credentials = 資格情報が正しくないか、期限が切れています。コマンドを再試行するか、詳細については %s を参照してください @@ -486,22 +451,18 @@ link_not_working_do_paste=リンクが開きませんか? コピーしてブ hi_user_x=こんにちは、%s さん。 activate_account=あなたのアカウントをアクティベートしてください。 -activate_account.title=%s さん、アカウントをアクティベートしてください activate_account.text_1=こんにちは、%[1]s さん。 %[2]s へのご登録ありがとうございます! activate_account.text_2=あなたのアカウントを有効化するため、%s以内に次のリンクをクリックしてください: activate_email=メール アドレスを確認します -activate_email.title=%s さん、メールアドレス確認をお願いします activate_email.text=あなたのメールアドレスを確認するため、%s以内に次のリンクをクリックしてください: register_notify=%sへようこそ -register_notify.title=%[1]s さん、%[2]s にようこそ register_notify.text_1=これは %s への登録確認メールです! register_notify.text_2=あなたはユーザー名 %s でログインできるようになりました。 register_notify.text_3=他の人があなたのアカウントを作成した場合、最初にパスワードを設定してください。 reset_password=アカウントを回復 -reset_password.title=%s さん、あなたのアカウントの復元がリクエストされました reset_password.text=あなたのアカウントを回復するには、%s以内に次のリンクをクリックしてください: register_success=登録が完了しました @@ -576,8 +537,6 @@ RepoName=リポジトリ名 Email=メールアドレス Password=パスワード Retype=パスワード確認 -SSHTitle=SSHキー名 -HttpsUrl=HTTPS URL PayloadUrl=ペイロードのURL TeamName=チーム名 AuthName=承認名 @@ -590,9 +549,6 @@ CommitChoice=コミットを選択 TreeName=ファイルパス Content=内容 -SSPISeparatorReplacement=セパレーター -SSPIDefaultLanguage=デフォルトの言語 - require_error=`は空にできません。` alpha_dash_error=`は、英数字、ダッシュ("-")、アンダースコア("_")だけを含めることができます。` alpha_dash_dot_error=`は、英数字、ダッシュ('-')、アンダースコア('_')、ドット('.')だけを含めることができます。` @@ -614,7 +570,6 @@ lang_select_error=言語をリストから選択してください。 username_been_taken=ユーザー名が既に使用されています。 username_change_not_local_user=非ローカルユーザーのユーザー名は変更できません。 -username_has_not_been_changed=ユーザー名は変更されていません repo_name_been_taken=リポジトリ名が既に使用されています。 repository_force_private=強制プライベートが有効です。プライベートリポジトリはパブリックにできません。 repository_files_already_exist=このリポジトリのファイルはすでに存在します。システム管理者に問い合わせてください。 @@ -692,7 +647,6 @@ unfollow=フォロー解除 user_bio=経歴 disabled_public_activity=このユーザーはアクティビティ表示を公開していません。 email_visibility.limited=あなたのメールアドレスはすべての認証済みユーザーに表示されています -email_visibility.private=あなたのメールアドレスは、あなたと管理者のみに表示されます show_on_map=地図上にこの場所を表示 settings=ユーザー設定 @@ -726,13 +680,11 @@ password=パスワード security=セキュリティ avatar=アバター ssh_gpg_keys=SSH / GPGキー -social=ソーシャルアカウント applications=アプリケーション orgs=組織 repos=リポジトリ delete=アカウントを削除 twofa=2要素認証 (TOTP) -account_link=連携アカウント organization=組織 uid=UID webauthn=2要素認証 (セキュリティキー) @@ -779,10 +731,7 @@ comment_type_group_issue_ref=イシューの参照先 saved_successfully=設定は正常に保存されました。 privacy=プライバシー keep_activity_private=プロフィールページのアクティビティ表示を隠す -keep_activity_private_popup=アクティビティを、あなたとインスタンス管理者にのみ表示します - lookup_avatar_by_mail=メールアドレスでアバターを見つける -federated_avatar_lookup=フェデレーテッド・アバター検索 enable_custom_avatar=カスタムアバターを有効にする choose_new_avatar=新しいアバターを選択 update_avatar=アバターを更新 @@ -800,7 +749,6 @@ password_incorrect=現在のパスワードが正しくありません。 change_password_success=パスワードを更新しました。 今後は新しいパスワードを使ってサインインしてください。 password_change_disabled=ローカルユーザーでない場合は、ForgejoのWebインターフェースからパスワードを変更することはできません。 -emails=メールアドレス manage_emails=メールアドレスの管理 manage_themes=デフォルトテーマ manage_openid=OpenIDアドレス @@ -843,8 +791,6 @@ principal_desc=これらのSSH証明書プリンシパルがあなたのアカ gpg_desc=あなたのアカウントに関連付けられているGPG公開鍵です。 これらの鍵でコミットが検証できるよう、秘密鍵は安全に保管してください。 ssh_helper=ヘルプが必要ですか? GitHubのガイドをご覧ください: SSHキーの作成、SSHを使う際によくある問題 gpg_helper=ヘルプが必要ですか? GitHubのガイドをご覧ください: 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', or 'sk-ssh-ed25519@openssh.com' key_content_gpg_placeholder=先頭は "-----BEGIN PGP PUBLIC KEY BLOCK-----" add_new_principal=プリンシパルを追加 @@ -862,7 +808,6 @@ gpg_invalid_token_signature=入力されたGPG鍵、署名、トークンが合 gpg_token_required=以下のトークンの署名を入力する必要があります gpg_token=トークン gpg_token_help=署名はこの方法で生成できます: -gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=Armor形式のGPG署名 key_signature_gpg_placeholder=先頭は "-----BEGIN PGP SIGNATURE-----" verify_gpg_key_success=GPG鍵 "%s" を確認しました。 @@ -909,11 +854,6 @@ hide_openid=プロフィールに表示しない ssh_disabled=SSHは無効です ssh_signonly=SSHは現在無効になっているため、これらのキーはコミット署名の検証にのみ使用されます。 ssh_externally_managed=このユーザー用に外部で管理されているSSHキーです -manage_social=関連付けられているソーシャルアカウントを管理 -social_desc=これらのソーシャルアカウントで、あなたのアカウントにサインインできます。 すべて自分が知っているものであることを確認してください。 -unbind=連携の解除 -unbind_success=ソーシャルアカウントの登録を削除しました。 - manage_access_token=アクセストークン generate_new_token=新しいトークンを生成 tokens_desc=これらのトークンは、Forgejo APIによるアカウントへのアクセスを許可します。 @@ -923,8 +863,6 @@ generate_token_success=あなたの新しいトークンを生成しました。 generate_token_name_duplicate=アプリケーション名 %s は既に使われています。他の名前を使用してください。 delete_token=削除 access_token_deletion=アクセストークンの削除 -access_token_deletion_cancel_action=キャンセル -access_token_deletion_confirm_action=削除 access_token_deletion_desc=トークンを削除すると、それを使用しているアプリケーションは、アカウントへのアクセスができなくなります。これは元に戻せません。続行しますか? delete_token_success=トークンを削除しました。 削除したトークンを使用しているアプリケーションは、今後あなたのアカウントにアクセスできません。 repo_and_org_access=リポジトリと組織へのアクセス @@ -998,7 +936,6 @@ webauthn_alternative_tip=もうひとつ別の認証方法も設定しておく manage_account_links=連携アカウント manage_account_links_desc=これらの外部アカウントがForgejoアカウントと連携されています。 -account_links_not_available=現在このForgejoアカウントが連携している外部アカウントはありません。 link_account=アカウントを連携 remove_account_link=連携アカウントの削除 remove_account_link_desc=連携アカウントを削除し、Forgejoアカウントへのアクセス権を取り消します。 続行しますか? @@ -1036,7 +973,6 @@ blocked_since = %s からブロック中 user_block_success = このユーザーをブロックするのに成功しました。 change_password = パスワードを変更 pronouns = 代名詞 -pronouns_custom = カスタム pronouns_unspecified = 未指定 update_hints = ヒントを更新 additional_repo_units_hint_description = 利用可能なすべての機能が有効になっていないリポジトリに対して、「さらに有効にする」ヒントを表示します。 @@ -1075,7 +1011,6 @@ fork_branch=フォークにクローンされるブランチ all_branches=すべてのブランチ fork_no_valid_owners=このリポジトリには有効なオーナーがいないため、フォークできません。 use_template=このテンプレートを使用 -clone_in_vsc=VSCodeでクローン download_zip=ZIPファイルをダウンロード download_tar=TAR.GZファイルをダウンロード download_bundle=バンドルをダウンロード @@ -1097,11 +1032,6 @@ readme=README readme_helper=READMEファイル テンプレートを選択してください readme_helper_desc=プロジェクトについての説明をひととおり書く場所です。 auto_init=リポジトリの初期設定 (.gitignore、ライセンスファイル、READMEファイルの追加) -trust_model_helper=署名検証のトラストモデルを選択します。 選択肢は次のとおりです: -trust_model_helper_collaborator=共同作業者: 共同作業者による署名を信頼します -trust_model_helper_committer=コミッター: コミットした人と一致している署名を信頼します -trust_model_helper_collaborator_committer=共同作業者+コミッター: 共同作業者による署名で、コミットした人と一致しているものを信頼します -trust_model_helper_default=デフォルト: このシステムのデフォルトのトラストモデルを使用します create_repo=リポジトリを作成 default_branch=デフォルトブランチ default_branch_label=デフォルト @@ -1174,9 +1104,6 @@ template.invalid=テンプレートリポジトリを選択する必要があり archive.title=このリポジトリはアーカイブされています。 ファイルの閲覧とクローンは可能ですが、プッシュ、イシューの作成、プルリクエストはできません。 archive.title_date=このリポジトリは%sにアーカイブされています。 ファイルの閲覧とクローンは可能ですが、プッシュ、イシューの作成、プルリクエストはできません。 -archive.issue.nocomment=このリポジトリはアーカイブされています。 イシューにコメントを追加することはできません。 -archive.pull.nocomment=このリポジトリはアーカイブされています。 プルリクエストにコメントを追加することはできません。 - form.reach_limit_of_creation_1=すでにあなたが作成できるリポジトリ数の上限 %d 個に達しています。 form.reach_limit_of_creation_n=すでにあなたが作成できるリポジトリ数の上限 %d 個に達しています。 form.name_reserved=リポジトリ名 "%s" は予約されています。 @@ -1184,7 +1111,6 @@ form.name_pattern_not_allowed=`"%s" の形式はリポジトリ名に使用で need_auth=認証 migrate_options=移行オプション -migrate_service=移行するサービス migrate_options_mirror_helper=このリポジトリをミラーにする migrate_options_lfs=LFS ファイルのマイグレート migrate_options_lfs_endpoint.label=LFS エンドポイント @@ -1270,7 +1196,6 @@ branches=ブランチ tags=タグ issues=イシュー pulls=プルリクエスト -project_board=プロジェクト packages=パッケージ actions=Actions labels=ラベル @@ -1284,7 +1209,6 @@ release=リリース releases=リリース tag=タグ released_this=がこれをリリース -tagged_this=がタグ付け file.title=%s at %s file_raw=Raw file_history=履歴 @@ -1397,9 +1321,7 @@ commits.desc=ソースコードの変更履歴を参照します。 commits.commits=コミット commits.no_commits=共通のコミットはありません。 "%s" と "%s" の履歴はすべて異なっています。 commits.nothing_to_compare=二つのブランチは同じ内容です。 -commits.search=コミットの検索… commits.search.tooltip=`キーワード "author:"、"committer:"、"after:"、"before:" を付けて指定できます。 例 "revert author:Alice before:2019-01-13"` -commits.find=検索 commits.search_all=すべてのブランチ commits.author=作成者 commits.message=メッセージ @@ -1427,8 +1349,6 @@ commitstatus.pending=保留 commitstatus.success=成功 ext_issues=外部イシュー -ext_issues.desc=外部のイシュートラッカーへのリンク。 - projects=プロジェクト projects.desc=プロジェクトボードでイシューとプルを管理します。 projects.description=説明 (オプション) @@ -1450,7 +1370,6 @@ projects.type.basic_kanban=基本的なカンバン projects.type.bug_triage=バグ トリアージ projects.template.desc=テンプレート projects.template.desc_helper=開始するプロジェクトテンプレートを選択 -projects.type.uncategorized=未分類 projects.column.edit=列を編集 projects.column.edit_title=名称 projects.column.new_title=名称 @@ -1458,8 +1377,6 @@ projects.column.new_submit=列を作成 projects.column.new=新しい列 projects.column.set_default=デフォルトに設定 projects.column.set_default_desc=この列を未分類のイシューやプルリクエストが入るデフォルトの列にします -projects.column.unset_default=デフォルトを解除 -projects.column.unset_default_desc=この列からデフォルト列の設定を解除します projects.column.delete=列を削除 projects.column.deletion_desc=プロジェクト列を削除すると、関連するすべてのイシューがデフォルトの列に移動します。 続行しますか? projects.column.color=カラー @@ -1573,7 +1490,6 @@ issues.filter_sort.moststars=スターが多い順 issues.filter_sort.feweststars=スターが少ない順 issues.filter_sort.mostforks=フォークが多い順 issues.filter_sort.fewestforks=フォークが少ない順 -issues.keyword_search_unavailable=現在キーワード検索は利用できません。 サイト管理者にお問い合わせください。 issues.action_open=オープン issues.action_close=クローズ issues.action_label=ラベル @@ -1618,11 +1534,8 @@ issues.ref_issue_from=`が%[3]s、このイシューを参照が%[3]s、このプルリクエストを参照 %[1]s` issues.ref_closing_from=`が%[3]s、プルリクエストがこのイシューをクローズするよう参照 %[1]s` issues.ref_reopening_from=`が%[3]s、プルリクエストがこのイシューを再オープンするよう参照 %[1]s` -issues.ref_closed_from=`が%[4]s、このイシューをクローズ %[2]s` -issues.ref_reopened_from=`が%[4]s、このイシューを再オープン %[2]s` issues.ref_from=` %[1]s にて` issues.author=作成者 -issues.author_helper=このユーザーは作成者です。 issues.role.owner=オーナー issues.role.owner_helper=このユーザーはこのリポジトリの所有者です。 issues.role.member=メンバー @@ -1717,18 +1630,13 @@ issues.add_time_sum_to_small=時間が入力されていません。 issues.time_spent_total=かかった時間の合計 issues.time_spent_from_all_authors=`かかった時間の合計: %s` issues.due_date=期日 -issues.invalid_due_date_format=期日は 'yyyy-mm-dd' の形式で入力してください。 -issues.error_modifying_due_date=期日を変更できませんでした。 -issues.error_removing_due_date=期日を削除できませんでした。 issues.push_commit_1=が %d コミット追加 %s issues.push_commits_n=が %d コミット追加 %s issues.force_push_codes=`が %[1]s を強制プッシュ ( %[2]s %[8]s から %[4]s %[9]s へ ) %[6]s` issues.force_push_compare=比較 issues.due_date_form=yyyy-mm-dd -issues.due_date_form_add=期日の追加 issues.due_date_form_edit=変更 issues.due_date_form_remove=削除 -issues.due_date_not_writer=イシューの期日を変更するには、リポジトリへの書き込み権限が必要です。 issues.due_date_not_set=期日は未設定です。 issues.due_date_added=が期日 %s を追加 %s issues.due_date_modified=が期日を %[2]s から %[1]s に変更 %[3]s @@ -1781,7 +1689,6 @@ issues.review.remove_review_request=が %s へのレビュー依頼を取り消 issues.review.remove_review_request_self=がレビューを拒否 %s issues.review.pending=保留 issues.review.pending.tooltip=このコメントは現在他のユーザーに表示されていません。 保留中のコメントを送信するには、このページの上にある "%s" -> "%s/%s/%s" を選択してください。 -issues.review.review=レビュー issues.review.reviewers=レビューア issues.review.outdated=古い内容 issues.review.outdated_description=このコメントが作成されたあとにコンテンツが変更されています @@ -1794,7 +1701,6 @@ issues.review.hide_resolved=解決済みを隠す issues.review.resolve_conversation=解決済みにする issues.review.un_resolve_conversation=未解決にする issues.review.resolved_by=がこの会話を解決済みにしました -issues.assignee.error=予期しないエラーにより、一部の担当者を追加できませんでした。 issues.reference_issue.body=内容 issues.content_history.deleted=削除しました issues.content_history.edited=編集済み @@ -1802,8 +1708,6 @@ issues.content_history.created=作成済み issues.content_history.delete_from_history=履歴から削除 issues.content_history.delete_from_history_confirm=履歴から削除しますか? issues.content_history.options=オプション -issues.reference_link=リファレンス: %s - compare.compare_base=基準 compare.compare_head=比較 @@ -1837,8 +1741,6 @@ pulls.nothing_to_compare=同じブランチ同士のため、 プルリクエス pulls.nothing_to_compare_and_allow_empty_pr=これらのブランチは内容が同じです。 空のプルリクエストになります。 pulls.has_pull_request=`同じブランチのプルリクエストはすでに存在します: %[2]s#%[3]d` pulls.create=プルリクエストを作成 -pulls.title_desc_few=が %[2]s から %[3]s への %[1]d コミットのマージを希望しています -pulls.merged_title_desc_few=が %[1]d 個のコミットを %[2]s から %[3]s へマージ %[4]s pulls.change_target_branch_at=`がターゲットブランチを %s から %s に変更 %s` pulls.tab_conversation=会話 pulls.tab_commits=コミット @@ -1998,8 +1900,6 @@ signing.wont_sign.approved=PRが未承認のため、マージは署名されま signing.wont_sign.not_signed_in=サインインしていません。 ext_wiki=外部Wiki -ext_wiki.desc=外部Wikiへのリンク。 - wiki=Wiki wiki.welcome=Wikiへようこそ。 wiki.welcome_desc=Wikiを使って共同作業者とドキュメンテーションの作成と共有ができます。 @@ -2095,17 +1995,6 @@ activity.git_stats_deletion_n=%d行削除 contributors.contribution_type.commits=コミット -search=検索 -search.search_repo=リポジトリを検索 -search.type.tooltip=検索タイプ -search.fuzzy=あいまい -search.fuzzy.tooltip=検索ワードにおおよそ一致している結果も含めます -search.match=一致 -search.match.tooltip=検索ワードに一致する結果だけを含めます -search.results=%[3]s 内での "%[1]s" の検索結果 -search.code_no_results=検索ワードに一致するソースコードが見つかりません。 -search.code_search_unavailable=現在コード検索は利用できません。 サイト管理者にお問い合わせください。 - settings=設定 settings.desc=設定では、リポジトリの設定を管理することができます。 settings.options=リポジトリ @@ -2213,7 +2102,6 @@ settings.transfer_abort=転送をキャンセル settings.transfer_abort_invalid=存在しないリポジトリの移転はキャンセルできません。 settings.transfer_abort_success=%s へのリポジトリ移転は正常にキャンセルされました。 settings.transfer_desc=別のユーザーやあなたが管理者権限を持っている組織にリポジトリを移転します。 -settings.transfer_form_title=確認のためリポジトリ名を入力: settings.transfer_in_progress=現在進行中の移転があります。このリポジトリを別のユーザーに移転したい場合はキャンセルしてください。 settings.transfer_notices_1=- 個人ユーザーに移転すると、あなたはリポジトリへのアクセス権を失います。 settings.transfer_notices_2=- あなたが所有(または共同で所有)している組織に移転すると、リポジトリへのアクセス権は維持されます。 @@ -2258,7 +2146,6 @@ settings.delete_collaborator=削除 settings.collaborator_deletion=共同作業者の削除 settings.collaborator_deletion_desc=共同作業者を削除し、このリポジトリへのアクセス権を取り消します。 続行しますか? settings.remove_collaborator_success=共同作業者を削除しました。 -settings.search_user_placeholder=ユーザーを検索… settings.org_not_allowed_to_be_collaborator=組織を共同作業者として追加することはできません。 settings.change_team_access_not_allowed=リポジトリに対するチームアクセス権の変更は、組織のオーナーのみに制限されています。 settings.team_not_in_organization=チームがリポジトリと同じ組織に属していません。 @@ -2266,7 +2153,6 @@ settings.teams=チーム settings.add_team=チームを追加 settings.add_team_duplicate=チームにはすでにこのリポジトリが登録されています。 settings.add_team_success=チームがこのリポジトリにアクセスできるようになりました。 -settings.search_team=チームを検索… settings.change_team_permission_tip=チームの権限はチーム設定ページで設定されており、リポジトリごとに変更することはできません settings.delete_team_tip=このチームはすべてのリポジトリにアクセスでき、削除できません settings.remove_team_success=チームのこのリポジトリへのアクセス権を削除しました。 @@ -2404,12 +2290,7 @@ settings.branches=ブランチ settings.protected_branch=ブランチの保護 settings.protected_branch.save_rule=ルールを保存 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.protect_this_branch=ブランチの保護を有効にする -settings.protect_this_branch_desc=ブランチの削除を防ぎ、ブランチへのプッシュやマージを制限します。 settings.protect_disable_push=プッシュ無効 settings.protect_disable_push_desc=このブランチへのプッシュは許可されません。 settings.protect_enable_push=プッシュ有効 @@ -2420,9 +2301,7 @@ settings.protect_whitelist_committers=ホワイトリストでプッシュを制 settings.protect_whitelist_committers_desc=ホワイトリストに登録したユーザーまたはチームにのみ、このブランチへのプッシュが許可されます。(強制プッシュ以外) settings.protect_whitelist_deploy_keys=プッシュ可能な書き込み権限を持つデプロイキーをホワイトリストに含める。 settings.protect_whitelist_users=プッシュ・ホワイトリストに含むユーザー: -settings.protect_whitelist_search_users=ユーザーを検索… settings.protect_whitelist_teams=プッシュ・ホワイトリストに含むチーム: -settings.protect_whitelist_search_teams=チームを検索… settings.protect_merge_whitelist_committers=マージ・ホワイトリストを有効にする settings.protect_merge_whitelist_committers_desc=ホワイトリストに登録したユーザーまたはチームにだけ、このブランチに対するプルリクエストのマージを許可します。 settings.protect_merge_whitelist_users=マージ・ホワイトリストに含むユーザー: @@ -2452,8 +2331,6 @@ settings.protect_protected_file_patterns=保護されるファイルのパター settings.protect_protected_file_patterns_desc=保護されたファイルは、このブランチにファイルを追加・編集・削除する権限を持つユーザーであっても、直接変更することができなくなります。 セミコロン(';')で区切って複数のパターンを指定できます。 パターンの文法については %[2]s を参照してください。 例: .drone.yml, /docs/**/*.txt settings.protect_unprotected_file_patterns=保護しないファイルのパターン (セミコロン';'で区切る): settings.protect_unprotected_file_patterns_desc=保護しないファイルは、ユーザーに書き込み権限があればプッシュ制限をバイパスして直接変更できます。 セミコロン(';')で区切って複数のパターンを指定できます。 パターンの文法については %[2]s を参照してください。 例: .drone.yml, /docs/**/*.txt -settings.add_protected_branch=保護を有効にする -settings.delete_protected_branch=保護を無効にする settings.update_protect_branch_success=ルール "%s" に対するブランチ保護を更新しました。 settings.remove_protected_branch_success=ルール "%s" に対するブランチ保護を削除しました。 settings.remove_protected_branch_failed=ブランチ保護ルール "%s" を削除できませんでした。 @@ -2532,8 +2409,6 @@ settings.lfs_pointers.associateAccessible=アクセス可能な%d件のOIDを登 settings.rename_branch_failed_exist=ターゲットブランチ %s が存在するため、ブランチの名前を変更できません。 settings.rename_branch_failed_not_exist=ブランチが存在しないので、ブランチ %s の名前を変更できません。 settings.rename_branch_success=ブランチ %s の名前を %s に変更しました。 -settings.rename_branch_from=以前のブランチ名 -settings.rename_branch_to=新しいブランチ名 settings.rename_branch=ブランチ名を変更 diff.browse_source=ソースを参照 @@ -2542,7 +2417,6 @@ diff.commit=コミット diff.git-notes=Notes diff.data_not_available=差分はありません diff.options_button=差分オプション -diff.show_diff_stats=統計情報を表示 diff.download_patch=Patchファイルをダウンロード diff.download_diff=Diffファイルをダウンロード diff.show_split_view=分割表示 @@ -2635,7 +2509,6 @@ release.tag_name_invalid=タグ名が不正です。 release.tag_name_protected=保護されているタグ名です。 release.tag_already_exist=このタグ名は既に存在します。 release.downloads=ダウンロード -release.download_count=ダウンロード数: %s release.add_tag_msg=リリースのタイトルと内容をタグのメッセージにする release.add_tag=タグを作成 release.releases_for=%s のリリース @@ -2664,14 +2537,12 @@ branch.default_deletion_failed=ブランチ "%s" はデフォルトブランチ branch.restore=ブランチ "%s" の復元 branch.download=ブランチ "%s" をダウンロード branch.rename=ブランチ名 "%s" を変更 -branch.search=ブランチを検索 branch.included_desc=このブランチはデフォルトブランチに含まれています branch.included=含有 branch.create_new_branch=このブランチをもとに作成します: branch.confirm_create_branch=ブランチを作成 branch.warning_rename_default_branch=デフォルトブランチの名前を変更しようとしています。 branch.rename_branch_to=`"%s" を変更:` -branch.confirm_rename_branch=ブランチ名を変更 branch.create_branch_operation=ブランチを作成 branch.new_branch=新しいブランチの作成 branch.new_branch_from=`"%s" から新しいブランチを作成` @@ -2696,7 +2567,6 @@ error.csv.too_large=このファイルは大きすぎるため表示できませ error.csv.unexpected=このファイルは %d 行目の %d 文字目に予期しない文字が含まれているため表示できません。 error.csv.invalid_field_count=このファイルは %d 行目のフィールドの数が正しくないため表示できません。 admin.enabled_flags = このリポジトリで有効になっているフラグ: -clone_in_vscodium = VSCodiumでcloneする wiki.cancel = キャンセル activity.navbar.contributors = 貢献者 contributors.contribution_type.filter_label = 貢献の種類: @@ -2712,7 +2582,6 @@ pulls.blocked_by_user = あなたはこのリポジトリの所有者からブ rss.must_be_on_branch = RSSフィードを見るためには、ブランチを閲覧する必要があります。 migrate.forgejo.description = codeberg.orgまたは他のインスタンスからデータを移行する。 commits.browse_further = もっと見る -issues.comment.blocked_by_user = あなたはこのリポジトリの所有者か、Issueの投稿者からブロックされているため、このIssueにコメントできません。 pulls.reopen_failed.head_branch = ブランチがもう存在しないため、このプルリクエストはreopenできません。 pulls.reopen_failed.base_branch = ベースブランチがもう存在しないため、このプルリクエストは再開できません。 settings.units.overview = 概要 @@ -2769,7 +2638,6 @@ settings.add_webhook.invalid_path = パスには「.」や「..」や空の文 settings.sourcehut_builds.manifest_path = Build manifestのパス settings.sourcehut_builds.secrets_helper = ジョブにビルドシークレットへのアクセス権を付与します (SECRETS:RO 権限が必要です) release.hide_archive_links_helper = このリリース用に自動的に生成されたソース コード アーカイブを非表示にします。たとえば、独自のソース コードをアップロードする場合などです。 -error.broken_git_hook = このリポジトリの Git フックが壊れているようです。ドキュメントに従って修正し、コミットをいくつかプッシュしてステータスを更新してください。 editor.commit_id_not_matching = 編集中にファイルが変更されました。新しいブランチにコミットしてからマージしてください。 issues.num_participants_one = %d 人の参加者 commits.search_branch = このブランチ @@ -2778,8 +2646,6 @@ editor.push_out_of_date = このpushはもう古いようです。 issues.archived_label_description = (アーカイブ済) %s settings.web_hook_name_sourcehut_builds = SourceHut Builds settings.matrix.room_id_helper = ルームIDは、Element web clientのRoom Settings > Advanced > Internal room IDから取得できます。例:%s。 -pulls.merged_title_desc_one = %[4]s の %[2]s から %[1]d 件のコミットを %[3]s へマージした -pulls.title_desc_one = %[2]sから %[1]d 件のコミットを %[3]s へマージしたい pulls.ready_for_review = レビューの準備ができていますか? settings.transfer.button = 所有権を移送する settings.transfer.modal.title = 所有権を移送 @@ -2918,9 +2784,7 @@ teams.none_access_helper=「アクセスなし」オプションはプライベ teams.general_access=カスタム権限 teams.general_access_helper=メンバーの権限は下記の権限テーブルで決定されます。 teams.read_access=読み取り -teams.read_access_helper=メンバーはチームリポジトリの閲覧とクローンが可能です。 teams.write_access=書き込み -teams.write_access_helper=メンバーはチームリポジトリの読み取りとプッシュが可能です。 teams.admin_access=管理者権限 teams.admin_access_helper=メンバーは、チームリポジトリへのプル、プッシュ、共同作業者の追加が可能です。 teams.no_desc=このチームには説明がありません。 @@ -2935,12 +2799,9 @@ teams.invite_team_member.list=保留中の招待 teams.delete_team_title=チームの削除 teams.delete_team_desc=チームを削除すると、メンバーはこのリポジトリへのアクセス権を失います。 続行しますか? teams.delete_team_success=チームを削除しました。 -teams.read_permission_desc=このチームは読み取りアクセス権を持ちます: メンバーはチームリポジトリの閲覧とクローンが可能です。 -teams.write_permission_desc=このチームは書き込みアクセス権を持ちます: メンバーはチームリポジトリの読み取りとプッシュが可能です。 teams.admin_permission_desc=このチームは管理者アクセス権が付与されます: メンバーはチームリポジトリの読み取り、プッシュ、共同作業者の追加が可能です。 teams.create_repo_permission_desc=さらに、このチームにはリポジトリの作成権限が与えられています: メンバーは組織のリポジトリを新たに作成できます。 teams.repositories=チームのリポジトリ -teams.search_repo_placeholder=リポジトリを検索… teams.remove_all_repos_title=チームリポジトリをすべて除去 teams.remove_all_repos_desc=チームからすべてのリポジトリを除去します。 teams.add_all_repos_title=すべてのリポジトリを追加 @@ -2953,9 +2814,6 @@ teams.specific_repositories=指定したリポジトリ teams.specific_repositories_helper=メンバーは、明示的にチームへ追加したリポジトリにのみアクセスできます。 これを選択しても、すでにすべてのリポジトリで追加されたリポジトリは自動的に除去されません。 teams.all_repositories=すべてのリポジトリ teams.all_repositories_helper=チームはすべてのリポジトリにアクセスできます。 これを選択すると、既存のすべてのリポジトリをチームに追加します。 -teams.all_repositories_read_permission_desc=このチームはすべてのリポジトリ読み取りアクセス権を持ちます: メンバーはリポジトリの閲覧とクローンが可能です。 -teams.all_repositories_write_permission_desc=このチームはすべてのリポジトリ書き込みアクセス権を持ちます: メンバーはリポジトリの読み取りとプッシュが可能です。 -teams.all_repositories_admin_permission_desc=このチームはすべてのリポジトリ管理者アクセス権を持ちます: メンバーはリポジトリの読み取り、プッシュ、共同作業者の追加が可能です。 teams.invite.title=あなたは組織 %[2]s 内のチーム %[1]s への参加に招待されました。 teams.invite.by=%s からの招待 teams.invite.description=下のボタンをクリックしてチームに参加してください。 @@ -3049,7 +2907,6 @@ dashboard.gc_metadata_obtained=GCメタデータ用取得量 dashboard.other_system_allocation_obtained=その他システム割当用取得量 dashboard.next_gc_recycle=次回のGCリサイクル dashboard.last_gc_time=前回GCからの時間 -dashboard.total_gc_time=GC停止時間の合計 dashboard.total_gc_pause=GC停止時間の合計 dashboard.last_gc_pause=前回のGC停止時間 dashboard.gc_times=GC実行回数 @@ -3148,9 +3005,6 @@ repos.unadopted.no_more=未登録のリポジトリはありません repos.owner=オーナー repos.name=名称 repos.private=プライベート -repos.watches=ウォッチ -repos.stars=スター -repos.forks=フォーク repos.issues=イシュー repos.size=サイズ repos.lfs_size=LFSサイズ @@ -3255,17 +3109,6 @@ auths.oauth2_admin_group=管理者ユーザーのグループClaim値 (オプシ auths.oauth2_restricted_group=制限付きユーザーのグループClaim値 (オプション - 上のClaim名が必要) auths.oauth2_map_group_to_team=見つかったグループを組織のチームにマップ (オプション - 上のClaim名が必要) auths.oauth2_map_group_to_team_removal=対応するグループにユーザーが含まれない場合、同期しているチームからユーザーを削除する -auths.enable_auto_register=自動登録を有効にする -auths.sspi_auto_create_users=自動的にユーザーを作成 -auths.sspi_auto_create_users_helper=初回ログインのユーザーに対して、SSPI認証処理が新しいアカウントを自動的に作成することを許可します -auths.sspi_auto_activate_users=自動的にユーザーをアクティベート -auths.sspi_auto_activate_users_helper=SSPI認証処理が新規ユーザーを自動的にアクティベートすることを許可します -auths.sspi_strip_domain_names=ユーザー名からドメイン名を除去 -auths.sspi_strip_domain_names_helper=チェックを入れると、ログオン名からドメイン名を除去します。 (例. "DOMAIN\user" や "user@example.org" は、どちらも "user" となります) -auths.sspi_separator_replacement=\、/、@の代わりに使用するセパレーター -auths.sspi_separator_replacement_helper=ダウンレベルログオン名のセパレーター (例. "DOMAIN\user" の \ ) やユーザープリンシパル名のセパレーター (例. "user@example.org" の @ ) を置き換えるときに使用する文字です。 -auths.sspi_default_language=ユーザーのデフォルトの言語 -auths.sspi_default_language_helper=SSPI認証処理によって自動的に作成されるユーザーのデフォルトの言語です。 言語を自動検出する方が良い場合は空のままにしてください。 auths.tips=ヒント auths.tips.oauth2.general=OAuth2認証 auths.tips.oauth2.general.tip=新しいOAuth2認証を登録するときは、コールバック/リダイレクトURLは以下になります: @@ -3275,7 +3118,6 @@ auths.tip.nextcloud=新しいOAuthコンシューマーを、インスタンス auths.tip.dropbox=新しいアプリケーションを %s から登録してください。 auths.tip.facebook=新しいアプリケーションを %s で登録し、"Facebook Login"を追加してください。 auths.tip.github=新しいOAuthアプリケーションを %s から登録してください。 -auths.tip.gitlab=新しいアプリケーションを https://gitlab.com/profile/applications から登録してください。 auths.tip.google_plus=OAuth2クライアント資格情報を、Google APIコンソール %s から取得してください。 auths.tip.openid_connect=OpenID Connect DiscoveryのURL (/.well-known/openid-configuration) をエンドポイントとして指定してください auths.tip.twitter=%s へアクセスしてアプリケーションを作成し、“Allow this application to be used to Sign in with Twitter”オプションを有効にしてください。 @@ -3843,8 +3685,6 @@ runs.actors_no_select=すべてのアクター runs.status_no_select=すべてのステータス runs.no_results=一致する結果はありません。 runs.no_workflows=ワークフローはまだありません。 -runs.no_workflows.quick_start = Forgejo Action の始め方がわからない? クイックスタートガイドをご覧ください。 -runs.no_workflows.documentation = Forgejo Action の詳細については、ドキュメントを参照してください。 runs.no_runs=ワークフローはまだ実行されていません。 runs.empty_commit_message=(空のコミットメッセージ) @@ -3913,16 +3753,12 @@ branch_kind = ブランチを検索… commit_kind = コミットを検索… user_kind = ユーザーを検索… team_kind = チームを検索… -code_search_by_git_grep = 現在のコード検索結果は「git grep」によって提供されます。サイト管理者がコード インデクサーを有効にすると、より良い結果が得られる可能性があります。 package_kind = パッケージを検索… project_kind = プロジェクトを検索… keyword_search_unavailable = キーワードによる検索は現在ご利用いただけません。サイト管理者にお問い合わせください。 runner_kind = ランナーを検索… no_results = 一致する結果が見つかりませんでした。 fuzzy_tooltip = 入力された語句に近いものも結果に含める -match = 一致 -match_tooltip = 検索語句に厳密に一致するもののみ結果に含める -milestone_kind = マイルストーンを検索... union_tooltip = 空白で区切られたキーワードのいずれかに一致する結果を含める exact_tooltip = 検索語句と完全に一致する結果のみを含める issue_kind = イシューを検索… diff --git a/options/locale/locale_jbo.ini b/options/locale/locale_jbo.ini index 947bb298de..3048ab1570 100644 --- a/options/locale/locale_jbo.ini +++ b/options/locale/locale_jbo.ini @@ -1,6 +1,3 @@ - - - [common] home = zdani dashboard = jitypalna diff --git a/options/locale/locale_ka.ini b/options/locale/locale_ka.ini index bebd021965..eb60c243b2 100644 --- a/options/locale/locale_ka.ini +++ b/options/locale/locale_ka.ini @@ -1,6 +1,3 @@ - - - [common] register = რეგისტრაცია pin = ამაგრება diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini index 8e8d9b1d6b..6cb342a39d 100644 --- a/options/locale/locale_ko-KR.ini +++ b/options/locale/locale_ko-KR.ini @@ -32,15 +32,10 @@ passcode=인증코드 repository=저장소 organization=조직 mirror=미러 -new_repo=새 저장소 -new_migrate=새 마이그레이션 new_mirror=새로운 미러 new_fork=새 저장소 포크 -new_org=새로운 조직 new_project=새로운 프로젝트 -manage_org=조직 관리 admin_panel=사이트 관리 -account_settings=계정 설정 settings=설정 your_profile=프로필 your_starred=좋아한 저장소 @@ -95,7 +90,6 @@ return_to_forgejo = Forgejo로 돌아가기 access_token = 액세스 토큰 webauthn_error_unable_to_process = 서버가 귀하의 요청을 처리할 수 없습니다. webauthn_error_duplicated = 이 요청에는 보안 키가 허용되지 않습니다. 키가 이미 등록되어 있는지 확인하세요. -webauthn_reload = 다시 불러오기 remove_label_str = "%s" 항목 제거 disabled = 비활성화됨 locked = 잠김 @@ -339,17 +333,10 @@ invalid_db_table = 데이터베이스 테이블 "%s"이(가) 올바르지 않습 [home] uname_holder=사용자명 또는 이메일 주소 -password_holder=비밀번호 switch_dashboard_context=대시보드 컨텍스트 바꾸기 my_repos=저장소 -show_more_repos=더 많은 저장소 보기… -collaborative_repos=협업 저장소 my_orgs=조직들 -my_mirrors=내 미러 저장소들 view_home=%s 보기 -search_repos=저장소 찾기.. - - show_private=비공개 issues.in_your_repos=당신의 저장소에 @@ -360,35 +347,26 @@ filter = 다른 필터 repos=저장소 users=사용자 organizations=조직 -search=검색 code=코드 -repo_no_results=일치하는 레포지토리가 없습니다. -user_no_results=일치하는 사용자가 없습니다. -org_no_results=일치하는 조직이 없습니다. -code_no_results=검색어와 일치하는 소스코드가 없습니다. stars_one = %d 좋아요 stars_few = %d 좋아요 [auth] create_new_account=계정 등록 -register_helper_msg=이미 계정을 가지고 계신가요? 로그인하세요! -social_register_helper_msg=이미 계정을 가지고 계신가요? 지금 연결하세요! disable_register_prompt=계정 등록이 비활성화 되었습니다. 사이트 관리자에게 문의해주십시오. disable_register_mail=계정 등록을 위한 이메일 검증이 비활성화 되었습니다. forgot_password_title=비밀번호 찾기 forgot_password=비밀번호를 잊으셨나요? -sign_up_now=계정이 필요하신가요? 지금 가입하세요. confirmation_mail_sent_prompt=새로운 확인 메일이 %s로 전송되었습니다. 받은 편지함으로 도착한 메일을 %s 안에 확인해서 등록 절차를 완료하십시오. must_change_password=비밀번호를 변경하세요 allow_password_change=사용자에게 비밀번호 변경을 요청 (권장됨) reset_password_mail_sent_prompt=확인 메일이 %s로 전송되었습니다. 받은 편지함으로 도착한 메일을 %s 안에 확인해서 비밀번호 찾기 절차를 완료하십시오. active_your_account=계정 활성화 account_activated=계정이 활성화 되었습니다 -prohibit_login = +prohibit_login = resent_limit_prompt=활성화를 위한 이메일을 이미 전송했습니다. 3분 내로 이메일을 받지 못한 경우 재시도해주세요. has_unconfirmed_mail=안녕하세요 %s, 이메일 주소(%s)가 확인되지 않았습니다. 확인 메일을 받으시지 못하겼거나 새로운 확인 메일이 필요하다면, 아래 버튼을 클릭해 재발송하실 수 있습니다. resend_mail=여기를 눌러 확인 메일 재전송 -email_not_associate=이 이메일 주소로 등록된 계정이 없습니다. send_reset_mail=복구 이메일 보내기 reset_password=비밀번호 재설정 invalid_code=검증 코드가 유효하지 않거나 만료되었습니다. @@ -402,7 +380,6 @@ twofa_scratch_used=스크래치 코드를 사용하셨습니다. 이중인증 twofa_passcode_incorrect=패스코드가 맞지 않습니다. 기기를 잘못 등록 한 경우, 스크래치 코드를 이용해 로그인 하십시오. twofa_scratch_token_incorrect=스크래치 코드가 올바르지 않습니다. login_userpass=로그인 -tab_openid=OpenID oauth_signup_tab=새 계정 등록하기 oauth_signup_submit=등록 완료 oauth_signin_tab=기존 계정에 연결하기 @@ -418,7 +395,6 @@ authorize_application=애플리케이션 승인 authorize_redirect_notice=애플리케이션을 승인하면 %s (으)로 리다이렉트됩니다. authorize_application_created_by=이 애플리케이션은 %s (이)가 만들었습니다. authorization_failed=인증 실패 -sspi_auth_failed=SSPI 인증 실패 [mail] activate_account=계정을 활성화하세요 @@ -462,8 +438,6 @@ RepoName=저장소명 Email=이메일 주소 Password=비밀번호 Retype=비밀번호 확인 -SSHTitle=SSH 키 이름 -HttpsUrl=HTTPS URL PayloadUrl=페이로드 URL TeamName=팀 이름 AuthName=권한 이름 @@ -476,9 +450,6 @@ CommitChoice=커밋 선택 TreeName=파일 경로 Content=컨텐츠 -SSPISeparatorReplacement=구분자 -SSPIDefaultLanguage=기본 언어 - require_error=` 비어 있을 수 없습니다.` alpha_dash_error=` 영문, 대시('-')와 밑줄('_') 만 입력해주십시오.` alpha_dash_dot_error=` 영문, 숫자, 대시('-'), 밑줄('_')과 점('.') 만 입력해주십시오.` @@ -546,13 +517,11 @@ password=비밀번호 security=보안 avatar=아바타 ssh_gpg_keys=SSH / GPG 키 -social=소셜 계정 applications=어플리케이션 orgs=조직 repos=저장소 delete=계정 삭제 twofa=2단계 인증 -account_link=연결된 계정 organization=조직 public_profile=공개 프로필 @@ -571,7 +540,6 @@ ui=테마 comment_type_group_title=제목 lookup_avatar_by_mail=이메일 주소로 아바타 찾기 -federated_avatar_lookup=분산 아바타 조회하기 enable_custom_avatar=커스텀 아바타를 사용하기 choose_new_avatar=새로운 아바타 선택 update_avatar=아바타 변경하기 @@ -586,7 +554,6 @@ password_incorrect=현재 비밀번호가 올바르지 않습니다. change_password_success=비밀번호가 업데이트되었습니다. 다음 번 로그인하실 때는 새 비밀번호를 사용해 주십시오. password_change_disabled=로컬 유저가 아닌 경우 Forgejo 웹 인터페이스를 통해 비밀번호를 변경할 수 없습니다. -emails=이메일 주소 manage_emails=이메일 주소 관리 manage_themes=기본 테마 manage_openid=OpenID 주소 @@ -619,8 +586,6 @@ ssh_desc=이 SSH 공개키들은 귀하의 계정과 연결되어 있습니다. gpg_desc=이 GPG 공개키들은 당신의 계정과 연결되어있습니다. 커밋이 검증될 수 있도록 당신의 개인키들을 안전하게 유지하십시오. ssh_helper=도움이 필요하세요? SSH 키 생성하기 또는 SSH를 사용할 때의 일반적인 문제에 관한 GitHub의 설명서를 참조하시기 바랍니다. gpg_helper=도움이 필요하세요? GPG키에 대한 GitHub 문서를 참조하시기 바랍니다. -add_new_key=SSH 키 추가 -add_new_gpg_key=GPG 키 추가 gpg_key_id_used=같은 ID의 GPG 공개키가 이미 존재합니다. gpg_key_verify=확인 gpg_token=토큰 @@ -648,9 +613,6 @@ token_state_desc=최근 1주일 동안 사용된 적 있는 토큰 show_openid=프로필에 표시 hide_openid=프로필에서 숨기기 ssh_disabled=SSH 사용불가 -manage_social=SNS계정 관리 -unbind=연결 해제 - manage_access_token=액세스 토큰 관리 generate_new_token=새 토큰을 생성 tokens_desc=이 토큰들은 당신의 계정을 이용하여 Forgejo API를 사용할 수 있습니다. @@ -659,8 +621,6 @@ generate_token=토큰 생성 generate_token_success=새로운 토큰이 생성되었습니다. 이 토큰은 다시 보이지 않으니 지금 복사하십시오. delete_token=삭제 access_token_deletion=액세스 토큰 삭제 -access_token_deletion_cancel_action=취소 -access_token_deletion_confirm_action=삭제 delete_token_success=토큰이 삭제되었습니다. 해당 토큰을 사용하는 어플리케이션은 더 이상 이 계정으로 접근할 수 없습니다. permission_read=읽음 @@ -693,7 +653,6 @@ twofa_enrolled=당신의 계정에 2단계 인증이 설정되었습니다. 스 manage_account_links=연결된 계정 관리 manage_account_links_desc=Forgejo 계정에 연결된 외부 계정입니다. -account_links_not_available=현재 Forgejo 계정에 연결된 외부 계정이 없습니다. link_account=계정 연결 remove_account_link=연결된 계정 제거 remove_account_link_desc=해당 계정을 연결해제 하는 경우 Forgejo 계정에 대한 접근 권한이 사라지게 됩니다. 계속하시겠습니까? @@ -843,8 +802,6 @@ editor.add_subdir=경로 추가… commits.desc=소스 코드 변경 내역을 탐색합니다. commits.commits=커밋 -commits.search=커밋 찾기... -commits.find=검색 commits.search_all=모든 브랜치 commits.author=작성자 commits.message=메시지 @@ -857,8 +814,6 @@ commits.gpg_key_id=GPG 키 ID commitstatus.pending=보류 -ext_issues.desc=외부 이슈 트래커 연결. - projects.description_placeholder=설명 projects.title=제목 projects.new=새 프로젝트 @@ -983,11 +938,7 @@ issues.add_time_sum_to_small=시간이 입력되지 않았습니다. issues.time_spent_total=총 경과된 시간 issues.time_spent_from_all_authors=`총 경과된 시간: %s` issues.due_date=마감일 -issues.invalid_due_date_format=마감일은 반드시 "yyyy-mm-dd" 형식이어야 합니다. -issues.error_modifying_due_date=마감일 수정을 실패하였습니다. -issues.error_removing_due_date=마감일 삭제를 실패하였습니다. issues.due_date_form=yyyy-mm-dd -issues.due_date_form_add=마감일 추가 issues.due_date_form_edit=편집 issues.due_date_form_remove=삭제 issues.due_date_not_set=마감일이 설정되지 않았습니다. @@ -1015,7 +966,6 @@ issues.review.self.rejection=자신의 풀 리퀘스트에 대한 변경을 요 issues.review.approve=이 변경사항을 승인함 %s issues.review.comment=검토됨 %s issues.review.pending=보류 -issues.review.review=검토 issues.review.reviewers=리뷰어 issues.review.show_outdated=오래된 내역 보기 issues.review.hide_outdated=오래된 내역 숨기기 @@ -1028,8 +978,6 @@ pulls.compare_compare=다음으로부터 풀 pulls.filter_branch=Filter Branch pulls.no_results=결과를 찾을 수 없습니다. pulls.create=풀 리퀘스트 생성 -pulls.title_desc_few=%[2]s 에서 %[3]s 로 %[1]d개의 커밋들을 병합하려함 -pulls.merged_title_desc_few=님이 %[2]s 에서 %[3]s 로 %[1]d 커밋을 %[4]s 병합함 pulls.tab_conversation=대화 pulls.tab_commits=커밋 pulls.tab_files=파일 변경 @@ -1072,8 +1020,6 @@ milestones.filter_sort.most_issues=이슈 많은 순 milestones.filter_sort.least_issues=이슈 적은 순 -ext_wiki.desc=외부 위키에 연결하기. - wiki=위키 wiki.welcome=위키에 오신것을 환영합니다. wiki.welcome_desc=Wiki를 사용하여 협업자들과 문서를 작성 하고 공유 할 수 있습니다. @@ -1134,10 +1080,6 @@ activity.published_release_label=배포됨 contributors.contribution_type.commits=커밋 -search=검색 -search.search_repo=저장소 검색 -search.code_no_results=검색어와 일치하는 소스코드가 없습니다. - settings=설정 settings.desc=설정에서 저장소 설정을 관리할 수 있음 settings.options=저장소 @@ -1197,7 +1139,6 @@ settings.add_collaborator=새 협업자 추가 settings.add_collaborator_success=협업자가 추가 되었습니다. settings.delete_collaborator=제거 settings.collaborator_deletion=협업자 삭제 -settings.search_user_placeholder=사용자 검색... settings.teams=팀 settings.add_webhook=Webhook 추가 settings.webhook_deletion=Webhook 삭제 @@ -1264,20 +1205,12 @@ settings.deploy_key_deletion=배포키 삭제 settings.deploy_key_deletion_success=배포키가 삭제되었습니다. settings.branches=브랜치 settings.protected_branch=브랜치 보호 -settings.protected_branch_can_push=푸시를 허용하시겠습니까? -settings.protected_branch_can_push_yes=푸시할 수 있음 -settings.protected_branch_can_push_no=푸시할 수 없음 settings.branch_protection='%s' 브랜치 보호 -settings.protect_this_branch=브랜치 보호 활성화 settings.protect_disable_push=푸시 끄기 settings.protect_enable_push=푸시 켜기 -settings.protect_whitelist_search_users=사용자 찾기... -settings.protect_whitelist_search_teams=팀 찾기... settings.protect_merge_whitelist_committers=병합 화이트리스트 활성화 settings.protect_required_approvals=필요한 승인: settings.protect_approvals_whitelist_users=화이트리스트된 리뷰어: -settings.add_protected_branch=보호 활성화 -settings.delete_protected_branch=보호 비활성화 settings.protected_branch_deletion=브랜치 보호 비활성화 settings.choose_branch=브랜치 선택… settings.no_protected_branch=보호된 브랜치가 없습니다. @@ -1361,7 +1294,6 @@ settings.tracker_url_format_desc = {user}를 사용자명, {r projects = 프로젝트 projects.desc = 이슈와 풀 리퀘스트를 프로젝트에서 관리합니다. projects.create = 프로젝트 만들기 -project_board = 프로젝트 projects.create_success = "%s" 프로젝트가 생성되었습니다. projects.deletion = 프로젝트 삭제 projects.deletion_desc = 프로젝트를 삭제하면 관련된 모든 이슈에서 해당 프로젝트가 제거됩니다. 계속하시겠습니까? @@ -1416,9 +1348,7 @@ activity.git_stats_author_n = %d명의 작성자 diff.review.self_reject = 풀 리퀘스트 작성자는 자신의 풀 리퀘스트에 수정을 요청할 수 없음 diff.review.self_approve = 풀 리퀘스트 작성자는 자신의 풀 리퀘스트를 승인할 수 없음 issues.blocked_by_user = 당신은 이 저장소의 소유자에게 차단당했기 떄문에 이슈를 만들 수 없습니다. -issues.comment.blocked_by_user = 당신은 이 저장소의 소유자 혹은 이 이슈의 작성자 에게 차단당했기 떄문에 이슈에 댓글을 달 수 없습니다. author_search_tooltip = 최대 30명의 사용자를 표시함 -pulls.merged_title_desc_one = 님이 %[2]s 에서 %[3]s 로 %[1]d 커밋을 %[4]s 병합함 issues.stop_tracking = 타이머 정지 issues.start_tracking_short = 타이머 시작 mirror_password_help = 사용자명을 변경해 저장된 비밀번호를 지우세요. @@ -1497,7 +1427,6 @@ teams.add_team_member=팀 구성원 추가 teams.delete_team_title=팀 삭제 teams.delete_team_success=팀이 삭제되었습니다. teams.repositories=팀 저장소 -teams.search_repo_placeholder=저장소 찾기... teams.add_duplicate_users=사용자가 이미 팀 멤버입니다. teams.members.none=이 팀에 멤버가 없습니다. form.name_pattern_not_allowed = "%s" 패턴이 조직명으로 사용할 수 없습니다. @@ -1547,7 +1476,6 @@ dashboard.gc_metadata_obtained=가비지 콜렉션 메타 데이터 확보 dashboard.other_system_allocation_obtained=기타 시스템 할당 확보 dashboard.next_gc_recycle=다음 가비지 콜렉션 순환 dashboard.last_gc_time=마지막 가비지 콜렉션 시간 -dashboard.total_gc_time=모든 가비지 콜렉션 중지 dashboard.total_gc_pause=모든 가비지 콜렉션 중지 dashboard.last_gc_pause=마지막 가비지 콜렉션 중지 dashboard.gc_times=가비지 콜렉션 시간 @@ -1595,9 +1523,6 @@ repos.repo_manage_panel=저장소 관리 repos.owner=소유자 repos.name=이름 repos.private=비공개 -repos.watches=지켜보기 -repos.stars=별 -repos.forks=포크 repos.issues=이슈 repos.size=크기 @@ -1650,7 +1575,6 @@ auths.oauth2_tokenURL=토큰 URL auths.oauth2_authURL=인가 URL auths.oauth2_profileURL=프로필 URL auths.oauth2_emailURL=이메일 URL -auths.enable_auto_register=자동 등록을 활성화 auths.tips=도움말 auths.tips.oauth2.general=OAuth2 인증 auths.tip.oauth2_provider=OAuth2 프로바이더 @@ -1799,7 +1723,6 @@ notices.op=일. notices.delete_success=시스템 알림이 삭제되었습니다. users.allow_git_hook_tooltip = Git 훅은 Forgejo가 실행중인 OS 유저로 실행되며 같은 수준의 권한을 갖습니다. 결과적으로, Git 훅 사용권한이 있는 사용자는 Forgejo에서 사용하는 데이터베이스를 포함한 모든 저장소에 접근하거나 수정할 수 있습니다. 궁극적으로 이러한 사용자들은 Forgejo의 관리자 권한을 획득할 수 있습니다. emails.primary = 대표 -auths.sspi_strip_domain_names = 사용자명들에서 도메인명을 제거함 auths.tip.yandex = %s에 새 애플리케이션을 만듭니다. "Yandex.Passport API"부분의 "Access to email address", "Access to user avatar", "Access to username, first name and surname, gender" 권한을 활성화 하세요. emails.filter_sort.name = 사용자명 auths.attribute_username_placeholder = 비워두면 Forgejo에 입력된 사용자명을 사용합니다. @@ -1899,7 +1822,6 @@ runs.commit=커밋 [git.filemode] [search] -code_search_by_git_grep = 현재 코드 검색 결과는 "git grep"에 의해 제공됩니다.관리자가 코드 인덱서를 활성화하면 더 나은 결과가 제공될 수 있습니다. branch_kind = 브랜치 검색… keyword_search_unavailable = 지금은 키워드로 검색이 지원되지 않습니다. 사이트 관리자에게 문의하십시오. commit_kind = 커밋 검색… @@ -1918,7 +1840,6 @@ project_kind = 프로젝트 검색… exact_tooltip = 검색어와 정확하게 일치하는 결과만 포함 issue_kind = 이슈 검색… pull_kind = 풀 검색… -milestone_kind = 마일스톤 검색... fuzzy = 모호함 union = 통합 검색 union_tooltip = 공백으로 구분된 키워드 중 하나라도 일치하는 결과를 포함하세요 diff --git a/options/locale/locale_lt.ini b/options/locale/locale_lt.ini index 9d1c938379..11fa4a0a4f 100644 --- a/options/locale/locale_lt.ini +++ b/options/locale/locale_lt.ini @@ -157,7 +157,6 @@ repo_kind = Ieškoti saugyklų… code_search_unavailable = Kodų paieška šiuo metu nepasiekiama. Kreipkis į svetainės administratorių. org_kind = Ieškoti organizacijų… union = Bendrinis -code_search_by_git_grep = Dabartiniai kodo paieškos rezultatai pateikiami atliekant „git grep“. Rezultatai gali būti geresni, jei svetainės administratorius įjungs kodo indeksuotoją. package_kind = Ieškoti paketų… project_kind = Ieškoti projektų… commit_kind = Ieškoti įsipareigojimų… @@ -165,7 +164,6 @@ runner_kind = Ieškoti vykdyklių… no_results = Nerasta atitinkamų rezultatų. issue_kind = Ieškoti problemų… branch_kind = Ieškoti šakų… -milestone_kind = Ieškoti gairių... pull_kind = Ieškoti sujungimų… keyword_search_unavailable = Ieškoti pagal raktažodį šiuo metu nepasiekiamas. Susisiekite su svetainės administratoriumi. regexp = Reguliarusis reiškinys diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 1b8608e522..34c2044b36 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -49,21 +49,14 @@ webauthn_error_unable_to_process=Serveris nevarēja apstrādāt pieprasījumu. webauthn_error_duplicated=Drošības atslēga nav atļauta šim pieprasījumam. Lūgums pārliecināties, ka šī atslēga nav jau reģistrēta. webauthn_error_empty=Jānorāda šīs atslēgas nosaukums. webauthn_error_timeout=Iestājās noildze, pirms varēja nolasīt atslēgu. Lūgums pārlādēt šo lapu un mēģināt vēlreiz. -webauthn_reload=Pārlādēt - repository=Glabātava organization=Apvienība mirror=Spoguļglabātava -new_repo=Jauns repozitorijs -new_migrate=Jauna migrācija new_mirror=Jauna spoguļglabātava new_fork=Jauns glabātavas atzarojums -new_org=Jauna organizācija new_project=Jauns projekts new_project_column=Jauna aile -manage_org=Pārvaldīt organizācijas admin_panel=Vietnes pārvaldība -account_settings=Konta iestatījumi settings=Iestatījumi your_profile=Profils your_starred=Izlase @@ -218,8 +211,6 @@ string.desc=Z - A [error] occurred=Radusies kļūda report_message=Ja ir pārliecība, ka šī ir Forgejo nepilnība, lūgums pārbaudīt Codeberg, vai tā jau nav zināma, vai izveidot jaunu pieteikumu, ja nepieciešams. -missing_csrf=Kļūdains pieprasījums: netika iesūtīta drošības pilnvara -invalid_csrf=Kļūdains pieprasījums: iesūtīta kļūdaina drošības pilnvara not_found=Pieprasītie dati netika atrasti. network_error=Tīkla kļūda server_internal = Iekšēja servera kļūda @@ -355,15 +346,10 @@ enable_update_checker_helper_forgejo = Tas laiku pa laikam pārbaudīs, vai ir p [home] uname_holder=Lietotājvārds vai e-pasta adrese -password_holder=Parole switch_dashboard_context=Mainīt pārskata paneļa kontekstu my_repos=Glabātavas -show_more_repos=Parādīt vairāk repozitorijus… -collaborative_repos=Sadarbības repozitoriji my_orgs=Apvienības -my_mirrors=Mani spoguļi view_home=Apskatīt %s -search_repos=Meklēt repozitoriju… filter=Citas atlases filter_by_team_repositories=Atlasīt pēc komandas glabātavām feed_of="%s" barotne @@ -384,20 +370,8 @@ issues.in_your_repos=Manās glabātavās repos=Glabātavas users=Lietotāji organizations=Apvienības -search=Meklēt go_to=Iet uz code=Kods -search.type.tooltip=Meklēšanas veids -search.fuzzy=Aptuveni -search.fuzzy.tooltip=Iekļaut meklēšanas rezultātos arī aptuvenas sakritības -search.match=Precīzi -search.match.tooltip=Iekļaut meklēšanas rezultātos tikai precīzas sakritības -code_search_unavailable=Pašlaik koda meklēšana nav pieejama. Sazinieties ar lapas administratoru. -repo_no_results=Netika atrasts neviens repozitorijs, kas atbilstu kritērijiem. -user_no_results=Netika atrasts neviens lietotājs, kas atbilstu kritērijiem. -org_no_results=Netika atrasta neviena organizācija, kas atbilstu kritērijiem. -code_no_results=Netika atrasts pirmkods, kas atbilstu kritērijiem. -code_search_results=`Meklēšanas rezultāti "%s"` code_last_indexed_at=Pēdējo reizi indeksēts %s relevant_repositories_tooltip=Glabātavas, kas ir atzarojumi vai kam nav temata, ikonas un apraksta, ir paslēptas. relevant_repositories=Tiek rādītas tikai atbilstošās glabātavas, rādīt neatsijātu iznākumu. @@ -408,16 +382,12 @@ forks_few = %d atzarojumi [auth] create_new_account=Izveidot kontu -register_helper_msg=Jau ir konts? Piesakieties tagad! -social_register_helper_msg=Jau ir konts? Piesaisti to! disable_register_prompt=Reģistrēšanās ir atspējota. Lūgums sazināties ar vietnes pārvaldītāju. disable_register_mail=E-pasta adreses apstiprināšana reģistrējoties ir atspējota. manual_activation_only=Jāsazinās ar vietnes pārvaldītāju, lai pabeigtu aktivēšanu. remember_me=Atcerēties šo ierīci -remember_me.compromised=Pieteikšanās pilnvara vairs nav derīga, kas var norādīt uz ļaunprātīgām darbībām kontā. Lūgums pārbaudīt, vai kontā nav neparastu darbību. forgot_password_title=Aizmirsta parole forgot_password=Aizmirsi paroli? -sign_up_now=Nepieciešams konts? Reģistrējies tagad. sign_up_successful=Konts tika sekmīgi izveidots. Laipni lūdzam! confirmation_mail_sent_prompt=Jauns apstiprināšanas e-pasta ziņojums tika nosūtīts uz %s. Lūgums pārbaudīt savu iesūtni nākamajās %s, lai pabeigtu reģistrēšanos. Ja e-pasta adrese ir nepareiza, ir iespējams pieteikties un pieprasīt vēl viena apstiprināšanas e-pasta ziņojuma nosūtīšanu uz citu adresi. must_change_password=Atjaunināt savu paroli @@ -430,7 +400,6 @@ prohibit_login_desc=Kontam ir liegts mijiedarboties ar serveri. Jāsazinās ar t resent_limit_prompt=Nesen jau tika pieprasīts aktivēšanas e-pasta ziņojums. Lūgums uzgaidīt 3 minūtes un mēģināt vēlreiz. has_unconfirmed_mail=Sveiciens, %s! Tev ir neapstiprināta e-pasta adrese (%s). Ja nav saņemts apstiprinājuma e-pasta ziņojums vai ir nepieciešams nosūtīt jaunu, lūgums klikšķināt uz zemāk esošās pogas. resend_mail=Klikšķināt šeit, lai atkārtoti nosūtītu aktivēšanas e-pasta ziņojumu -email_not_associate=Šī e-pasta adrese nav saistīta ar nevienu kontu. send_reset_mail=Nosūtīt atkopes e-pasta ziņojumu reset_password=Konta atkope invalid_code=Apstiprināšanas kods ir nederīgs, vai ir beidzies tā derīgums. @@ -447,7 +416,6 @@ twofa_scratch_used=Ir izmantots vienreizējais kods. Notika pārvirzīšana uz d twofa_passcode_incorrect=Piekļuves kods ir nepareizs. Ja ierīce ir pazaudēta, jāizmanto vienreizējais kods, lai pieteiktos. twofa_scratch_token_incorrect=Ievadīts nepareizs vienreizējais kods. login_userpass=Pieteikties -tab_openid=OpenID oauth_signup_tab=Izveidot jaunu kontu oauth_signup_title=Pabeigt jauna konta izveidošanu oauth_signup_submit=Pabeigt konta izveidošanu @@ -473,7 +441,6 @@ authorize_application_description=Ja nodrošināsi piekļuvi, tā varēs piekļ authorize_title=Pilnvarot "%s" piekļuvi Tavam kontam? authorization_failed=Pilnvarošana neizdevās authorization_failed_desc=Pilnvarošana neizdevās, jo tika noteikts nederīgs pieprasījums. Lūgums sazināties ar lietotnes, no kuras tika veikts pilnvarošanas pieprasījums, uzturētāju. -sspi_auth_failed=SSPI autentifikācija neizdevās password_pwned=Izvēlētā parole ir nozagto paroļu sarakstā, kas iepriekš ir atklāts pieejamās datu noplūdēs. Lūgums mēģināt vēlreiz ar citu paroli un apsvērt to nomainīt arī citur. password_pwned_err=Neizdevās pabeigt pieprasījumu uz HaveIBeenPwned back_to_sign_in = Atpakaļ uz pieteikšanos @@ -495,22 +462,18 @@ link_not_working_do_paste=Saite nedarbojas? Jāmēģina tā ievietot starpliktuv hi_user_x=Sveiciens, %s! activate_account=Lūgums aktivēt savu kontu -activate_account.title=%s, aktivizējiet savu kontu activate_account.text_1=Sveiciens, %[1]s! Paldies par reģistrēšanos %[2]s! activate_account.text_2=Jāklikšķina uz šīs saites, lai aktivētu savu %s kontu: activate_email=Apliecini savu e-pasta adresi -activate_email.title=%s, apstipriniet savu e-pasta adresi activate_email.text=Lūgums klikšķināt uz šīs saites, lai apliecinātu savu e-pasta adresi %s: register_notify=Laipni lūdzam %s -register_notify.title=%[1]s, esat reģistrējies %[2]s register_notify.text_1=Šis ir apstiprinājuma e-pasta ziņojums reģistrācijai %s. register_notify.text_2=Tagad var pieteikties ar savu lietotājvārdu: %s register_notify.text_3=Ja šo kontu izveidoja kāds cits, vispirms ir nepieciešams iestatīt savu paroli. reset_password=Atgūt kontu -reset_password.title=%s, esat pieprasījis atjaunot savu kontu reset_password.text=Lūgums klikšķināt uz šīs saites, lai atjaunotu savu %s kontu: register_success=Reģistrācija bija sekmīga @@ -585,8 +548,6 @@ RepoName=Glabātavas nosaukums Email=E-pasta adrese Password=Parole Retype=Apstiprināt paroli -SSHTitle=SSH atslēgas nosaukums -HttpsUrl=HTTPS URL PayloadUrl=Vērtuma URL TeamName=Komandas nosaukums AuthName=Pilnvarošanas nosaukums @@ -599,9 +560,6 @@ CommitChoice=Iesūtījuma izvēle TreeName=Datnes ceļš Content=Saturs -SSPISeparatorReplacement=Atdalītājs -SSPIDefaultLanguage=Noklusējuma valoda - require_error=` nedrīkst būt tukšs.` alpha_dash_error=` drīkst sastāvēt tikai no burtiem un cipariem, domuzīmēm ("-") un apakšsvītrām ("_").` alpha_dash_dot_error=` drīkst sastāvēt tikai no burtiem un cipariem, domuzīmēm ('-'), apakšsvītrām ('_') un punktiem ('.').` @@ -623,7 +581,6 @@ lang_select_error=Atlasīt valodu no saraksta. username_been_taken=Lietotājvārds jau ir aizņemts. username_change_not_local_user=Ārējie lietotāji nevar mainīt savu lietotājvārdu. -username_has_not_been_changed=Lietotājvārds netika mainīts repo_name_been_taken=Glabātavas nosaukums jau tiek izmantots. repository_force_private=Iespējots "Uzspiest privātās": privātās glabātavas nevar padarīt pieejamas visiem. repository_files_already_exist=Šajā glabātavā jau atrodas datnes. Jāsazinās ar sistēmas pārvaldītāju. @@ -703,7 +660,6 @@ unfollow=Pārtraukt sekot user_bio=Apraksts par sevi disabled_public_activity=Šis lietotājs ir atspējojis darbību redzamību citiem. email_visibility.limited=E-pasta adrese ir redzama visiem autentificētajiem lietotājiem -email_visibility.private=E-pasta adrese ir redzama tikai administratoriem show_on_map=Rādīt šo vietu kartē settings=Lietotāja iestatījumi @@ -738,13 +694,11 @@ password=Parole security=Drošība avatar=Profila attēls ssh_gpg_keys=SSH / GPG atslēgas -social=Sociālie konti applications=Lietotnes orgs=Apvienības repos=Glabātavas delete=Izdzēst kontu twofa=Divpakāpju pieteikšanās (TOTP) -account_link=Saistītie konti organization=Apvienības uid=UID webauthn=Divpakāpju pieteikšanās (drošības atslēgas) @@ -791,10 +745,7 @@ comment_type_group_issue_ref=Pieteikumu atsauces saved_successfully=Iestatījumi tika sekmīgi saglabāti. privacy=Privātums keep_activity_private=Profila lapā paslēpt notikumus -keep_activity_private_popup=Savu aktivitāti redzēsiet tikai Jūs un administratori - lookup_avatar_by_mail=Uzmeklēt profila attēlus pēc e-pasta adreses -federated_avatar_lookup=Apvienotais profila bilžu meklētājs enable_custom_avatar=Izmantot pielāgotu profila attēlu choose_new_avatar=Izvēlēties jaunu profila attēlu update_avatar=Atjaunināt attēlu @@ -812,7 +763,6 @@ password_incorrect=Ievadīta nepareiza pašreizējā parole. change_password_success=Parole tika atjaunināta. Turpmāk jāizmanto sava jaunā parole, lai pieteiktos. password_change_disabled=Ārējie lietotāji nevar mainīt savu paroli Forgejo tīmekļa saskarnē. -emails=E-pasta adreses manage_emails=Pārvaldīt e-pasta adreses manage_themes=Noklusējuma izskats manage_openid=OpenID adreses @@ -855,8 +805,6 @@ principal_desc=Šīs SSH sertifikātu identitātes ir pievienotas kontam un ļau gpg_desc=Šīs publiskās GPG atslēgas ir saistītas ar kontu un tiek izmantotas, lai apliecinātu iesūtījumus. Savas privātās atslēgas ir jātur drošībā, jo tās ļauj parakstīt iesūtījumus Tavā vārdā. ssh_helper=Vajadzīga palīdzība? Ir vērts ieskatīties GitHub pamācībā par jaunas SSH atslēgas izveidošanu vai biežāk sastopamo sarežģījumu, ar kuriem var saskarties SSH izmantošanas laikā, novēršanu. gpg_helper=Nepieciešama palīdzība? Ir vērts ieskatīties GitHub vadlīnijās par GPG. -add_new_key=Pievienot SSH atslēgu -add_new_gpg_key=Pievienot GPG atslēgu key_content_ssh_placeholder=Sākas ar "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com" vai "sk-ssh-ed25519@openssh.com" key_content_gpg_placeholder=Sākas ar "-----BEGIN PGP PUBLIC KEY BLOCK-----" add_new_principal=Pievienot identitāti @@ -874,7 +822,6 @@ gpg_invalid_token_signature=Norādītā GPG atslēga, paraksts un pilnvara neatb gpg_token_required=Jānorāda paraksts zemāk esošajai pilnvarai gpg_token=Pilnvara gpg_token_help=Parakstu var izveidot: -gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=Tekstuāls GPG paraksts key_signature_gpg_placeholder=Sākas ar "-----BEGIN PGP SIGNATURE-----" verify_gpg_key_success=GPG atslēga "%s" tika apliecināta. @@ -921,11 +868,6 @@ hide_openid=Paslēpt no profila ssh_disabled=SSH atspējots ssh_signonly=SSH pašlaik ir atspējots, tādēļ šīs atslēgas tiek izmantotas tikai iesūtījumu parakstu apliecināšanai. ssh_externally_managed=Šim lietotājam SSH atslēga tiek pāvaldīta attālināti -manage_social=Pārvaldīt piesaistītos sociālos kontus -social_desc=Šie sociālo tīklu konti var tikt izmantoti, lai pieteiktos. Pārliecinieties, ka visi ir atpazīstami. -unbind=Atsaistīt -unbind_success=Sociālā tīkla konts tika veiksmīgi noņemts. - manage_access_token=Piekļuves pilnvaras generate_new_token=Izveidot jaunu pilnvaru tokens_desc=Šīs pilnvaras nodrošina piekļuvi kontam ar Forgejo API. @@ -935,8 +877,6 @@ generate_token_success=Jaunā pilnvara tika izveidota. Tā ir jāievieto starpli generate_token_name_duplicate=Lietotnes nosaukums %s jau tiek izmantots. Lūgums izmantot citu. delete_token=Izdzēst access_token_deletion=Izdzēst piekļuves pilnvaru -access_token_deletion_cancel_action=Atcelt -access_token_deletion_confirm_action=Dzēst access_token_deletion_desc=Pilnvaras izdzēšana atsauks lietotņu, kas to izmanto, piekļuvi kontam. Šo darbību nevar atsaukt. Turpināt? delete_token_success=Pilnvara tika izdzēsta. Lietotnēm, kas to izmanto, vairs nav piekļuves kontam. repo_and_org_access=Glabātavas un apvienības piekļuve @@ -1010,7 +950,6 @@ webauthn_alternative_tip=Ir vēlams uzstādīt papildu autentificēšanās veidu manage_account_links=Sasaistītie konti manage_account_links_desc=Šie ārējie konti ir sasaistīti ar Tavu Forgejo kontu. -account_links_not_available=Pašlaik nav neviena ārējā konta piesaistīta šim kontam. link_account=Sasaistīt kontu remove_account_link=Noņemt sasaistīto kontu remove_account_link_desc=Sasaistītā konta noņemšana atsauks tā piekļuvi Tavam Forgejo kontam. Turpināt? @@ -1050,7 +989,6 @@ user_unblock_success = Lietotāja liegums tika sekmīgi atcelts. blocked_since = Liegts kopš %s blocked_users_none = Nav liegto lietotāju. pronouns = Vietniekvārdi -pronouns_custom = Pielāgoti blocked_users = Liegtie lietotāji pronouns_unspecified = Nav norādīts language.title = Noklusējuma valoda @@ -1060,7 +998,6 @@ additional_repo_units_hint = Ieteikt iespējot papildu glabātavas vienības additional_repo_units_hint_description = Attēlot norādi "Iespējot vēl" glabātavās, kurās nav iespējotas visas pieejamās vienības. language.description = Šī valoda tiks saglabāta kontā un pēc pieteikšanās tiks izmantota kā noklusējuma. user_block_yourself = Nevar liegt sevi. -pronouns_custom_label = Pielāgoti vietniekvārdi change_username_redirect_prompt.with_cooldown.one = Vecais lietotājvārds būs pieejams visiem pēc noilguma, kas ir %[1]d diena. Šajā laikā ir iespējams to atkal sākt izmantot. change_username_redirect_prompt.with_cooldown.few = Vecais lietotājvārds būs pieejams visiem pēc noilguma, kas ir %[1]d dienas. Šajā laikā ir iespējams to atkal sākt izmantot. keep_pronouns_private = Vietniekvārdus rādīt tikai lietotājiem, kuri ir pieteikušies @@ -1117,7 +1054,6 @@ fork_branch=Zars, kas ir klonējams atzarojumā all_branches=Visi zari fork_no_valid_owners=Šai glabātavai nevar izveidot atzarojumus, jo tai nav derīgu īpašnieku. use_template=Izmantot šo sagatavi -clone_in_vsc=Atvērt VS Code download_zip=Lejupielādēt ZIP download_tar=Lejupielādēt TAR.GZ download_bundle=Lejupielādēt BUNDLE @@ -1137,11 +1073,6 @@ readme=LASIMANI readme_helper=Atlasīt README datnes sagatavi readme_helper_desc=Šī ir vieta, kurā var ievietot izvērstu aprakstu par projektu. auto_init=Sāknēt glabātavu -trust_model_helper=Izvēlieties parakstu pārbaudes uzticamības modeli. Iespējamie varianti ir: -trust_model_helper_collaborator=Līdzstrādnieka: Uzticēties līdzstrādnieku parakstiem -trust_model_helper_committer=Revīzijas iesūtītāja: Uzticēties parakstiem, kas atbilst revīzijas iesūtītājam -trust_model_helper_collaborator_committer=Līdzstrādnieka un revīzijas iesūtītāja: Uzticēties līdzstrādnieku parakstiem, kas atbilst revīzijas iesūtītājam -trust_model_helper_default=Noklusētais: Izmantojiet šī servera noklusēto uzticamības modeli create_repo=Izveidot glabātavu default_branch=Noklusējuma zars default_branch_label=noklusējuma @@ -1215,9 +1146,6 @@ template.invalid=Jāatlasa sagataves glabātava archive.title=Šī glabātava ir arhivēta. Tajā var apskatīt datnes, un to var klonēt, bet tajā nevar veikt jebkādas izmaiņas, piemēram, aizgādāt izmaiņas un izveidot jaunus pieteikumus, izmaiņu pieprasījumus vai piebildes. archive.title_date=Šī glabātava tika arhivēta %s. Tajā var apskatīt datnes, un to var klonēt, bet tajā nevar veikt jebkādas izmaiņas, piemēram, aizgādāt izmaiņas un izveidot pieteikumus, izmaiņu pieprasījumus vai piebildes. -archive.issue.nocomment=Šī glabātava ir arhivēta. Pieteikumiem nevar pievienot piebildes. -archive.pull.nocomment=Šī glabātava ir arhivēta. Izmaiņu pieprasījumiem nevar pievienot piebildes. - form.reach_limit_of_creation_1=Īpašnieks jau ir sasniedzis %d glabātavas ierobežojumu. form.reach_limit_of_creation_n=Īpašnieks jau ir sasniedzis %d glabātavu ierobežojumu. form.name_reserved=Glabātavas nosaukums "%s" ir aizņemts. @@ -1225,7 +1153,6 @@ form.name_pattern_not_allowed="%s" nav ļauts izmantot glabātavas nosaukumā. need_auth=Pilnvarošana migrate_options=Pārcelšanas iespējas -migrate_service=Migrācijas serviss migrate_options_mirror_helper=Šī glabātava būs spoguļglabātava migrate_options_lfs=Pārcelt LFS datnes migrate_options_lfs_endpoint.label=LFS galapunkts @@ -1311,7 +1238,6 @@ branches=Zari tags=Birkas issues=Pieteikumi pulls=Izmaiņu pieprasījumi -project_board=Projekti packages=Pakotnes actions=Darbības labels=Iezīmes @@ -1325,7 +1251,6 @@ release=Laidiens releases=Laidieni tag=Birka released_this=izveidoja šo laidienu -tagged_this=izveidoja tagu revīzijai file.title=%s zarā %s file_raw=Neapstrādāta file_history=Vēsture @@ -1438,9 +1363,7 @@ commits.desc=Pārlūkot pirmkoda izmaiņu vēsturi. commits.commits=Iesūtījumi commits.no_commits=Nav kopīgu iesūtījumu. "%s" un "%s" ir pilnīgi atšķirīga vēsture. commits.nothing_to_compare=Šie zari ir vienādi. -commits.search=Meklēt revīzijas… commits.search.tooltip=Atslēgvārdu sākumā var pievienot "author:", "committer:", "after:" vai "before:", piemēram, "revert author:Anna before:2019-01-13". -commits.find=Meklēt commits.search_all=Visi zari commits.author=Autors commits.message=Ziņojums @@ -1468,8 +1391,6 @@ commitstatus.pending=Nav iesūtīts commitstatus.success=Sekmīgs ext_issues=Ārēji pieteikumi -ext_issues.desc=Saite uz ārējo problēmu sekotāju. - projects=Projekti projects.desc=Pārvaldīt pieteikumus un izmaiņu pieprasījumus projektos. projects.description=Apraksts (pēc izvēles) @@ -1491,7 +1412,6 @@ projects.type.basic_kanban=Pamata "Kanban" projects.type.bug_triage=Kļūdu šķirošana projects.template.desc=Sagatave projects.template.desc_helper=Jāatlasa projekta sagatave, lai uzsāktu -projects.type.uncategorized=Bez kategorijas projects.column.edit=Labot aili projects.column.edit_title=Nosaukums projects.column.new_title=Nosaukums @@ -1499,8 +1419,6 @@ projects.column.new_submit=Izveidot aili projects.column.new=Jauna aile projects.column.set_default=Iestatīt kā noklusējuma projects.column.set_default_desc=Iestatīt šo aili kā noklusējumu neapkopotiem pieteikumiem un izmaiņu pieprasījumiem -projects.column.unset_default=Atiestatīt noklusēto -projects.column.unset_default_desc=Noņemt šo kolonnu kā noklusēto projects.column.delete=Izdzēst aili projects.column.deletion_desc=Projekta ailes izdzēšana pārvietos visus saistītos pieteikumus uz noklusējuma aili. Turpināt? projects.column.color=Krāsa @@ -1614,7 +1532,6 @@ issues.filter_sort.moststars=Visvairāk zvaigžņu issues.filter_sort.feweststars=Vismazāk zvaigžņu issues.filter_sort.mostforks=Visvairāk atzarojumu issues.filter_sort.fewestforks=Vismazāk atzarojumu -issues.keyword_search_unavailable=Meklēšana pēc atslēgvārda pašreiz nav pieejama. Lūgums sazināties ar vietnes administratoru. issues.action_open=Atvērt issues.action_close=Aizvērt issues.action_label=Iezīme @@ -1659,11 +1576,8 @@ issues.ref_issue_from=`atsaucās uz šo pieteikumu %[3]s %[1 issues.ref_pull_from=`atsaucās uz šo izmaiņu pieprasījumu %[3]s %[1]s` issues.ref_closing_from=`atsaucās uz šo pieteikumu izmaiņu pieprasījumā %[3]s, kas aizvērs to, %[1]s` issues.ref_reopening_from=`atsaucās uz šo pieteikumu izmaiņu pieprasījumā %[3]s, kas atkārtoti atvērs to, %[1]s` -issues.ref_closed_from=`aizvēra pieteikumu %[4]s %[2]s` -issues.ref_reopened_from=`atkārtoti atvēra pieteikumu %[4]s %[2]s` issues.ref_from=`no %[1]s` issues.author=Autors -issues.author_helper=Šis lietotājs ir autors. issues.role.owner=Īpašnieks issues.role.owner_helper=Šis lietotājs ir šīs glabātavas īpašnieks. issues.role.member=Dalībnieks @@ -1758,18 +1672,13 @@ issues.add_time_sum_to_small=Nav norādīts laiks. issues.time_spent_total=Kopējais patērētais laiks issues.time_spent_from_all_authors=`Kopējais patērētais laiks: %s` issues.due_date=Izpildes datums -issues.invalid_due_date_format=Izpildes termiņam ir jābūt formāta 'yyyy-mm-dd'. -issues.error_modifying_due_date=Neizdevās izmainīt izpildes termiņu. -issues.error_removing_due_date=Neizdevās noņemt izpildes termiņu. issues.push_commit_1=pievienoja %d iesūtījumu %s issues.push_commits_n=pievienoja %d iesūtījumus %s issues.force_push_codes=`uzspiesti aizgādāja %[1]s no %[2]s %[8]s uz %[4]s %[9]s %[6]s` issues.force_push_compare=Salīdzināt issues.due_date_form=dd.mm.gggg. -issues.due_date_form_add=Pievienot izpildes termiņu issues.due_date_form_edit=Labot issues.due_date_form_remove=Noņemt -issues.due_date_not_writer=Ir nepieciešama rakstīšanas piekļuve šim repozitorijam, lai varētu mainīt problēmas plānoto izpildes datumu. issues.due_date_not_set=Nav uzstādīts izpildes datums. issues.due_date_added=pievienoja izpildes datumu %s %s issues.due_date_modified=mainīja izpildes datumu no %[2]s uz %[1]s %[3]s @@ -1822,7 +1731,6 @@ issues.review.remove_review_request=noņēma izskatīšanas pieprasījumu %[1]s issues.review.remove_review_request_self=atteicās izskatīt %s issues.review.pending=Nav iesūtīts issues.review.pending.tooltip=Šī piebilde pagaidām nav redzama citiem lietotājiem. Lai iesniegtu savas ierindotās piebildes, lapas augšdaļā jāatlasa "%s" -> "%s/%s/%s". -issues.review.review=Izskatīšana issues.review.reviewers=Izskatītāji issues.review.outdated=Novecojusi issues.review.outdated_description=Pēc šīs piebildes pievienošanas ir mainījies saturs @@ -1835,7 +1743,6 @@ issues.review.hide_resolved=Paslēpt atrisināto issues.review.resolve_conversation=Atrisināt sarunu issues.review.un_resolve_conversation=Atcelt sarunas atrisinājumu issues.review.resolved_by=atzīmēja šo sarunu kā atrisinātu -issues.assignee.error=Ne visi atbildīgie tika pievienoti, jo radās neparedzēta kļūda. issues.reference_issue.body=Saturs issues.content_history.deleted=izdzēsts issues.content_history.edited=labots @@ -1843,8 +1750,6 @@ issues.content_history.created=izveidots issues.content_history.delete_from_history=Izdzēst no vēstures issues.content_history.delete_from_history_confirm=Izdzēst no vēstures? issues.content_history.options=Iespējas -issues.reference_link=Atsauce: %s - compare.compare_base=pamata compare.compare_head=salīdzināt @@ -1878,8 +1783,6 @@ pulls.nothing_to_compare=Šie zari ir vienādi. Nav nepieciešams izveidot izmai pulls.nothing_to_compare_and_allow_empty_pr=Šie zari ir vienādi. Šis izmaiņu pieprasījums būs tukšs. pulls.has_pull_request=`Jau pastāv izmaiņu pieprasījums starp šiem zariem: %[2]s#%[3]d` pulls.create=Izveidot izmaiņu pieprasījumu -pulls.title_desc_few=vēlas iekļaut %[1]d iesūtījumus no %[2]s zarā %[3]s -pulls.merged_title_desc_few=Iekļāva %[1]d iesūtījumus no %[2]s zarā %[3]s %[4]s pulls.change_target_branch_at=`nomainīja mērķa zaru no %s uz %s %s` pulls.tab_conversation=Saruna pulls.tab_commits=Iesūtījumi @@ -2039,8 +1942,6 @@ signing.wont_sign.approved=Apvienošana netiks parakstīta, jo izmaiņu piepras signing.wont_sign.not_signed_in=Tu neesi pieteicies. ext_wiki=Ārēja vikivietne -ext_wiki.desc=Ārējā vikivietne norāda uz ārējo vikivietnes adresi. - wiki=Vikivietne wiki.welcome=Laipni lūdzam vikivietnē! wiki.welcome_desc=Vikivietne ļauj rakstīt un kopīgot dokumentāciju ar līdzdalībniekiem. @@ -2136,17 +2037,6 @@ activity.git_stats_deletion_n=%d izdzēšanas contributors.contribution_type.commits=Iesūtījumi -search=Meklēt -search.search_repo=Meklēšana repozitorijā -search.type.tooltip=Meklēšanas veids -search.fuzzy=Aptuveni -search.fuzzy.tooltip=Iekļaut meklēšanas rezultātos arī aptuvenas sakritības -search.match=Precīzi -search.match.tooltip=Iekļaut meklēšanas rezultātos tikai precīzas sakritības -search.results=Meklēšanas rezultāti nosacījumam "%s" repozitorijā %s -search.code_no_results=Netika atrasts pirmkods, kas atbilstu kritērijiem. -search.code_search_unavailable=Pašlaik koda meklēšana nav pieejama. Sazinieties ar lapas administratoru. - settings=Iestatījumi settings.desc=Iestatījumi ir vieta, kur pārvaldīt glabātavas iestatījumus settings.options=Glabātava @@ -2253,7 +2143,6 @@ settings.transfer_abort=Atcelt nodošanu settings.transfer_abort_invalid=Nevar atcelt neesošu glabātavas nodošanu. settings.transfer_abort_success=Glabātavas nodošana %s tika sekmīgi atcelta. settings.transfer_desc=Nodot šo glabātavu lietotājam vai apvienībai, kurā Tev ir pārvaldītāja tiesības. -settings.transfer_form_title=Ievadiet repozitorija nosaukumu, lai apstiprinātu: settings.transfer_in_progress=Pašlaik jau ir notiekoša nodošana. Lūgums to atcelt, ja ir vēlme nodot šo glabātavu citam lietotājam. settings.transfer_notices_1=- Tiks zaudēta piekļuve glabātavai, ja tā tiks nodota atsevišķam lietotājam. settings.transfer_notices_2=- Tiks saglabāta piekļuve glabātavai, ja tā tiks nodota apvienībai, kurai esi (līdz)īpašnieks. @@ -2298,7 +2187,6 @@ settings.delete_collaborator=Noņemt settings.collaborator_deletion=Noņemt līdzdalībnieku settings.collaborator_deletion_desc=Līdzdalībnieka noņemšana atsauks tā piekļuvi šai glabātavai. Turpināt? settings.remove_collaborator_success=Līdzdalībnieks tika noņemts. -settings.search_user_placeholder=Meklēt lietotāju… settings.org_not_allowed_to_be_collaborator=Apvienības nevar tikt pievienotas kā līdzdalībnieki. settings.change_team_access_not_allowed=Komandu piekļuves mainīšana glabātavai ir pieejama tikai apvienības īpašniekam settings.team_not_in_organization=Komanda nav tajā pašā apvienībā kā glabātava @@ -2306,7 +2194,6 @@ settings.teams=Komandas settings.add_team=Pievienot komandu settings.add_team_duplicate=Komandai jau ir piekļuve glabātavai settings.add_team_success=Komandai tagad ir piekļuve glabātavai. -settings.search_team=Meklēt komandu… settings.change_team_permission_tip=Komandas atļauja ir iestatīta komandas iestatījumu lapā un nav maināma katrai glabātavai atsevišķi settings.delete_team_tip=Komandai ir piekļuve visām glabātavām, un to nevar noņemt settings.remove_team_success=Tika noņemta komandas piekļuve glabātavai. @@ -2444,12 +2331,7 @@ settings.branches=Zari settings.protected_branch=Zaru aizsargāšana settings.protected_branch.save_rule=Saglabāt kārtulu settings.protected_branch.delete_rule=Izdzēst kārtulu -settings.protected_branch_can_push=Atļaut izmaiņu nosūtīšanu? -settings.protected_branch_can_push_yes=Jūs varat nosūtīt izmaiņas -settings.protected_branch_can_push_no=Jūs nevarat nosūtīt izmaiņas settings.branch_protection=Zara "%s" aizsargāšanas kārtulas -settings.protect_this_branch=Iespējot atzara aizsardzību -settings.protect_this_branch_desc=Neļauj atzara dzēšanu, kā arī ierobežo izmaiņu iesūtīšanu un sapludināšanu šajā atzarā. settings.protect_disable_push=Atspējot aizgādāšanu settings.protect_disable_push_desc=Aizgādāšana šajā zarā netiks ļauta. settings.protect_enable_push=Iespējot aizgādāšanu @@ -2460,9 +2342,7 @@ settings.protect_whitelist_committers=Ierobežotas aizgādāšanas izņēmumi settings.protect_whitelist_committers_desc=Tikai norādītajiem lietotājiem vai komandām būs ļauts aizgādāt izmaiņas šajā zarā (bet ne uzspiesta aizgādāšana). settings.protect_whitelist_deploy_keys=Atļaut izvietošanas atslēgām ar rakstīšanas piekļuvi aizgādāt izmaiņas. settings.protect_whitelist_users=Lietotāji, kuriem ir ļauts aizgādāt izmaiņas -settings.protect_whitelist_search_users=Meklēt lietotājus… settings.protect_whitelist_teams=Komandas, kurām ir ļauts aizgādāt izmaiņas -settings.protect_whitelist_search_teams=Meklēt komandas… settings.protect_merge_whitelist_committers=Iespējot apvienošanas atļaušanas sarakstu settings.protect_merge_whitelist_committers_desc=Atļaut tikai noteiktiem lietotājiem vai komandām apvienot izmaiņu pieprasījumus ar šo zaru. settings.protect_merge_whitelist_users=Lietotāji, kuri var veikt apvienošanu @@ -2492,8 +2372,6 @@ settings.protect_protected_file_patterns=Aizsargāto datņu paraugs (vairākus a settings.protect_protected_file_patterns_desc=Aizsargātās datnes nav ļauts tiešā veidā mainīt, pat ja lietotājam šajā zarā ir tiesības pievienot, labot vai izdzēst datnes. Vairākus paraugus var atdalīt ar semikolu (";"). Paraugu pieraksts ir skatāms %[2]s dokumentācijā. Piemēri: .drone.yml, /docs/**/*.txt. settings.protect_unprotected_file_patterns=Neaizsargāto datņu paraugs (vairākus atdala ar semikolu ";") settings.protect_unprotected_file_patterns_desc=Neaizsargātās datnes, kuras ir ļauts izmainīt tiešā veidā, apejot aizgādāšanas ierobežojumu, ja lietotājam ir rakstīšanas piekļuve. Vairāki paraugi ir atdalāmi ar semikolu (";"). Paraugu pierakstu skatīt %[2]s dokumentācijā. Piemēri: .drone.yml, /docs/**/*.txt. -settings.add_protected_branch=Iespējot aizsargāšanu -settings.delete_protected_branch=Atspējot aizsargāšanu settings.update_protect_branch_success=Zara aizsargāšanas kārtula "%s" tika atjaunināta. settings.remove_protected_branch_success=Zara aizsargāšanas kārtula "%s" tika noņemta. settings.remove_protected_branch_failed=Zara aizsargāšanas kārtulas "%s" noņemšana neizdevās. @@ -2572,8 +2450,6 @@ settings.lfs_pointers.associateAccessible=Saistīt pieejamos %d OID'us settings.rename_branch_failed_exist=Nevar pārdēvēt zaru, jo mērķa zars %s jau pastāv. settings.rename_branch_failed_not_exist=Nevar pārdēvēt zaru %s, jo tas nepastāv. settings.rename_branch_success=Zars %s tika sekmīgi pārdēvēts par %s. -settings.rename_branch_from=no vecā atzara nosaukuma -settings.rename_branch_to=jaunais atzara nosaukums settings.rename_branch=Pārdēvēt zaru diff.browse_source=Pārlūkot avotu @@ -2582,7 +2458,6 @@ diff.commit=iesūtījums diff.git-notes=Piezīmes diff.data_not_available=Satura salīdzināšana nav pieejama diff.options_button=Salīdzināšanas iespējas -diff.show_diff_stats=Rādīt apkopojumu diff.download_patch=Lejupielādēt ielāpa datni diff.download_diff=Lejupielādēt atšķirību datni diff.show_split_view=Sadalītais skats @@ -2675,7 +2550,6 @@ release.tag_name_invalid=Nederīgs birkas nosaukums. release.tag_name_protected=Birkas nosaukums ir aizsargāts. release.tag_already_exist=Šāds birkas nosaukums jau pastāv. release.downloads=Lejupielādes -release.download_count=Lejupielādes: %s release.add_tag_msg=Izmantot laidiena nosaukumu un saturu kā birkas ziņojumu. release.add_tag=Izveidot birku release.releases_for=Glabātavas %s laidieni @@ -2704,14 +2578,12 @@ branch.default_deletion_failed=Zars "%s" ir noklusējuma zars. To nevar izdzēst branch.restore=Atjaunot zaru "%s" branch.download=Lejupielādēt zaru "%s" branch.rename=Pārdēvēt zaru "%s" -branch.search=Meklēt atzarā branch.included_desc=Šis zars ir daļa no noklusējuma zara branch.included=Iekļauts branch.create_new_branch=Izveidot zaru no zara: branch.confirm_create_branch=Izveidot zaru branch.warning_rename_default_branch=Tiek pārdēvēts noklusējuma zars. branch.rename_branch_to=Pārdēvēt "%s" par: -branch.confirm_rename_branch=Pārdēvēt atzaru branch.create_branch_operation=Izveidot zaru branch.new_branch=Izveidot jaunu zaru branch.new_branch_from=Izveidot jaunu zaru no "%s" @@ -2816,7 +2688,6 @@ diff.git-notes.remove-body = Šī piezīme tiks noņemta. settings.confirm_wiki_branch_rename = Pārdēvēt vikivietnes zaru settings.matrix.room_id_helper = Istabas Id var iegūt Element tīmekļa klientā > Istabas iestatījumi > Papildu > Iekšējais istabas Id. Piemērs: %s. settings.mirror_settings.pushed_repository = Aizgādāšanas glabātava -error.broken_git_hook = Šķiet, ka šīs glabātavas Git aizķeres ir salūzušas. Lūgums vērsties dokumentācijā, lai tās salabotu, tad jāaizgādā kāds iesūtījums, lai atsvaidzinātu stāvokli. settings.add_collaborator_blocked_them = Nevar pievienot līdzdalībnieku, jo viņš/a ir liedzis/a glabātavas īpašnieku. settings.add_collaborator_blocked_our = Nevar pievienot līdzdalībnieku, jo glabātavas īpašnieks viņu ir liedzis. contributors.contribution_type.filter_label = Līdzdarbošanās veids: @@ -2829,18 +2700,15 @@ pulls.blocked_by_user = Tu nevari izveidot izmaiņu pieprasījumu šajā glabāt issues.all_title = Visi pulls.commit_ref_at = ` atsaucās uz šo izmaiņu pieprasījumu iesūtījumā %s` issues.num_participants_one = %d dalībnieks -pulls.title_desc_one = vēlas iekļaut %[1]d iesūtījumu no %[2]s %[3]s issues.archived_label_description = (Arhivēts) %s issues.blocked_by_user = Šajā glabātavā nevari izveidot pieteikumus, jo tās īpašnieks ir liedzis Tevi. issues.summary_card_alt = Pieteikuma "%s" kopsavilkuma karte glabātavā %s pulls.nothing_to_compare_have_tag = Atlasītie zari/birkas ir vienādi. -pulls.merged_title_desc_one = iekļāva %[1]d iesūtījumu no %[2]s %[3]s %[4]s pulls.reopen_failed.head_branch = Izmaiņu pieprasījumu nevar atkārtoti atvērt, jo galotnes zars vairs nepastāv. pulls.reopen_failed.base_branch = Izmaiņu pieprasījumu nevar atkārtoti atvērt, jo pamata zars vairs nepastāv. pulls.cmd_instruction_merge_warning = Brīdinājums: "Automātiski noteikt pašrocīgu apvienošanu" šajā glabātavā nav iespējots, pēcāk būs nepieciešams atzīmēt šo izmaiņu pieprasījumu kā pašrocīgi apvienotu. issues.author.tooltip.issue = Šis lietotājs ir šī pieteikuma izveidotājs. issues.review.add_review_requests = pieprasīja izskatīšanu no %[1]s %[2]s -issues.comment.blocked_by_user = Tu šim pieteikumam nevari pievienot piebildi, jo glabātavas īpašnieks vai pieteikuma izveidotājs ir liedzis Tevi. issues.num_reviews_one = %d izskatīšana issues.num_reviews_few = %d izskatīšanas settings.wiki_branch_rename_failure = Neizdevās normalizēt glabātavas vikivietnes zara nosaukumu. @@ -2905,7 +2773,6 @@ commits.view_single_diff = Apskatīt šajā datnē veiktās izmaiņas šajā ies pulls.editable = Labojams pulls.editable_explanation = Šis izmaiņu pieprasījums pieļauj labojumus no uzturētājiem. Tu vari tieši līdzdarboties tajā. issues.reopen.blocked_by_user = Tu nevari atkārtoti atvērt šo pieteikumu, jo tā izveidotājs vai glabātavas īpašnieks ir liedzis Tevi. -pulls.comment.blocked_by_user = Tu šim izmaiņu pieprasījumam nevari pievienot piebildi, jo tā izveidotājs vai glabātavas īpašnieks ir liedzis Tevi. issues.filter_no_results = Nav vienumu issues.filter_no_results_placeholder = Jāmēģina pielāgot meklēšanas atlasītāji. migrate.repo_desc_helper = Atstāt tukšu, lai ievietotu esošo aprakstu @@ -3014,9 +2881,7 @@ teams.none_access_helper="Nav piekļuve" iespēja iedarbojas tikai privātās gl teams.general_access=Pielāgota piekļuve teams.general_access_helper=Komandas tiesības tiks noteiktas pēc tabulas zemāk. teams.read_access=Lasīt -teams.read_access_helper=Komanda varēs skatīties un klonēt šīs organizācijas repozitorijus. teams.write_access=Rakstīt -teams.write_access_helper=Šī komanda varēs lasīt un nosūtīt izmaiņas uz tās repozitorijiem. teams.admin_access=Pārvaldītāja piekļuve teams.admin_access_helper=Dalībnieki var atgādāt un aizgādāt izmaiņas uz komandas glabātavām un pievienot tām līdzdalībniekus. teams.no_desc=Komandai nav apraksta @@ -3031,12 +2896,9 @@ teams.invite_team_member.list=Neapstiprināti uzaicinājumi teams.delete_team_title=Izdzēst komandu teams.delete_team_desc=Komandas izdzēšana tās dalībniekiem atsauc piekļuvi glabātavām. Turpināt? teams.delete_team_success=Komanda tika izdzēsta. -teams.read_permission_desc=Šī komanda nodrošina lasīšanas piekļuvi: dalībnieki var apskatīt un klonēt komandas glabātavas. -teams.write_permission_desc=Šī komanda nodrošina rakstīšanas piekļuvi: dalībnieki var lasīt un aizgādāt izmaiņas uz komandas glabātavām. teams.admin_permission_desc=Šī komanda nodrošina pārvaldītāja piekļuvi: dalībnieki var lasīt no, aizgādāt izmaiņas uz un pievienot līdzdalībniekus komandas glabātavām. teams.create_repo_permission_desc=Papildus šī komanda nodrošina atļauju Izveidot glabātavu: dalībnieki apvienībā var izveidot jaunas glabātavas. teams.repositories=Komandas glabātavas -teams.search_repo_placeholder=Meklēt repozitorijā… teams.remove_all_repos_title=Noņemt visas komandas glabātavas teams.remove_all_repos_desc=Šī darbība noņems visas komandas glabātavas. teams.add_all_repos_title=Pievienot visas glabātavas @@ -3049,9 +2911,6 @@ teams.specific_repositories=Noteiktas glabātavas teams.specific_repositories_helper=Dalībniekiem būs piekļuve tikai komandai pievienotajām glabātavām. Pēc šī atlasīšanas netiks automātiski noņemtas glabātavas, kas jau tika pievienotas ar Visas glabātavas. teams.all_repositories=Visas glabātavas teams.all_repositories_helper=Komandai ir piekļuve visām glabātavām. Šī atlasīšana komandai pievienos visas esošās glabātavas. -teams.all_repositories_read_permission_desc=Šī komanda piešķirt skatīšanās tiesības visiem repozitorijiem: komandas biedri var skatīties un klonēt visus organizācijas repozitorijus. -teams.all_repositories_write_permission_desc=Šī komanda piešķirt labošanas tiesības visiem repozitorijiem: komandas biedri var skatīties un nosūtīt izmaiņas visiem organizācijas repozitorijiem. -teams.all_repositories_admin_permission_desc=Šī komanda piešķirt administratora tiesības visiem repozitorijiem: komandas biedri var skatīties, nosūtīt izmaiņas un mainīt iestatījumus visiem organizācijas repozitorijiem. teams.invite.title=Tevi uzaicināja pievienoties komandai %s apvienībā %s. teams.invite.by=Uzaicināja %s teams.invite.description=Lūgums nospiest zemāk esošo pogu, lai pievienotos komandai. @@ -3148,7 +3007,6 @@ dashboard.gc_metadata_obtained=Iegūtie GC metadati dashboard.other_system_allocation_obtained=Citas iegūtās sistēmas sadales dashboard.next_gc_recycle=Nākamā GC atkritne dashboard.last_gc_time=Laiks kopš pēdējās GC -dashboard.total_gc_time=Kopējais GC izpildes laiks dashboard.total_gc_pause=Kopējais GC pārtraukums dashboard.last_gc_pause=Pedējais GC pārtraukums dashboard.gc_times=GC reizes @@ -3247,9 +3105,6 @@ repos.unadopted.no_more=Nav atrasta neviena nepieņemta glabātava. repos.owner=Īpašnieks repos.name=Nosaukums repos.private=Privāta -repos.watches=Vērošana -repos.stars=Zvaigznes -repos.forks=Atdalītie repos.issues=Pieteikumi repos.size=Izmērs repos.lfs_size=LFS lielums @@ -3354,17 +3209,6 @@ auths.oauth2_admin_group=Kopas prasības vērtība pārvaldītājiem. (Izvēles auths.oauth2_restricted_group=Grupas prasības vērtība ierobežotajiem lietotājiem. (Izvēles - nepieciešams augstāk esošais prasības nosaukums) auths.oauth2_map_group_to_team=Sasaistīt pieprasītās kopas ar apvienības komandām. (Izvēles - nepieciešams augstāk esošais prasības nosaukums) auths.oauth2_map_group_to_team_removal=Noņemt lietotājus no sinhronizētajām komandām, ja lietotājs nav attiecīgajā grupai. -auths.enable_auto_register=Iespējot automātisko reģistrāciju -auths.sspi_auto_create_users=Automātiski izveidot lietotājus -auths.sspi_auto_create_users_helper=Ļauj SSPI autentificēšanās veidam automātiski izveidot jaunus kontus lietotājiem, kas piesakās pirmo reizi -auths.sspi_auto_activate_users=Automātiski aktivēt lietotājus -auths.sspi_auto_activate_users_helper=Ļauj SSPI autentificēšanas viedam automātiski aktivēt jaunus lietotājus -auths.sspi_strip_domain_names=Noņemt domēna vārdus no lietotāju vārdiem -auths.sspi_strip_domain_names_helper=Ja atzīmēts, domēna vārdi tiks noņemti no lietotāja vārdiem, piemēram, "DOMĒNS\lietotājs" un "lietotājs@domēns.lv" abi kļūs par tikai "lietotājs". -auths.sspi_separator_replacement=Atdalītājs, ko izmantot \, / vai @ vietā -auths.sspi_separator_replacement_helper=Rakstzīme, ko izmantot, lai aizstātu atdalītājus zemāka līmeņa pieteikšanās vārdos (piem., "\" vērtībā "DOMĒNS\lietotājs") un lietotāja identitāšu nosaukumos (piemēram, "@" vērtībā "lietotajs@example.org"). -auths.sspi_default_language=Lietotāju noklusējuma valoda -auths.sspi_default_language_helper=Noklusējuma valoda lietotājiem, kurus automātiski izveido SSPI autentificēšanās veids. Atstāt tukšu, ja ir vēlams, lai valoda tiktu noteikta automātiski. auths.tips=Padomi auths.tips.oauth2.general=OAuth2 autentificēšanās auths.tips.oauth2.general.tip=Kad tiek reģistrēta jauna OAuth2 autentificēšana, atzvanīšanas/pārvirzīšanas URL vajadzētu būt: @@ -3374,7 +3218,6 @@ auths.tip.nextcloud=Reģistrēt jaunu OAuth patērētāju savā serverī var izv auths.tip.dropbox=Jāizveido jauna lietotne %s auths.tip.facebook=Jāizveido jauna lietotne %s un jāpievieno produkts "Facebook Login" auths.tip.github=Jāizveido jauna OAuth lietotne %s -auths.tip.gitlab=Reģistrējiet jaunu aplikāciju adresē https://gitlab.com/profile/applications auths.tip.google_plus=OAuth2 klienta piekļuves dati ir iegūstami Google API konsolē %s auths.tip.openid_connect=Jāizmanto OpenID savienošanās atklāšanas URL (/.well-known/openid-configuration), lai norādītu galapunktus auths.tip.twitter=Jādodas uz %s, jāizveido lietotne un jānodrošina, ka iespēja "Allow this application to be used to Sign in with Twitter" ir iespējota @@ -4039,13 +3882,11 @@ code_search_unavailable = Koda meklēšana pašlaik nav pieejama. Lūgums sazin project_kind = Meklēt projektus… runner_kind = Meklēt izpildītājus… no_results = Nekas netika atrasts. -milestone_kind = Meklēt atskaites punktus... package_kind = Meklēt pakotnes… org_kind = Meklēt apvienības… user_kind = Meklēt lietotājus… team_kind = Meklēt komandas… code_kind = Meklēt kodu… -code_search_by_git_grep = Pašreizējo koda meklēšanas iznākumu nodrošina "git grep". Iznākums varētu būt labāks, ja vietnes pārvaldītājs iespējo glabātavas indeksētāju. keyword_search_unavailable = Meklēšana pēc atslēgvārda pašreiz nav pieejama. Lūgums sazināties ar vietnes pārvaldītāju. issue_kind = Meklēt pieteikumus… pull_kind = Meklēt izmaiņu pieprasījumus… diff --git a/options/locale/locale_ml-IN.ini b/options/locale/locale_ml-IN.ini index c4c266ad86..f7eb04495e 100644 --- a/options/locale/locale_ml-IN.ini +++ b/options/locale/locale_ml-IN.ini @@ -4,7 +4,6 @@ dashboard=ഡാഷ്ബോർഡ് explore=കണ്ടെത്തൂ help=സഹായം sign_in=പ്രവേശിക്കുക -sign_in_with=ഉപയോഗിച്ചു് പ്രവേശിയ്ക്കുക sign_out=പുറത്തുകടക്കുക sign_up=രജിസ്റ്റർ link_account=അക്കൌണ്ട് ബന്ധിപ്പിയ്ക്കുക @@ -32,14 +31,9 @@ passcode=രഹസ്യ കോഡ് repository=കലവറ organization=സംഘടന mirror=മിറര്‍ -new_repo=പുതിയ കലവറ -new_migrate=പുതിയ കുടിയേറ്റിപ്പാര്‍പ്പിക്കല്‍ new_mirror=പുതിയ മിറര്‍ new_fork=കലവറയുടെ പുതിയ ശിഖരം -new_org=പുതിയ സംഘടന -manage_org=സംഘടനകളെ നിയന്ത്രിക്കുക admin_panel=സൈറ്റിന്റെ കാര്യനിര്‍വ്വാഹണം -account_settings=അക്കൌണ്ട് ക്രമീകരണങള്‍ settings=ക്രമീകരണങ്ങള്‍ your_profile=പ്രൊഫൈൽ your_starred=നക്ഷത്ര ചിഹ്നമിട്ടവ @@ -82,9 +76,7 @@ host=ഹോസ്റ്റ് user=ഉപയോക്ത്രു നാമം password=രഹസ്യവാക്കു് db_name=ഡാറ്റാബേസിന്റെ പേര് -db_helper=MySQL ഉപയോക്താക്കൾക്കുള്ള കുറിപ്പ്: ദയവായി InnoDB സ്റ്റോറേജ് എഞ്ചിൻ ഉപയോഗിക്കുക. നിങ്ങൾ "utf8mb4" ഉപയോഗിക്കുകയാണെങ്കിൽ, InnoDB പതിപ്പ് 5.6 നേക്കാൾ വലുതായിരിക്കണം. ssl_mode=SSL -charset=ക്യാര്‍സെറ്റ് path=പാത sqlite_helper=SQLite3 ഡാറ്റാബേസിന്റെ ഫയല്‍ പാത്ത്.
    നിങ്ങൾ ഗിറ്റീയെ ഒരു സേവനമായി പ്രവർത്തിപ്പിക്കുകയാണെങ്കിൽ സമ്പൂര്‍ണ്ണ ഫയല്‍ പാത നൽകുക. err_empty_db_path=SQLite3 ഡാറ്റാബേസ് പാത്ത് ശൂന്യമായിരിക്കരുത്. @@ -122,22 +114,12 @@ register_confirm=രജിസ്റ്റർ ചെയ്യുന്നതി mail_notify=ഇമെയിൽ അറിയിപ്പുകൾ പ്രാപ്തമാക്കുക server_service_title=സെർവറിന്റെയും മൂന്നാം കക്ഷി സേവനങ്ങളുടെയും ക്രമീകരണങ്ങള്‍ offline_mode=പ്രാദേശിക മോഡ് പ്രവർത്തനക്ഷമമാക്കുക -offline_mode_popup=മൂന്നാം കക്ഷി ഉള്ളടക്ക ഡെലിവറി നെറ്റ്‌വർക്കുകൾ അപ്രാപ്‌തമാക്കി എല്ലാ വിഭവങ്ങളും പ്രാദേശികമായി നല്‍കുക. disable_gravatar=ഗ്രവതാര്‍ പ്രവർത്തനരഹിതമാക്കുക -disable_gravatar_popup=ഗ്രവതാര്‍ അല്ലെങ്കില്‍ മൂന്നാം കക്ഷി അവതാർ ഉറവിടങ്ങൾ പ്രവർത്തനരഹിതമാക്കുക. ഒരു ഉപയോക്താവ് പ്രാദേശികമായി ഒരു അവതാർ അപ്‌ലോഡുചെയ്യുന്നില്ലെങ്കിൽ സ്ഥിരസ്ഥിതി അവതാർ ഉപയോഗിക്കും. federated_avatar_lookup=കേന്ദ്രീകൃത അവതാര്‍ പ്രാപ്തമാക്കുക -federated_avatar_lookup_popup=ലിബ്രാവതാർ ഉപയോഗിച്ച് കേന്ദ്രീക്രത അവതാർ തിരയൽ പ്രാപ്തമാക്കുക. disable_registration=സ്വയം രജിസ്ട്രേഷൻ അപ്രാപ്തമാക്കുക -disable_registration_popup=ഉപയോക്താക്കള്‍ സ്വയം രജിസ്റ്റര്‍ ചെയ്യുന്നതു അപ്രാപ്യമാക്കുക. അഡ്മിനിസ്ട്രേറ്റർമാർക്ക് മാത്രമേ പുതിയ ഉപയോക്തൃ അക്കൌണ്ടുകൾ സൃഷ്ടിക്കാന്‍ കഴിയൂ. -allow_only_external_registration_popup=ബാഹ്യ സേവനങ്ങളിലൂടെ മാത്രം രജിസ്ട്രേഷന്‍ അനുവദിക്കുക openid_signin=OpenID പ്രവേശനം പ്രവർത്തനക്ഷമമാക്കുക -openid_signin_popup=OpenID വഴി ഉപയോക്തൃ പ്രവേശനം പ്രാപ്തമാക്കുക. openid_signup=OpenID സ്വയം രജിസ്ട്രേഷൻ പ്രാപ്തമാക്കുക -openid_signup_popup=OpenID അടിസ്ഥാനമാക്കിയുള്ള ഉപയോക്തൃ സ്വയം രജിസ്ട്രേഷൻ പ്രാപ്തമാക്കുക. -enable_captcha_popup=ഉപയോക്താക്കള്‍ സ്വയം രജിസ്ട്രേഷന്‍ ചെയ്യുന്നതിനു് ഒരു ക്യാപ്ച ആവശ്യമാണ്. require_sign_in_view=പേജുകൾ കാണുന്നതിന് സൈറ്റില്‍ പ്രവേശിക്കണം -require_sign_in_view_popup=പേജ് ആക്‌സസ്സ്, പ്രവേശിച്ച ഉപയോക്താക്കൾക്കുമാത്രമായി പരിമിതപ്പെടുത്തുക. സന്ദർശകർ 'പ്രവേശനം', രജിസ്ട്രേഷൻ പേജുകൾ എന്നിവ മാത്രമേ കാണൂ. -admin_setting_desc=ഒരു അഡ്മിനിസ്ട്രേറ്റര്‍ അക്കൗണ്ട് സൃഷ്ടിക്കുന്നത് ഐച്ഛികമാണ്. ആദ്യം രജിസ്റ്റര്‍ ചെയ്ത ഉപയോക്താവ് യാന്ത്രികമായി ഒരു അഡ്മിനിസ്ട്രേറ്ററായി മാറും. admin_title=അഡ്മിനിസ്ട്രേറ്റര്‍ അക്കൗണ്ട് ക്രമീകരണങ്ങൾ admin_name=അഡ്മിനിസ്ട്രേറ്ററുടെ ഉപയോക്തൃനാമം admin_password=രഹസ്യവാക്കു് @@ -151,55 +133,33 @@ invalid_repo_path=കലവറയുടെ റൂട്ട് പാത്ത് run_user_not_match='റൺ ആസ്' ഉപയോക്തൃനാമം നിലവിലെ ഉപയോക്തൃനാമമല്ല: %s -> %s save_config_failed=കോൺഫിഗറേഷൻ സംരക്ഷിക്കുന്നതിൽ പരാജയപ്പെട്ടു: %v invalid_admin_setting=അഡ്മിനിസ്ട്രേറ്റര്‍ അക്കൌണ്ട് ക്രമീകരണം അസാധുവാണ്: %v -install_success=സ്വാഗതം! ഗിറ്റീ തിരഞ്ഞെടുത്തതിന് നന്ദി. സൂക്ഷിക്കുക, ആസ്വദിക്കൂ,! invalid_log_root_path=ലോഗ് പാത്ത് അസാധുവാണ്: %v default_keep_email_private=സ്ഥിരസ്ഥിതിയായി ഇമെയില്‍ വിലാസങ്ങള്‍ മറയ്‌ക്കുക -default_keep_email_private_popup=സ്ഥിരസ്ഥിതിയായി പുതിയ ഉപയോക്തൃ അക്കൗണ്ടുകളുടെ ഇമെയില്‍ വിലാസങ്ങള്‍ മറയ്ക്കുക. default_allow_create_organization=സ്ഥിരസ്ഥിതിയായി സംഘടനകള്‍ സൃഷ്ടിക്കാന്‍ അനുവദിക്കുക -default_allow_create_organization_popup=സ്ഥിരസ്ഥിതിയായി സംഘടനകള്‍ സൃഷ്ടിക്കാന്‍ പുതിയ ഉപയോക്തൃ അക്കൗണ്ടുകളെ അനുവദിക്കുക. default_enable_timetracking=സ്ഥിരസ്ഥിതിയായി സമയം ട്രാക്കു് ചെയ്യുന്നതു പ്രാപ്തമാക്കുക -default_enable_timetracking_popup=സ്ഥിരസ്ഥിതിയായി പുതിയ കലവറകള്‍ക്കു് സമയം ട്രാക്കു് ചെയ്യുന്നതു് പ്രാപ്തമാക്കുക. no_reply_address=മറച്ച ഇമെയിൽ ഡൊമെയ്ൻ no_reply_address_helper=മറഞ്ഞിരിക്കുന്ന ഇമെയിൽ വിലാസമുള്ള ഉപയോക്താക്കൾക്കുള്ള ഡൊമെയ്ൻ നാമം. ഉദാഹരണത്തിന്, മറഞ്ഞിരിക്കുന്ന ഇമെയിൽ ഡൊമെയ്ൻ 'noreply.example.org' ആയി സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ 'joe' എന്ന ഉപയോക്താവു് 'joe@noreply.example.org' ആയി ലോഗിൻ ചെയ്യും. [home] uname_holder=ഉപയോക്തൃനാമമോ ഇമെയിൽ വിലാസമോ -password_holder=രഹസ്യവാക്കു് switch_dashboard_context=ഡാഷ്‌ബോർഡ് സന്ദർഭം മാറ്റുക my_repos=കലവറകള്‍ -show_more_repos=കൂടുതൽ കലവറകള്‍ കാണിക്കുക… -collaborative_repos=സഹകരിക്കാവുന്ന കലവറകള്‍ my_orgs=എന്റെ സംഘടനകള്‍ -my_mirrors=എന്റെ മിററുകള്‍ view_home=%s കാണുക -search_repos=ഒരു കലവറ കണ്ടെത്തുക… - - - issues.in_your_repos=നിങ്ങളുടെ കലവറകളില്‍ [explore] repos=കലവറകള്‍ users=ഉപയോക്താക്കള്‍ organizations=സംഘടനകള്‍ -search=തിരയുക code=കോഡ് -repo_no_results=പൊരുത്തപ്പെടുന്ന കലവറകളൊന്നും കണ്ടെത്താനായില്ല. -user_no_results=പൊരുത്തപ്പെടുന്ന ഉപയോക്താക്കളെയൊന്നും കണ്ടെത്താനായില്ല. -org_no_results=പൊരുത്തപ്പെടുന്ന സംഘടനകളൊന്നും കണ്ടെത്താനായില്ല. -code_no_results=നിങ്ങളുടെ തിരയൽ പദവുമായി പൊരുത്തപ്പെടുന്ന സോഴ്സ് കോഡുകളൊന്നും കണ്ടെത്താനായില്ല. -code_search_results=%s എന്നതിനായുള്ള തിരയൽ ഫലങ്ങൾ - [auth] create_new_account=അക്കൗണ്ട് രജിസ്റ്റർ ചെയ്യുക -register_helper_msg=ഇതിനകം ഒരു അക്കൗണ്ട് ഉണ്ടോ? ഇപ്പോൾ പ്രവേശിക്കുക! -social_register_helper_msg=ഇതിനകം ഒരു അക്കൗണ്ട് ഉണ്ടോ? ഇത് ഇപ്പോൾ ബന്ധിപ്പിയ്ക്കുക! disable_register_prompt=രജിസ്ട്രേഷൻ അപ്രാപ്തമാക്കി. നിങ്ങളുടെ സൈറ്റ് അഡ്മിനിസ്ട്രേറ്ററുമായി ബന്ധപ്പെടുക. disable_register_mail=രജിസ്ട്രേഷനായുള്ള ഇമെയിൽ സ്ഥിരീകരണം അപ്രാപ്തമാക്കി. forgot_password_title=അടയാളവാക്യം മറന്നുപോയോ forgot_password=അടയാള വാക്ക് ഓർക്കുന്നില്ലേ? -sign_up_now=ഒരു അക്കൗണ്ട് ആവശ്യമുണ്ടോ? ഇപ്പോള്‍ രജിസ്റ്റര്‍ ചെയ്യുക. sign_up_successful=അക്കൗണ്ട് വിജയകരമായി സൃഷ്ടിച്ചു. confirmation_mail_sent_prompt=%s ലേക്ക് ഒരു പുതിയ സ്ഥിരീകരണ ഇമെയിൽ അയച്ചു. രജിസ്ട്രേഷൻ പ്രക്രിയ പൂർത്തിയാക്കുന്നതിന് അടുത്ത %s നുള്ളിൽ നിങ്ങളുടെ ഇൻ‌ബോക്സ് പരിശോധിക്കുക. must_change_password=നിങ്ങളുടെ രഹസ്യവാക്കു് പുതുക്കുക @@ -212,7 +172,6 @@ prohibit_login_desc=നിങ്ങളുടെ അക്കൗണ്ടില resent_limit_prompt=നിങ്ങൾ അടുത്തിടെ ഒരു സജീവമാക്കൽ ഇമെയിൽ അഭ്യർത്ഥിച്ചു. 3 മിനിറ്റ് കാത്തിരുന്ന് വീണ്ടും ശ്രമിക്കുക. has_unconfirmed_mail=ഹായ് %s, നിങ്ങൾക്ക് സ്ഥിരീകരിക്കാത്ത ഇമെയിൽ വിലാസം (%s) ഉണ്ട്. നിങ്ങൾക്ക് ഒരു സ്ഥിരീകരണ ഇമെയിൽ ലഭിച്ചില്ലെങ്കിലോ പുതിയതൊന്ന് വീണ്ടും അയയ്‌ക്കേണ്ടതുണ്ടെങ്കിലോ, ചുവടെയുള്ള ബട്ടണിൽ ക്ലിക്കുചെയ്യുക. resend_mail=നിങ്ങളുടെ സജീവമാക്കൽ ഇമെയിൽ വീണ്ടും അയയ്‌ക്കാൻ ഇവിടെ ക്ലിക്കുചെയ്യുക -email_not_associate=ഇമെയിൽ വിലാസം ഏതെങ്കിലും അക്കൗണ്ടുമായി ബന്ധപ്പെടുത്തിയിട്ടില്ല. send_reset_mail=അക്കൗണ്ട് വീണ്ടെടുക്കൽ ഇമെയിൽ അയയ്‌ക്കുക reset_password=അക്കൗണ്ട് വീണ്ടെടുക്കൽ invalid_code=നിങ്ങളുടെ സ്ഥിരീകരണ കോഡ് അസാധുവാണ് അല്ലെങ്കിൽ കാലഹരണപ്പെട്ടു. @@ -227,7 +186,6 @@ twofa_scratch_used=നിങ്ങളുടെ സ്ക്രാച്ച് twofa_passcode_incorrect=നിങ്ങളുടെ പാസ്‌കോഡ് തെറ്റാണ്. നിങ്ങളുടെ ഉപകരണം തെറ്റായി സ്ഥാപിച്ചിട്ടുണ്ടെങ്കിൽ, പ്രവേശിക്കാൻ നിങ്ങളുടെ സ്ക്രാച്ച് കോഡ് ഉപയോഗിക്കുക. twofa_scratch_token_incorrect=നിങ്ങളുടെ സ്ക്രാച്ച് കോഡ് തെറ്റാണ്. login_userpass=പ്രവേശിക്കുക -login_openid=OpenID oauth_signup_tab=പുതിയ അക്കൗണ്ട് രജിസ്റ്റർ ചെയ്യുക oauth_signup_submit=അക്കൗണ്ട് പൂർത്തിയാക്കുക oauth_signin_tab=നിലവിലുള്ള അക്കൌണ്ടുമായി ബന്ധിപ്പിയ്ക്കുക @@ -275,8 +233,6 @@ RepoName=കലവറയുടെ പേരു് Email=ഇ-മെയില്‍ വിലാസം Password=രഹസ്യവാക്കു് Retype=രഹസ്യവാക്കു് വീണ്ടും നല്‍കുക -SSHTitle=SSH കീയുടെ പേരു് -HttpsUrl=HTTPS URL PayloadUrl=പേലോഡ് URL TeamName=ടീമിന്റെ പേരു് AuthName=അംഗീകാരത്തിന്റെ പേരു് @@ -333,15 +289,11 @@ target_branch_not_exist=ലക്ഷ്യമാക്കിയ ശാഖ നി [user] change_avatar=നിങ്ങളുടെ അവതാർ മാറ്റുക… -join_on=ചേർന്നതു് repositories=കലവറകള്‍ activity=പൊതുവായ പ്രവർത്തനങ്ങള്‍ -followers=പിന്തുടരുന്നവര്‍‌ starred=നക്ഷത്രമിട്ട കലവറകള്‍ -following=പിന്തുടരുന്നവര്‍ follow=പിന്തുടരൂ unfollow=പിന്തുടരുന്നത് നിര്‍ത്തുക -heatmap.loading=ഹീറ്റ്മാപ്പ് ലോഡുചെയ്യുന്നു… user_bio=ജീവചരിത്രം form.name_reserved='%s' എന്ന ഉപയോക്തൃനാമം മറ്റാവശ്യങ്ങള്‍ക്കായി നീക്കിവച്ചിരിക്കുന്നു. @@ -354,13 +306,11 @@ password=രഹസ്യവാക്കു് security=സുരക്ഷ avatar=അവതാര്‍ ssh_gpg_keys=SSH / GPG കീകള്‍ -social=സോഷ്യൽ അക്കൗണ്ടുകൾ applications=അപ്ലിക്കേഷനുകൾ orgs=സംഘടനകൾ repos=കലവറകള്‍ delete=അക്കൗണ്ട് ഇല്ലാതാക്കുക twofa=ഇരട്ട ഘടക പ്രാമാണീകരണം -account_link=ബന്ധിപ്പിച്ച അക്കൌണ്ടുകള്‍ organization=സംഘടനകള്‍ uid=Uid @@ -381,7 +331,6 @@ language=ഭാഷ ui=പ്രമേയങ്ങള്‍ lookup_avatar_by_mail=ഇമെയിൽ വിലാസം അനുസരിച്ച് അവതാർ കണ്ടെത്തുക -federated_avatar_lookup=കേന്ദ്രീക്രത അവതാര്‍ കണ്ടെത്തല്‍ enable_custom_avatar=ഇഷ്‌ടാനുസൃത അവതാർ ഉപയോഗിക്കുക choose_new_avatar=പുതിയ അവതാർ തിരഞ്ഞെടുക്കുക update_avatar=അവതാർ പുതുക്കുക @@ -398,7 +347,6 @@ password_incorrect=നിലവിലെ പാസ്‌വേഡ് തെറ change_password_success=നിങ്ങളുടെ പാസ്‌വേഡ് അപ്‌ഡേറ്റുചെയ്‌തു. ഇനി മുതൽ നിങ്ങളുടെ പുതിയ പാസ്‌വേഡ് ഉപയോഗിച്ച് പ്രവേശിക്കുക. password_change_disabled=പ്രാദേശിക ഇതര ഉപയോക്താക്കൾക്ക് ഗിറ്റീ വെബ് വഴി പാസ്‌വേഡ് പുതുക്കാന്‍ ചെയ്യാൻ കഴിയില്ല. -emails=ഇ-മെയില്‍ വിലാസങ്ങള്‍ manage_emails=ഇമെയിൽ വിലാസങ്ങൾ നിയന്ത്രിക്കുക manage_themes=ഡിഫോൾട്ട് തീം manage_openid=OpenID വിലാസങ്ങൾ @@ -433,8 +381,6 @@ ssh_desc=ഇവയാണു് നിങ്ങളുടെ അക്കൗണ് gpg_desc=ഈ പൊതു GPG കീകൾ നിങ്ങളുടെ അക്കൗണ്ടുമായി ബന്ധപ്പെട്ടിരിക്കുന്നു. കമ്മിറ്റുകളെ പരിശോധിച്ചുറപ്പിക്കാൻ നിങ്ങളുടെ സ്വകാര്യ കീകൾ അനുവദിക്കുന്നതിനാൽ അവ സുരക്ഷിതമായി സൂക്ഷിക്കുക. ssh_helper=സഹായം ആവശ്യമുണ്ടോ? നിങ്ങളുടെ സ്വന്തം SSH കീകൾ സൃഷ്ടിക്കുക, അല്ലെങ്കിൽ പൊതുവായ പ്രശ്നങ്ങൾ എന്നിവയ്ക്കായുള്ള ഗിറ്റ്ഹബ്ബിന്റെ മാര്‍ഗദര്‍ശനങ്ങള്‍ ഉപയോഗിച്ചു് നിങ്ങൾക്ക് എസ്. എസ്. എച്ചുമായി ബന്ധപ്പെട്ട പ്രശ്നങ്ങള്‍ പരിഹരിക്കാം. gpg_helper= സഹായം ആവശ്യമുണ്ടോ? ജിപിജിയെക്കുറിച്ച് ഗിറ്റ്ഹബിന്റെ മാര്‍ഗ്ഗനിര്‍ദ്ദേശങ്ങള്‍ പരിശോധിയ്ക്കുക. -add_new_key=SSH കീ ചേർക്കുക -add_new_gpg_key=GPG കീ ചേർക്കുക ssh_key_been_used=ഈ SSH കീ ഇതിനകം ചേർത്തു. gpg_key_id_used=സമാന ഐഡിയുള്ള ഒരു പൊതു ജിപിജി കീ ഇതിനകം നിലവിലുണ്ട്. subkeys=സബ് കീകള്‍ @@ -450,8 +396,6 @@ ssh_key_deletion_desc=ഒരു SSH കീ നീക്കംചെയ്യു gpg_key_deletion_desc=ഒരു ജി‌പി‌ജി കീ നീക്കംചെയ്യുന്നത് അതിൽ ഒപ്പിട്ട കമ്മിറ്റുകളെ സ്ഥിരീകരിക്കില്ല. തുടരട്ടെ? ssh_key_deletion_success=SSH കീ നീക്കംചെയ്‌തു. gpg_key_deletion_success=GPG കീ നീക്കംചെയ്‌തു. -add_on=ചേര്‍ത്തതു് -valid_until=വരെ സാധുവാണ് valid_forever=എന്നും സാധുവാണു് last_used=അവസാനം ഉപയോഗിച്ചത് no_activity=സമീപകാലത്തു് പ്രവർത്തനങ്ങളൊന്നുമില്ല @@ -462,15 +406,9 @@ token_state_desc=ഈ ടോക്കൺ കഴിഞ്ഞ 7 ദിവസങ് show_openid=പ്രൊഫൈലിൽ കാണുക hide_openid=പ്രൊഫൈലിൽ നിന്ന് മറയ്‌ക്കുക ssh_disabled=SSH അപ്രാപ്‌തമാക്കി -manage_social=സഹവസിക്കുന്ന സോഷ്യൽ അക്കൗണ്ടുകളെ നിയന്ത്രിക്കുക -social_desc=ഈ സോഷ്യൽ അക്കൗണ്ടുകൾ നിങ്ങളുടെ ഗിറ്റീ അക്കൗണ്ടുമായി ലിങ്കുചെയ്‌തു. ഇവ നിങ്ങളുടെ ഗീറ്റീ അക്കൗണ്ടിലേക്ക് പ്രവേശിക്കാൻ ഉപയോഗിക്കാവുന്നതിനാൽ അവയെല്ലാം നിങ്ങൾ തിരിച്ചറിഞ്ഞുവെന്ന് ഉറപ്പാക്കുക. -unbind=അൺലിങ്ക് ചെയ്യുക -unbind_success=നിങ്ങളുടെ ഗീറ്റീ അക്കൗണ്ടിൽ നിന്ന് സോഷ്യൽ അക്കൗണ്ട് അൺലിങ്ക് ചെയ്തു. - manage_access_token=ആക്‌സസ്സ് ടോക്കണുകൾ നിയന്ത്രിക്കുക generate_new_token=പുതിയ ടോക്കൺ സൃഷ്‌ടിക്കുക tokens_desc=ഈ ടോക്കണുകൾ ഗിറ്റീ API ഉപയോഗിച്ച് നിങ്ങളുടെ അക്കൌണ്ടിലേക്ക് പ്രവേശനം നൽകുന്നു. -new_token_desc=ഒരു ടോക്കൺ ഉപയോഗിക്കുന്ന അപ്ലിക്കേഷനുകൾക്ക് നിങ്ങളുടെ അക്കൌണ്ടിലേക്ക് പൂർണ്ണ പ്രവേശനം ഉണ്ട്. token_name=ടോക്കണിന്റെ പേരു് generate_token=ടോക്കൺ സൃഷ്‌ടിക്കുക generate_token_success=നിങ്ങളുടെ പുതിയ ടോക്കൺ ജനറേറ്റുചെയ്‌തു. ഇത് വീണ്ടും കാണിക്കാത്തതിനാൽ ഇപ്പോൾ തന്നെ പകർത്തുക. @@ -489,7 +427,6 @@ create_oauth2_application_button=അപ്ലിക്കേഷൻ സൃഷ് create_oauth2_application_success=നിങ്ങൾ വിജയകരമായി ഒരു പുതിയ OAuth2 അപ്ലിക്കേഷൻ സൃഷ്ടിച്ചു. update_oauth2_application_success=നിങ്ങൾ വിജയകരമായി ഒരു പുതിയ OAuth2 അപ്ലിക്കേഷൻ പുതുക്കി. oauth2_application_name=അപ്ലിക്കേഷന്റെ പേര് -oauth2_redirect_uri=URI റീഡയറക്‌ട് ചെയ്യുക save_application=സംരക്ഷിയ്ക്കുക oauth2_client_id=ക്ലൈന്റ് ഐഡി oauth2_client_secret=ക്ലൈന്റു് രഹസ്യം @@ -527,7 +464,6 @@ twofa_enrolled=നിങ്ങളുടെ അക്കൌണ്ട് രണ് manage_account_links=ബന്ധിപ്പിച്ചിട്ടുള്ള അക്കൗണ്ടുകൾ നിയന്ത്രിക്കുക manage_account_links_desc=ഈ ബാഹ്യ അക്കൗണ്ടുകൾ നിങ്ങളുടെ ഗിറ്റീ അക്കൗണ്ടുമായി ലിങ്കുചെയ്‌തു. -account_links_not_available=നിങ്ങളുടെ ഗിറ്റീ അക്കൌണ്ടുമായി നിലവിൽ മറ്റു് ബാഹ്യ അക്കൌണ്ടുകളൊന്നും ബന്ധിപ്പിച്ചിട്ടില്ല. remove_account_link=ബന്ധിപ്പിച്ച അക്കൗണ്ട് നീക്കംചെയ്യുക remove_account_link_desc=ഒരു ബന്ധിപ്പിച്ച അക്കൗണ്ട് നീക്കംചെയ്യുന്നത് നിങ്ങളുടെ ഗിറ്റീ അക്കൗണ്ടിലേക്കുള്ള പ്രവേശനം അസാധുവാക്കും. തുടരട്ടെ? remove_account_link_success=ബന്ധിപ്പിച്ച അക്കൗണ്ട് നീക്കംചെയ്‌തു. @@ -580,16 +516,12 @@ mirror_last_synced=അവസാനം സമന്വയിപ്പിച്ച watchers=നിരീക്ഷകർ stargazers=സ്റ്റാർഗാസറുകൾ forks=ശാഖകള്‍ -pick_reaction=നിങ്ങളുടെ പ്രതികരണം തിരഞ്ഞെടുക്കുക reactions_more=കൂടാതെ %d അധികം archive.title=ഈ കലവറ ചരിത്രരേഖാപരമായി നിലനിര്‍ത്തിയിരിക്കുന്നു. നിങ്ങൾക്ക് ഫയലുകൾ കാണാനും ക്ലോൺ ചെയ്യാനും കഴിയും, പക്ഷേ പ്രശ്‌നങ്ങൾ / ലയന അഭ്യർത്ഥനകൾ ഉണ്ടാക്കാനോ തുറക്കാനോ കഴിയില്ല. -archive.issue.nocomment=ഈ കലവറ ചരിത്രപരമായി നിലനിര്‍ത്തിയിരിക്കുന്നതാണു്. നിങ്ങൾക്ക് പ്രശ്നങ്ങളിൽ അഭിപ്രായമിടാൻ കഴിയില്ല. -archive.pull.nocomment=ഈ കലവറ ചരിത്രപരമായി നിലനിര്‍ത്തിയിരിക്കുന്നതാണു്. നിങ്ങൾക്ക് ലയന അഭ്യർത്ഥനകളില്‍ അഭിപ്രായമിടാൻ കഴിയില്ല. - form.name_reserved='%s' എന്ന കലവറയുടെ പേരു് മറ്റാവശ്യങ്ങള്‍ക്കായി നീക്കിവച്ചിരിക്കുന്നു. form.name_pattern_not_allowed=കലവറനാമത്തിൽ '%s' എന്ന ശ്രേണി അനുവദനീയമല്ല. diff --git a/options/locale/locale_nds.ini b/options/locale/locale_nds.ini index bf60b23ef8..e5e4c62bd5 100644 --- a/options/locale/locale_nds.ini +++ b/options/locale/locale_nds.ini @@ -162,7 +162,6 @@ project_kind = In Projekten söken … commit_kind = In Kommitterens söken … runner_kind = In Lopers söken … no_results = Nix funnen, wat passt. -milestone_kind = In Markstenen söken … pull_kind = In Haalvörslagens söken … code_search_unavailable = Quelltext-Söök is stedenwies nich verföögbaar. Bidde kuntakteer de Sied-Chef. branch_kind = In Twiegen söken … @@ -170,7 +169,6 @@ code_kind = In Quelltext söken … package_kind = In Paketen söken … issue_kind = In Gefallens söken … keyword_search_unavailable = Woorden-Söök is stedenwies nich verföögbaar. Bidde kuntakteer de Sied-Chef. -code_search_by_git_grep = Stedenwies Quelltext-Söök-Resultaten worden vun »git grep« paraatstellt. Wenn de Sied-Chef de Quelltext-Indizerer anknipst, kann dat betere Resultaten geven. [aria] navbar = Navigerens-Balken @@ -435,8 +433,6 @@ AdminEmail = Chef-E-Mail AccessToken = Togang-Teken CommitMessage = Kommitteren-Naricht TreeName = Dateipadd -SSPISeparatorReplacement = Trenner -SSPIDefaultLanguage = Normaalspraak email_error = ` is keene gültige E-Mail-Adress.` captcha_incorrect = De CAPTCHA-Tahl is falsk. username_been_taken = Deeser Brukernaam word al bruukt. @@ -571,7 +567,6 @@ blocked_users = Blockeert Brukers public_profile = Publikes profil location_placeholder = Deel waar du umslags büst mit Annerns pronouns = Pronomens -pronouns_custom = Eegene update_theme = Thema ännern update_profile = Profil vernejen update_language_success = Spraak is verneeit worden. @@ -858,7 +853,6 @@ twofa_desc = Um dien Konto tegen Passwoordklau to schütten, kannst du een Smart twofa_recovery_tip = Wenn du dien Geraadskupp verlüst, kannst du eenen Eenmaal-Bruuk-Torügghalens-Slötel bruken, um weer in dien Konto to komen. webauthn_desc = Sekerheids-Slötels sünd Geraadskuppen, wat kryptographisk Slötels enthollen. Se könen för dat Anmellen mit Twee Faktooren bruukt worden. Sekerheids-Slötels mutten de »WebAuthn Authenticator«-Standard unnerstütten. user_block_yourself = Du kannst di nich sülvst blockeren. -pronouns_custom_label = Eegene Pronomens change_username_redirect_prompt.with_cooldown.one = De olle Brukernaam word na eener Ofköhl-Düür vun %[1]d Dag för all Lüü verföögbaar wesen. In de Ofköhl-Düür kannst du de ollen Naam noch torügghalen. change_username_redirect_prompt.with_cooldown.few = De olle Brukernaam word na eener Ofköhl-Düür vun %[1]d Dagen för all Lüü verföögbaar wesen. In de Ofköhl-Düür kannst du de ollen Naam noch torügghalen. keep_pronouns_private = Pronomens blots to anmellt Brukers wiesen @@ -1067,8 +1061,6 @@ form.string_too_long = De angeven Text is langer as %d Bookstavens. migrate_items_issues = Gefallens template.items = Vörlaag-Dingen template.git_hooks_tooltip = Du kannst jüüst keene Git-Hakens bewarken of lösken, nadeem se hentoföögt sünd. Köör dat blots ut, wenn du de Vörlaag-Repositorium vertraust. -archive.issue.nocomment = Deeses Repositorium is archiveert. Du kannst nich up Gefallens kommenteren. -archive.pull.nocomment = Deeses Repositorium is archiveert. Du kannst nich up Haalvörslagens kommenteren. form.reach_limit_of_creation_n = De Eegner is al bi de Grenz vun %d Repositoriums. migrate_options_mirror_helper = Deeses Repositorium word een Spegel wesen migrate_options_lfs_endpoint.description.local = Een stedenwies Server-Padd word ok unnerstütt. @@ -1441,8 +1433,6 @@ issues.reopen_issue = Weer opmaken issues.closed_at = `hett deeses Gefall %s dichtmaakt` issues.commit_ref_at = `hett deeses Gefall %s vun eenem Kommitteren benöömt` issues.ref_closing_from = `hett deeses Gefall %[1]s vun eenem Haalvörslag, wat ’t %[3]s dichtmaken word, benöömt` -issues.ref_closed_from = `hett deeses Gefall %[4]s %[2]s dichtmaakt` -issues.ref_reopened_from = `hett deeses Gefall %[4]s %[2]s weer opmaakt` issues.ref_from = `vun %[1]s` issues.author = Autor issues.author.tooltip.pr = Deeser Bruker is de Autor vun deesem Haalvörslag. @@ -1491,7 +1481,6 @@ issues.re_request_review = Nakieken neei anfragen issues.is_stale = ’t hett siet de Nakieken Ännerns in deesem HV geven issues.label_deletion_desc = Wenn du een Vermark löskest, word dat vun all Gefallens wegnohmen. Wiedermaken? issues.label.filter_sort.reverse_by_size = Gröttste Grött -issues.review.review = Nakieken issues.review.reviewers = Nakiekers issues.review.show_resolved = Wies lööst issues.review.hide_resolved = Verbarg lööst @@ -1614,7 +1603,6 @@ issues.review.add_review_request = hett %[2]s um een Nakieken vun %[1]s anfraggt issues.review.show_outdated = Wies verollt issues.review.hide_outdated = Verbarg verollt issues.content_history.options = Instellens -issues.reference_link = Nömen: %s compare.compare_base = Grund compare.compare_head = Verglieken pulls.desc = Haalvörslagen un Quelltext-Nakiekens anknipsen. @@ -1641,8 +1629,6 @@ pulls.filter_changes_by_commit = Na Kommitteren filtern pulls.nothing_to_compare = Deese Twiegen sünd gliek. ’t is nich nödig, eenen Haalvörslag to maken. pulls.nothing_to_compare_have_tag = De utköört Twiegen/Marken sünd gliek. pulls.create = Haalvörslag maken -pulls.title_desc_one = will %[1]d Kommitteren vun %[2]s na %[3]s tosamenföhren -pulls.merged_title_desc_one = hett %[1]d Kommitteren vun %[2]s na %[3]s %[4]s tosamenföhrt pulls.change_target_branch_at = `hett %[3]s de Enn-Twieg vun %[1]s to %[2]s ännert` pulls.tab_conversation = Snack pulls.tab_commits = Kommitterens @@ -1691,18 +1677,15 @@ issues.content_history.delete_from_history = Ut Histoorje lösken pulls.compare_changes = Nejer Haalvörslag pulls.allow_edits_from_maintainers_desc = Brukers, well dat Recht hebben, to de Grund-Twieg to schrieven, düren ok up deesen Twieg schuuven pulls.nothing_to_compare_and_allow_empty_pr = Deese Twiegen sünd gliek. De HV word leeg wesen. -pulls.title_desc_few = will %[1]d Kommitterens vun %[2]s na %[3]s tosamenföhren pulls.data_broken = Deeser Haalvörslag is kaputt, denn de Gabel-Informatioon fehlt. pulls.waiting_count_1 = %d Nakieken staht ut issues.content_history.deleted = lösket issues.content_history.created = maakt issues.content_history.delete_from_history_confirm = Ut Histoorje lösken? issues.blocked_by_user = Du kannst in deesem Repositorium keene Gefallens opmaken, denn de Repositoriums-Eegner hett di blockeert. -pulls.merged_title_desc_few = hett %[1]d Kommitterens vun %[2]s na %[3]s %[4]s tosamenföhrt pulls.reject_count_1 = %d Bidde um Ännerns pulls.blocked_by_user = Du kannst in deesem Repositorium keenen Haalvörslag opmaken, denn de Repositoriums-Eegner hett di blockeert. pulls.no_merge_access = Du hest nich dat Recht, deesen Haalvörslag tosamentoföhren. -issues.comment.blocked_by_user = Du kannst up deesem Gefall nich kommenteren, denn de Repositoriums-Eegner of de Autor vun de Gefall hett di blockeert. pulls.switch_comparison_type = Verglieks-Aard ännern pulls.showing_only_single_commit = Blots Ännerns vun Kommitteren %[1]s wiesen pulls.blocked_by_changed_protected_files_n = Deeser Haalvörslag is blockeert, denn dat ännert beschütt Dateien: @@ -2369,7 +2352,6 @@ diff.commit = Kommitteren diff.git-notes = Anmarkens diff.data_not_available = Unnerscheed-Inholl is nich verföögbaar diff.options_button = Unnerscheed-Instellens -diff.show_diff_stats = Statistiken wiesen diff.download_patch = Plack-Datei runnerladen diff.show_split_view = Deelte Sicht diff.show_unified_view = Vereenigte Sicht @@ -2570,7 +2552,6 @@ settings.protect_protected_file_patterns_desc = Schütt Dateien, wat nich strack settings.branch_filter_desc = Twieg-Verlöövnis-List för Vörfallen över dat Schuven un dat Maken un Lösken vun Twiegen, angeven as een Glob-Muster. Wenn leeg of * worden Vörfallen för all Twiegen mellt. Kiek de Dokumenteren för %[2]s för de Syntax an. Bispölen: master, {master,release*}. settings.matrix.room_id_helper = De Ruum-ID kann vun de Element-Internett-Sied unner Ruum-Instellens → Verwiedert → Binnere Ruum-ID haalt worden. Bispööl: %s. settings.tags.protection.pattern.description = Du kannst eenen enkelt Naam bruken of een Glob-Muster of Regel-Utdruck, um up mennig Markens to passen. Lees mehr in de Inföhren över schütt Markens. -error.broken_git_hook = Git-Hakens in deesem Repositorium schienen kaputt to wesen. Bidde folg de Dokumenteren, um se to repareren, dann schuuv een paar Kommitterens, um de Tostand to vernejen. settings.matrix.access_token_helper = Dat word anraden, daarföör eegens een Matrix-Konto intorichten. Dat Togangs-Teken kann in de Element-Internett-Sied (in eener privaaten/anonymen Karteikaart) unner Brukermenü (boven links) → All Instellens → Hülp & Över → Togangs-Teken (stracks unner de Heimaadserver-URL) haalt worden. Maak de privaate/anonyme Karteikaart dicht (wenn du di avmellst, word dat Teken ungültig). issues.review.add_remove_review_requests = hett %[3]s um Nakiekens vun %[1]s anfraggt un de Nakiekens-Anfragen för %[2]s wegdaan issues.review.add_review_requests = hett %[2]s um Nakiekens vun %[1]s anfraggt @@ -2606,7 +2587,6 @@ commits.view_single_diff = Ännerns an deeser Datei in deesem Kommitteren wiesen pulls.editable = Bewarkbaar pulls.editable_explanation = Deeser Haalvörslag verlöövt Bewarkens vun Liddmaten. Du kannst stracks daarto bidragen. issues.reopen.blocked_by_user = Du kannst deeses Gefall nich weer opmaken, denn de Repositoriums-Eegner of de Autor vun de Gefall hett di blockeert. -pulls.comment.blocked_by_user = Du kannst up deesem Haalvörslag nich kommenteren, denn de Repositoriums-Eegner of de Autor vun de Haalvörslag hett di blockeert. issues.filter_no_results = Keene Resultaten issues.filter_no_results_placeholder = Versöök, diene Söök-Filters antopassen. migrate.repo_desc_helper = Leeg laten, um de bestahn Beschrieven to importeren @@ -2740,7 +2720,6 @@ teams.update_settings = Instellens vernejen teams.delete_team = Klottje wegdoon teams.add_team_member = Klottjen-Liddmaat hentofögen teams.delete_team_success = De Klottje is wegdaan worden. -teams.write_permission_desc = Deese Klottje gifft Schrievens-Togriep: Liddmaten könen Klottjen-Repositoriums ankieken un daarhen schuven. teams.remove_all_repos_title = All Klottjen-Repositoriums wegdoon teams.add_all_repos_title = All Repositoriums hentofögen teams.add_nonexistent_repo = Dat Repositorium, wat du hentofögen willst, gifft dat nich; bidde maak ’t eerst. @@ -2762,7 +2741,6 @@ teams.admin_access_helper = Liddmaten könen to Klottjen-Repositoriums schuven u teams.delete_team_title = Klottje wegdoon teams.invite_team_member.list = Utstahn Inladens teams.remove_all_repos_desc = Dat doot all Repositoriums vun de Klottje weg. -teams.read_permission_desc = Deese Klottje gifft Lesens-Togriep: Liddmaten könen Klottjen-Repositoriums ankieken un klonen. teams.repos.none = Deese Klottje kann up keene Repositoriums togriepen. teams.specific_repositories_helper = Liddmaten hebben blots Togriep up Repositoriums, wat besünners to de Klottje hentoföögt worden sünd. Wenn du dat utköörst, worden Repositoriums, wat du al mit All Repositoriums hentoföögt hest, nich automatisk wegdaan. teams.all_repositories = All Repositoriums @@ -3065,12 +3043,6 @@ auths.oauth2_admin_group = Gruppen-Anrecht-Weert för Chef-Brukers. (Nich nödig auths.oauth2_restricted_group = Gruppen-Anrecht-Weert för begrenzte Brukers. (Nich nödig – bruukt boven de Anrecht-Naam) auths.oauth2_map_group_to_team = Billt Anrechts-Gruppen up Vereenigungs-Klottjen av. (Nich nödig – bruukt boven de Anrecht-Naam) auths.oauth2_map_group_to_team_removal = Brukers vun spegelt Klottjen wegdoon, wenn de Bruker nich to de tohörig Grupp daartohöört. -auths.sspi_auto_create_users = Brukers automatisk maken -auths.sspi_auto_activate_users = Brukers automatisk aktiveren -auths.sspi_auto_activate_users_helper = Verlöövt de SSPI-Anmellens-Aard, neje Brukers automatisk to aktiveren -auths.sspi_separator_replacement = Trennteken, wat in Stee vun \, / un @ bruukt word -auths.sspi_separator_replacement_helper = De Bookstaav, wat bruukt word, um de Trenntekens vun unnerörnt Anmell-Namen uttowesseln (to’n Bispööl dat \ in »DOMAIN\bruker«) un Bruker-Höövdmann-Namen (to’n Bispööl dat @ in »bruker@example.org«). -auths.sspi_default_language = Bruker-Normaal-Spraak auths.tips = Tipps auths.tips.gmail_settings = Gmail-Instellens: auths.tips.oauth2.general = Anmellen mit OAuth2 @@ -3262,7 +3234,6 @@ self_check.database_collation_mismatch = Verwacht, dat de Datenbank deese Kollat self_check.database_collation_case_insensitive = Datenbank bruukt eene Kollatioon %s, wat eene unklünige Kollatioon is. Forgejo kann twaar daarmit warken, aver dat kann rare Fallen geven, waar dat nich so warkt as verwacht. self_check.database_fix_mysql = Brukers vun MySQL of MariaDB könen de Oorder »forgejo doctor convert« bruken, um de Kollatioons-Problemen oftohelpen, of du kannst dat Probleem ofhelpen, indeem du vun Hand de SQL-Oorders »ALTER … COLLATE …« bruukst. self_check.database_inconsistent_collation_columns = Datenbank bruukt Kollatioon %s, aver deese Striepen bruken unpassend Kollatioonen. Dat kann unverwachte Problemen maken. -auths.sspi_auto_create_users_helper = Verlöövt de SSPI-Anmellens-Aard, automatisk een Konto för Brukers to maken, well sik tum eersten Maal anmellen config.log_file_root_path = Utgaav-Padd config.reset_password_code_lives = Ofloops-Düür vun de Torügghalens-Teken config.allow_dots_in_usernames = Brukers verlöven, Punkten in hör Brukernamen to bruken. Ännert nix an bestahn Konten. @@ -3283,9 +3254,6 @@ monitor.queue.type = Aard monitor.queue.settings.remove_all_items_done = All Dingen in de Slang sünd wegdaan worden. auths.tip.mastodon = Giff eene eegene Instanz-URL för de Mastodon-Instanz, mit wat du anmellen willst, in (of bruuk de Normaalweert) notices.delete_success = De Systeem-Narichtens sünd wegdaan worden. -auths.sspi_strip_domain_names = Domään-Namen vun Brukernamen lösken -auths.sspi_strip_domain_names_helper = Wenn dat anknipst is, worden Domään-Namen automatisk vun Anmell-Namen lösket (to’n Bispööl worden »DOMAIN\bruker« un »bruker@example.org« beide blots »bruker«). -auths.sspi_default_language_helper = Normaal-Spraak för Brukers, wat vun de SSPI-Anmellens-Aard automatisk maakt worden. Laat dat leeg, wenn du willst, dat de Spraak automatisk utköört word. config.repo_root_path = Repositoriums-Ruut-Padd config.allow_only_internal_registration = Registreren blots dör Forgejo sülvst verlöven config.allow_only_external_registration = Registreren blots dör frömde Deensten verlöven @@ -3795,8 +3763,6 @@ runs.no_job_without_needs = De Warkwies mutt tominnst eene Upgaav sünner Ofhang workflow.dispatch.success = Warkwies-Utföhren is vörmarkt worden. variables.deletion.description = Eene Variaabel wegtodoon is för all Tieden un kann nich torüggnohmen worden. Wiedermaken? unit.desc = Verwalt integreerte CI-/CD-Affolgens mit Forgejo-Aktioonen. -runs.no_workflows.quick_start = Weetst du nich, wo man mit Forgejo-Aktioonen begünnt? Kiek de fixe Inföhren an. -runs.no_workflows.documentation = För mehr Informatioonen över Forgejo-Aktioonen, kiek de Dokumenteren an. runs.no_workflows.help_write_access = Weetst du nich, wo man mit Forgejo-Aktioonen begünnen sall? Kiek de Fixanwies in de Bruker-Dokumenteren an, um diene eerste Warkwies to schrieven, un richt dann dienen eersten Forgejo-Loper in, um diene Upgavens uttoföhren. runs.no_workflows.help_no_write_access = Um mehr över Forgejo-Aktioonen to lehren, kiek de Dokumenteren an. variables.not_found = Kunn de Variaabel nich finnen. diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index c4f586338b..3e38c2edf2 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -46,20 +46,13 @@ webauthn_error_unable_to_process=De server kon uw verzoek niet verwerken. webauthn_error_duplicated=De beveiligingssleutel is voor dit verzoek niet toegestaan. Controleer alstublieft of de sleutel niet al is geregistreerd. webauthn_error_empty=U moet een naam voor deze sleutel instellen. webauthn_error_timeout=Time-out bereikt voordat uw sleutel kon worden gelezen. Herlaad deze pagina en probeer het opnieuw. -webauthn_reload=Vernieuwen - repository=Repository organization=Organisatie mirror=Kopie -new_repo=Nieuwe repository -new_migrate=Nieuwe migratie new_mirror=Nieuwe mirror new_fork=Nieuwe repository fork -new_org=Nieuwe organisatie new_project=Nieuw project -manage_org=Beheer organisaties admin_panel=Site beheer -account_settings=Accountinstellingen settings=Instellingen your_profile=Profiel your_starred=Favoriet @@ -217,8 +210,6 @@ string.desc = Z -A [error] occurred=Er is een fout opgetreden -missing_csrf=Foutief verzoek: geen CSRF-token aanwezig -invalid_csrf=Verkeerd verzoek: ongeldig CSRF-token not_found=Het doel kon niet worden gevonden. network_error=Netwerk fout report_message = Als je denkt dat dit een bug is in Forgejo, zoek dan naar issues op Codeberg of open een nieuwe issue als dat nodig is. @@ -355,15 +346,10 @@ app_slogan_helper = Voer hier de slogan van uw instantie in. Laat leeg om dit ui [home] uname_holder=Gebruikersnaam of e-mailadres -password_holder=Wachtwoord switch_dashboard_context=Wissel voorpaginacontext my_repos=Repositories -show_more_repos=Toon meer repositories… -collaborative_repos=Gedeelde repositories my_orgs=Organisaties -my_mirrors=Mijn spiegels view_home=Bekijk %s -search_repos=Zoek een repository… filter=Andere filters filter_by_team_repositories=Filter op team repositories feed_of=`Feed van "%s"` @@ -384,23 +370,11 @@ issues.in_your_repos=In uw repositories repos=Repositories users=Gebruikers organizations=Organisaties -search=Zoeken code=Code -search.fuzzy=Vergelijkbaar -search.match=Overeenkomst -code_search_unavailable=Er is momenteel geen code zoekfunctie beschikbaar. Neem contact op met uw sitebeheerder. -repo_no_results=Er zijn geen overeenkomende repositories gevonden. -user_no_results=Er zijn geen overeenkomende gebruikers gevonden. -org_no_results=Er zijn geen overeenkomende organisaties gevonden. -code_no_results=Geen broncode gevonden in overeenstemming met uw zoekterm. code_last_indexed_at=Laatst geïndexeerd %s -search.type.tooltip = Zoek type -search.match.tooltip = Alleen resultaten opnemen die exact overeenkomen met de zoekterm relevant_repositories = Alleen relevante repositories worden getoond, niet-gefilterde resultaten tonen. go_to = Ga naar -search.fuzzy.tooltip = Neem resultaten op die ook sterk overeenkomen met de zoekterm relevant_repositories_tooltip = Repositories die forks zijn of die geen onderwerp, geen icoon en geen beschrijving hebben worden verborgen. -code_search_results = Zoekresultaten voor "%s" stars_one = %d ster stars_few = %d sterren forks_one = %d fork @@ -408,15 +382,12 @@ forks_few = %d forks [auth] create_new_account=Account registreren -register_helper_msg=Heeft u al een account? Klik hier om in te loggen! -social_register_helper_msg=Heeft u al een account? Koppel deze nu! disable_register_prompt=Registratie is uitgeschakeld. Neem alstublieft contact op met de pagina beheerder. disable_register_mail=E-mailbevestiging voor registratie is uitgeschakeld. manual_activation_only=Neem contact op met uw sitebeheerder om de activering te voltooien. remember_me=Onthoud dit apparaat forgot_password_title=Wachtwoord vergeten forgot_password=Wachtwoord vergeten? -sign_up_now=Een account nodig? Meld u nu aan. confirmation_mail_sent_prompt=Er is een nieuwe bevestigingsmail verzonden naar %s. Om het registratieproces te voltooien, controleert u uw inbox en volgt u de verstrekte link binnen de komende %s. Als de e-mail niet correct is, kunt u inloggen en verzoeken om een nieuwe bevestigingsmail naar een ander adres te sturen. must_change_password=Uw wachtwoord wijzigen allow_password_change=Verplicht de gebruiker om zijn/haar wachtwoord te wijzigen (aanbevolen) @@ -427,7 +398,6 @@ prohibit_login=Account is geschorst resent_limit_prompt=Sorry, je hebt te snel na elkaar een aanvraag gedaan voor een activatiemail. Wacht drie minuten voor je volgende aanvraag. has_unconfirmed_mail=Beste %s, u heeft een onbevestigd e-mailadres (%s). Als u nog geen bevestiging heeft ontvangen, of u een nieuwe aanvraag wilt doen, klik dan op de onderstaande knop. resend_mail=Klik hier om uw activatie mail nog een keer te verzenden -email_not_associate=Dit emailadres is niet gekoppeld aan een account. send_reset_mail=Verzend e-mail voor herstel reset_password=Account herstel invalid_code=Uw bevestigingscode is ongeldig of is verlopen. @@ -441,7 +411,6 @@ twofa_scratch_used=Je hebt je eenmalige code gebruikt. Je wordt omgeleid naar de twofa_passcode_incorrect=Uw wachtwoord is onjuist. Als u uw apparaat kwijt bent, gebruik dan je eenmalige code om in te loggen. twofa_scratch_token_incorrect=Je eenmalige code is onjuist. login_userpass=Inloggen -tab_openid=OpenID oauth_signup_tab=Registreer nieuw account oauth_signup_title=Voltooi nieuw account oauth_signup_submit=Account voltooien @@ -465,7 +434,6 @@ authorize_application_created_by=Deze applicatie is gemaakt door %s. authorize_application_description=Als u toegang verleent, zal de applicatie toegang hebben tot en kunnen schrijven naar al uw accountgegevens, met inbegrip van privérepo's en -organisaties. authorize_title=Autoriseer "%s" voor toegang tot uw account? authorization_failed=Autorisatie mislukt -sspi_auth_failed=SSPI-authenticatie mislukt password_pwned_err=Kan het verzoek om HaveIBeenPwned niet voltooien prohibit_login_desc = Uw account is geschorst voor interactie met de instantie. Neem contact op met de beheerder van de instantie om weer toegang te krijgen. change_unconfirmed_email_error = Kan het e-mailadres niet wijzigen: %v @@ -479,9 +447,6 @@ password_pwned = Het wachtwoord dat je hebt gekozen staat op een Nu aanmelden! hint_register = Heb je een account nodig? Registreer nu. sign_up_button = Registreer nu. @@ -496,7 +461,6 @@ link_not_working_do_paste=Werkt de link niet? Kopieer en plak de link dan in de hi_user_x=Hoi %s, activate_account=Activeer uw account -activate_account.title=%s, activeer alstublieft uw account activate_account.text_1=Hallo %[1]s, bedankt voor het registeren op %[2]s! activate_account.text_2=Klik op de volgende link om uw account te activeren binnen %s: @@ -504,13 +468,11 @@ activate_email=Verifieer uw e-mailadres activate_email.text=Klik op de volgende link om je e-mailadres te bevestigen in %s: register_notify=Welkom bij %s -register_notify.title=%[1]s, welkom bij %[2]s register_notify.text_1=dit is uw registratie bevestigingsemail voor %s! register_notify.text_2=U kunt zich aanmelden bij uw account met uw gebruikersnaam: %s register_notify.text_3=Als iemand anders dit account voor u heeft gemaakt, moet u eerst uw wachtwoord instellen. reset_password=Account herstellen -reset_password.title=%s, we hebben een verzoek ontvangen om uw account te herstellen reset_password.text=Als u dit was, klik dan op de volgende link om uw account te herstellen binnen %s: register_success=Registratie succesvol @@ -551,7 +513,6 @@ repo.collaborator.added.text=U bent toegevoegd als een samenwerker van de reposi reply = of antwoord op deze e-mail admin.new_user.subject = Nieuwe gebruiker %s heeft zich zojuist geregisteerd admin.new_user.user_info = Gebruikersinformatie -activate_email.title = %s, verifieer uw e-mailadres alstublieft team_invite.subject = %[1]s heeft u uitgenodigd om aan de organisatie %[2]s deel te nemen team_invite.text_3 = Merk op: Deze uitnodiging was bestemd voor %[1]s. Als u deze uitnodiging niet verwacht, kunt u deze e-mail negeren. team_invite.text_1 = %[1]s heeft u een uitnodiging gestuurd om aan het team %[2]s in de organisatie %[3]s deel te nemen. @@ -559,7 +520,6 @@ team_invite.text_2 = Klik alstublieft op de volgende link om aan het team deel t admin.new_user.text = Klik hier om deze gebruiker te beheren vanuit het beheerderspaneel. password_change.subject = Uw wachtwoord is gewijzigd password_change.text_1 = Het wachtwoord voor je account is zojuist gewijzigd. -reset_password.text_1 = totp_disabled.subject = TOTP is uitgeschakeld primary_mail_change.subject = Uw primaire e-mail is gewijzigd totp_disabled.no_2fa = Er zijn geen andere 2FA methodes meer geconfigureerd, wat betekent dat het niet langer nodig is om in te loggen op uw account met 2FA. @@ -588,8 +548,6 @@ RepoName=Naam van repository Email=e-mailadres Password=Wachtwoord Retype=Verifieer wachtwoord -SSHTitle=SSH sleutel naam -HttpsUrl=HTTPS-URL PayloadUrl=Payload url TeamName=Team naam AuthName=Autorisatienaam @@ -602,9 +560,6 @@ CommitChoice=Commit keuze TreeName=Bestandspad Content=Inhoud -SSPISeparatorReplacement=Scheidingsteken -SSPIDefaultLanguage=Standaardtaal - require_error=` kan niet leeg zijn.` alpha_dash_error=` moet bevatten alleen alfanumerieke, dash ("-") en onderstrepingstekens ("_").` alpha_dash_dot_error=` moet bevatten alleen alfanumerieke, dash ("-"), onderstrepingsteken ("_") en de dot (".") karakters.` @@ -661,7 +616,6 @@ url_error = `"%s" is niet een geldige URL.` include_error = ` moet de volgende tekst bevatten "%s".` username_error = ` kan alleen alfanumerieke karakters ("0-9","a-z","A-Z"), streepje ("-"), liggend streepje ("_") en punt (".") bevatten. Niet-alfanumerieke karakters aan het begin of eind zijn verboden en aaneenvolgende niet alfanumerieke karakters zijn ook verboden.` openid_been_used = De OpenID-adres "%s" is al in gebruik. -username_has_not_been_changed = Gebruikersnaam is niet veranderd duplicate_invite_to_team = De gebruiker heeft al een uitnodiging ontvangen om deel te nemen aan deze team. organization_leave_success = U heeft de organisatie %s succesvol verlaten. still_own_packages = Uw account is eigenaar van één of meer pakketten, verwijder deze eerst. @@ -714,7 +668,6 @@ block = Blokkeren unblock = Deblokkeren code = Broncode email_visibility.limited = Uw e-mailadres is zichtbaar voor alle geauthenticeerde gebruikers -email_visibility.private = Uw e-mailadres is alleen zichtbaar voor u en beheerders show_on_map = Toon deze plek op de kaart settings = Gebruikersinstellingen form.name_reserved = De gebruikersnaam "%s" is gereserveerd. @@ -741,13 +694,11 @@ password=Wachtwoord security=Beveiliging avatar=Profielfoto ssh_gpg_keys=SSH / GPG sleutels -social=Sociale netwerk-accounts applications=Applicaties orgs=Organisaties repos=Repositories delete=Verwijder account twofa=Twee-factor authenticatie (TOTP) -account_link=Gekoppelde accounts organization=Organisaties webauthn=Twee-factor authenticatie (Beveiligingssleutels) @@ -783,10 +734,7 @@ comment_type_group_project=Project comment_type_group_issue_ref=Referentie issue saved_successfully=Uw instellingen zijn succesvol opgeslagen. privacy=Privacy -keep_activity_private_popup=Uw activiteiten zijn alleen zichtbaar voor u en de instantiebeheerders - lookup_avatar_by_mail=Avatar opzoeken via e-mailadres -federated_avatar_lookup=Gefedereerde avatars inschakelen enable_custom_avatar=Aangepaste avatar inschakelen choose_new_avatar=Kies een nieuwe avatar update_avatar=Update avatar @@ -802,7 +750,6 @@ password_incorrect=Het wachtwoord is niet correct. change_password_success=Uw wachtwoord is bijgewerkt. Log vanaf nu in met uw nieuwe wachtwoord. password_change_disabled=Niet-lokale gebruikers kunnen hun wachtwoord niet in de webinterface van Forgejo wijzigen. -emails=E-mailadressen manage_emails=E-mailadressen beheren manage_themes=Standaardthema manage_openid=OpenID-adressen @@ -841,8 +788,6 @@ principal_desc=Deze SSH-certificaatverantwoordelijken zijn gekoppeld aan uw acco gpg_desc=Deze publieke GPG-sleutels zijn gekoppeld aan je account en worden gebruikt om je commits te verifiëren. Bewaar je privésleutels veilig, omdat ze het mogelijk maken om commits met jouw identiteit te ondertekenen. ssh_helper=Weet u niet hoe? Lees dan onze handleiding voor het genereren van SSH sleutels of voor algemene SSH problemen. gpg_helper=Hulp nodig? Neem een kijkje op de GitHub handleiding over GPG. -add_new_key=SSH sleutel toevoegen -add_new_gpg_key=GPG sleutel toevoegen key_content_ssh_placeholder=Begint met "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com", of "sk-ssh-ed25519@openssh.com" key_content_gpg_placeholder=Begint met "-----BEGIN PGP PUBLIC KEY BLOCK-----" add_new_principal=Principaal toevoegen @@ -860,7 +805,6 @@ gpg_invalid_token_signature=De opgegeven GPG-sleutel, handtekening en token kome gpg_token_required=U moet een handtekening opgeven voor de onderstaande token gpg_token=Token gpg_token_help=U kunt een handtekening genereren met: -gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=Gepantserde GPG-handtekening key_signature_gpg_placeholder=Begint met "-----BEGIN PGP SIGNATURE-----" ssh_key_verified=Geverifieerde sleutel @@ -899,9 +843,6 @@ show_openid=Tonen op profiel hide_openid=Verbergen van profiel ssh_disabled=SSH is uitgeschakeld ssh_externally_managed=Deze SSH sleutel wordt extern beheerd voor deze gebruiker -manage_social=Beheer gekoppelde sociale accounts -unbind=Ontkoppelen - manage_access_token=Toegangstokens generate_new_token=Nieuw token genereren tokens_desc=Deze tokens geven toegang tot je account via de API van Forgejo. @@ -911,8 +852,6 @@ generate_token_success=Je nieuwe token is gegenereerd. Kopieer hem nu, want hij generate_token_name_duplicate=%s is al gebruikt als een applicatienaam. Gebruik een nieuwe. delete_token=Verwijderen access_token_deletion=Verwijder toegangstoken -access_token_deletion_cancel_action=Annuleren -access_token_deletion_confirm_action=Verwijderen access_token_deletion_desc=Als je een token verwijdert, heeft de applicatie die het gebruikt geen toegang meer tot je account. Doorgaan? delete_token_success=De token is verwijderd. Applicaties die hem gebruiken, verliezen toegang tot je account. permission_read=Gelezen @@ -964,7 +903,6 @@ webauthn_delete_key_desc=Als u een beveiligingssleutel verwijdert, kunt u er nie manage_account_links=Gekoppelde accounts manage_account_links_desc=Deze externe accounts zijn gekoppeld aan je Forgejo-account. -account_links_not_available=Er zijn momenteel geen externe accounts aan je Forgejo-account gelinkt. link_account=Account koppelen remove_account_link=Gekoppeld account verwijderen remove_account_link_desc=Als je een gekoppeld account verwijdert, verliest dit account toegang tot je Forgejo-account. Doorgaan? @@ -1017,9 +955,7 @@ add_principal_success = De SSH certificaat opdrachtgever "%s" is toegevoegd. verify_gpg_key_success = GPG-sleutel "%s" is geverifieerd. valid_until_date = Geldig tot %s ssh_signonly = SSH is momenteel gedeactiveerd waardoor deze sleutels alleen gebruikt kunnen worden voor commit handtekening verificatie. -social_desc = Deze sociale media accounts kunnen gebruikt worden om in te loggen op uw account. Zorg ervoor dat u deze allemaal herkent. added_on = Toegevoegd op %s -unbind_success = De sociale account is succesvol verwijderd. permissions_public_only = Alleen publiek repo_and_org_access = Repository en Organisatie Toegang at_least_one_permission = Je moet minstens één machtiging kiezen om een token te kunnen creëren @@ -1056,14 +992,12 @@ update_hints_success = Tips zijn bijgewerkt. hints = Tips additional_repo_units_hint_description = Toon een “Meer activeren” hint voor repositories die niet alle beschikbare eenheden hebben ingeschakeld. pronouns = Persoonlijke voornaamwoord -pronouns_custom = Aangepast pronouns_unspecified = Ongedefinieerd language.title = Standaard taal keep_activity_private.description = Uw publieke activiteit zal alleen zichtbaar zijn voor u en de beheerders van de instantie. language.description = Deze taal wordt opgeslagen in uw account en wordt als standaardtaal gebruikt nadat u zich heeft aangemeld. language.localization_project = Help ons Forgejo in uw taal te vertalen! Leer meer. user_block_yourself = U kunt niet zichzelf blokkeren. -pronouns_custom_label = Aangepaste voornaamwoorden change_username_redirect_prompt.with_cooldown.few = De oude gebruikersnaam zal voor iedereen beschikbaar zijn na een afkoelperiode van %[1]d dagen. U kunt de oude gebruikersnaam nog steeds opeisen tijdens de afkoelperiode. change_username_redirect_prompt.with_cooldown.one = De oude gebruikersnaam zal voor iedereen beschikbaar zijn na een afkoelperiode van %[1]d dag. U kunt de oude gebruikersnaam nog steeds opeisen tijdens de afkoelperiode. keep_pronouns_private = Toon voornaamwoorden alleen aan geauthenticeerde gebruikers @@ -1115,7 +1049,6 @@ already_forked=Je hebt %s al geforked fork_to_different_account=Fork naar een ander account fork_visibility_helper=De zichtbaarheid van een geforkte repository kan niet worden veranderd. use_template=Gebruik dit sjabloon -clone_in_vsc=Kloon in VS Code download_zip=ZIP downloaden download_tar=TAR.GZ downloaden download_bundle=BUNDLE downloaden @@ -1135,11 +1068,6 @@ readme=README readme_helper=Selecteer een README-bestandssjabloon readme_helper_desc=Dit is de plek waar je een volledige beschrijving van je project kunt schrijven. auto_init=Initialiseer repository -trust_model_helper=Selecteer het vertrouwensmodel voor handtekeningverificatie. Mogelijke opties zijn: -trust_model_helper_collaborator=Samenwerker: Vertrouw handtekeningen door samenwerker -trust_model_helper_committer=Committer: Vertrouw handtekeningen die overeenkomen met de committers -trust_model_helper_collaborator_committer=Samenwerker+Committer: Vertrouw handtekeningen door samenwerkers die overeenkomen met de committer -trust_model_helper_default=Standaard: Gebruik het standaard vertrouwemsmodel voor deze installatie create_repo=Nieuwe repository default_branch=Standaard branch default_branch_helper=De standaard branch is de basis branch voor pull requests en code commits. @@ -1198,15 +1126,11 @@ template.issue_labels=Issue labels template.one_item=Moet ten minste één sjabloon selecteren template.invalid=Moet een sjabloon repository selecteren -archive.issue.nocomment=Deze repository is gearchiveerd. U kunt niet reageren op problemen. -archive.pull.nocomment=Deze repository is gearchiveerd. U kunt niet reageren op pull requests. - form.reach_limit_of_creation_1=U heeft al uw limiet van %d repository bereikt. form.reach_limit_of_creation_n=U heeft al uw limiet van %d repositories bereikt. need_auth=Autorisatie migrate_options=Migratie opties -migrate_service=Migratie service migrate_options_mirror_helper=Deze repositorie zal een mirror zijn migrate_options_lfs=Migreer LFS bestanden migrate_options_lfs_endpoint.label=LFS eindpunt @@ -1285,7 +1209,6 @@ branches=Branches tags=Labels issues=Issues pulls=Pull requests -project_board=Projecten packages=Pakketten labels=Labels org_labels_desc=Organisatielabel dat gebruikt kan worden met alle repositories onder deze organisatie @@ -1380,8 +1303,6 @@ editor.revert=%s ongedaan maken op: commits.desc=Bekijk de broncode-wijzigingsgeschiedenis. commits.commits=Commits commits.nothing_to_compare=Deze branches zijn gelijk. -commits.search=Zoek commits… -commits.find=Zoek commits.search_all=Alle branches commits.author=Auteur commits.message=Bericht @@ -1405,8 +1326,6 @@ commitstatus.error=Fout commitstatus.pending=In behandeling ext_issues=Externe issues -ext_issues.desc=Koppelen aan een externe kwestie-tracker. - projects=Projecten projects.desc=Beheer issues en pulls in projectborden. projects.description=Omschrijving (optioneel) @@ -1426,7 +1345,6 @@ projects.type.basic_kanban=Basis kanban projects.type.bug_triage=Bug triage projects.template.desc=Project sjabloon projects.template.desc_helper=Selecteer een projectsjabloon om aan de slag te gaan -projects.type.uncategorized=Ongecategoriseerd projects.column.edit_title=Naam projects.column.new_title=Naam projects.column.color=Kleur @@ -1562,8 +1480,6 @@ issues.ref_issue_from=`refereerde aan dit issue %[3]s %[1]s` issues.ref_pull_from=`refereerde aan deze pull request %[3]s %[1]s` issues.ref_closing_from=`verwees naar deze issue van een pull request %[3]s dat het zal sluiten, %[1]s` issues.ref_reopening_from=`verwees naar een pull request %[3]s dat dit issue heropent %[1]s ` -issues.ref_closed_from=`sloot dit issue %[4]s %[2]s` -issues.ref_reopened_from=`heropende dit issue %[4]s %[2]s` issues.ref_from=`van %[1]s` issues.role.owner=Eigenaar issues.role.member=Lid @@ -1640,15 +1556,11 @@ issues.add_time_sum_to_small=Geen tijd opgegeven. issues.time_spent_total=Totaal besteedde tijd issues.time_spent_from_all_authors=`Totaal besteedde tijd: %s` issues.due_date=Vervaldatum -issues.invalid_due_date_format=Het formaat van de deadline is moet "jjjj-mm-dd" zijn. -issues.error_modifying_due_date=Deadline aanpassen mislukt. -issues.error_removing_due_date=Deadline verwijderen mislukt. issues.push_commit_1=toegevoegd %d commit %s issues.push_commits_n=toegevoegd %d commits %s issues.force_push_codes=`force-push %[1]s van %[2]s %[8]s naar %[4]s %[9]s %[6]s` issues.force_push_compare=Vergelijk issues.due_date_form=jjjj-mm-dd -issues.due_date_form_add=Vervaldatum toevoegen issues.due_date_form_edit=Bewerk issues.due_date_form_remove=Verwijder issues.due_date_not_set=Geen vervaldatum ingesteld. @@ -1698,7 +1610,6 @@ issues.review.add_review_request=beoordeling gevraagd van %[1]s %[2]s issues.review.remove_review_request=beoordelingsaanvraag voor %[1]s %[2]s verwijderd issues.review.remove_review_request_self=weigerde te beoordelen %s issues.review.pending=In behandeling -issues.review.review=Review issues.review.reviewers=Beoordelaars issues.review.outdated=Verouderd issues.review.show_outdated=Toon verouderd @@ -1708,7 +1619,6 @@ issues.review.hide_resolved=Verbergen afgehandeld issues.review.resolve_conversation=Gesprek oplossen issues.review.un_resolve_conversation=Gesprek niet oplossen issues.review.resolved_by=markeerde dit gesprek als opgelost -issues.assignee.error=Niet alle aangewezen personen zijn toegevoegd vanwege een onverwachte fout. issues.reference_issue.body=Inhoud issues.content_history.deleted=verwijderd issues.content_history.edited=bewerkt @@ -1716,8 +1626,6 @@ issues.content_history.created=gecreëerd issues.content_history.delete_from_history=Uit geschiedenis verwijderen issues.content_history.delete_from_history_confirm=Uit geschiedenis verwijderen? issues.content_history.options=Opties -issues.reference_link=Referentie: %s - compare.compare_base=basis compare.compare_head=vergelijk @@ -1742,8 +1650,6 @@ pulls.nothing_to_compare=Deze branches zijn gelijk. Er is geen pull request nodi pulls.nothing_to_compare_and_allow_empty_pr=Deze branches zijn gelijk. Deze pull verzoek zal leeg zijn. pulls.has_pull_request=`Een pull-verzoek tussen deze branches bestaat al: %[2]s#%[3]d` pulls.create=Pull request aanmaken -pulls.title_desc_few=wilt %[1]d commits van %[2]s samenvoegen met %[3]s -pulls.merged_title_desc_few=heeft %[1]d commits samengevoegd van %[2]s naar %[3]s %[4]s pulls.change_target_branch_at='doelbranch aangepast van %s naar %s %s' pulls.tab_conversation=Discussie pulls.tab_commits=Commits @@ -1860,8 +1766,6 @@ milestones.filter_sort.least_issues=Minste problemen ext_wiki=Externe wiki -ext_wiki.desc=Koppelen aan een externe wiki. - wiki=Wiki wiki.welcome=Welkom op de wiki. wiki.welcome_desc=Op de wiki kan je documentatie schrijven en met samenwerkers delen. @@ -1951,14 +1855,6 @@ activity.git_stats_deletion_1=%d verwijdering activity.git_stats_deletion_n=%d verwijderingen contributors.contribution_type.commits = Commits -search=Zoek -search.search_repo=Zoek repository -search.fuzzy=Vergelijkbaar -search.match=Overeenkomst -search.results=Zoek resultaat voor "%s" in %s -search.code_no_results=Geen broncode gevonden die aan uw zoekterm voldoet. -search.code_search_unavailable=Er is momenteel geen code zoekfunctie beschikbaar. Neem contact op met uw sitebeheerder. - settings=Instellingen settings.desc=In de instellingen kan je de instellingen van de repository aanpassen settings.options=Repository @@ -2035,7 +1931,6 @@ settings.delete_collaborator=Verwijder settings.collaborator_deletion=Verwijder samenwerker settings.collaborator_deletion_desc=Het verwijderen van een collaborator zal hun toegang tot deze repository intrekken. Doorgaan? settings.remove_collaborator_success=De medewerker is verwijderd. -settings.search_user_placeholder=Zoek gebruiker… settings.org_not_allowed_to_be_collaborator=Organisaties kunnen niet worden toegevoegd als een medewerker. settings.change_team_access_not_allowed=Het veranderen van team toegang voor de repository is beperkt tot de organisatie eigenaar settings.team_not_in_organization=Het team zit niet in dezelfde organisatie als de repository @@ -2043,7 +1938,6 @@ settings.teams=Teams settings.add_team=Team toevoegen settings.add_team_duplicate=Team heeft al de repository settings.add_team_success=Het team heeft nu toegang tot de repository. -settings.search_team=Zoek team… settings.change_team_permission_tip=Teammachtiging is ingesteld op de team-instellingspagina en kan niet per repository worden gewijzigd settings.delete_team_tip=Dit team heeft toegang tot alle repositories en kan niet verwijderd worden settings.remove_team_success=De toegang van het team tot de repository is verwijderd. @@ -2162,12 +2056,7 @@ settings.deploy_key_deletion_desc=Het verwijderen van een deploy sleutel zal de settings.deploy_key_deletion_success=De deploy-sleutel is verwijderd. settings.branches=Branches settings.protected_branch=Branch bescherming -settings.protected_branch_can_push=Push toestaan? -settings.protected_branch_can_push_yes=U mag pushen -settings.protected_branch_can_push_no=U mag niet pushen settings.branch_protection=Beschermingsregels voor branch “%s” -settings.protect_this_branch=Branch bescherming inschakelen -settings.protect_this_branch_desc=Voorkomt verwijdering en beperkt Git pushing en samenvoegen tot de branch. settings.protect_disable_push=Push uitschakelen settings.protect_disable_push_desc=Geen pushes zijn toegestaan in deze branch. settings.protect_enable_push=Push inschakelen @@ -2176,9 +2065,7 @@ settings.protect_whitelist_committers=Whitelist beperkte push settings.protect_whitelist_committers_desc=Alleen gewhiteliste gebruikers of teams mogen pushen naar deze branch (maar geen force push). settings.protect_whitelist_deploy_keys=Whitelist deploy sleutels met schrijftoegang om te pushen. settings.protect_whitelist_users=Toegestane gebruikers voor push -settings.protect_whitelist_search_users=Zoek gebruiker… settings.protect_whitelist_teams=Toegestane teams voor push -settings.protect_whitelist_search_teams=Zoek teams… settings.protect_merge_whitelist_committers=Samenvoegen whitelist inschakelen settings.protect_merge_whitelist_committers_desc=Sta alleen gebruikers of teams van de whitelist toe om pull requests samen te voegen met deze branch. settings.protect_merge_whitelist_users=Toegestane gebruikers voor samenvoegen @@ -2196,8 +2083,6 @@ settings.dismiss_stale_approvals=Verouderde goedkeuringen afwijzen settings.dismiss_stale_approvals_desc=Wanneer nieuwe commits die de inhoud van het pull-verzoek veranderen, naar de branch worden gepusht, worden oude goedkeuringen verwijderd. settings.require_signed_commits=Ondertekende commits vereisen settings.require_signed_commits_desc=Weiger pushes naar deze branch als deze niet ondertekend of niet verifieerbaar is. -settings.add_protected_branch=Bescherming aanzetten -settings.delete_protected_branch=Bescherming uitzetten settings.protected_branch_deletion=Branch bescherming verwijderen settings.protected_branch_deletion_desc=Branch bescherming uitschakelen zorgt ervoor dat gebruikers met schrijfrechten naar de branch kunnen pushen. Doorgaan? settings.block_rejected_reviews=Samenvoegen van afgewezen beoordelingen blokkeren @@ -2262,8 +2147,6 @@ settings.lfs_pointers.associateAccessible=Koppel toegankelijke %d OIDs settings.rename_branch_failed_exist=Kan branch niet hernoemen omdat doel branch %s bestaat. settings.rename_branch_failed_not_exist=Kan branch %s niet hernoemen omdat deze niet bestaat. settings.rename_branch_success=Branch %s is succesvol hernoemd naar %s. -settings.rename_branch_from=oude branch naam -settings.rename_branch_to=nieuwe branch naam settings.rename_branch=Hernoem branch diff.browse_source=Bladeren bron @@ -2272,7 +2155,6 @@ diff.commit=commit diff.git-notes=Notities diff.data_not_available=Diff gegevens niet beschikbaar diff.options_button=Diff opties -diff.show_diff_stats=Statistieken weergeven diff.download_patch=Download patch-bestand diff.download_diff=Download diff-bestand diff.show_split_view=Zij-aan-zij weergave @@ -2346,8 +2228,6 @@ release.deletion_success=De release is verwijderd. release.tag_name_already_exist=Een versie met deze naam bestaat al. release.tag_name_invalid=Tagnaam is niet geldig. release.downloads=Downloads -release.download_count=Downloads: %s - branch.name=Branch naam branch.delete_head=Verwijder branch.delete_html=Verwijder branch @@ -2355,10 +2235,6 @@ branch.create_branch=Maak branch %s branch.deleted_by=Verwijderd door %s branch.included_desc=Deze branch maakt deel uit van de standaard branch branch.included=Inbegrepen -branch.confirm_rename_branch=Hernoem branch - - - topic.manage_topics=Beheer topics topic.done=Klaar topic.count_prompt=Je kunt niet meer dan 25 onderwerpen selecteren @@ -2376,7 +2252,6 @@ issues.close = Issue sluiten issues.comment_pull_merged_at = commit %[1]s samengevoegd in %[2]s %[3]s issues.comment_manually_pull_merged_at = commit %[1]s handmatig samengevoegd in %[2]s %[3]s issues.author = Auteur -issues.author_helper = Deze gebruiker is de auteur. issues.role.owner_helper = Deze gebruiker is de eigenaar van deze repository. issues.role.member_helper = Deze gebruiker is lid van de organisatie die eigenaar is van deze repository. rss.must_be_on_branch = U moet een branch geselecteerd hebben om een RSS-feed te verkrijgen. @@ -2389,7 +2264,6 @@ fork_branch = Branch die zal worden gekloond naar de fork all_branches = Alle branches fork_no_valid_owners = Deze repository kan niet geforkt worden omdat er geen geldige eigenaren zijn. visibility_helper = Maak repository privé -clone_in_vscodium = Kloon in VSCodium object_format = Objectformaat object_format_helper = Objectformaat van de repository. Kan later niet worden gewijzigd. SHA1 is het meest compatibel. mirror_sync = gesynchroniseerd @@ -2405,7 +2279,6 @@ branch.default_deletion_failed = Branch "%s" is de standaard branch. Het kan nie branch.restore = Herstel branch "%s" branch.download = Download branch % branch.rename = Hernoem branch "%s" -branch.search = Zoek Branch branch.create_new_branch = Creëer branch van branch: branch.confirm_create_branch = Creëer branch branch.warning_rename_default_branch = Je hernoemt de standaard branch. @@ -2426,7 +2299,6 @@ find_file.no_matching = Geen overeenkomstige bestanden gevonden error.csv.too_large = Kan dit bestand niet renderen omdat het te groot is. error.csv.unexpected = Kan dit bestand niet renderen omdat het een onverwacht karakter bevat in regel %d en kolom %d. error.csv.invalid_field_count = Kan dit bestand niet renderen omdat het een verkeerd aantal velden heeft in regel %d. -issues.comment.blocked_by_user = U kunt niet reageren op deze issue omdat u geblokkeerd bent door de eigenaar van de repository of de poster van de issue. issues.blocked_by_user = U kunt geen issues aanmaken in deze repository omdat u geblokkeerd bent door de eigenaar van deze repository. issues.label_archived_filter = Gearchiveerde labels bekijken issues.label_archive_tooltip = Gearchiveerde labels zijn standaard uitgezonderd van de suggesties als men op een label zoekt. @@ -2434,7 +2306,6 @@ issues.max_pinned = U kunt geen issues meer vastpinnen issues.unpin_issue = Issue ontpinnen issues.pin_comment = vastgepind %s issues.cancel_tracking_history = `tijdregistratie geannuleerd %s` -issues.due_date_not_writer = U heeft schrijfrechten tot deze repository nodig om de vervaldatum van een issue bij te werken. issues.dependency.no_permission_1 = U heeft geen machtiging om de afhankelijkheid %d te lezen issues.dependency.no_permission_n = U heeft geen machtiging om de afhankelijkheden %d te lezen issues.dependency.no_permission.can_remove = U heeft geen machtiging om de afhankelijkheid te lezen, maar u kunt deze wel verwijderen @@ -2467,7 +2338,6 @@ projects.column.edit = Kolom bewerken projects.column.new_submit = Kolom maken projects.column.new = Nieuwe kolom projects.column.set_default = Standaard instellen -projects.column.unset_default = Standaardinstelling ongedaan maken projects.column.delete = Kolom verwijderen projects.column.assigned_to = Toegewezen aan projects.card_type.images_and_text = Afbeeldingen en tekst @@ -2483,7 +2353,6 @@ issues.filter_milestone_open = Open mijlpalen issues.filter_milestone_closed = Gesloten mijlpalen issues.filter_project_all = Alle projecten issues.filter_type.reviewed_by_you = Beoordeeld door u -issues.keyword_search_unavailable = Zoeken op een trefwoord is momenteel niet beschikbaar. Neem contact op met uw sitebeheerder. issues.num_comments_1 = %d reactie issues.role.collaborator = Samenwerker issues.role.collaborator_helper = Deze gebruiker is uitgenodigd om mee te werken aan deze repository. @@ -2587,7 +2456,6 @@ settings.transfer_started = Deze repository is gemarkeerd voor overdracht en wac settings.trust_model.collaborator = Samenwerker blame.ignore_revs = Revisies negeren in .git-blame-ignore-revs. Klik hier om de normale blameweergave te omzeilen. editor.update = %s bijwerken -projects.column.unset_default_desc = Maak deze kolom ongedaan als standaard pulls.showing_only_single_commit = Alleen veranderingen tonen van commit %[1]s pulls.blocked_by_changed_protected_files_1 = Dit pull request is geblokkeerd omdat het een beveiligd bestand wijzigt: signing.wont_sign.nokey = Deze instantie heeft geen sleutel om deze commmit mee te ondertekenen. @@ -2769,9 +2637,6 @@ settings.webhook.replay.description = Deze webhook opnieuw afspelen. settings.webhook.delivery.success = Er is een gebeurtenis toegevoegd aan de wachtrij. Het kan enkele seconden duren voor het in de leveringsgeschiedenis verschijnt. settings.authorization_header_desc = Wordt opgenomen als autorisatieheader voor verzoeken indien aanwezig. Voorbeelden: %s. settings.add_key_success = De deploy sleutel "%s" is toegevoegd. -search.type.tooltip = Type zoekopdracht -search.fuzzy.tooltip = Neem resultaten op die ook sterk overeenkomen met de zoekterm -search.match.tooltip = Alleen resultaten opnemen die exact overeenkomen met de zoekterm settings.wiki_rename_branch_main = Normaliseer de Wiki branch naam settings.event_pull_request_approvals = Pull request goedkeuringen settings.protected_branch_duplicate_rule_name = Er is al een regel voor deze reeks branches @@ -2788,11 +2653,8 @@ settings.confirmation_string = Confirmatie string activity.navbar.code_frequency = Code frequentie activity.navbar.recent_commits = Recente commits file_follow = Volg symlink -error.broken_git_hook = it hooks van deze repository lijken kapot te zijn. Volg alsjeblieft de documentatie om ze te repareren, push daarna wat commits om de status te vernieuwen. -pulls.title_desc_one = wilt %[1]d commit van %[2]s samenvoegen in %[3]s open_with_editor = Open met %s commits.search_branch = Deze branch -pulls.merged_title_desc_one = heeft %[1]d commit van %[2]s samengevoegd in %[3]s %[4]s pulls.ready_for_review = Klaar voor een beoordeling? editor.push_out_of_date = De push lijkt verouderd. editor.commit_id_not_matching = Het bestand is gewijzigd terwijl je het aan het bewerken was. Committeer naar een nieuwe branch en voeg dan samen. @@ -2904,7 +2766,6 @@ commits.view_single_diff = Bekijk de veranderingen aan dit bestand die in deze c pulls.editable_explanation = Deze pull request staat bewerkingen toe van beheerders. Je kunt er direct aan bijdragen. pulls.editable = Bewerkbaar issues.reopen.blocked_by_user = U kunt deze issue niet heropenen omdat u geblokkeerd bent door de eigenaar van de repository of de poster van de issue. -pulls.comment.blocked_by_user = U kunt niet reageren op deze pull request omdat u geblokkeerd bent door de eigenaar van de repository of de poster van de issue. issues.filter_no_results_placeholder = Probeer uw zoekfilters aan te passen. issues.filter_no_results = Geen resultaten migrate.repo_desc_helper = Leeg laten om bestaande beschrijving te importeren @@ -3002,8 +2863,6 @@ teams.leave=Verlaat teams.can_create_org_repo=Maak repositories teams.can_create_org_repo_helper=Leden kunnen nieuwe repositories aanmaken in de organisatie. De maker krijgt beheerder toegang tot de nieuwe repository. teams.read_access=Gelezen -teams.read_access_helper=Leden kunnen teamrepositories bekijken en klonen. -teams.write_access_helper=Leden kunnen lezen en pushen naar teamrepositories. teams.admin_access=Beheerder toegang teams.admin_access_helper=Leden kunnen van en naar repositories pullen, pushen, en er medewerkers aan toevoegen. teams.no_desc=Dit team heeft geen omschrijving @@ -3016,12 +2875,9 @@ teams.add_team_member=Teamlid toevoegen teams.delete_team_title=Team verwijderen teams.delete_team_desc=Het verwijderen van een team heeft de toegang tot de repository van de leden. Doorgaan? teams.delete_team_success=Het team is verwijderd. -teams.read_permission_desc=Dit team heeft Lees rechten: leden kunnen repositories lezen en klonen. -teams.write_permission_desc=Dit team heeft Schrijf rechten: leden kunnen repositories lezen en push aanvragen verwerken. teams.admin_permission_desc=Deze team heeft Beheerder rechten: leden kunnen van en naar teamrepositories pullen, pushen, en er medewerkers aan toevoegen. teams.create_repo_permission_desc=Daarnaast verleent dit team Maak repository permissie: leden kunnen nieuwe repositories maken in de organisatie. teams.repositories=Teamrepositories -teams.search_repo_placeholder=Repository zoeken… teams.remove_all_repos_title=Verwijder alle team repositories teams.remove_all_repos_desc=Dit zal alle repositories uit het team verwijderen. teams.add_all_repos_title=Voeg alle repositories toe @@ -3033,7 +2889,6 @@ teams.specific_repositories=Specifieke repositories teams.specific_repositories_helper=Leden zullen alleen toegang hebben tot repositories die expliciet aan het team zijn toegevoegd. Door dit te selecteren, worden niet repositories die al zijn toegevoegd met Alle repositories. teams.all_repositories=Alle repositories teams.all_repositories_helper=Team heeft toegang tot alle repositories. Door dit te selecteren worden alle bestaande repositories aan het team toegevoegd. -teams.all_repositories_read_permission_desc=Dit team heeft Lees toegang tot alle repositories: leden kunnen repositories bekijken en klonen. teams.none_access = Geen toegang teams.none_access_helper = De optie "geen toegang" heeft alleen effect op privé repositories. teams.general_access = Aangepaste toegang @@ -3053,11 +2908,9 @@ teams.invite_team_member.list = Openstaande uitnodigingen teams.invite.title = U bent uitgenodigd om lid te worden van team %s in organisatie %s. teams.invite.description = Klik op onderstaande knop om u bij het team aan te sluiten. teams.invite.by = Uitgenodigd door %s -teams.all_repositories_admin_permission_desc = Dit team verleent Administrator permissies tot alle repositories: leden kunnen lezen, pushen naar en samenwerkers toevoegen aan repositories. settings.change_orgname_prompt = Merk op: Het wijzigen van de organisatienaam zal ook de URL van uw organisatie veranderen en de oude naam vrijgeven. settings.visibility.limited = Beperkt (alleen zichtbaar voor ingelogde gebruikers) teams.add_nonexistent_repo = De repository die u probeert toe te voegen bestaat niet, maak deze eerst aan alstublieft. -teams.all_repositories_write_permission_desc = Dit team verleent Schrijf permissies tot alle repositories: leden kunnen lezen en pushen naar repositories. open_dashboard = Open dashboard settings.change_orgname_redirect_prompt.with_cooldown.one = De oude organisatienaam zal voor iedereen beschikbaar zijn na een afkoelperiode van %[1]d dag. U kunt de oude naam nog steeds opeisen tijdens de afkoelperiode. settings.change_orgname_redirect_prompt.with_cooldown.few = De oude organisatienaam zal voor iedereen beschikbaar zijn na een afkoelperiode van %[1]d dagen. U kunt de oude naam nog steeds opeisen tijdens de afkoelperiode. @@ -3136,7 +2989,6 @@ dashboard.gc_metadata_obtained=GC metadada verkregen dashboard.other_system_allocation_obtained=Andere systeem toewijzing verkregen dashboard.next_gc_recycle=Volgende GC recycle dashboard.last_gc_time=Sinds vorige GC verwerkingstijd -dashboard.total_gc_time=Totaal GC verwerkingstijd dashboard.total_gc_pause=Totaal GC verwerkingstijd dashboard.last_gc_pause=Laatste GC verwerkingstijd dashboard.gc_times=GC verwerkingen @@ -3207,9 +3059,6 @@ repos.unadopted.no_more=Geen niet-geadopteerde repositories gevonden. repos.owner=Eigenaar repos.name=Naam repos.private=Prive -repos.watches=Volgers -repos.stars=Sterren -repos.forks=Forks repos.issues=Issues repos.size=Grootte @@ -3273,16 +3122,6 @@ auths.oauth2_tokenURL=Token URL auths.oauth2_authURL=Autorisatie URL auths.oauth2_profileURL=Profiel URL auths.oauth2_emailURL=E-mail URL -auths.enable_auto_register=Activeer automatische registratie -auths.sspi_auto_create_users=Automatisch gebruikers maken -auths.sspi_auto_create_users_helper=Toestaan dat de SSPI authenticatiemethode automatisch nieuwe accounts aanmaakt voor gebruikers die voor de eerste keer inloggen -auths.sspi_auto_activate_users=Gebruikers automatisch activeren -auths.sspi_auto_activate_users_helper=SSPI authenticatie methode toestaan om automatisch nieuwe gebruikers te activeren -auths.sspi_strip_domain_names=Verwijder domeinnamen uit gebruikersnamen -auths.sspi_separator_replacement=Scheidingsteken voor gebruik in plaats van \, / en @ -auths.sspi_separator_replacement_helper=Het karakter dat moet worden gebruikt om de scheidingstekens van namen op downniveau logon te vervangen (bijv. de \ in "DOMAIN\user") en gebruikersverantwoordelijken (bijv. de @ in "user@example.org"). -auths.sspi_default_language=Standaard gebruikerstaal -auths.sspi_default_language_helper=Standaardtaal voor gebruikers wordt automatisch gemaakt met SSPI authenticatiemethode. Laat leeg als u de taal automatisch wilt detecteren. auths.tips=Tips auths.tips.oauth2.general=OAuth2 authenticatie auths.tip.oauth2_provider=OAuth2 provider @@ -3290,7 +3129,6 @@ auths.tip.nextcloud=`Registreer een nieuwe OAuth consument op je installatie met auths.tip.dropbox=Maak een nieuwe applicatie aan op %s auths.tip.facebook=Registreer een nieuwe applicatie op %s en voeg het product "Facebook Login" toe auths.tip.github=Registreer een nieuwe OAuth toepassing op %s -auths.tip.gitlab=Registreer een nieuwe applicatie op https://gitlab.com/profile/applicaties auths.tip.google_plus=Verkrijg OAuth2 client referenties van de Google API console op %s auths.tip.openid_connect=Gebruik de OpenID Connect Discovery URL (/.well-known/openid-configuration) om de eindpunten op te geven auths.tip.yandex=Maak een nieuwe toepassing op %s. Selecteer de volgende rechten in het gedeelte “Yandex.Passport API”: “Toegang tot e-mailadres”, ‘Toegang tot gebruikersavatar’ en ‘Toegang tot gebruikersnaam, voor- en achternaam, geslacht’ @@ -3575,7 +3413,6 @@ config.test_mail_failed = Er is geen testmail verzonden naar "%s": %v config.access_log_template = Sjabloon voor toegangslogboek config.logger_name_fmt = Logger: %s config.git_max_diff_line_characters = Max diff tekens per regel -auths.sspi_strip_domain_names_helper = Als deze optie is aangevinkt, worden domeinnamen verwijderd uit inlognamen (bijv. "DOMEIN\gebruiker" en "gebruiker@example.org" worden beide gewoon "gebruiker"). auths.map_group_to_team_removal = Gebruikers verwijderen uit gesynchroniseerde teams als gebruiker niet tot overeenkomstige LDAP-groep behoort config.send_test_mail_submit = Stuur auths.unable_to_initialize_openid = OpenID Connect Provider kan niet worden geïnitialiseerd: %s @@ -3980,12 +3817,10 @@ runs.status_no_select = Alle statussen runs.no_results = Geen resultaten gevonden. runs.no_workflows = Er zijn nog geen workflows. unit.desc = Beheer geïntegreerde CI/CD-pijplijnen met Forgejo Actions. -runs.no_workflows.documentation = Voor meer informatie over Forgejo acties, zie de documentatie. workflow.disable_success = Workflow "%s" is succesvol uitgeschakeld. variables.none = Er zijn nog geen variabelen. runners.task_list = Recente taken op deze runner runners.delete_runner_notice = Als er een taak op deze runner draait, wordt deze beëindigd en gemarkeerd als mislukt. Dit kan het bouwen van de workflow onderbreken. -runs.no_workflows.quick_start = Weet je niet hoe je moet beginnen met Forgejo Actions? Zie de snelstartgids. variables.description = Variabelen worden doorgegeven aan bepaalde acties en kunnen anders niet worden gelezen. runners.delete_runner_success = Runner succesvol verwijderd runs.no_matching_online_runner_helper = Geen overeenkomende online runner met label: %s @@ -4026,8 +3861,6 @@ executable_file = Uitvoerbaar bestand [search] search = Zoek… fuzzy = Fuzzy -match = Overeenkomen -match_tooltip = Alleen resultaten opnemen die exact overeenkomen met de zoekterm repo_kind = Zoek repos… user_kind = Zoek gebruikers… org_kind = Zoek orgs… @@ -4043,14 +3876,12 @@ type_tooltip = Zoektype fuzzy_tooltip = Neem resultaten op die ook sterk overeenkomen met de zoekterm code_search_unavailable = Code zoeken is momenteel niet beschikbaar. Neem contact op met de sitebeheerder. keyword_search_unavailable = Zoeken op trefwoord is momenteel niet beschikbaar. Neem contact op met de beheerder van de site. -code_search_by_git_grep = Huidige code zoekresultaten worden geleverd door "git grep". Er kunnen betere resultaten zijn als de sitebeheerder code indexer inschakelt. exact = Exact exact_tooltip = Bevat alleen resultaten die de exacte zoekterm bevatten issue_kind = Zoek issues… pull_kind = Zoek pulls… union = Trefwoorden union_tooltip = Neem resultaten op die overeenkomen met een van de trefwoorden gescheiden door spaties -milestone_kind = Zoek mijlpalen... regexp_tooltip = Interpreteer de zoekterm als een reguliere expressie regexp = RegExp diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index 1e069b8474..9a4abcdcfd 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -45,20 +45,13 @@ webauthn_error_unable_to_process=Serwer nie mógł obsłużyć Twojego żądania webauthn_error_duplicated=Klucz bezpieczeństwa nie jest dozwolony dla tego żądania. Upewnij się, że klucz nie jest już zarejestrowany. webauthn_error_empty=Musisz ustawić nazwę dla tego klucza. webauthn_error_timeout=Osiągnięto limit czasu zanim Twój klucz może zostać odczytany. Odśwież stronę i spróbuj ponownie. -webauthn_reload=Odśwież - repository=Repozytorium organization=Organizacja mirror=Kopia lustrzana -new_repo=Nowe repozytorium -new_migrate=Nowa migracja new_mirror=Nowa kopia lustrzana new_fork=Nowy fork repozytorium -new_org=Nowa organizacja new_project=Nowy projekt -manage_org=Zarządzaj organizacjami admin_panel=Administracja witryny -account_settings=Ustawienia konta settings=Ustawienia your_profile=Profil your_starred=Z gwiazdką @@ -213,8 +206,6 @@ string.desc = Z - A [error] occurred=Wystąpił błąd -missing_csrf=Błędne żądanie: brak tokenu CSRF -invalid_csrf=Błędne żądanie: nieprawidłowy token CSRF not_found=Nie można odnaleźć celu. network_error=Błąd sieci report_message = Jeśli podejrzewasz że jest to bug w Forgejo, przeszukaj zgłoszenia na Codeberg lub otwórz nowe zgłoszenie w razie potrzeby. @@ -351,15 +342,10 @@ app_slogan_helper = Wprowadź tutaj slogan swojej instancji. Pozostaw puste, aby [home] uname_holder=Nazwa użytkownika lub adres e-mail -password_holder=Hasło switch_dashboard_context=Przełącz kontekst pulpitu my_repos=Repozytoria -show_more_repos=Pokaż więcej repozytoriów… -collaborative_repos=Wspólne repozytoria my_orgs=Organizacje -my_mirrors=Moje kopie lustrzane view_home=Zobacz %s -search_repos=Znajdź repozytorium… filter=Inne filtry filter_by_team_repositories=Filtruj według repozytoriów zespołu feed_of=`Kanał "%s"` @@ -380,14 +366,7 @@ issues.in_your_repos=W Twoich repozytoriach repos=Repozytoria users=Użytkownicy organizations=Organizacje -search=Szukaj code=Kod -search.fuzzy=Fuzzy -search.match=Dopasuj -repo_no_results=Nie znaleziono pasujących repozytoriów. -user_no_results=Nie znaleziono pasującego użytkowników. -org_no_results=Nie znaleziono pasujących organizacji. -code_no_results=Nie znaleziono kodu źródłowego odpowiadającego Twojej frazie wyszukiwania. code_last_indexed_at=Ostatnio indeksowane %s go_to = Przejdź do relevant_repositories = Wyświetlane są tylko istotne repozytoria, pokaż niefiltrowane wyniki. @@ -399,14 +378,11 @@ relevant_repositories_tooltip = Repozytoria, które nie są forkami lub nie maj [auth] create_new_account=Utwórz konto -register_helper_msg=Masz już konto? Zaloguj się teraz! -social_register_helper_msg=Masz już konto? Powiąż je teraz! disable_register_prompt=Rejestracja jest wyłączona. Skontaktuj się z administratorem strony. disable_register_mail=Potwierdzenie adresu e-mail w celu rejestracji jest wyłączone. remember_me=Zapamiętaj to urządzenie forgot_password_title=Zapomniałem hasła forgot_password=Zapomniałeś hasła? -sign_up_now=Potrzebujesz konta? Zarejestruj się teraz. confirmation_mail_sent_prompt=Nowa wiadomość e-mail z potwierdzeniem została wysłana do %s. Aby zakończyć proces rejestracji, sprawdź swoją skrzynkę odbiorczą i kliknij podany link w ciągu najbliższych %s. Jeśli wiadomość e-mail jest nieważna, możesz się zalogować i poprosić o wysłanie kolejnej wiadomości e-mail z potwierdzeniem na inny adres. must_change_password=Zaktualizuj swoje hasło allow_password_change=Użytkownik musi zmienić hasło (zalecane) @@ -417,7 +393,6 @@ prohibit_login=Konto jest zawieszone resent_limit_prompt=Zażądano już wiadomości aktywacyjnej. Zaczekaj 3 minuty i spróbuj ponownie. has_unconfirmed_mail=Witaj, %s, masz niepotwierdzony adres e-mail (%s). Jeśli nie otrzymałeś wiadomości e-mail z potwierdzeniem lub potrzebujesz wysłać nową, kliknij na poniższy przycisk. resend_mail=Kliknij tutaj, aby wysłać e-mail aktywacyjny -email_not_associate=Adres e-mail nie jest powiązany z żadnym kontem. send_reset_mail=Wyślij e-mail odzyskiwania reset_password=Odzyskiwanie konta invalid_code=Twój kod potwierdzający jest nieprawidłowy lub wygasł. @@ -431,7 +406,6 @@ twofa_scratch_used=Użyłeś/aś swojego kodu jednorazowego. Przekierowano Cię twofa_passcode_incorrect=Twój kod autoryzacji jest niepoprawny. Jeśli zapodziałeś(-aś) swoje urządzenie, użyj swojego kodu jednorazowego do zalogowania. twofa_scratch_token_incorrect=Twój kod jednorazowy jest niepoprawny. login_userpass=Zaloguj się -tab_openid=OpenID oauth_signup_tab=Utwórz nowe konto oauth_signup_title=Ukończ tworzenie nowego konta oauth_signup_submit=Utwórz konto @@ -452,9 +426,7 @@ authorize_application_created_by=Ta aplikacja została stworzona przez %s. authorize_application_description=Jeżeli udzielisz dostępu, aplikacja uzyska dostęp z zapisem do wszystkich informacji o Twoim koncie, wraz z prywatnymi repozytoriami i organizacjami. authorize_title=Zezwolić "%s" na dostęp do Twojego konta? authorization_failed=Autoryzacja nie powiodła się -sspi_auth_failed=Uwierzytelnianie SSPI nie powiodło się password_pwned_err=Nie udało się ukończyć żądania do HaveIBeenPwned -remember_me.compromised = Token logowania nie jest już ważny, co może wskazywać na naruszenie bezpieczeństwa konta. Sprawdź swoje konto pod kątem podejrzanych działań. sign_up_successful = Konto zostało pomyślnie utworzone. Witamy! prohibit_login_desc = Twoje konto zostało zawieszone i nie może wchodzić w interakcje z instancją. Skontaktuj się z administratorem instancji, aby odzyskać dostęp. change_unconfirmed_email_summary = Zmień adres e-mail, na który zostanie wysłana wiadomość aktywacyjna. @@ -464,13 +436,11 @@ openid_signin_desc = Wprowadź swój identyfikator URI OpenID. Na przykład: ali authorization_failed_desc = Autoryzacja nie powiodła się, ponieważ wykryliśmy nieprawidłowe żądanie. Skontaktuj się z autorem aplikacji, którą próbowałeś(-aś) autoryzować. password_pwned = Wybrane hasło znajduje się na liście skradzionych haseł, które zostały wcześniej ujawnione w wyniku publicznego naruszenia danych. Spróbuj ponownie z innym hasłem i rozważ zmianę tego hasła również w innych miejscach. last_admin = Nie można usunąć ostatniego administratora. Musi istnieć co najmniej jeden administrator. -tab_signin = Zaloguj oauth.signin.error = Wystąpił błąd podczas przetwarzania żądania autoryzacji. Jeśli ten błąd nadal występuje, skontaktuj się z administratorem witryny. change_unconfirmed_email_error = Nie udało się zmienić adresu e-mail: %v invalid_code_forgot_password = Twój kod potwierdzający jest niepoprawny lub wygasł. Naciśnij tutaj⁣, aby rozpocząć nową sesję. invalid_password = Twoje hasło nie zgadza się z hasłem, które zostało użyte do stworzenia konta. reset_password_wrong_user = Jesteś zalogowany(-a) jako %s, ale link odzyskujący jest dla %s -tab_signup = Zarejestruj oauth.signin.error.access_denied = Wniosek o autoryzację został odrzucony. oauth.signin.error.temporarily_unavailable = Autoryzacja nie powiodła się, ponieważ serwer uwierzytelniania jest tymczasowo niedostępny. Spróbuj ponownie później. hint_register = Potrzebujesz konta? Zarejestruj się. @@ -487,7 +457,6 @@ link_not_working_do_paste=Czy link nie działa? Spróbuj skopiować i wkleić go hi_user_x=Cześć %s, activate_account=Aktywuj swoje konto -activate_account.title=%s, proszę aktywuj swoje konto activate_account.text_1=Cześć %[1]s, dziękujemy za rejestrację na %[2]s! activate_account.text_2=Kliknij poniższy link, aby aktywować swoje konto w ciągu %s: @@ -495,13 +464,11 @@ activate_email=Potwierdź swój adres e-mail activate_email.text=Aby zweryfikować swój adres e-mail, w ciągu następnych %s kliknij poniższy link: register_notify=Witamy w %s -register_notify.title=%[1]s, witaj w %[2]s register_notify.text_1=to jest Twój e-mail z potwierdzeniem rejestracji dla %s! register_notify.text_2=Możesz teraz zalogować się za pomocą nazwy użytkownika: %s register_notify.text_3=Jeśli ktoś inny utworzył dla ciebie to konto, musisz najpierw ustawić swoje hasło. reset_password=Odzyskaj swoje konto -reset_password.title=%s, otrzymaliśmy prośbę o odzyskanie konta reset_password.text=Jeśli to byłeś(-aś) ty, kliknij poniższy link, aby odzyskać swoje konto w ciągu %s: register_success=Rejestracja powiodła się @@ -534,7 +501,6 @@ repo.transfer.body=Aby zaakceptować lub odrzucić go, odwiedź %s lub po prostu repo.collaborator.added.subject=%s dodał cię do %s jako współtwórce repo.collaborator.added.text=Zostałeś(-aś) dodany jako współtwórca do repozytorium: issue.action.push_1 = @%[1]s pchnął %[3]d commit do %[2]s -activate_email.title = %s, zweryfikuj swój adres e-mail admin.new_user.text = Kliknij tutaj, aby zarządzać tym użytkownikiem z panelu administracyjnego. issue.action.push_n = @%[1]s pchnął %[3]d commity do %[2]s reply = lub odpowiedz bezpośrednio na ten e-mail @@ -578,8 +544,6 @@ RepoName=Nazwa repozytorium Email=Adres e-mail Password=Hasło Retype=Potwierdź hasło -SSHTitle=Nazwa klucza SSH -HttpsUrl=HTTPS URL PayloadUrl=URL do wywołania TeamName=Nazwa zespołu AuthName=Nazwa autoryzacji @@ -592,9 +556,6 @@ CommitChoice=Wybór commita TreeName=Ścieżka pliku Content=Treść -SSPISeparatorReplacement=Separator -SSPIDefaultLanguage=Domyślny język - require_error=` nie może być puste.` alpha_dash_error=` powinno zawierać tylko znaki alfanumeryczne, myślniki ("-") i znaki podkreślenia ("_").` alpha_dash_dot_error=` powinno zawierać tylko znaki alfanumeryczne, myślniki ("-"), znaki podkreślenia ("_") i kropki (".").` @@ -729,13 +690,11 @@ password=Hasło security=Bezpieczeństwo avatar=Awatar ssh_gpg_keys=Klucze SSH / GPG -social=Konta społecznościowe applications=Aplikacje orgs=Organizacje repos=Repozytoria delete=Usuń konto twofa=Autoryzacja dwuetapowa -account_link=Powiązane Konta organization=Organizacje webauthn=Klucze bezpieczeństwa @@ -755,10 +714,7 @@ language=Język ui=Motyw comment_type_group_title=Tytuł privacy=Prywatność -keep_activity_private_popup=Aktywność staje się widoczna tylko dla Ciebie i administratorów - lookup_avatar_by_mail=Znajdź awatar po adresie e-mail -federated_avatar_lookup=Wyszukiwanie zewnętrznych awatarów enable_custom_avatar=Włącz niestandardowe awatary choose_new_avatar=Wybierz nowy avatar update_avatar=Aktualizuj awatar @@ -773,7 +729,6 @@ password_incorrect=Bieżące hasło nie jest prawidłowe. change_password_success=Twoje hasło zostało zaktualizowane. Od teraz możesz logować się za pomocą nowego hasła. password_change_disabled=Konta niebędące lokalnymi nie mogą zmienić swojego hasła poprzez interfejs przeglądarkowy Forgejo. -emails=Adresy e-mail manage_emails=Zarządzaj adresami e-mail manage_themes=Domyślny motyw manage_openid=Adresy OpenID @@ -810,8 +765,6 @@ ssh_desc=Te publiczne klucze SSH są powiązane z Twoim kontem. Odpowiadające i gpg_desc=Te publiczne klucze GPG są powiązane z Twoim kontem i będą używane do weryfikacji twoich commitów. Dbaj o bezpieczeństwo kluczy prywatnych, gdyż pozwalają one na podpisywanie commitów. ssh_helper=Potrzebujesz pomocy? Sprawdź na GitHubie przewodnik generowania kluczy SSH lub rozwiązywanie typowych problemów z SSH. gpg_helper=Potrzebujesz pomocy? Przeczytaj na GitHubie poradnik na temat GPG. -add_new_key=Dodaj klucz SSH -add_new_gpg_key=Dodaj klucz GPG key_content_gpg_placeholder=Zaczyna się od "-----BEGIN PGP PUBLIC KEY BLOCK-----" ssh_key_been_used=Ten klucz SSH został już dodany do tego serwera. ssh_key_name_used=Klucz SSH z tą nazwą został już dodany do Twojego konta. @@ -827,7 +780,6 @@ gpg_invalid_token_signature=Podany klucz GPG, podpis i token nie pasują lub tok gpg_token_required=Musisz podać podpis poniższego tokenu gpg_token=Token gpg_token_help=Możesz wygenerować podpis za pomocą: -gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=Wzmocniony podpis GPG key_signature_gpg_placeholder=Zaczyna się od "-----BEGIN PGP SIGNATURE-----" ssh_key_verified=Zweryfikowany klucz @@ -864,9 +816,6 @@ show_openid=Pokaż w profilu hide_openid=Ukryj w profilu ssh_disabled=SSH jest wyłączony ssh_externally_managed=Ten klucz SSH jest zarządzany zewnętrznie dla tego użytkownika -manage_social=Zarządzaj powiązanymi kontami społecznościowymi -unbind=Rozłącz - manage_access_token=Tokeny dostępu generate_new_token=Wygeneruj nowy token tokens_desc=Te tokeny dostępu udzielają dostępu do Twojego konta za pomocą API Forgejo. @@ -876,8 +825,6 @@ generate_token_success=Twój nowy token został wygenerowany. Skopiuj go teraz, generate_token_name_duplicate=%s istnieje już jako nazwa aplikacji. Użyj nowej. delete_token=Usuń access_token_deletion=Usuń token dostępu -access_token_deletion_cancel_action=Anuluj -access_token_deletion_confirm_action=Usuń delete_token_success=Token został usunięty. Aplikacje używające go nie będą miały już dostępu do Twojego konta. permission_read=Przeczytane @@ -926,7 +873,6 @@ webauthn_delete_key_desc=Jeżeli usuniesz klucz bezpieczeństwa, utracisz możli manage_account_links=Powiązane konta manage_account_links_desc=Te konta zewnętrzne są powiązane z Twoim kontem Forgejo. -account_links_not_available=Obecnie nie ma żadnych zewnętrznych kont powiązanych z tym kontem Forgejo. link_account=Powiąż konto remove_account_link=Usuń powiązane konto remove_account_link_desc=Usunięcie powiązanego konta unieważni jego dostęp do Twojego konta Forgejo. Kontynuować? @@ -1028,7 +974,6 @@ update_user_avatar_success = Awatar użytkownika został zaktualizowany. access_token_desc = Wybrane uprawnienia tokenu ograniczają autoryzację tylko dla następujących ścieżek API. Więcej szczegółów znajdziesz w dokumentacji . profile_desc = O tobie pronouns = Zaimki -pronouns_custom = Własne saved_successfully = Twoje ustawienia zostały zapisane pomyślnie. keep_activity_private.description = Twoja aktywność publiczna będzie widoczna tylko dla ciebie i administratorów tej instancji. add_email_confirmation_sent = E-mail z potwierdzeniem został wysłany do "%s". By potwierdzić swój adres e-mail, proszę sprawdź swoją skrzynkę odbiorczą i odwiedź dostarczony link w ciągu %s. @@ -1037,7 +982,6 @@ twofa_recovery_tip = Jeżeli zgubisz swoje urządzenie, będziesz mógł użyć webauthn_key_loss_warning = Jeżeli zgubisz swoje klucze bezpieczeństwa, utracisz dostęp do swojego konta. webauthn_alternative_tip = Możesz skonfigurować dodatkową metodę uwierzytelniania. user_block_yourself = Nie możesz zablokować siebie. -pronouns_custom_label = Własne zaimki update_language_not_found = Język "%s" nie jest dostępny. language.title = Domyślny język language.localization_project = Pomóż nam przetłumaczyć Forgejo na twój język! Dowiedz się więcej. @@ -1074,7 +1018,6 @@ fork_repo=Forkuj repozytorium fork_from=Forkuj z fork_visibility_helper=Widoczność sforkowanego repozytorium nie może być zmieniona. use_template=Użyj tego szablonu -clone_in_vsc=Klonuj w VS Code download_zip=Pobierz ZIP download_tar=Pobierz TAR.GZ download_bundle=Pobierz BUNDLE @@ -1093,7 +1036,6 @@ readme=README readme_helper=Wybierz szablon pliku README readme_helper_desc=To jest miejsce, w którym możesz napisać pełny opis swojego projektu. auto_init=Inicjalizuj repozytorium -trust_model_helper_default=Domyślnie: Użyj domyślnego modelu zaufania dla tej instalacji create_repo=Utwórz repozytorium default_branch=Domyślny branch default_branch_helper=Domyślny branch jest podstawowym branch'em dla pull requestów i commit'ów kodu. @@ -1146,15 +1088,11 @@ template.issue_labels=Etykiety zgłoszenia template.one_item=Musisz wybrać co najmniej jeden element szablonu template.invalid=Musisz wybrać repozytorium dla szablonu -archive.issue.nocomment=To repozytorium jest zarchiwizowane. Nie możesz komentować zgłoszeń. -archive.pull.nocomment=To repozytorium jest zarchiwizowane. Nie możesz komentować pull requestów. - form.reach_limit_of_creation_1=Osiągnąłeś już limit %d repozytorium. form.reach_limit_of_creation_n=Osiągnąłeś już limit %d repozytoriów. need_auth=Autoryzacja migrate_options=Opcje migracji -migrate_service=Usługa migracji migrate_options_lfs=Migruj pliki LFS migrate_options_lfs_endpoint.label=Punkt końcowy LFS migrate_options_lfs_endpoint.description=Migracja spróbuje użyć Git remote, aby określić serwer LFS. Możesz również określić niestandardowy punkt końcowy, jeśli dane repozytorium LFS są przechowywane gdzieś indziej. @@ -1230,7 +1168,6 @@ branches=Gałęzie tags=Tagi issues=Zgłoszenia pulls=Pull requesty -project_board=Projekty labels=Etykiety org_labels_desc=Etykiety organizacji, które mogą być używane z wszystkimi repozytoriami w tej organizacji org_labels_desc_manage=zarządzaj @@ -1307,8 +1244,6 @@ editor.require_signed_commit=Gałąź wymaga podpisanych commitów commits.desc=Przeglądaj historię zmian kodu źródłowego. commits.commits=Commity -commits.search=Przeszukaj commity… -commits.find=Szukaj commits.search_all=Wszystkie gałęzie commits.author=Autor commits.message=Wiadomość @@ -1324,8 +1259,6 @@ commits.gpg_key_id=ID klucza GPG commitstatus.error=Błąd commitstatus.pending=Oczekująca -ext_issues.desc=Link do zewnętrznego systemu śledzenia zgłoszeń. - projects=Projekty projects.description=Opis (opcjonalnie) projects.description_placeholder=Opis @@ -1344,7 +1277,6 @@ projects.type.basic_kanban=Podstawowy kanban projects.type.bug_triage=Segregacja bugów projects.template.desc=Szablon projects.template.desc_helper=Wybierz szablon projektu by rozpocząć -projects.type.uncategorized=Bez kategorii projects.column.edit_title=Nazwa projects.column.new_title=Nazwa projects.column.color=Kolor @@ -1467,8 +1399,6 @@ issues.ref_issue_from=`odwołał(-a) się do tego zgłoszenia %[ issues.ref_pull_from=`odwołał(-a) się do tego Pull Requesta %[3]s %[1]s` issues.ref_closing_from=`odwołał(-a) się do pull requesta %[3]s, który zamknie to zgłoszenie %[1]s` issues.ref_reopening_from=`odwołał(-a) się z pull requesta %[3]s, który otworzy na nowo to zgłoszenie %[1]s` -issues.ref_closed_from=`zamknął(-ęła) to zgłoszenie %[4]s %[2]s` -issues.ref_reopened_from=`ponownie otworzył(-a) to zgłoszenie %[4]s %[2]s` issues.ref_from=`z %[1]s` issues.role.owner=Właściciel issues.role.member=Członek @@ -1537,14 +1467,10 @@ issues.add_time_sum_to_small=Czas nie został wprowadzony. issues.time_spent_total=Całkowity spędzony czas issues.time_spent_from_all_authors=`Całkowity spędzony czas: %s` issues.due_date=Termin realizacji -issues.invalid_due_date_format=Format terminu realizacji musi mieć wartość 'rrrr-mm-dd'. -issues.error_modifying_due_date=Nie udało się zmodyfikować terminu realizacji. -issues.error_removing_due_date=Nie udało się usunąć terminu realizacji. issues.push_commit_1=dodał(-a) %d commit %s issues.push_commits_n=dodał(-a) %d commity(-ów) %s issues.force_push_compare=Porównaj issues.due_date_form=yyyy-mm-dd -issues.due_date_form_add=Dodaj termin realizacji issues.due_date_form_edit=Edytuj issues.due_date_form_remove=Usuń issues.due_date_not_set=Brak ustawionego terminu realizacji. @@ -1588,7 +1514,6 @@ issues.review.add_review_request=poprosił o recenzję %s %s issues.review.remove_review_request=usunięto prośbę o recenzję %s %s issues.review.remove_review_request_self=odmówił recenzji %s issues.review.pending=Oczekująca -issues.review.review=Recenzja issues.review.reviewers=Recenzenci issues.review.outdated=Nieaktualny issues.review.show_outdated=Pokaż przedawnione @@ -1598,7 +1523,6 @@ issues.review.hide_resolved=Ukryj rozwiązane issues.review.resolve_conversation=Rozwiąż dyskusję issues.review.un_resolve_conversation=Oznacz dyskusję jako nierozstrzygniętą issues.review.resolved_by=oznaczył(-a) tę rozmowę jako rozwiązaną -issues.assignee.error=Nie udało się dodać wszystkich wybranych osób do przypisanych przez nieoczekiwany błąd. issues.reference_issue.body=Treść issues.content_history.edited=edytowano issues.content_history.delete_from_history=Usuń z historii @@ -1617,8 +1541,6 @@ pulls.no_results=Nie znaleziono wyników. pulls.nothing_to_compare=Te gałęzie są sobie równe. Nie ma potrzeby tworzyć Pull Requesta. pulls.nothing_to_compare_and_allow_empty_pr=Te gałęzie są równe. Ten PR będzie pusty. pulls.create=Utwórz pull request -pulls.title_desc_few=chce scalić %[1]d commity/ów z %[2]s do %[3]s -pulls.merged_title_desc_few=scala %[1]d commity/ów z %[2]s do %[3]s %[4]s pulls.change_target_branch_at=`zmienia gałąź docelową z %s na %s %s` pulls.tab_conversation=Dyskusja pulls.tab_commits=Commity @@ -1713,8 +1635,6 @@ milestones.filter_sort.most_issues=Najwięcej zgłoszeń milestones.filter_sort.least_issues=Najmniej zgłoszeń -ext_wiki.desc=Link do zewnętrznego wiki. - wiki=Wiki wiki.welcome=Witaj na wiki! wiki.welcome_desc=Wiki pozwala Ci na tworzenie i współdzielenie dokumentacji ze współpracownikami. @@ -1803,13 +1723,6 @@ activity.git_stats_deletion_n=%d usunięć contributors.contribution_type.commits=Commity -search=Szukaj -search.search_repo=Przeszukaj repozytorium -search.fuzzy=Fuzzy -search.match=Dopasuj -search.results=Wyniki wyszukiwania dla "%s" w %s -search.code_no_results=Nie znaleziono kodu źródłowego odpowiadającego Twojej frazie wyszukiwania. - settings=Ustawienia settings.desc=Ustawienia to miejsce, w którym możesz zmieniać parametry repozytorium settings.options=Repozytorium @@ -1880,7 +1793,6 @@ settings.transfer.success=Przeniesienie repozytorium powiodło się. settings.transfer_abort=Anuluj transfer settings.transfer_abort_invalid=Nie możesz anulować nieistniejącego transferu repozytorium. settings.transfer_desc=Przenieś to repozytorium do innego użytkownika lub organizacji, w której posiadasz uprawnienia administratora. -settings.transfer_form_title=Wpisz nazwę repozytorium w celu potwierdzenia: settings.transfer_in_progress=Obecnie trwa transfer. Anuluj go, jeśli chcesz przenieść to repozytorium do innego użytkownika. settings.transfer_notices_1=- Stracisz dostęp do tego repozytorium, jeśli przeniesiesz je do innego użytkownika. settings.transfer_notices_2=- Utrzymasz dostęp do tego repozytorium, jeśli przeniesiesz je do organizacji, której jesteś (współ-)właścicielem. @@ -1919,7 +1831,6 @@ settings.delete_collaborator=Usuń settings.collaborator_deletion=Usuń współpracownika settings.collaborator_deletion_desc=Usunięcie współpracownika odbierze mu dostęp do tego repozytorium. Kontynuować? settings.remove_collaborator_success=Usunięto użytkownika. -settings.search_user_placeholder=Szukaj użytkownika… settings.org_not_allowed_to_be_collaborator=Organizacji nie można dodać jako współpracownika. settings.change_team_access_not_allowed=Zmiana dostępu zespołu do repozytorium zostało zastrzeżone do właściciela organizacji settings.team_not_in_organization=Zespół nie jest w tej samej organizacji co repozytorium @@ -1927,7 +1838,6 @@ settings.teams=Zespoły settings.add_team=Dodaj zespół settings.add_team_duplicate=Zespół już posiada repozytorium settings.add_team_success=Zespół ma teraz dostęp do repozytorium. -settings.search_team=Szukaj zespołu… settings.change_team_permission_tip=Uprawnienia zespołu ustawione są konfigurowane na stronie ustawień zespołu i nie mogą być zmieniane dla pojedynczych repozytoriów settings.delete_team_tip=Ten zespół ma dostęp do wszystkich repozytoriów i nie może zostać usunięty settings.remove_team_success=Dostęp zespołu do repozytorium został usunięty. @@ -2029,12 +1939,7 @@ settings.deploy_key_deletion_desc=Usunięcie klucza wdrożeniowego wycofa jego d settings.deploy_key_deletion_success=Klucz wdrożeniowy został usunięty. settings.branches=Gałęzie settings.protected_branch=Ochrona gałęzi -settings.protected_branch_can_push=Umożliwić push? -settings.protected_branch_can_push_yes=Możesz wysyłać -settings.protected_branch_can_push_no=Nie możesz wysyłać settings.branch_protection=Reguły ochrony dla gałęzi "%s" -settings.protect_this_branch=Włącz ochronę gałęzi -settings.protect_this_branch_desc=Zapobiega usunięciu oraz ogranicza wypychanie i scalanie zmian do tej gałęzi. settings.protect_disable_push=Wyłącz wypychanie settings.protect_disable_push_desc=Wypychanie do tej gałęzi nie będzie możliwe. settings.protect_enable_push=Włącz wypychanie @@ -2043,9 +1948,7 @@ settings.protect_whitelist_committers=Wypychanie ograniczone białą listą settings.protect_whitelist_committers_desc=Tylko dopuszczeni użytkownicy oraz zespoły będą miały możliwość wypychania zmian do tej gałęzi (oprócz wymuszenia wypchnięcia). settings.protect_whitelist_deploy_keys=Dozwolona lista kluczy wdrożeniowych z uprawnieniem zapisu do push'a. settings.protect_whitelist_users=Użytkownicy dopuszczeni do wypychania -settings.protect_whitelist_search_users=Szukaj użytkowników… settings.protect_whitelist_teams=Zespoły dopuszczone do wypychania -settings.protect_whitelist_search_teams=Szukaj zespołów… settings.protect_merge_whitelist_committers=Włącz dopuszczenie scalania settings.protect_merge_whitelist_committers_desc=Zezwól jedynie dopuszczonym użytkownikom lub zespołom na scalanie Pull Requestów w tej gałęzi. settings.protect_merge_whitelist_users=Użytkownicy dopuszczeni do scalania @@ -2063,8 +1966,6 @@ settings.dismiss_stale_approvals=Unieważnij przestarzałe zatwierdzenia settings.dismiss_stale_approvals_desc=Kiedy nowe commity zmieniające zawartość Pull Requesta są wypychane do gałęzi, wcześniejsze zatwierdzenia zostaną unieważnione. settings.require_signed_commits=Wymagaj podpisanych commitów settings.require_signed_commits_desc=Odrzucaj zmiany wypychane do tej gałęzi, jeśli nie są podpisane, lub są niemożliwe do zweryfikowania. -settings.add_protected_branch=Włącz ochronę -settings.delete_protected_branch=Wyłącz ochronę settings.protected_branch_deletion=Wyłącz ochronę gałęzi settings.protected_branch_deletion_desc=Wyłączenie ochrony gałęzi pozwoli użytkownikom z uprawnieniami zapisu do przekazywania zmian do gałęzi. Kontynuować? settings.block_rejected_reviews=Zablokuj scalanie przy odrzuconych recenzjach @@ -2125,16 +2026,12 @@ settings.lfs_pointers.inRepo=W repozytorium settings.lfs_pointers.exists=Istnieje w magazynie settings.lfs_pointers.accessible=Dostępne dla użytkownika settings.lfs_pointers.associateAccessible=Powiąż dostępne %d OID -settings.rename_branch_from=nazwa starej gałęzi -settings.rename_branch_to=nazwa nowej gałęzi - diff.browse_source=Przeglądaj źródła diff.parent=rodzic diff.commit=commit diff.git-notes=Notatki diff.data_not_available=Informacje nt. zmian nie są dostępne diff.options_button=Opcje porównania -diff.show_diff_stats=Pokaż statystyki diff.download_patch=Pobierz plik łatki diff.download_diff=Pobierz plik zmian diff.show_split_view=Widok podzielony @@ -2207,7 +2104,6 @@ release.tag_name_invalid=Nazwa tagu jest niewłaściwa. release.tag_name_protected=Nazwa tagu jest chroniona. release.tag_already_exist=Ta nazwa tag'a już istnieje. release.downloads=Pliki do pobrania -release.download_count=Pobrania: %s release.add_tag_msg=Użyj tytułu i zawartości wydania jako wiadomości znacznika. release.add_tag=Utwórz tag @@ -2586,7 +2482,6 @@ branch.create_success = Gałąź "%s" została utworzona. editor.file_delete_success = Plik "%s" został usunięty. branch.branch_already_exists = Gałąź "%s" już istnieje w repozytorium. branch.new_branch_from = Utwórz nową gałąź z "%s" -error.broken_git_hook = Hooki Git tego repozytorium zdają się być zepsute. Proszę sprawdź jak je naprawić w dokumentacji, a następnie wypchnij parę commitów by odświeżyć stan. editor.cherry_pick = Cherry-pick %s na: milestones.edit_success = Kamień milowy "%s" został zaktualizowany. activity.title.issues_closed_from = %s zamknięte przez %s @@ -2631,7 +2526,6 @@ issues.due_date_modified = zmienił termin realizacji z %[2]s na %[1]s %[3]s issues.dependency.issue_no_dependencies = Brak ustawionych zależności. issues.dependency.no_permission_n = Nie masz uprawnień do odczytu %d zależności issues.dependency.issue_batch_close_blocked = Nie można zamknąć wybranych zgłoszeń, ponieważ zgłoszenie #%d nadal ma otwarte zależności -issues.reference_link = Odniesienie: %s issues.blocked_by_user = Nie możesz utworzyć zgłoszeń w tym repozytorium ponieważ jesteś zablokowany(-a) przez właściciela repozytorium. pulls.view = Zobacz pull request issues.summary_card_alt = Podsumowanie karty zgłoszenia zatytułowanego "%s" w repozytorium %s @@ -2734,7 +2628,6 @@ branch.download = Pobierz gałąź "%s" commit.contained_in = Ten commit jest zawarty w: pulls.allow_edits_from_maintainers_err = Aktualizowanie nie powiodło się pulls.collapse_files = Zwiń wszystkie pliki -issues.comment.blocked_by_user = Nie możesz utworzyć komentarza do tego zgłoszenia ponieważ jesteś zablokowany(-a) przez właściciela repozytorium lub autora zgłoszenia. pulls.switch_comparison_type = Zmień rodzaj porównania settings.branch_filter_desc = Biała lista gałęzi na wydarzenia wypchnięcia, tworzenie gałęzi i usuwanie gałęzi, określone wzorem glob. Jeżeli puste lub *, raportowane będą wydarzenia wszystkich gałęzi. Sprawdź składnię w dokumentacji %[2]s. Przykłady: master, {master,release*}. settings.remove_protected_branch_success = Ochrona gałęzi dla reguły "%s" została usunięta. @@ -2931,8 +2824,6 @@ teams.leave.detail=Czy jesteś pewien(-na), że chcesz opuścić zespół "%s"? teams.can_create_org_repo=Tworzenie repozytoriów teams.can_create_org_repo_helper=Członkowie mogą tworzyć nowe repozytoria w organizacji. Twórca otrzyma uprawnienia administracyjne do nowego repozytorium. teams.read_access=Przeczytane -teams.read_access_helper=Członkowie mogą wyświetlać i klonować repozytoria zespołów. -teams.write_access_helper=Członkowie mają uprawnienia odczytu i wypychania do repozytoriów zespołu. teams.admin_access=Dostęp administratora teams.admin_access_helper=Członkowie mogą ściągać i wypychać zmiany do repozytoriów zespołu oraz dodawać do niego współpracowników. teams.no_desc=Ten zespół nie ma opisu @@ -2945,12 +2836,9 @@ teams.add_team_member=Dodaj członka zespołu teams.delete_team_title=Usuń zespół teams.delete_team_desc=Usunięcie zespołu wycofa dostęp do repozytorium jego członkom. Kontynuować? teams.delete_team_success=Zespół został usunięty. -teams.read_permission_desc=Ten zespół udziela dostępu z odczytem: członkowie mogą wyświetlać i klonować repozytoria zespołu. -teams.write_permission_desc=Ten zespół udziela dostępu z zapisem: członkowie mogą wyświetlać i wypychać zmiany do repozytoriów zespołu. teams.admin_permission_desc=Ten zespół udziela dostępu Administratora: członkowie mogą wyświetlać i wypychać zmiany oraz dodawać współpracowników do repozytoriów zespołu. teams.create_repo_permission_desc=Dodatkowo, ten zespół otrzyma uprawnienie Tworzenie repozytoriów: jego członkowie mogą tworzyć nowe repozytoria w organizacji. teams.repositories=Repozytoria zespołu -teams.search_repo_placeholder=Szukaj repozytorium… teams.remove_all_repos_title=Usuń wszystkie repozytoria zespołu teams.remove_all_repos_desc=Usunie to wszystkie repozytoria przypisane do zespołu. teams.add_all_repos_title=Dodaj wszystkie repozytoria @@ -2962,9 +2850,6 @@ teams.specific_repositories=Określone repozytoria teams.specific_repositories_helper=Członkowie uzyskają dostęp wyłącznie do repozytoriów przypisanych do tego zespołu. Wybranie tej opcji nie usunie automatycznie repozytoriów dodanych przy pomocy Wszystkie repozytoria. teams.all_repositories=Wszystkie repozytoria teams.all_repositories_helper=Zespół ma dostęp do wszystkich repozytoriów. Wybranie tego doda wszystkie istniejące repozytoria do tego zespołu. -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 open_dashboard = Otwórz pulpit @@ -3064,7 +2949,6 @@ dashboard.gc_metadata_obtained=Ilość metadanych uzyskanych przez GC dashboard.other_system_allocation_obtained=Inne uzyskane alokacje systemowe dashboard.next_gc_recycle=Następne wywołanie GC dashboard.last_gc_time=Czas od ostatniego wywołania GC -dashboard.total_gc_time=Sumaryczny czas wstrzymania przez GC dashboard.total_gc_pause=Sumaryczny czas wstrzymania przez GC dashboard.last_gc_pause=Ostatnie wstrzymanie przez GC dashboard.gc_times=Ilość wywołań GC @@ -3135,9 +3019,6 @@ repos.unadopted.no_more=Nie znaleziono więcej nieadoptowanych repozytoriów. repos.owner=Właściciel repos.name=Nazwa repos.private=Prywatne -repos.watches=Obserwujących -repos.stars=Polubienia -repos.forks=Forki repos.issues=Zgłoszenia repos.size=Rozmiar @@ -3207,17 +3088,6 @@ auths.oauth2_authURL=URL autoryzacji auths.oauth2_profileURL=URL profilu auths.oauth2_emailURL=URL adresu e-mail auths.skip_local_two_fa=Pomiń lokalne 2FA -auths.enable_auto_register=Włącz automatyczną rejestrację -auths.sspi_auto_create_users=Automatycznie twórz użytkowników -auths.sspi_auto_create_users_helper=Zezwól metodzie uwierzytelniania SSPI na automatyczne tworzenie nowych kont dla użytkowników, którzy logują się po raz pierwszy -auths.sspi_auto_activate_users=Automatycznie aktywuj użytkowników -auths.sspi_auto_activate_users_helper=Zezwól metodzie uwierzytelnienia SSPI na automatyczne aktywowanie nowych kont użytkowników -auths.sspi_strip_domain_names=Usuwaj nazwy domen z nazw użytkowników -auths.sspi_strip_domain_names_helper=Gdy zaznaczone, nazwy domen będą usuwane z nazw logowania (np. zamiast "DOMENA\osoba", "czy osoba@example.org" będą po prostu "osoba"). -auths.sspi_separator_replacement=Używany separator zamiast \, / oraz @ -auths.sspi_separator_replacement_helper=Znak używany do zastępowania separatorów nazw logowania niskiego poziomu (np. znak \ w "DOMENA\osoba") i nazw głównych użytkowników (np. @ w "osoba@example.org"). -auths.sspi_default_language=Domyślny język użytkownika -auths.sspi_default_language_helper=Domyślny język dla użytkowników automatycznie stworzonych przy pomocy metody uwierzytelnienia SSPI. Pozostaw puste, jeśli język ma zostać wykryty automatycznie. auths.tips=Wskazówki auths.tips.oauth2.general=Uwierzytelnianie OAuth2 auths.tip.oauth2_provider=Dostawca OAuth2 @@ -3226,7 +3096,6 @@ auths.tip.nextcloud=`Zarejestruj nowego klienta OAuth w swojej instancji za pomo auths.tip.dropbox=Stwórz nową aplikację na %s auths.tip.facebook=`Zarejestruj nową aplikację na %s i dodaj produkt "Facebook Login"` auths.tip.github=Zarejestruj nową aplikację OAuth na %s -auths.tip.gitlab=Zarejestruj nową aplikację na https://gitlab.com/profile/applications auths.tip.google_plus=Uzyskaj dane uwierzytelniające klienta OAuth2 z konsoli Google API na %s auths.tip.openid_connect=Użyj adresu URL OpenID Connect Discovery (/.well-known/openid-configuration), aby określić punkty końcowe auths.tip.twitter=Przejdź na %s, stwórz aplikację i upewnij się, że opcja “Allow this application to be used to Sign in with Twitter” jest włączona @@ -3953,8 +3822,6 @@ type_tooltip = Typ wyszukiwania fuzzy = Przybliżone package_kind = Wyszukaj pakiety… fuzzy_tooltip = Uwzględnij wyniki, które są bliskie wyszukiwanemu hasłu -match = Dopasuj -match_tooltip = Uwzględniaj tylko wyniki pasujące do wyszukiwanego hasła repo_kind = Wyszukaj repozytoria… user_kind = Wyszukaj użytkownilków… code_search_unavailable = Wyszukiwanie kodu jest obecnie niedostępne. Skontakuj sie z administratorem strony. @@ -3962,13 +3829,11 @@ no_results = Nie znaleziono pasujących wyników. org_kind = Wyszukaj organizacje… team_kind = Wyszukaj zespoły… code_kind = Wyszukaj kod… -code_search_by_git_grep = Obecne wyniki wyszukiwania kodu są dostarczane przez "git grep". Wyniki mogą być lepsze, jeśli administrator witryny włączy indeksator kodu. project_kind = Wyszukaj projekty… branch_kind = Wyszukaj gałęzie… commit_kind = Wyszukaj commity… runner_kind = Wyszukaj runnery… keyword_search_unavailable = Wyszukiwanie według słów kluczowych jest obecnie niedostępne. Skontaktuj się z administratorem strony. -milestone_kind = Wyszukaj kamienie milowe... union_tooltip = Uwzględnia wyniki pasujące do dowolnego słowa kluczowego rozdzielonego białymi znakami exact = Dokładne exact_tooltip = Uwzględniaj tylko wyniki pasujące do wyszukiwanego hasła diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index afc472f9a5..97c3708043 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -48,21 +48,14 @@ webauthn_error_unable_to_process=O servidor não pôde processar sua solicitaç webauthn_error_duplicated=A chave de segurança não é permitida para esta solicitação. Por favor, certifique-se que a chave já não está registrada. webauthn_error_empty=Você deve definir um nome para esta chave. webauthn_error_timeout=Não foi possível ler a sua chave de segurança antes do tempo limite. Atualize a página e tente novamente. -webauthn_reload=Atualizar - repository=Repositório organization=Organização mirror=Espelhamento -new_repo=Novo repositório -new_migrate=Nova migração new_mirror=Novo espelho new_fork=Novo fork do repositório -new_org=Nova organização new_project=Novo projeto new_project_column=Nova coluna -manage_org=Gerenciar organizações admin_panel=Administração do servidor -account_settings=Configurações da conta settings=Configurações your_profile=Perfil your_starred=Favorito @@ -218,8 +211,6 @@ string.desc=Z - A [error] occurred=Ocorreu um erro report_message=Caso acredite que este é um problema do Forgejo, veja se a questão existe no repositório do Codeberg, ou crie uma nova questão. -missing_csrf=Pedido inválido: não tem token CSRF presente -invalid_csrf=Requisição Inválida: token CSRF inválido not_found=Não foi possível encontrar o destino. network_error=Erro de rede server_internal = Erro interno do servidor @@ -355,15 +346,10 @@ app_slogan_helper = Insira o slogan de seu servidor aqui. Deixe em branco para d [home] uname_holder=Usuário ou e-mail -password_holder=Senha switch_dashboard_context=Trocar contexto do painel my_repos=Repositórios -show_more_repos=Mostrar mais repositórios… -collaborative_repos=Repositórios colaborativos my_orgs=Organizações -my_mirrors=Meus espelhos view_home=Ver %s -search_repos=Encontre um repositório… filter=Outros filtros filter_by_team_repositories=Filtrar por repositórios da equipe feed_of=`Feed de "%s"` @@ -384,20 +370,8 @@ issues.in_your_repos=Em seus repositórios repos=Repositórios users=Usuários organizations=Organizações -search=Pesquisar go_to=Ir para code=Código -search.type.tooltip=Tipo de pesquisa -search.fuzzy=Similar -search.fuzzy.tooltip=Incluir resultados que sejam próximos ao termo de busca -search.match=Correspondência -search.match.tooltip=Incluir somente resultados que correspondam exatamente ao termo de busca -code_search_unavailable=A pesquisa por código não está disponível no momento. Entre em contato com o administrador do site. -repo_no_results=Nenhum repositório correspondente foi encontrado. -user_no_results=Nenhum usuário correspondente foi encontrado. -org_no_results=Nenhuma organização correspondente foi encontrada. -code_no_results=Nenhum código-fonte correspondente ao seu termo de pesquisa foi encontrado. -code_search_results=`Resultados da pesquisa por: "%s"` code_last_indexed_at=Última indexação %s relevant_repositories_tooltip=Repositórios que são forks ou que não possuem tópico, nem ícone e nem descrição estão ocultos. relevant_repositories=Apenas repositórios relevantes estão sendo mostrados, mostrar resultados não filtrados. @@ -408,15 +382,12 @@ forks_few = %d forks [auth] create_new_account=Cadastrar conta -register_helper_msg=Já tem uma conta? Acesse agora! -social_register_helper_msg=Já tem uma conta? Vincule agora! disable_register_prompt=Cadastro está desabilitado. Entre em contato com o administrador do site. disable_register_mail=E-mail de confirmação de cadastro está desabilitado. manual_activation_only=Entre em contato com o administrador do site para concluir a ativação. remember_me=Lembrar este dispositivo forgot_password_title=Esqueci minha senha forgot_password=Esqueceu sua senha? -sign_up_now=Precisa de uma conta? Cadastre-se agora. sign_up_successful=A conta foi criada com sucesso. Bem-vindo! confirmation_mail_sent_prompt=Um novo email de confirmação foi enviado para %s. Para completar o processo de cadastro, por favor verifique sua caixa de entrada e acesse o link fornecido dentro de %s. Se o e-mail estiver incorreto, você pode entrar na conta e solicitar outro e-mail de confirmação para um endereço diferente. must_change_password=Redefina sua senha @@ -429,7 +400,6 @@ prohibit_login_desc=Sua conta foi suspensa de interagir com o servidor. Entre em resent_limit_prompt=Você já solicitou recentemente um e-mail de ativação. Por favor, aguarde 3 minutos e tente novamente. has_unconfirmed_mail=Oi %s, você possui um endereço de e-mail não confirmado (%s). Se você não recebeu um e-mail de confirmação ou precisa reenviar um novo, clique no botão abaixo. resend_mail=Clique aqui para reenviar seu e-mail de ativação -email_not_associate=O endereço de e-mail não está associado à nenhuma conta. send_reset_mail=Enviar e-mail de recuperação de conta reset_password=Recuperação de conta invalid_code=Seu código de confirmação é inválido ou expirou. @@ -446,7 +416,6 @@ twofa_scratch_used=Você usou seu código de backup. Você foi redirecionado par twofa_passcode_incorrect=Seu código de acesso está incorreto. Se você perdeu seu dispositivo, use seu código de backup para acessar. twofa_scratch_token_incorrect=Seu código de backup está incorreto. login_userpass=Acessar -tab_openid=OpenID oauth_signup_tab=Cadastrar nova conta oauth_signup_title=Completar nova conta oauth_signup_submit=Completar conta @@ -472,16 +441,12 @@ authorize_application_description=Se você conceder acesso, isso permitirá aces authorize_title=Autorizar "%s" para acessar sua conta? authorization_failed=Autorização falhou authorization_failed_desc=A autorização falhou porque detectamos uma solicitação inválida. Entre em contato com o responsável do aplicativo que você tentou autorizar. -sspi_auth_failed=Falha de autenticação SSPI password_pwned=A senha que você escolheu faz parte de uma lista de senhas roubadas expostas anteriormente em violações de dados. Tente novamente com uma senha diferente e considere alterar essa senha em outro lugar também. password_pwned_err=Não foi possível concluir a requisição ao HaveIBeenPwned change_unconfirmed_email_error = Erro ao alterar o endereço de e-mail: %v change_unconfirmed_email_summary = Alterar o endereço de e-mail que o e-mail de ativação será enviado para. last_admin = Não é possível remover o último administrador. Deve existir ao menos um usuário administrador. change_unconfirmed_email = Se você colocou o endereço de e-mail errado durante o cadastro, você pode alterá-lo abaixo, e uma confirmação será enviada para o novo endereço. -remember_me.compromised = O identificador de sessão foi invalidado, o que pode indicar que a sua conta foi comprometida. Verifique se não há atividades suspeitas em sua conta. -tab_signin = Iniciar sessão -tab_signup = Inscrever-se hint_register = Precisa de uma conta? Registre-se agora. sign_up_button = Registre-se agora. hint_login = Já possui uma conta? Faça login agora! @@ -497,22 +462,18 @@ link_not_working_do_paste=O link não está funcionando? Tente copiar e colá-lo hi_user_x=Olá %s, activate_account=Por favor, ative sua conta -activate_account.title=%s, por favor, ative a sua conta activate_account.text_1=Olá %[1]s, obrigado por se registrar em %[2]s! activate_account.text_2=Por favor clique no link a seguir para ativar sua conta em %s: activate_email=Verifique seu endereço de e-mail -activate_email.title=%s, por favor verifique o seu endereço de e-mail activate_email.text=Por favor clique no link a seguir para verificar o seu endereço de e-mail em %s: register_notify=Boas vindas a %s -register_notify.title=%[1]s, bem-vindo(a) a %[2]s register_notify.text_1=este é o seu e-mail de confirmação de registro para %s! register_notify.text_2=Você pode iniciar a sessão com o usuário: %s register_notify.text_3=Se outra pessoa criou esta conta para você, é preciso definir a sua senha primeiro. reset_password=Recuperar sua conta -reset_password.title=%s, recebemos um pedido para recuperar a sua conta reset_password.text=Caso tenha solicitado, clique no link a seguir para recuperar a sua conta dentro de %s: register_success=Cadastro bem-sucedido @@ -587,8 +548,6 @@ RepoName=Nome do repositório Email=Endereço de e-mail Password=Senha Retype=Confirmar senha -SSHTitle=Nome da chave SSH -HttpsUrl=URL HTTPS PayloadUrl=URL de carga TeamName=Nome da equipe AuthName=Nome de autorização @@ -601,9 +560,6 @@ CommitChoice=Escolha de commit TreeName=Caminho do arquivo Content=Conteúdo -SSPISeparatorReplacement=Separador -SSPIDefaultLanguage=Idioma padrão - require_error=` não pode estar em branco.` alpha_dash_error=`deve conter apenas caracteres alfanuméricos, traço ("-") e sublinhado ("_").` alpha_dash_dot_error=`deve conter apenas caracteres alfanuméricos, traço ("-"), sublinhado ("_") e ponto (".").` @@ -625,7 +581,6 @@ lang_select_error=Selecione um idioma da lista. username_been_taken=O nome de usuário já está sendo usado. username_change_not_local_user=Usuários não-locais não são autorizados a alterar nome de usuário. -username_has_not_been_changed=Nome de usuário não foi alterado repo_name_been_taken=O nome de repositório já está sendo usado. repository_force_private=Forçar Privado está ativado: repositórios privados não podem ser tornados públicos. repository_files_already_exist=Arquivos já existem neste repositório. Contate o administrador. @@ -705,7 +660,6 @@ unfollow=Deixar de seguir user_bio=Biografia disabled_public_activity=Este usuário desativou a visibilidade pública da atividade. email_visibility.limited=Seu endereço de e-mail está visível para todos os usuários autenticados -email_visibility.private=Seu endereço de e-mail é visível apenas para você e administradores show_on_map=Mostrar este lugar em um mapa settings=Configurações do usuário @@ -740,13 +694,11 @@ password=Senha security=Segurança avatar=Avatar ssh_gpg_keys=Chaves SSH / GPG -social=Redes sociais applications=Aplicativos orgs=Organizações repos=Repositórios delete=Excluir conta twofa=Autenticação de dois fatores -account_link=Contas vinculadas organization=Organizações uid=UID webauthn=Chaves de segurança @@ -793,10 +745,7 @@ comment_type_group_issue_ref=Referência do issue saved_successfully=Suas configurações foram salvas com sucesso. privacy=Privacidade keep_activity_private=Ocultar atividade da página de perfil -keep_activity_private_popup=A sua atividade estará visível apenas para você e os admnistradores - lookup_avatar_by_mail=Pesquisar avatar por endereço de e-mail -federated_avatar_lookup=Pesquisa de avatar federado enable_custom_avatar=Usar avatar personalizado choose_new_avatar=Escolha um novo avatar update_avatar=Atualizar avatar @@ -814,7 +763,6 @@ password_incorrect=A senha atual está incorreta. change_password_success=Sua senha foi atualizada. A partir de agora, use sua nova senha para acessar sua conta. password_change_disabled=Contas não-locais não podem alterar sua senha através da interface web do Forgejo. -emails=Endereços de e-mail manage_emails=Gerenciar endereços de e-mail manage_themes=Tema padrão manage_openid=Endereços OpenID @@ -857,8 +805,6 @@ principal_desc=Estes nomes principais do certificado SSH estão associados à su gpg_desc=Essas chaves GPG públicas são associadas à sua conta e usadas para verificar seus commits. Mantenha suas chaves privadas seguras, pois elas permitem assinar commits com sua identidade. ssh_helper=Precisa de ajuda? Dê uma olhada no guia do GitHub para criar suas próprias chaves SSH ou resolver problemas comuns que você pode ter usando SSH. gpg_helper=Precisa de ajuda? Dê uma olhada no guia do GitHub sobre GPG. -add_new_key=Adicionar chave SSH -add_new_gpg_key=Adicionar chave GPG key_content_ssh_placeholder=Começa com "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com" ou "sk-ssh-ed25519@openssh.com" key_content_gpg_placeholder=Começa com "-----BEGIN PGP PUBLIC KEY BLOCK-----" add_new_principal=Adicionar principal @@ -876,7 +822,6 @@ gpg_invalid_token_signature=A chave GPG fornecida, a assinatura ou o token não gpg_token_required=Você tem que fornecer uma assinatura para o token abaixo gpg_token=Token gpg_token_help=Você pode gerar uma assinatura usando: -gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=Assinatura GPG blindada key_signature_gpg_placeholder=Começa com "-----BEGIN PGP SIGNATURE-----" verify_gpg_key_success=A chave GPG "%s" foi validada. @@ -923,11 +868,6 @@ hide_openid=Ocultar no perfil ssh_disabled=SSH está desativado ssh_signonly=O SSH está desativado no momento, portanto, essas chaves são usadas apenas para verificação de assinatura de confirmação. ssh_externally_managed=Esta chave SSH para este usuário é gerenciada externamente -manage_social=Gerenciar contas sociais associadas -social_desc=Essas contas sociais podem ser usadas para fazer login em sua conta. Certifique-se de reconhecer todas elas. -unbind=Desvincular -unbind_success=A conta social foi removida com sucesso. - manage_access_token=Tokens de acesso generate_new_token=Gerar novo token tokens_desc=Esses tokens concedem acesso à sua conta usando a API do Forgejo. @@ -937,8 +877,6 @@ generate_token_success=Seu novo token foi gerado. Copie-o agora, pois ele não s generate_token_name_duplicate=%s já foi usado como um nome de aplicativo. Por favor, use outro. delete_token=Excluir access_token_deletion=Excluir token de acesso -access_token_deletion_cancel_action=Cancelar -access_token_deletion_confirm_action=Excluir access_token_deletion_desc=A exclusão de um token revoga o acesso à sua conta para aplicativos que o usam. Continuar? delete_token_success=O token foi excluído. Os aplicativos que o utilizam já não têm acesso à sua conta. repo_and_org_access=Acesso ao Repositório e Organização @@ -1008,7 +946,6 @@ webauthn_delete_key_desc=Se você remover uma chave de segurança, não será po manage_account_links=Contas vinculadas manage_account_links_desc=Estas contas externas estão vinculadas a sua conta de Forgejo. -account_links_not_available=Não existem contas externas atualmente vinculadas a esta conta. link_account=Vincular conta remove_account_link=Remover conta remove_account_link_desc=A exclusão da chave SSH revogará o acesso à sua conta. Continuar? @@ -1051,7 +988,6 @@ webauthn_alternative_tip = Você talvez queira configurar um método adicional d change_password = Alterar senha hints = Dicas pronouns = Pronomes -pronouns_custom = Personalizado pronouns_unspecified = Não especificado language.title = Idioma padrão additional_repo_units_hint = Sugira habilitar unidades de repositório adicionais @@ -1062,7 +998,6 @@ keep_activity_private.description = A sua atividade pública es language.localization_project = Ajude-nos a traduzir Forgejo para o seu idioma! Mais informações. language.description = Essa língua será salva em sua conta e será usada como padrão após você iniciar a sessão. user_block_yourself = Você não pode se bloquear. -pronouns_custom_label = Pronomes personalizados change_username_redirect_prompt.with_cooldown.one = O nome de usuário antigo ficará disponível para qualquer pessoa após um período de proteção de %[1]d dia. Você ainda pode recuperar o nome de usuário antigo durante este período de proteção. change_username_redirect_prompt.with_cooldown.few = O nome de usuário antigo ficará disponível para qualquer pessoa após um período de proteção de %[1]d dias. Você ainda pode recuperar o nome de usuário antigo durante este período de proteção. quota.applies_to_user = As seguintes regras de cota se aplicam à sua conta @@ -1116,7 +1051,6 @@ fork_to_different_account=Faça um fork para uma conta diferente fork_visibility_helper=A visibilidade do fork de um repositório não pode ser alterada. fork_no_valid_owners=Não é possível fazer um fork desse repositório porque não há proprietários validos. use_template=Usar este modelo -clone_in_vsc=Clonar no VS Code download_zip=Baixar ZIP download_tar=Baixar TAR.GZ download_bundle=Baixar PACOTE @@ -1136,11 +1070,6 @@ readme=LEIA-ME readme_helper=Selecione um modelo de arquivo README readme_helper_desc=Aqui você pode escrever uma descrição completa para o seu projeto. auto_init=Inicializar repositório -trust_model_helper=Selecione o modelo de confiança para verificação de assinatura. As opções possíveis são: -trust_model_helper_collaborator=Colaborador: Confiar em assinaturas de colaboradores -trust_model_helper_committer=Committer: Confiar em assinaturas que correspondem aos committers -trust_model_helper_collaborator_committer=Colaborador+Committer: Confiar em assinaturas dos colaboradores que correspondem ao committer -trust_model_helper_default=Padrão: Usar o modelo de confiança padrão para esta instalação create_repo=Criar repositório default_branch=Ramo padrão default_branch_label=padrão @@ -1208,9 +1137,6 @@ template.invalid=Deve-se selecionar um repositório de modelo archive.title=Este repositório está arquivado. Você pode visualizar arquivos e cloná-lo, mas não pode fazer alterações, tais como push, novos issues, pull requests ou comentários. archive.title_date=Este repositório foi arquivado em %s. Você pode visualizar arquivos e cloná-lo, mas não pode fazer alterações, tais como push, abrir issues, pull requests ou comentários. -archive.issue.nocomment=Este repositório está arquivado. Você não pode comentar em issues. -archive.pull.nocomment=Este repositório está arquivado. Você não pode comentar em pull requests. - form.reach_limit_of_creation_1=Você já atingiu o seu limite de %d repositório. form.reach_limit_of_creation_n=Você já atingiu o limite de %d repositórios. form.name_reserved=O nome de repositório "%s" está reservado. @@ -1218,7 +1144,6 @@ form.name_pattern_not_allowed=O padrão "%s" não é permitido em um nome de rep need_auth=Autorização migrate_options=Opções de migração -migrate_service=Serviço de Migração migrate_options_mirror_helper=Este repositório será um espelho migrate_options_lfs=Migrar arquivos LFS migrate_options_lfs_endpoint.label=Destino LFS @@ -1304,7 +1229,6 @@ branches=Branches tags=Tags issues=Issues pulls=Pull requests -project_board=Projetos packages=Pacotes actions=Ações labels=Etiquetas @@ -1318,7 +1242,6 @@ release=Versão releases=Versões tag=Tag released_this=lançou isto -tagged_this=criou essa tag file.title=%s em %s file_raw=Original file_history=Histórico @@ -1431,9 +1354,7 @@ commits.desc=Veja o histórico de alterações do código de fonte. commits.commits=Commits commits.no_commits=Nenhum commit em comum. "%s" e "%s" tem históricos completamente diferentes. commits.nothing_to_compare=Estes branches são iguais. -commits.search=Pesquisar commits... commits.search.tooltip=Você pode prefixar as palavras-chave com "author:" (autor da mudança), "committer:" (autor do commit), "after:" (depois) ou "before:" (antes). Por exemplo: "revert author:Ana before:2019-01-13".\ -commits.find=Pesquisar commits.search_all=Todos os ramos commits.author=Autor commits.message=Mensagem @@ -1460,8 +1381,6 @@ commitstatus.pending=Pendente commitstatus.success=Sucesso ext_issues=Issues externos -ext_issues.desc=Link para o issue tracker externo. - projects=Projetos projects.desc=Gerencie issues e PRs nos quadros do projeto. projects.description=Descrição (opcional) @@ -1483,7 +1402,6 @@ projects.type.basic_kanban=Kanban básico projects.type.bug_triage=Triagem de bugs projects.template.desc=Modelo de projeto projects.template.desc_helper=Selecione um modelo de projeto para começar -projects.type.uncategorized=Sem categoria projects.column.edit=Editar coluna projects.column.edit_title=Nome projects.column.new_title=Nome @@ -1491,8 +1409,6 @@ projects.column.new_submit=Criar coluna projects.column.new=Nova coluna projects.column.set_default=Atribuir como padrão projects.column.set_default_desc=Definir esta coluna como padrão para pull e issues sem categoria -projects.column.unset_default=Desatribuir padrão -projects.column.unset_default_desc=Desatribuir esta coluna como padrão projects.column.delete=Excluir coluna projects.column.deletion_desc=Excluir uma coluna do projeto move todos os issues relacionados para a coluna padrão. Continuar? projects.column.color=Cor @@ -1605,7 +1521,6 @@ issues.filter_sort.moststars=Mais estrelas issues.filter_sort.feweststars=Menos estrelas issues.filter_sort.mostforks=Mais forks issues.filter_sort.fewestforks=Menos forks -issues.keyword_search_unavailable=A pesquisa por palavra-chave não está disponível no momento. Entre em contato com o administrador do site. issues.action_open=Abrir issues.action_close=Fechar issues.action_label=Etiqueta @@ -1650,11 +1565,8 @@ issues.ref_issue_from=`citou esta issue %[3]s %[1]s` issues.ref_pull_from=`citou este pull request %[3]s %[1]s` issues.ref_closing_from=`citou esta issue de um pull request %[3]s que a fechará %[1]s` issues.ref_reopening_from=`citou esta issue de um pull request %[3]s que a reabrirá, %[1]s` -issues.ref_closed_from=`fechou esta issue %[4]s %[2]s` -issues.ref_reopened_from=`reabriu esta issue %[4]s %[2]s` issues.ref_from=`de %[1]s` issues.author=Autor -issues.author_helper=Este usuário é o autor. issues.role.owner=Proprietário(a) issues.role.owner_helper=Este usuário é o proprietário deste repositório. issues.role.member=Membro @@ -1740,15 +1652,11 @@ issues.add_time_sum_to_small=Nenhum tempo inserido. issues.time_spent_total=Total de tempo gasto issues.time_spent_from_all_authors=`Total de tempo gasto: %s` issues.due_date=Data limite -issues.invalid_due_date_format=Formato da data limite inválido, deve ser 'dd/mm/aaaa'. -issues.error_modifying_due_date=Falha ao modificar a data limite. -issues.error_removing_due_date=Falha ao remover a data limite. issues.push_commit_1=adicionou %d commit %s issues.push_commits_n=adicionou %d commits %s issues.force_push_codes=`forçou o push %[1]s de %[2]s %[8]s para %[4]s %[9]s %[6]s` issues.force_push_compare=Comparar issues.due_date_form=dd/mm/aaaa -issues.due_date_form_add=Adicionar data limite issues.due_date_form_edit=Editar issues.due_date_form_remove=Remover issues.due_date_not_set=Não há data limite definida. @@ -1803,7 +1711,6 @@ issues.review.remove_review_request=removeu a solicitação de revisão para %[1 issues.review.remove_review_request_self=recusou-se a revisar %s issues.review.pending=Pendente issues.review.pending.tooltip=Este comentário não está atualmente visível para outros usuários. Para enviar seus comentários pendentes, selecione "%s" -> "%s/%s/%s" no topo da página. -issues.review.review=Revisão issues.review.reviewers=Revisores issues.review.outdated=Desatualizado issues.review.outdated_description=O conteúdo foi alterado desde que este comentário foi feito @@ -1816,7 +1723,6 @@ issues.review.hide_resolved=Ocultar resolvidas issues.review.resolve_conversation=Resolver conversa issues.review.un_resolve_conversation=Conversa não resolvida issues.review.resolved_by=marcou esta conversa como resolvida -issues.assignee.error=Nem todos os responsáveis foram adicionados devido a um erro inesperado. issues.reference_issue.body=Conteúdo issues.content_history.deleted=excluído issues.content_history.edited=editado @@ -1824,8 +1730,6 @@ issues.content_history.created=criado issues.content_history.delete_from_history=Excluir do histórico issues.content_history.delete_from_history_confirm=Excluir do histórico? issues.content_history.options=Opções -issues.reference_link=Referência: %s - compare.compare_base=base compare.compare_head=comparar @@ -1859,8 +1763,6 @@ pulls.nothing_to_compare=Estes branches são iguais. Não há nenhuma necessidad pulls.nothing_to_compare_and_allow_empty_pr=Estes branches são iguais. Este PR ficará vazio. pulls.has_pull_request=`Um pull request entre esses branches já existe: %[2]s#%[3]d` pulls.create=Criar pull request -pulls.title_desc_few=quer mesclar %[1]d commits de %[2]s em %[3]s -pulls.merged_title_desc_few=mesclou %[1]d commits de %[2]s em %[3]s %[4]s pulls.change_target_branch_at=`mudou o branch de destino de %s para %s %s` pulls.tab_conversation=Conversação pulls.tab_commits=Commits @@ -2011,8 +1913,6 @@ signing.wont_sign.approved=O merge não será assinado porque o PR não foi apro signing.wont_sign.not_signed_in=Você não está conectado. ext_wiki=Wiki Externa -ext_wiki.desc=Link para uma wiki externa. - wiki=Wiki wiki.welcome=Bem-vindo à wiki. wiki.welcome_desc=A wiki permite que você escreva e compartilhe a documentação com os colaboradores. @@ -2107,17 +2007,6 @@ activity.git_stats_deletion_1=%d exclusão activity.git_stats_deletion_n=%d exclusões contributors.contribution_type.commits = Commits -search=Pesquisar -search.search_repo=Pesquisar no repositório... -search.type.tooltip=Tipo de pesquisa -search.fuzzy=Aproximada -search.fuzzy.tooltip=Incluir resultados que sejam próximos ao termo de busca -search.match=Corresponde -search.match.tooltip=Incluir somente resultados que correspondam exatamente ao termo de busca -search.results=Resultados da pesquisa para "%s" em %s -search.code_no_results=Nenhum código-fonte correspondente ao seu termo de pesquisa foi encontrado. -search.code_search_unavailable=A pesquisa por código não está disponível no momento. Entre em contato com o administrador do site. - settings=Configurações settings.desc=Opções é onde você pode gerenciar as configurações para o repositório settings.options=Repositório @@ -2213,7 +2102,6 @@ settings.transfer.success=A transferência do repositório foi bem sucedida. settings.transfer_abort=Cancelar transferência settings.transfer_abort_invalid=Não é possível cancelar uma transferência de repositório não existente. settings.transfer_desc=Transferir este repositório para outro usuário ou para uma organização onde você tem direitos de administrador. -settings.transfer_form_title=Digite o nome do repositório para confirmar: settings.transfer_in_progress=Há uma transferência em andamento. Por favor, cancele se você gostaria de transferir este repositório para outro usuário. settings.transfer_notices_1=- Você perderá o acesso ao repositório se transferir para um usuário individual. settings.transfer_notices_2=- Você manterá acesso ao repositório se transferi-lo para uma organização que você também é proprietário. @@ -2256,7 +2144,6 @@ settings.delete_collaborator=Remover settings.collaborator_deletion=Remover colaborador settings.collaborator_deletion_desc=A exclusão de um colaborador irá revogar o acesso a este repositório. Continuar? settings.remove_collaborator_success=O colaborador foi removido. -settings.search_user_placeholder=Pesquisar usuário... settings.org_not_allowed_to_be_collaborator=Organizações não podem ser adicionadas como um colaborador. settings.change_team_access_not_allowed=Alteração do acesso da equipe para o repositório está restrito ao proprietário da organização settings.team_not_in_organization=A equipe não está na mesma organização que o repositório @@ -2264,7 +2151,6 @@ settings.teams=Equipes settings.add_team=Adicionar equipe settings.add_team_duplicate=A equipe já tem o repositório settings.add_team_success=A equipe agora tem acesso ao repositório. -settings.search_team=Pesquisar Equipe… settings.change_team_permission_tip=A permissão da equipe está definida na página de configurações da equipe e não pode ser alterada por repositório settings.delete_team_tip=Esta equipe tem acesso a todos os repositórios e não pode ser removida settings.remove_team_success=O acesso da equipe ao repositório foi removido. @@ -2395,12 +2281,7 @@ settings.branches=Branches settings.protected_branch=Proteção de branch settings.protected_branch.save_rule=Salvar regra settings.protected_branch.delete_rule=Excluir regra -settings.protected_branch_can_push=Permitir push? -settings.protected_branch_can_push_yes=Você pode fazer push -settings.protected_branch_can_push_no=Você não pode fazer push settings.branch_protection=Regras de proteção do branch "%s" -settings.protect_this_branch=Habilitar Proteção de Branch -settings.protect_this_branch_desc=Previne a exclusão e restringe o merge e push para o branch. settings.protect_disable_push=Desabilitar push settings.protect_disable_push_desc=Nenhum push será permitido neste branch. settings.protect_enable_push=Habilitar push @@ -2410,9 +2291,7 @@ settings.protect_whitelist_committers=Push restrito à lista de permissão settings.protect_whitelist_committers_desc=Somente usuários ou equipes da lista permitida serão autorizados realizar push neste branch (mas não forçar o push). settings.protect_whitelist_deploy_keys=Dar permissão às chaves de deploy com acesso de gravação para push. settings.protect_whitelist_users=Usuários com permissão para realizar push -settings.protect_whitelist_search_users=Pesquisar usuários... settings.protect_whitelist_teams=Equipes com permissão para realizar push -settings.protect_whitelist_search_teams=Pesquisar equipes... settings.protect_merge_whitelist_committers=Habilitar lista de permissão de merge settings.protect_merge_whitelist_committers_desc=Permitir que determinados usuários ou equipes possam aplicar merge de pull requests neste branch. settings.protect_merge_whitelist_users=Usuários com permissão para fazer merge @@ -2436,8 +2315,6 @@ settings.protect_protected_file_patterns=Padrões de arquivo protegidos (separad settings.protect_protected_file_patterns_desc=Arquivos protegidos não podem ser alterados diretamente, mesmo que o usuário tenha direitos para adicionar, editar ou excluir arquivos neste branch. Vários padrões podem ser separados usando ponto e vírgula (';'). Consulte a documentação %[2]s para a sintaxe padrão. Exemplos: .drone.yml, /docs/**/*.txt. settings.protect_unprotected_file_patterns=Padrões de arquivo desprotegidos (separados usando ponto e vírgula ";") settings.protect_unprotected_file_patterns_desc=Arquivos não protegidos que podem ser alterados diretamente se o usuário tiver acesso de gravação, ignorando as restrições de push. Vários padrões podem ser separados usando ponto e vírgula (\;'). Veja %[2]s documentação para sintaxe de padrões. Exemplos: .drone.yml, /docs/**/*.txt. -settings.add_protected_branch=Habilitar proteção -settings.delete_protected_branch=Desabilitar proteção settings.update_protect_branch_success=Proteção do branch "%s" foi atualizada. settings.remove_protected_branch_success=Proteção do branch "%s" foi desabilitada. settings.remove_protected_branch_failed=Removendo regra de proteção de branch "%s" falhou. @@ -2508,8 +2385,6 @@ settings.lfs_pointers.associateAccessible=Associar %d OIDs acessíveis settings.rename_branch_failed_exist=Não é possível renomear o branch porque existe o branch %s. settings.rename_branch_failed_not_exist=Não é possível renomear o branch %s porque ele não existe. settings.rename_branch_success=Branch %s foi renomeado com sucesso para %s. -settings.rename_branch_from=nome antigo do branch -settings.rename_branch_to=novo nome do branch settings.rename_branch=Renomear branch diff.browse_source=Ver código fonte @@ -2518,7 +2393,6 @@ diff.commit=commit diff.git-notes=Notas diff.data_not_available=O conteúdo do diff não está disponível diff.options_button=Opções de visualização de diferenças -diff.show_diff_stats=Mostrar estatísticas diff.download_patch=Baixar arquivo patch diff.download_diff=Baixar arquivo diff diff.show_split_view=Visão dividida @@ -2609,7 +2483,6 @@ release.tag_name_invalid=O nome da tag não é válido. release.tag_name_protected=O nome da tag está protegido. release.tag_already_exist=Este nome de tag já existe. release.downloads=Downloads -release.download_count=Downloads: %s release.add_tag_msg=Use o título e o conteúdo do lançamento como mensagem da tag. release.add_tag=Criar tag release.releases_for=Versões para %s @@ -2641,7 +2514,6 @@ branch.create_new_branch=Criar branch a partir do branch: branch.confirm_create_branch=Criar branch branch.warning_rename_default_branch=Você está renomeando o branch padrão. branch.rename_branch_to=Renomear "%s" para: -branch.confirm_rename_branch=Renomear branch branch.create_branch_operation=Criar branch branch.new_branch=Criar novo branch branch.new_branch_from=`Criar novo branch a partir de "%s"` @@ -2665,7 +2537,6 @@ error.csv.too_large=Não é possível renderizar este arquivo porque ele é muit error.csv.unexpected=Não é possível renderizar este arquivo porque ele contém um caractere inesperado na linha %d e coluna %d. error.csv.invalid_field_count=Não é possível renderizar este arquivo porque ele tem um número errado de campos na linha %d. generated = Gerado -clone_in_vscodium = Clonar com VSCodium mirror_sync = sincronizado desc.sha256 = SHA256 issues.role.collaborator = Colaborador(a) @@ -2732,10 +2603,8 @@ n_commit_one = %s commit n_tag_few = %s etiquetas settings.federation_settings = Configurações de federação settings.confirm_wiki_branch_rename = Renomar o ramo da wiki -pulls.merged_title_desc_one = mesclou %[1]d commit de %[2]s em %[3]s %[4]s activity.navbar.recent_commits = Commits recentes size_format = %[1]s: %[2]s; %[3]s: %[4]s -pulls.title_desc_one = quer mesclar %[1]d commit de %[2]s em %[3]s pulls.cmd_instruction_merge_desc = Mescle as alterações e enviar para o Forgejo. pulls.ready_for_review = Pronto para revisão? commits.search_branch = Este ramo @@ -2798,7 +2667,6 @@ pulls.fast_forward_only_merge_pull_request = Apenas fast-forward pulls.has_merged = Falha: O pull request foi merged, você não pode merge novamente ou mudar o branch destino. issues.author.tooltip.pr = Esse usuário é o autor dessa solicitação de pull. editor.push_out_of_date = O push parece estar desatualizado. -issues.comment.blocked_by_user = Você não pode comentar neste issue porque você foi bloqueado pelo dono do repositório ou pelo autor deste issue. pulls.blocked_by_user = Você não pode criar uma solicitação de pull nesse repositório porque você está bloqueado pelo dono do repositório. mirror_use_ssh.helper = Forgejo irá espelhar o repositório via Git através de SSH e criar um par de chaves para você ao escolher essa opção. Você deverá garantir que a chave pública gerada está autorizada a fazer push para o repositório de destino. Você não pode usar autorização baseada em senha ao escolher essa opção. mirror_denied_combination = Não é possível combinar o uso de chave pública e autenticação baseada em senha. @@ -2858,7 +2726,6 @@ settings.sourcehut_builds.visibility = Visibilidade do job settings.unarchive.text = Desarquivar o repositório irá restaurar a possibilidade de receber commits e push, bem como novos issues e pull requests. settings.ignore_stale_approvals_desc = Não contar aprovações feitas em commits mais antigos (revisões inativas) no número de aprovações de pedidos de merge. Não tem efeito se as revisões inativas já são desconsideradas. settings.protect_status_check_patterns = Padrões de verificação de status -error.broken_git_hook = Os hooks Git desse repositório parecem estar quebrados. Por favor, siga a documentação para corrigi-los e então faça push de alguns commits para atualizar o status. release.type_attachment = Anexo release.type_external_asset = Recurso externo release.asset_name = Nome do recurso @@ -2905,7 +2772,6 @@ commits.view_single_diff = Ver modificações neste arquivo introduzidas neste c pulls.editable = Editável pulls.editable_explanation = Este pull request permite edições de mantenedores. Voçê pode contribuir diretamenta para ele. issues.reopen.blocked_by_user = Você não pode reabrir este issue porque você foi bloqueado pelo dono do repositório ou pelo criador deste issue. -pulls.comment.blocked_by_user = Você não pode comentar neste pull request porque você foi bloqueado pelo dono do repositório ou pelo autor do pull request. issues.filter_no_results = Nenhum resultado issues.filter_no_results_placeholder = Tente ajustar seus filtros de pesquisa. archive.nocomment = Não é possível comentar pois o repositório foi arquivado. @@ -3012,9 +2878,7 @@ teams.none_access_helper=A opção "sem acesso" só tem efeito em repositórios teams.general_access=Acesso personalizado teams.general_access_helper=As permissões dos membros serão decididas pela tabela de permissões abaixo. teams.read_access=Leitura -teams.read_access_helper=Os membros podem ver e clonar os repositórios da equipe. teams.write_access=Escrita -teams.write_access_helper=Os membros podem ler e realizar push para os repositórios da equipe. teams.admin_access=Acesso de administrador teams.admin_access_helper=Os membros podem realizar pull e push em repositórios da equipe e adicionar colaboradores a eles. teams.no_desc=Esta equipe não tem descrição @@ -3029,12 +2893,9 @@ teams.invite_team_member.list=Convites pendentes teams.delete_team_title=Excluir equipe teams.delete_team_desc=A exclusão de uma equipe revoga o acesso ao repositório de seus membros. Continuar? teams.delete_team_success=A equipe foi excluída. -teams.read_permission_desc=Essa equipe concede acesso para Leitura: membros podem ver e clonar os repositórios da equipe. -teams.write_permission_desc=Esta equipe concede acesso para escrita: Membros podem ler e fazer push para os repositórios da equipe. teams.admin_permission_desc=Esta equipe concede acesso de Administrador: membros podem ler, fazer push e adicionar outros colaboradores em repositórios da equipe. teams.create_repo_permission_desc=Além disso, esta equipe concede permissão de Criar repositório: membros podem criar novos repositórios na organização. teams.repositories=Repositórios da equipe -teams.search_repo_placeholder=Pesquisar repositório... teams.remove_all_repos_title=Remover todos os repositórios da equipe teams.remove_all_repos_desc=Isto irá remover todos os repositórios da equipe. teams.add_all_repos_title=Adicionar todos os repositórios @@ -3047,9 +2908,6 @@ teams.specific_repositories=Repositórios específicos teams.specific_repositories_helper=Os membros terão acesso apenas aos repositórios explicitamente adicionados à equipe. Selecionar este não removerá automaticamente os repositórios já adicionados com Todos os repositórios. teams.all_repositories=Todos os repositórios teams.all_repositories_helper=A equipe tem acesso a todos os repositórios. Selecionar isto irá adicionar todos os repositórios existentes à equipe. -teams.all_repositories_read_permission_desc=Esta equipe concede acesso Leitura a todos os repositórios: membros podem ver e clonar repositórios. -teams.all_repositories_write_permission_desc=Esta equipe concede acesso Escrita a todos os repositórios: os membros podem ler de e fazer push para os repositórios. -teams.all_repositories_admin_permission_desc=Esta equipe concede acesso Administrativo a todos os repositórios: os membros podem ler, fazer push e adicionar colaboradores aos repositórios. teams.invite.by=Convidado por %s teams.invite.description=Por favor, clique no botão abaixo para se juntar à equipe. settings.email = E-mail de contato @@ -3141,7 +2999,6 @@ dashboard.gc_metadata_obtained=Metadados do GC obtidos dashboard.other_system_allocation_obtained=Outra alocação de sistema obtida dashboard.next_gc_recycle=Próxima reciclagem do GC dashboard.last_gc_time=Tempo desde última GC -dashboard.total_gc_time=Pausa total do GC dashboard.total_gc_pause=Pausa total de GC dashboard.last_gc_pause=Última pausa de GC dashboard.gc_times=Número de execuções do GC @@ -3234,9 +3091,6 @@ repos.unadopted.no_more=Não foram encontrados repositórios não adotados. repos.owner=Proprietário(a) repos.name=Nome repos.private=Privado -repos.watches=Observadores -repos.stars=Favoritos -repos.forks=Forks repos.issues=Issues repos.size=Tamanho repos.lfs_size=Tamanho do LFS @@ -3338,17 +3192,6 @@ auths.oauth2_admin_group=Valor do claim de grupo para os usuários administrador auths.oauth2_restricted_group=Valor do claim de grupo para os usuários restritos. (Opcional - requer nome do claim acima) auths.oauth2_map_group_to_team=Mapear grupos do claim a equipes da organização. (Opcional - requer nome do claim acima) auths.oauth2_map_group_to_team_removal=Remover usuários de equipes sincronizadas se o usuário não pertence ao grupo correspondente. -auths.enable_auto_register=Habilitar cadastro automático -auths.sspi_auto_create_users=Criar usuários automaticamente -auths.sspi_auto_create_users_helper=Permitir que o método de autenticação SSPI crie automaticamente novas contas para usuários que fazem o login pela primeira vez -auths.sspi_auto_activate_users=Ativar usuários automaticamente -auths.sspi_auto_activate_users_helper=Permitir que o método de autenticação SSPI ative automaticamente novos usuários -auths.sspi_strip_domain_names=Remover nomes de domínio dos nomes de usuário -auths.sspi_strip_domain_names_helper=Se marcado, nomes de domínio serão removidos dos nomes de logon (ex. "DOMÍNIO\usuário" e "user@examplo.org" ambos se tornarão apenas "usuário"). -auths.sspi_separator_replacement=Separador a ser usado em vez de \, / e @ -auths.sspi_separator_replacement_helper=Caractere a ser usado para substituir os separadores de nomes de logon de nível baixo (ex. os \ em "DOMINIO\usuario") e nomes principais de usuário (ex. @ em "usuario@examplo.org"). -auths.sspi_default_language=Idioma padrão do usuário -auths.sspi_default_language_helper=Idioma padrão para usuários criados automaticamente pelo método de autenticação SSPI. Deixe em branco se você prefere que o idioma seja detectado automaticamente. auths.tips=Dicas auths.tips.oauth2.general=Autenticação OAuth2 auths.tips.oauth2.general.tip=Ao registrar uma nova autenticação OAuth2, o URL de retorno de chamada/redirecionamento deve ser: @@ -3358,7 +3201,6 @@ auths.tip.nextcloud=`Registre um novo consumidor OAuth em sua instância usando auths.tip.dropbox=Criar um novo aplicativo em %s auths.tip.facebook=`Cadastrar um novo aplicativo em %s e adicionar o produto "Facebook Login"` auths.tip.github=Cadastrar um novo aplicativo de OAuth na %s -auths.tip.gitlab=Cadastrar um novo aplicativo em https://gitlab.com/profile/applications auths.tip.google_plus=Obter credenciais de cliente OAuth2 do console de API do Google em %s auths.tip.openid_connect=Use o OpenID Connect Discovery URL (/.well-known/openid-configuration) para especificar os endpoints auths.tip.twitter=Vá em %s, crie um aplicativo e certifique-se de que está habilitada a opção “Allow this application to be used to Sign in with Twitter“ @@ -3980,8 +3822,6 @@ variables = Variáveis variables.id_not_exist = A variável com o ID %d não existe. variables.deletion.failed = Falha ao remover a variável. variables.creation.failed = Falha ao adicionar a variável. -runs.no_workflows.documentation = Para mais informações sobre Forgejo Actions, veja a documentação. -runs.no_workflows.quick_start = Forgejo Actions é uma novidade para você? Veja o guia rápido. runs.no_results = Nenhum resultado. variables.description = As variáveis serão passadas para certas ações e não poderão ser lidas de outra forma. workflow.dispatch.trigger_found = Este workflow tem um disparador de evento workflow_dispatch. @@ -4037,16 +3877,12 @@ project_kind = Buscar projetos… search = Buscar… fuzzy = Aproximada fuzzy_tooltip = Incluir resultados que se aproximam dos termos de busca -match = Correspondente -match_tooltip = Inclui apenas os resultados que correspondem exatamente aos termos de busca repo_kind = Buscar repositórios… type_tooltip = Tipo de busca -code_search_by_git_grep = Os resultados atuais da pesquisa de código são fornecidos por "git grep". Pode haver melhores resultados se o administrador do site ativar o indexador de código. branch_kind = Buscar ramos… commit_kind = Buscar commits… runner_kind = Buscar runners… code_search_unavailable = A pesquisa de código não está disponível no momento. Entre em contato com o administrador do site. -milestone_kind = Pesquisar marcos... union_tooltip = Incluir resultados que correspondam a quaisquer palavras-chave separadas por espaços union = União exact = Exato diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index a8afe522d7..2b746c39ae 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -49,21 +49,14 @@ webauthn_error_unable_to_process=O servidor não conseguiu processar o seu pedid webauthn_error_duplicated=A chave de segurança não é permitida neste pedido. Certifique-se de que a chave não está já registada. webauthn_error_empty=Você tem que definir um nome para esta chave. webauthn_error_timeout=O tempo limite foi atingido antes que a sua chave pudesse ser lida. Recarregue esta página e tente novamente. -webauthn_reload=Recarregar - repository=Repositório organization=Organização mirror=Réplica -new_repo=Novo repositório -new_migrate=Nova migração new_mirror=Nova réplica new_fork=Nova derivação do repositório -new_org=Nova organização new_project=Novo projeto new_project_column=Nova coluna -manage_org=Gerir organizações admin_panel=Administração do site -account_settings=Configurações da conta settings=Configurações your_profile=Perfil your_starred=Favoritos @@ -218,8 +211,6 @@ string.desc=Z - A [error] occurred=Ocorreu um erro report_message=Se acredita de que se trata de um erro do Forgejo, procure, por favor, questões relacionadas no Codeberg ou abra uma nova questão, se necessário. -missing_csrf=Pedido inválido: não há código CSRF -invalid_csrf=Pedido inválido: código CSRF inválido not_found=Não foi possível encontrar o destino. network_error=Erro de rede server_internal = Erro interno do servidor @@ -355,15 +346,10 @@ allow_only_external_registration = Permitir registo apenas através de serviços [home] uname_holder=Nome de utilizador ou endereço de email -password_holder=Senha switch_dashboard_context=Trocar contexto do painel my_repos=Repositórios -show_more_repos=Mostrar mais repositórios… -collaborative_repos=Repositórios colaborativos my_orgs=Organizações -my_mirrors=As minhas réplicas view_home=Ver %s -search_repos=Procurar um repositório… filter=Outros filtros filter_by_team_repositories=Filtrar por repositórios da equipa feed_of=`Fonte de "%s"` @@ -384,20 +370,8 @@ issues.in_your_repos=Nos seus repositórios repos=Repositórios users=Utilizadores organizations=Organizações -search=Procurar go_to=Ir para code=Código -search.type.tooltip=Tipo de pesquisa -search.fuzzy=Aproximada -search.fuzzy.tooltip=Incluir também os resultados que estejam próximos do termo de pesquisa -search.match=Fiel -search.match.tooltip=Incluir somente os resultados que correspondam rigorosamente ao termo de pesquisa -code_search_unavailable=A pesquisa por código-fonte não está disponível, neste momento. Entre em contacto com o administrador. -repo_no_results=Não foram encontrados quaisquer repositórios correspondentes. -user_no_results=Não foram encontrados quaisquer utilizadores correspondentes. -org_no_results=Não foram encontradas quaisquer organizações correspondentes. -code_no_results=Não foi encontrado qualquer código-fonte correspondente à sua pesquisa. -code_search_results=`Resultados da pesquisa para "%s"` code_last_indexed_at=Última indexação %s relevant_repositories_tooltip=Repositórios que são derivações ou que não têm tópico, nem ícone, nem descrição, estão escondidos. relevant_repositories=Apenas estão a ser mostrados os repositórios relevantes. Mostrar resultados não filtrados. @@ -408,16 +382,12 @@ forks_few = %d derivações [auth] create_new_account=Fazer inscrição -register_helper_msg=Já tem uma conta? Inicie a sessão agora! -social_register_helper_msg=Já tem uma conta? Associe-a agora! disable_register_prompt=As inscrições estão desabilitadas. Entre em contacto com o administrador do sítio. disable_register_mail=A confirmação por email da inscrição está desabilitada. manual_activation_only=Contacte o administrador para completar a habilitação. remember_me=Memorizar este dispositivo -remember_me.compromised=O identificador da sessão já não é válido, o que pode indicar uma conta comprometida. Verifique se a sua conta apresenta operações pouco habituais. forgot_password_title=Esqueci-me da palavra-passe forgot_password=Esqueceu a sua senha? -sign_up_now=Precisa de uma conta? Inscreva-se agora. sign_up_successful=A conta foi criada com sucesso. Bem-vindo/a! confirmation_mail_sent_prompt=Foi enviado um novo email de confirmação para %s. Para completar o processo de inscrição, verifique a sua caixa de entrada e siga a ligação fornecida dentro de %s. Se o email estiver errado, pode iniciar a sessão e pedir que seja enviado outro email de confirmação para um endereço diferente. must_change_password=Mude a sua senha @@ -430,7 +400,6 @@ prohibit_login_desc=A sua conta foi suspendida de interagir com a instância. Co resent_limit_prompt=Já fez um pedido recentemente para enviar um email para pôr a conta em funcionamento. Espere 3 minutos e tente novamente. has_unconfirmed_mail=Olá %s, tem um endereço de email não confirmado (%s). Se não recebeu um email de confirmação ou precisa de o voltar a enviar, clique no botão abaixo. resend_mail=Clique aqui para voltar a enviar um email para pôr a conta em funcionamento -email_not_associate=O endereço de email não está associado a qualquer conta. send_reset_mail=Enviar email de recuperação da conta reset_password=Recuperação de conta invalid_code=O seu código de confirmação é inválido ou expirou. @@ -447,7 +416,6 @@ twofa_scratch_used=Você usou o seu código de recuperação. Foi reencaminhado twofa_passcode_incorrect=A senha está errada. Se perdeu o seu dispositivo, use o código de recuperação para iniciar a sessão. twofa_scratch_token_incorrect=O código de recuperação está errado. login_userpass=Iniciar sessão -tab_openid=OpenID oauth_signup_tab=Fazer inscrição oauth_signup_title=Completar a nova conta oauth_signup_submit=Completar conta @@ -473,14 +441,11 @@ authorize_application_description=Se conceder acesso, a aplicação terá privil authorize_title=Autorizar o acesso de "%s" à sua conta? authorization_failed=A autorização falhou authorization_failed_desc=A autorização falhou porque encontrámos um pedido inválido. Entre em contacto com o responsável pela aplicação que tentou autorizar. -sspi_auth_failed=Falhou a autenticação SSPI password_pwned=A senha utilizada está numa lista de senhas roubadas anteriormente expostas em fugas de dados públicas. Tente novamente com uma senha diferente e considere também mudar esta senha nos outros sítios. password_pwned_err=Não foi possível completar o pedido ao HaveIBeenPwned last_admin=Não pode remover o último administrador. Tem que existir pelo menos um administrador. change_unconfirmed_email = Se forneceu um endereço de email errado durante o registo, pode mudá-lo abaixo e ser-lhe-á enviada uma confirmação para o novo endereço. change_unconfirmed_email_summary = Mudar o endereço de email para onde a mensagem de habilitação é enviada. -tab_signin = Iniciar sessão -tab_signup = Criar conta change_unconfirmed_email_error = Não foi possível mudar o endereço de email: %v hint_login = Já tem uma conta? Inicie a sessão agora! hint_register = Precisa de uma conta? Faça uma inscrição agora. @@ -497,22 +462,18 @@ link_not_working_do_paste=A ligação não funciona? Tente copiar e colar na bar hi_user_x=Olá %s, activate_account=Por favor, ponha a sua conta em funcionamento -activate_account.title=%s, por favor habilite a sua conta activate_account.text_1=Olá %[1]s, obrigado por se registar em %[2]s! activate_account.text_2=Clique, por favor, na ligação seguinte para activar a sua conta dentro de %s: activate_email=Valide o seu endereço de email -activate_email.title=%s, por favor valide o seu endereço de email activate_email.text=Por favor clique na seguinte ligação para validar o seu endereço de email dentro de %s: register_notify=Bem-vindo/a ao %s -register_notify.title=%[1]s, bem-vindo(a) a %[2]s register_notify.text_1=este é o seu email de confirmação de registo para %s! register_notify.text_2=Pode iniciar a sessão usando o seu nome de utilizador: %s register_notify.text_3=Se outra pessoa criou esta conta para si, terá de definir a sua senha primeiro. reset_password=Recupere a sua conta -reset_password.title=%s, recebemos um pedido para recuperar a sua conta reset_password.text=Se foi você, clique na ligação seguinte para recuperar a sua conta dentro de %s: register_success=Inscrição bem sucedida @@ -587,8 +548,6 @@ RepoName=Nome do repositório Email=Endereço de email Password=Senha Retype=Confirme a senha -SSHTitle=Nome da chave SSH -HttpsUrl=URL HTTPS PayloadUrl=URL da carga TeamName=Nome da equipa AuthName=Nome da autorização @@ -601,9 +560,6 @@ CommitChoice=Escolha do cometimento TreeName=Localização do ficheiro Content=Conteúdo -SSPISeparatorReplacement=Separador -SSPIDefaultLanguage=Idioma padrão - require_error=` não pode estar em branco.` alpha_dash_error=` deve conter apenas caracteres alfanuméricos, hífen ("-") e sublinhado ("_").` alpha_dash_dot_error=` deve conter apenas caracteres alfanuméricos, hífen ("-"), sublinhado ("_") e ponto (".").` @@ -625,7 +581,6 @@ lang_select_error=Escolha um idioma da lista. username_been_taken=O nome de utilizador já foi tomado. username_change_not_local_user=Utilizadores que não são locais não têm permissão para mudar o nome de utilizador. -username_has_not_been_changed=O nome de utilizador não foi modificado repo_name_been_taken=O nome do repositório já foi usado. repository_force_private=Forçar Privado está habilitado: repositórios privados não podem ser tornados públicos. repository_files_already_exist=Já existem ficheiros neste repositório. Contacte o administrador do sistema. @@ -705,7 +660,6 @@ unfollow=Deixar de seguir user_bio=Biografia disabled_public_activity=Este utilizador desabilitou a visibilidade pública do trabalho. email_visibility.limited=O seu endereço de email é visível para todos os utilizadores autenticados -email_visibility.private=O seu endereço de email só é visível para si e para os administradores show_on_map=Mostrar este lugar num mapa settings=Configurações do utilizador @@ -740,13 +694,11 @@ password=Senha security=Segurança avatar=Avatar ssh_gpg_keys=Chaves SSH / GPG -social=Contas sociais applications=Aplicações orgs=Organizações repos=Repositórios delete=Eliminar conta twofa=Autenticação em dois passos (TOTP) -account_link=Contas vinculadas organization=Organizações uid=UID webauthn=Autenticação em dois passos (chaves de segurança) @@ -793,10 +745,7 @@ comment_type_group_issue_ref=Referência da questão saved_successfully=As suas configurações foram guardadas com sucesso. privacy=Privacidade keep_activity_private=Esconder trabalho da página do perfil -keep_activity_private_popup=O seu trabalho será visível apenas para si e para os administradores da instância - lookup_avatar_by_mail=Procurar avatar com base no endereço de email -federated_avatar_lookup=Pesquisa de avatar federada enable_custom_avatar=Usar avatar personalizado choose_new_avatar=Escolher um novo avatar update_avatar=Substituir avatar @@ -814,7 +763,6 @@ password_incorrect=A senha corrente está errada. change_password_success=A sua senha foi atualizada. A partir de agora, utilize a sua nova senha para iniciar sessão. password_change_disabled=Os utilizadores não-locais não podem alterar a sua senha através da interface web do Forgejo. -emails=Endereços de email manage_emails=Gerir endereços de email manage_themes=Tema padrão manage_openid=Endereços OpenID @@ -857,8 +805,6 @@ principal_desc=Estes protagonistas de certificados SSH estão associados à sua gpg_desc=Essas chaves GPG públicas estão associadas à sua conta e usadas para verificar os seus cometimentos. Mantenha as suas chaves privadas seguras, uma vez que elas permitem assinar os cometimentos com a sua identidade. ssh_helper=Precisa de ajuda? Dê uma vista de olhos no guia do GitHub para criar as suas próprias chaves SSH ou para resolver problemas comuns que pode encontrar ao usar o SSH. gpg_helper=Precisa de ajuda? Dê uma vista de olhos no guia do GitHub sobre GPG. -add_new_key=Adicionar chave SSH -add_new_gpg_key=Adicionar chave GPG key_content_ssh_placeholder=Começa com "ssh-ed25519", "ssh-rsa", "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521", "sk-ecdsa-sha2-nistp256@openssh.com", ou "sk-ssh-ed25519@openssh.com" key_content_gpg_placeholder=Começa com "-----BEGIN PGP PUBLIC KEY BLOCK-----" add_new_principal=Adicionar protagonista @@ -876,7 +822,6 @@ gpg_invalid_token_signature=A chave GPG, assinatura ou código fornecidos não c gpg_token_required=Tem que fornecer uma assinatura para o código abaixo gpg_token=Código gpg_token_help=Pode gerar uma assinatura usando o seguinte comando: -gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=Assinatura GPG blindada (com armadura ASCII) key_signature_gpg_placeholder=Começa com "-----BEGIN PGP SIGNATURE-----" verify_gpg_key_success=A chave GPG "%s" foi validada. @@ -923,11 +868,6 @@ hide_openid=Ocultar do perfil ssh_disabled=SSH desabilitado ssh_signonly=Neste momento o SSH está desabiltado, por isso estas chaves são usadas apenas para verificar assinaturas de cometimentos. ssh_externally_managed=Esta chave SSH é gerida externamente para este utilizador -manage_social=Gerir contas sociais associadas -social_desc=Estas contas sociais podem ser usadas para iniciar sessão na sua conta. Certifique-se que as reconhece todas. -unbind=Desvincular -unbind_success=A conta social foi removida com sucesso. - manage_access_token=Códigos de acesso generate_new_token=Gerar um novo código tokens_desc=Esses códigos concedem acesso à sua conta usando a API do Forgejo. @@ -937,8 +877,6 @@ generate_token_success=O seu novo código foi gerado. Copie-o agora porque não generate_token_name_duplicate=%s já foi usado como nome de uma aplicação. Tente outro. delete_token=Eliminar access_token_deletion=Eliminar código de acesso -access_token_deletion_cancel_action=Cancelar -access_token_deletion_confirm_action=Eliminar access_token_deletion_desc=Eliminar um código revoga o acesso à sua conta nas aplicações que o usem. Esta operação não poderá ser revertida. Quer continuar? delete_token_success=O código foi eliminado. Aplicações que o usavam deixaram de ter acesso à sua conta. repo_and_org_access=Acesso aos repositórios e às organizações @@ -1012,7 +950,6 @@ webauthn_alternative_tip=Poderá querer configurar um método de autenticação manage_account_links=Contas vinculadas manage_account_links_desc=Estas contas externas estão vinculadas à sua conta do Forgejo. -account_links_not_available=Neste momento não existem contas externas vinculadas à sua conta do Forgejo. link_account=Vincular conta remove_account_link=Remover conta vinculada remove_account_link_desc=A remoção de uma conta vinculada revogará o acesso dessa conta à sua conta do Forgejo. Quer continuar? @@ -1047,7 +984,6 @@ additional_repo_units_hint = Sugere a habilitação de unidades do repositório update_hints = Modificar sugestões change_password = Modificar a senha pronouns = Pronomes -pronouns_custom = Personalizado pronouns_unspecified = Não especificado hints = Sugestões blocked_users = Utilizadores bloqueados @@ -1061,7 +997,6 @@ language.title = Idioma predefinido keep_activity_private.description = O seu trabalho público apenas estará visível para si e para os administradores da instância. language.description = Este idioma vai ser guardado na sua conta e ser usado como o predefinido depois de iniciar sessão. language.localization_project = Ajude-nos a traduzir o Forgejo para o seu idioma! Saiba mais. -pronouns_custom_label = Pronomes personalizados user_block_yourself = Não se pode bloquear a si próprio. change_username_redirect_prompt.with_cooldown.one = O nome de utilizador antigo estará disponível para todos após um período de espera de %[1]d dia. Pode ainda reivindicar o nome de utilizador antigo durante o período de espera. change_username_redirect_prompt.with_cooldown.few = O nome de utilizador antigo ficará disponível para todos após um período de espera de %[1]d dias. Pode ainda reivindicar o nome de utilizador antigo durante o período de espera. @@ -1118,7 +1053,6 @@ fork_branch=Ramo a ser clonado para a derivação all_branches=Todos os ramos fork_no_valid_owners=Não pode fazer uma derivação deste repositório porque não existem proprietários válidos. use_template=Usar este modelo -clone_in_vsc=Clonar no VS Code download_zip=Descarregar ZIP download_tar=Descarregar TAR.GZ download_bundle=Descarregar PACOTE @@ -1140,11 +1074,6 @@ readme=README readme_helper=Escolha um modelo de ficheiro README readme_helper_desc=Este é o sítio onde pode escrever uma descrição completa do seu trabalho. auto_init=Inicializar repositório -trust_model_helper=Escolha o modelo de confiança para a validação das assinaturas. As opções são: -trust_model_helper_collaborator=Colaborador: Confiar nas assinaturas dos colaboradores -trust_model_helper_committer=Autor do cometimento: Confiar nas assinaturas que correspondem a autores de cometimentos -trust_model_helper_collaborator_committer=Colaborador + Autor do cometimento: Confiar nas assinaturas de colaboradores que correspondem ao autor do cometimento -trust_model_helper_default=Padrão: Usar o modelo de confiança padrão para esta instalação create_repo=Criar repositório default_branch=Ramo principal default_branch_label=predefinido @@ -1219,9 +1148,6 @@ template.invalid=Tem que escolher um repositório modelo archive.title=Este repositório está arquivado. Pode ver os ficheiros e cloná-lo, mas não pode fazer quaisquer alterações ao seu estado, tais como fazer envios e criar novas questões, pedidos de integração ou comentários. archive.title_date=Este repositório foi arquivado em %s. Pode ver os ficheiros e cloná-lo, mas não pode fazer quaisquer alterações ao seu estado, tais como fazer envios e criar novas questões, pedidos de integração ou comentários. -archive.issue.nocomment=Este repositório está arquivado. Não pode comentar nas questões. -archive.pull.nocomment=Este repositório está arquivado. Não pode comentar nos pedidos de integração. - form.reach_limit_of_creation_1=Já atingiu o seu limite de %d repositório. form.reach_limit_of_creation_n=Já atingiu o seu limite de %d repositórios. form.name_reserved=O nome de repositório "%s" está reservado. @@ -1229,7 +1155,6 @@ form.name_pattern_not_allowed=O padrão "%s" não é permitido no nome de um rep need_auth=Autorização migrate_options=Opções de migração -migrate_service=Serviço de migração migrate_options_mirror_helper=Este repositório irá ser uma réplica migrate_options_lfs=Migrar ficheiros LFS migrate_options_lfs_endpoint.label=Destino LFS @@ -1315,7 +1240,6 @@ branches=Ramos tags=Etiquetas issues=Questões pulls=Pedidos de integração -project_board=Planeamentos packages=Pacotes actions=Operações labels=Rótulos @@ -1329,7 +1253,6 @@ release=Lançamento releases=Lançamentos tag=Etiqueta released_this=lançou isto -tagged_this=etiquetou isto file.title=%s em %s file_raw=Em bruto file_history=Histórico @@ -1443,9 +1366,7 @@ commits.desc=Navegar pelo histórico de modificações no código fonte. commits.commits=Cometimentos commits.no_commits=Não há cometimentos em comum. "%s" e "%s" têm históricos completamente diferentes. commits.nothing_to_compare=Estes ramos são iguais. -commits.search=Procurar cometimentos… commits.search.tooltip=Pode prefixar palavras-chave com "author:", "committer:", "after:", ou "before:". Por exemplo: "revert author:Alice before:2019-01-13". -commits.find=Procurar commits.search_all=Todos os ramos commits.author=Autor(a) commits.message=Mensagem @@ -1473,8 +1394,6 @@ commitstatus.pending=Pendente commitstatus.success=Sucesso ext_issues=Questões externas -ext_issues.desc=Ligação para um rastreador de questões externo. - projects=Planeamentos projects.desc=Gerir questões e integrações nos quadros do planeamento. projects.description=Descrição (opcional) @@ -1496,7 +1415,6 @@ projects.type.basic_kanban=Kanban básico projects.type.bug_triage=Triagem de erros projects.template.desc=Modelo projects.template.desc_helper=Escolha um modelo de projeto para começar -projects.type.uncategorized=Sem categoria projects.column.edit=Editar coluna projects.column.edit_title=Nome projects.column.new_title=Nome @@ -1504,8 +1422,6 @@ projects.column.new_submit=Criar coluna projects.column.new=Nova coluna projects.column.set_default=Tornar predefinida projects.column.set_default_desc=Definir esta coluna como a predefinida para questões e pedidos de integração não categorizados -projects.column.unset_default=Deixar de ser a predefinida -projects.column.unset_default_desc=Faz com que esta coluna deixe de ser a predefinida projects.column.delete=Eliminar coluna projects.column.deletion_desc=Eliminar uma coluna de um projeto faz com que todas as questões que nela constam sejam movidas para a coluna padrão. Continuar? projects.column.color=Colorido @@ -1619,7 +1535,6 @@ issues.filter_sort.moststars=Favorito (decrescente) issues.filter_sort.feweststars=Favorito (crescente) issues.filter_sort.mostforks=Mais derivações issues.filter_sort.fewestforks=Menos derivações -issues.keyword_search_unavailable=A pesquisa por palavra-chave não está disponível, neste momento. Entre em contacto com o administrador. issues.action_open=Abrir issues.action_close=Fechar issues.action_label=Rótulo @@ -1664,11 +1579,8 @@ issues.ref_issue_from=`referiu esta questão %[3]s %[1]s` issues.ref_pull_from=`referiu este pedido de integração %[3]s %[1]s` issues.ref_closing_from=`referiu esta questão a partir de um pedido de integração %[3]s que a fechará %[1]s` issues.ref_reopening_from=`referiu esta questão a partir de um pedido de integração %[3]s que a reabrirá %[1]s` -issues.ref_closed_from=`encerrou esta questão %[4]s %[2]s` -issues.ref_reopened_from=`reabriu esta questão %[4]s %[2]s` issues.ref_from=`de %[1]s` issues.author=Autor(a) -issues.author_helper=Este utilizador é o autor. issues.role.owner=Proprietário(a) issues.role.owner_helper=Este utilizador é o proprietário deste repositório. issues.role.member=Membro @@ -1763,18 +1675,13 @@ issues.add_time_sum_to_small=Não foi inserido qualquer tempo. issues.time_spent_total=Total de tempo gasto issues.time_spent_from_all_authors=`Total de tempo gasto: %s` issues.due_date=Data de vencimento -issues.invalid_due_date_format=O formato da data de vencimento tem que ser "aaaa-mm-dd". -issues.error_modifying_due_date=Falhou a modificação da data de vencimento. -issues.error_removing_due_date=Falhou a remoção da data de vencimento. issues.push_commit_1=adicionou %d cometimento %s issues.push_commits_n=adicionou %d cometimentos %s issues.force_push_codes=`forçou o envio %[1]s de %[2]s %[8]s para %[4]s %[9]s %[6]s` issues.force_push_compare=Comparar issues.due_date_form=aaaa-mm-dd -issues.due_date_form_add=Adicionar data de vencimento issues.due_date_form_edit=Editar issues.due_date_form_remove=Remover -issues.due_date_not_writer=Tem que ter acesso de escrita neste repositório para poder modificar a data de vencimento de uma questão. issues.due_date_not_set=Sem data de vencimento definida. issues.due_date_added=adicionou a data de vencimento %s %s issues.due_date_modified=modificou a data de vencimento de %[2]s para %[1]s %[3]s @@ -1827,7 +1734,6 @@ issues.review.remove_review_request=removeu a solicitação de revisão para %[1 issues.review.remove_review_request_self=recusou-se a rever %s issues.review.pending=Pendente issues.review.pending.tooltip=Este comentário não está visível para os outros utilizadores, neste momento. Para submeter os seus comentários pendentes, escolha "%s" → "%s/%s/%s" no topo da página. -issues.review.review=Revisão issues.review.reviewers=Revisores issues.review.outdated=Obsoleta issues.review.outdated_description=O conteúdo mudou desde que este comentário foi feito @@ -1840,7 +1746,6 @@ issues.review.hide_resolved=Ocultar os concluídos issues.review.resolve_conversation=Passar diálogo ao estado de resolvido issues.review.un_resolve_conversation=Passar diálogo ao estado de não resolvido issues.review.resolved_by=marcou este diálogo como estando concluído -issues.assignee.error=Nem todos os encarregados foram adicionados devido a um erro inesperado. issues.reference_issue.body=Conteúdo issues.content_history.deleted=eliminado issues.content_history.edited=editado @@ -1848,8 +1753,6 @@ issues.content_history.created=criado issues.content_history.delete_from_history=Eliminar do histórico issues.content_history.delete_from_history_confirm=Eliminar do histórico? issues.content_history.options=Opções -issues.reference_link=Referência: %s - compare.compare_base=base compare.compare_head=comparar @@ -1884,8 +1787,6 @@ pulls.nothing_to_compare_have_tag=Os ramos/etiquetas escolhidos são iguais. pulls.nothing_to_compare_and_allow_empty_pr=Estes ramos são iguais. Este pedido de integração ficará vazio. pulls.has_pull_request=`Já existe um pedido de integração entre estes ramos: %[2]s#%[3]d` pulls.create=Criar um pedido de integração -pulls.title_desc_few=quer integrar %[1]d cometimento(s) do ramo %[2]s no ramo %[3]s -pulls.merged_title_desc_few=integrou %[1]d cometimento(s) do ramo %[2]s no ramo %[3]s %[4]s pulls.change_target_branch_at=`mudou o ramo de destino de %s para %s %s` pulls.tab_conversation=Diálogo pulls.tab_commits=Cometimentos @@ -2046,8 +1947,6 @@ signing.wont_sign.approved=A integração não irá ser assinada, uma vez que o signing.wont_sign.not_signed_in=Não tem a sessão iniciada. ext_wiki=Wiki externo -ext_wiki.desc=Ligação para um wiki externo. - wiki=Wiki wiki.welcome=Bem-vindo(a) à wiki. wiki.welcome_desc=O wiki permite escrever e partilhar documentação com os colaboradores. @@ -2148,17 +2047,6 @@ contributors.contribution_type.commits=Cometimentos contributors.contribution_type.additions=Adições contributors.contribution_type.deletions=Eliminações -search=Procurar -search.search_repo=Procurar repositório -search.type.tooltip=Tipo de pesquisa -search.fuzzy=Aproximada -search.fuzzy.tooltip=Incluir também os resultados que estejam próximos do termo de pesquisa -search.match=Fiel -search.match.tooltip=Incluir somente os resultados que correspondam rigorosamente ao termo de pesquisa -search.results=Resultados da procura de "%s" em %s -search.code_no_results=Não foi encontrado qualquer código-fonte correspondente à sua pesquisa. -search.code_search_unavailable=A pesquisa por código-fonte não está disponível, neste momento. Entre em contacto com o administrador. - settings=Configurações settings.desc=Configurações é onde pode gerir as configurações do repositório settings.options=Repositório @@ -2266,7 +2154,6 @@ settings.transfer_abort=Cancelar a transferência settings.transfer_abort_invalid=Não pode cancelar a transferência de um repositório inexistente. settings.transfer_abort_success=A transferência de repositório para %s foi cancelada com sucesso. settings.transfer_desc=Transferir este repositório para um utilizador ou para uma organização na qual você tenha direitos de administrador. -settings.transfer_form_title=Insira o nome do repositório para confirmar: settings.transfer_in_progress=Está a ser feita uma transferência. Cancele-a, por favor, se quiser transferir este repositório para outro utilizador. settings.transfer_notices_1=- Você perderá o acesso ao repositório se o transferir para um utilizador individual. settings.transfer_notices_2=- Você manterá o acesso ao repositório se o transferir para uma organização da qual você é (co-)proprietário(a). @@ -2311,7 +2198,6 @@ settings.delete_collaborator=Remover settings.collaborator_deletion=Remover colaborador settings.collaborator_deletion_desc=Remover um colaborador irá revogar o seu acesso a este repositório. Quer continuar? settings.remove_collaborator_success=O colaborador foi removido. -settings.search_user_placeholder=Procurar utilizador… settings.org_not_allowed_to_be_collaborator=As organizações não podem ser adicionadas como colaborador. settings.change_team_access_not_allowed=Alterar o acesso da equipa ao repositório foi restrito ao proprietário da organização settings.team_not_in_organization=A equipa não está na mesma organização que o repositório @@ -2319,7 +2205,6 @@ settings.teams=Equipas settings.add_team=Adicionar equipa settings.add_team_duplicate=A equipa já tem o repositório settings.add_team_success=A equipa agora tem acesso ao repositório. -settings.search_team=Procurar equipa… settings.change_team_permission_tip=A permissão da equipa é definida na página de configurações da equipa e não pode ter modificações específicas de cada repositório settings.delete_team_tip=Esta equipa tem acesso a todos os repositórios e não pode ser removida settings.remove_team_success=O acesso da equipa ao repositório foi removido. @@ -2457,12 +2342,7 @@ settings.branches=Ramos settings.protected_branch=Salvaguarda do ramo settings.protected_branch.save_rule=Guardar regra settings.protected_branch.delete_rule=Eliminar regra -settings.protected_branch_can_push=Permitir envios? -settings.protected_branch_can_push_yes=Pode enviar -settings.protected_branch_can_push_no=Não pode enviar settings.branch_protection=Regras de salvaguarda do ramo '%s' -settings.protect_this_branch=Habilitar salvaguarda do ramo -settings.protect_this_branch_desc=Impede a eliminação e restringe envios e integrações do Git no ramo. settings.protect_disable_push=Desabilitar envios settings.protect_disable_push_desc=Não será permitido enviar para este ramo. settings.protect_enable_push=Habilitar envios @@ -2473,9 +2353,7 @@ settings.protect_whitelist_committers=Lista de permissões para restringir os en settings.protect_whitelist_committers_desc=Apenas os utilizadores ou equipas constantes na lista terão permissão para enviar para este ramo (mas não poderão fazer envios forçados). settings.protect_whitelist_deploy_keys=Dar permissão às chaves de instalação para terem acesso de escrita para enviar. settings.protect_whitelist_users=Utilizadores com permissão para enviar -settings.protect_whitelist_search_users=Procurar utilizadores… settings.protect_whitelist_teams=Equipas com permissão para enviar -settings.protect_whitelist_search_teams=Procurar equipas… settings.protect_merge_whitelist_committers=Habilitar lista de permissão para integrar settings.protect_merge_whitelist_committers_desc=Permitir que somente utilizadores ou equipas constantes na lista de permissão possam executar, neste ramo, integrações constantes em pedidos de integração. settings.protect_merge_whitelist_users=Utilizadores com permissão para executar integrações @@ -2507,8 +2385,6 @@ settings.protect_protected_file_patterns=Padrões de ficheiros protegidos (separ settings.protect_protected_file_patterns_desc=Ficheiros protegidos não podem ser modificados imediatamente, mesmo que o utilizador tenha direitos para adicionar, editar ou eliminar ficheiros neste ramo. Múltiplos padrões podem ser separados com ponto e vírgula (";"). Veja a documentação em %s para ver a sintaxe. Exemplos: .drone.yml, /docs/**/*.txt. settings.protect_unprotected_file_patterns=Padrões de ficheiros desprotegidos (separados com ponto e vírgula ";") settings.protect_unprotected_file_patterns_desc=Ficheiros desprotegidos que podem ser modificados imediatamente se o utilizador tiver direitos de escrita, contornando a restrição no envio. Padrões múltiplos podem ser separados com ponto e vírgula (";"). Veja a documentação em %[2]s para ver a sintaxe. Exemplos: .drone.yml, /docs/**/*.txt. -settings.add_protected_branch=Habilitar salvaguarda -settings.delete_protected_branch=Desabilitar salvaguarda settings.update_protect_branch_success=A salvaguarda do ramo "%s" foi modificada. settings.remove_protected_branch_success=A salvaguarda do ramo "%s" foi removida. settings.remove_protected_branch_failed=A remoção da regra "%s" de salvaguarda do ramo falhou. @@ -2588,8 +2464,6 @@ settings.lfs_pointers.associateAccessible=Associar %d OIDs acessíveis settings.rename_branch_failed_exist=Não é possível renomear o ramo porque já existe o ramo de destino %s. settings.rename_branch_failed_not_exist=Não é possível renomear o ramo %s porque ele não existe. settings.rename_branch_success=O ramo %s foi renomeado para %s com sucesso. -settings.rename_branch_from=antigo nome do ramo -settings.rename_branch_to=novo nome do ramo settings.rename_branch=Renomear ramo diff.browse_source=Ver a proveniência @@ -2598,7 +2472,6 @@ diff.commit=cometimento diff.git-notes=Notas diff.data_not_available=O conteúdo das diferenças não está disponível diff.options_button=Opções das diferenças -diff.show_diff_stats=Mostrar estatísticas diff.download_patch=Descarregar ficheiro patch diff.download_diff=Descarregar ficheiro diff diff.show_split_view=Visualização em 2 colunas @@ -2691,7 +2564,6 @@ release.tag_name_invalid=A etiqueta não é válida. release.tag_name_protected=O nome da etiqueta está protegido. release.tag_already_exist=Este nome de etiqueta já existe. release.downloads=Descargas -release.download_count=Descargas: %s release.add_tag_msg=Usar o título e o conteúdo do lançamento como mensagem da etiqueta. release.add_tag=Criar etiqueta release.releases_for=Lançamentos para %s @@ -2720,14 +2592,12 @@ branch.default_deletion_failed=O ramo "%s" é o ramo principal, não pode ser el branch.restore=Restaurar o ramo "%s" branch.download=Descarregar o ramo "%s" branch.rename=Renomear o ramo "%s" -branch.search=Pesquisar ramo branch.included_desc=Este ramo faz parte do ramo principal branch.included=Incluído branch.create_new_branch=Criar ramo a partir do ramo: branch.confirm_create_branch=Criar ramo branch.warning_rename_default_branch=Está a renomear o ramo principal. branch.rename_branch_to=Renomear "%s" para: -branch.confirm_rename_branch=Renomear ramo branch.create_branch_operation=Criar ramo branch.new_branch=Criar um novo ramo branch.new_branch_from=`Criar um novo ramo a partir do ramo "%s"` @@ -2777,7 +2647,6 @@ migrate.forgejo.description = Migrar dados de codeberg.org ou de outras instânc n_commit_one = %s cometimento editor.commit_id_not_matching = O ficheiro foi modificado enquanto o estava a editar. Cometa para um ramo novo e depois integre. commits.search_branch = Este ramo -pulls.title_desc_one = quer integrar %[1]d cometimento do ramo %[2]s no ramo %[3]s pulls.reopen_failed.base_branch = O pedido de integração não pode ser reaberto porque o ramo base já não existe. activity.navbar.code_frequency = Frequência de programação settings.units.add_more = Habilitar mais @@ -2804,7 +2673,6 @@ release.download_count_few = %s descargas release.system_generated = Este anexo é gerado automaticamente. pulls.ready_for_review = Pronto/a para rever? settings.units.units = Unidades -error.broken_git_hook = Os automatismos git deste repositório parecem estar danificados. Consulte a documentação sobre como os consertar e depois envie alguns cometimentos para refrescar o estado. settings.rename_branch_failed_protected = Não é possível renomear o ramo %s porque é um ramo protegido. settings.units.overview = Visão geral activity.navbar.recent_commits = Cometimentos recentes @@ -2817,8 +2685,6 @@ settings.sourcehut_builds.secrets = Segredos settings.matrix.room_id_helper = O ID da Sala pode ser obtido no cliente web Element > Configurações da sala > Avançado > ID interno da sala. Exemplo: %s. settings.web_hook_name_sourcehut_builds = Construções do SourceHut settings.enter_repo_name = Insira o nome do/a proprietário/a e do repositório tal como é apresentado: -issues.comment.blocked_by_user = Não pode comentar nesta questão porque foi bloqueado(a) pelo(a) proprietário(a) ou pelo autor da questão. -pulls.merged_title_desc_one = integrou %[1]d cometimento do ramo %[2]s no ramo %[3]s %[4]s pulls.agit_explanation = Criado usando a sequência de trabalho AGit. AGit deixa os contribuidores proporem alterações usando "git push" sem criar uma derivação ou um ramo novo. settings.new_owner_blocked_doer = O/A novo/a proprietário/a bloqueou-o/a. settings.matrix.access_token_helper = É recomendado criar uma conta Matrix só para isto. O código de acesso pode ser obtido a partir do cliente web Element (num separador privado/incógnito) > Menu de utilizador (canto superior esquerdo) > Todas as configurações > Ajuda e sobre > Avançado > Código de acesso (logo abaixo do URL do servidor caseiro). Feche o separador privado/incógnito (terminar a sessão iria invalidar o código). @@ -2903,7 +2769,6 @@ release.summary_card_alt = Cartão de resumo de um lançamento com o título "%s archive.pull.noreview = Este repositório está arquivado. Não é possível rever os pedidos de integração. editor.commit_email = Endereço de email do cometimento commits.view_single_diff = Ver alterações a este ficheiro introduzidas neste cometimento -pulls.comment.blocked_by_user = Não pode comentar este pedido de integração porque está bloqueado pelo(a) proprietário(a) do repositório ou pelo(a) autor(a) do pedido de integração. issues.reopen.blocked_by_user = Não pode reabrir esta questão porque está bloqueado pelo(a) proprietário(a) do repositório ou pelo autor da questão. pulls.editable = Editável pulls.editable_explanation = Este pedido de integração permite edições dos responsáveis. Pode contribuir diretamente para ele. @@ -3015,9 +2880,7 @@ teams.none_access_helper=A opção "sem acesso" só tem efeito nos repositórios teams.general_access=Acesso personalizado teams.general_access_helper=As permissões dos membros serão decididas pela tabela de permissões abaixo. teams.read_access=Ler -teams.read_access_helper=Os membros podem ver e clonar os repositórios da equipa. teams.write_access=Escrever -teams.write_access_helper=Os membros podem ler e enviar para os repositórios da equipa. teams.admin_access=Acesso de administrador teams.admin_access_helper=Os membros podem puxar de, e enviar para os repositórios da equipa e adicionar colaboradores a esses repositórios. teams.no_desc=Esta equipa não tem descrição @@ -3032,12 +2895,9 @@ teams.invite_team_member.list=Convites pendentes teams.delete_team_title=Eliminar equipa teams.delete_team_desc=Eliminar uma equipa revoga o acesso dos seus membros ao repositório. Quer continuar? teams.delete_team_success=A equipa foi eliminada. -teams.read_permission_desc=Esta equipa atribui acesso de leitura: os seus membros podem ver e clonar os repositórios da equipa. -teams.write_permission_desc=Esta equipa atribui acesso de escrita: os seus membros podem ler de, e enviar para os repositórios da equipa. teams.admin_permission_desc=Esta equipa atribui o acesso de administração: os seus membros podem ler de, enviar para, e adicionar colaboradores aos repositórios da equipa. teams.create_repo_permission_desc=Adicionalmente, esta equipa atribui a permissão de criar repositórios: os seus membros podem criar novos repositórios na organização. teams.repositories=Repositórios da equipa -teams.search_repo_placeholder=Procurar repositório… teams.remove_all_repos_title=Remover todos os repositórios da equipa teams.remove_all_repos_desc=Isto irá remover todos os repositórios da equipa. teams.add_all_repos_title=Adicionar todos os repositórios @@ -3050,9 +2910,6 @@ teams.specific_repositories=Repositórios específicos teams.specific_repositories_helper=Os membros só terão acesso a repositórios explicitamente adicionados à equipa. Escolher isto não irá remover automaticamente os repositórios já adicionados com Todos os repositórios. teams.all_repositories=Todos os repositórios teams.all_repositories_helper=A equipa tem acesso a todos os repositórios. Escolher isto irá adicionar todos os repositórios existentes à equipa. -teams.all_repositories_read_permission_desc=Esta equipa atribui o acesso de leitura a todos os repositórios: os seus membros podem ver e clonar os repositórios. -teams.all_repositories_write_permission_desc=Esta equipa atribui o acesso de escrita a todos os repositórios: os seus membros podem ler de, e enviar para os repositórios. -teams.all_repositories_admin_permission_desc=Esta equipa atribui o acesso de administração a todos os repositórios: os seus membros podem ler de, enviar para, e adicionar colaboradores aos repositórios. teams.invite.title=Foi-lhe feito um convite para se juntar à equipa %s na organização%s. teams.invite.by=Convidado(a) por %s teams.invite.description=Clique no botão abaixo para se juntar à equipa. @@ -3150,7 +3007,6 @@ dashboard.gc_metadata_obtained=Metadados obtidos da recolha de lixo dashboard.other_system_allocation_obtained=Outras alocações de sistema obtidas dashboard.next_gc_recycle=Próxima reciclagem da recolha de lixo dashboard.last_gc_time=Tempo decorrido desde a última recolha de lixo -dashboard.total_gc_time=Pausa total da recolha de lixo dashboard.total_gc_pause=Pausa total da recolha de lixo dashboard.last_gc_pause=Última pausa da recolha de lixo dashboard.gc_times=N.º de recolhas de lixo @@ -3250,9 +3106,6 @@ repos.unadopted.no_more=Não foram encontrados repositórios não adotados. repos.owner=Proprietário(a) repos.name=Nome repos.private=Privado -repos.watches=Vigilâncias -repos.stars=Favoritos -repos.forks=Derivações repos.issues=Questões repos.size=Tamanho repos.lfs_size=Tamanho do LFS @@ -3357,17 +3210,6 @@ auths.oauth2_admin_group=Valor da reivindicação de grupo para utilizadores adm auths.oauth2_restricted_group=Valor da reivindicação de grupo para utilizadores restritos. (Opcional — exige a reivindicação de nome acima) auths.oauth2_map_group_to_team=Mapear grupos reclamados em equipas da organização. (Opcional — requer nome de reclamação acima) auths.oauth2_map_group_to_team_removal=Remover utilizadores das equipas sincronizadas se esses utilizadores não pertencerem ao grupo correspondente. -auths.enable_auto_register=Habilitar o registo automático -auths.sspi_auto_create_users=Criar utilizadores automaticamente -auths.sspi_auto_create_users_helper=Permitir que o método de autenticação SSPI crie, automaticamente, novas contas para utilizadores que iniciam a sessão pela primeira vez -auths.sspi_auto_activate_users=Habilitar utilizadores automaticamente -auths.sspi_auto_activate_users_helper=Permitir que o método de autenticação SSPI habilite automaticamente os novos utilizadores -auths.sspi_strip_domain_names=Remover nomes de domínio dos nomes de utilizador -auths.sspi_strip_domain_names_helper=Se esta opção estiver marcada, os nomes de domínio serão removidos dos nomes do início de sessão (ex.: "DOMÍNIO\utilizador" e "utilizador@exemplo.org" tornar-se-ão "utilizador", simplesmente). -auths.sspi_separator_replacement=Separador a usar em vez de \, / e @ -auths.sspi_separator_replacement_helper=O carácter a ser usado para substituir os separadores de nomes de início de sessão de nível inferior (ex.: o \ em "DOMÍNIO\utilizador") e os nomes principais do utilizador (ex.: o @ em "utilizador@exemplo.org"). -auths.sspi_default_language=Idioma predefinido do utilizador -auths.sspi_default_language_helper=Idioma predefinido para utilizadores criados automaticamente pelo método de autenticação SSPI. Deixe em branco se preferir que o idioma seja determinado automaticamente. auths.tips=Dicas auths.tips.oauth2.general=Autenticação OAuth2 auths.tips.oauth2.general.tip=Ao registar uma nova autenticação OAuth2, o URL da ligação de retorno ou do reencaminhamento deve ser: @@ -3377,7 +3219,6 @@ auths.tip.nextcloud=`Registe um novo consumidor OAuth na sua instância usando o auths.tip.dropbox=Crie uma nova aplicação em %s auths.tip.facebook=`Registe uma nova aplicação em %s e adicione o produto "Facebook Login"` auths.tip.github=Registe uma nova aplicação OAuth em %s -auths.tip.gitlab=Registe uma nova aplicação em https://gitlab.com/profile/applications auths.tip.google_plus=Obtenha credenciais de cliente OAuth2 a partir da consola do Google API em %s auths.tip.openid_connect=Use o URL da descoberta de conexão OpenID (/.well-known/openid-configuration) para especificar os extremos auths.tip.twitter=`Vá a %s, crie uma aplicação e certifique-se de que está habilitada a opção "Allow this application to be used to Sign in with Twitter"` @@ -3992,8 +3833,6 @@ variables.creation.failed=Falha ao adicionar a variável. variables.creation.success=A variável "%s" foi adicionada. variables.update.failed=Falha ao editar a variável. variables.update.success=A variável foi editada. -runs.no_workflows.documentation = Para mais informação sobre o Forgejo Action, veja a documentação. -runs.no_workflows.quick_start = Não sabe como começar com o Forgejo Action? Veja o guia de iniciação rápida. 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 @@ -4028,7 +3867,6 @@ submodule=Submódulo [search] org_kind = Pesquisar organizações… keyword_search_unavailable = Pesquisar por palavra-chave não está disponível, neste momento. Entre em contacto com o administrador. -code_search_by_git_grep = Os resultados da pesquisa no código-fonte neste momento são fornecidos pelo "git grep". Esses resultados podem ser melhores se o administrador habilitar o indexador de código-fonte. no_results = Não foram encontrados resultados correspondentes. package_kind = Pesquisar pacotes… runner_kind = Pesquisar executores… @@ -4039,8 +3877,6 @@ search = Procurar… type_tooltip = Tipo de pesquisa fuzzy = Aproximada fuzzy_tooltip = Incluir também os resultados que estejam próximos do termo de pesquisa -match = Fiel -match_tooltip = Incluir somente os resultados que correspondam rigorosamente ao termo de pesquisa repo_kind = Pesquisar repositórios… user_kind = Pesquisar utilizadores… team_kind = Pesquisar equipas… @@ -4052,7 +3888,6 @@ issue_kind = Procurar questões… pull_kind = Procurar pedidos de integração… union = Palavras-chave union_tooltip = Incluir resultados correspondentes a qualquer das palavras-chave separadas por espaços em branco -milestone_kind = Procurar etapas... regexp_tooltip = Interpreta o termo de pesquisa como uma expressão regular regexp = ExpReg diff --git a/options/locale/locale_ro.ini b/options/locale/locale_ro.ini index f12301307d..4421ed2ffd 100644 --- a/options/locale/locale_ro.ini +++ b/options/locale/locale_ro.ini @@ -1,6 +1,3 @@ - - - [common] return_to_forgejo = Înapoi la Forgejo explore = Explorează diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 68932d89a3..723cd1fb80 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -48,21 +48,14 @@ webauthn_error_unable_to_process=Сервер не смог обработать webauthn_error_duplicated=Этот токен авторизации не разрешен для выполнения этого запроса. Убедитесь, что токен не был зарегистрирован ранее. webauthn_error_empty=Необходимо задать имя для этого ключа. webauthn_error_timeout=Время истекло раньше, чем ключ был прочитан. Перезагрузите эту страницу и повторите попытку. -webauthn_reload=Обновить - repository=Репозиторий organization=Организация mirror=Зеркало -new_repo=Создать репозиторий -new_migrate=Выполнить миграцию new_mirror=Новое зеркало new_fork=Новое ответвление репозитория -new_org=Создать организацию new_project=Новый проект new_project_column=Новый столбец -manage_org=Управление организациями admin_panel=Панель управления -account_settings=Настройки учётной записи settings=Настройки your_profile=Профиль your_starred=Избранные @@ -218,8 +211,6 @@ string.desc=Я - А [error] occurred=Произошла ошибка report_message=Если вы считаете, что это баг Forgejo, пожалуйста, поищите задачу на Codeberg или создайте новую при необходимости. -missing_csrf=Некорректный запрос: отсутствует токен CSRF -invalid_csrf=Некорректный запрос: неверный токен CSRF not_found=Цель не найдена. network_error=Ошибка сети server_internal = Внутренняя ошибка сервера @@ -355,15 +346,10 @@ app_slogan_helper = Укажите лозунг вашего сервера, л [home] uname_holder=Имя или адрес эл. почты -password_holder=Пароль switch_dashboard_context=Сменить просматриваемое пространство my_repos=Репозитории -show_more_repos=Показать больше репозиториев… -collaborative_repos=Совместные репозитории my_orgs=Организации -my_mirrors=Мои зеркала view_home=Показать %s -search_repos=Поиск репозитория… filter=Прочие фильтры filter_by_team_repositories=Фильтровать по репозиториям команды feed_of=Лента «%s» @@ -384,20 +370,8 @@ issues.in_your_repos=В ваших репозиториях repos=Репозитории users=Пользователи organizations=Организации -search=Поиск go_to=Перейти к code=Код -search.type.tooltip=Тип поиска -search.fuzzy=Неточный -search.fuzzy.tooltip=Включать результаты, которые не полностью соответствуют поисковому запросу -search.match=Соответствие -search.match.tooltip=Включать только результаты, которые точно соответствуют поисковому запросу -code_search_unavailable=В настоящее время поиск по коду недоступен. Обратитесь к администратору сайта. -repo_no_results=Подходящие репозитории не найдены. -user_no_results=Подходящие пользователи не найдены. -org_no_results=Подходящие организации не найдены. -code_no_results=Соответствующий поисковому запросу исходный код не найден. -code_search_results=Результаты поиска «%s» code_last_indexed_at=Последняя индексация %s relevant_repositories_tooltip=Скрыты ответвления и репозитории, не имеющие ни темы, ни значка, ни описания. relevant_repositories=Показаны только релевантные репозитории, показать результаты без фильтрации. @@ -408,16 +382,12 @@ stars_few = В избранном у %d пользователей [auth] create_new_account=Зарегистрировать учётную запись -register_helper_msg=Уже есть учётная запись? Войдите! -social_register_helper_msg=Уже есть учётная запись? Привяжите её! disable_register_prompt=Извините, возможность регистрации отключена. Пожалуйста, свяжитесь с администратором сайта. disable_register_mail=Подтверждение регистрации по эл. почте отключено. manual_activation_only=Обратитесь к администратору сайта для завершения активации. remember_me=Запомнить это устройство -remember_me.compromised=Токен входа более не действителен, что может указывать на компрометацию учётной записи. Пожалуйста, проверьте свою учётную запись на необычные действия. forgot_password_title=Восстановление пароля forgot_password=Забыли пароль? -sign_up_now=Нужна учётная запись? Зарегистрируйтесь. sign_up_successful=Учётная запись успешно создана. Добро пожаловать! confirmation_mail_sent_prompt=Новое письмо для подтверждения было отправлено на %s. Для завершения регистрации, пожалуйста, перейдите по ссылке внутри в течение %s. Если был введён неправильный адрес, вы можете войти и изменить его. must_change_password=Обновите пароль @@ -430,7 +400,6 @@ prohibit_login_desc=Возможность использования этой resent_limit_prompt=Недавно вы уже запрашивали письмо для активации. Пожалуйста, повторите попытку через 3 минуты. has_unconfirmed_mail=Здравствуйте, %s! У вас есть неподтвержденный адрес эл. почты (%s). Если вам не приходило письмо с подтверждением или нужно выслать новое письмо, нажмите на кнопку ниже. resend_mail=Нажмите здесь, чтобы отправить письмо для активации ещё раз -email_not_associate=Этот адрес эл. почты не связан ни с одной учётной записью. send_reset_mail=Отправить восстановление пароля reset_password=Восстановление учётной записи invalid_code=Код подтверждения недействителен или истёк. @@ -447,9 +416,6 @@ twofa_scratch_used=Вы использовали код восстановлен twofa_passcode_incorrect=Введён неверный код. Если вы потеряли устройство, используйте код восстановления. twofa_scratch_token_incorrect=Неверный код восстановления. login_userpass=Вход -tab_signin = Войти -tab_signup = Зарегистрироваться -tab_openid=OpenID oauth_signup_tab=Зарегистрировать новую учётную запись oauth_signup_title=Завершение регистрации учётной записи oauth_signup_submit=Завершить регистрацию @@ -475,7 +441,6 @@ authorize_application_description=Если вы предоставите дос authorize_title=Разрешить «%s» доступ к вашей учётной записи? authorization_failed=Ошибка авторизации authorization_failed_desc=Ошибка авторизации, обнаружен неверный запрос. Пожалуйста, свяжитесь с автором приложения, которое вы пытались авторизовать. -sspi_auth_failed=Аутентификация SSPI не удалась password_pwned=Выбранный вами пароль находится в списке украденных паролей из ранее опубликованных утечек. Повторите попытку с другим паролем. Также рекомендуем сменить этот пароль в других местах. password_pwned_err=Не удалось завершить запрос к HaveIBeenPwned change_unconfirmed_email_summary = Измените адрес эл. почты, на который будет отправлено письмо для активации учётной записи. @@ -497,22 +462,18 @@ link_not_working_do_paste=Ссылка не работает? Попробуйт hi_user_x=Привет %s, activate_account=Активация учётной записи -activate_account.title=%s, пожалуйста, активируйте вашу учётную запись activate_account.text_1=Привет, %[1]s, спасибо за регистрацию в %[2]s! activate_account.text_2=Для активации учётной записи перейдите по следующей ссылке в течение %s: activate_email=Подтвердите свой адрес эл. почты -activate_email.title=%s, пожалуйста, подтвердите свой адрес эл. почты activate_email.text=Для подтверждения эл. почты перейдите по следующей ссылке в течение %s: register_notify=Приветствуем в %s -register_notify.title=%[1]s, добро пожаловать в %[2]s register_notify.text_1=это письмо с вашим подтверждением регистрации в %s! register_notify.text_2=Теперь вы можете войти в свою учётную запись, используя имя: %s register_notify.text_3=Если эта учётная запись создана кем-то для вас, сперва будет необходимо задать пароль. reset_password=Восстановление учётной записи -reset_password.title=%s, был получен запрос на восстановление вашей учётной записи reset_password.text=Если этот запрос ваш, для восстановления учётной записи используйте следующую ссылку в течение %s: register_success=Регистрация прошла успешно @@ -587,8 +548,6 @@ RepoName=Название репозитория Email=Адрес эл. почты Password=Пароль Retype=Подтверждение пароля -SSHTitle=Имя ключа SSH -HttpsUrl=URL HTTPS PayloadUrl=URL обработчика TeamName=Название команды AuthName=Имя авторизации @@ -601,9 +560,6 @@ CommitChoice=Выбор коммита TreeName=Путь к файлу Content=Содержимое -SSPISeparatorReplacement=Разделитель -SSPIDefaultLanguage=Язык по умолчанию - require_error=` не может быть пустым.` alpha_dash_error=` может содержать только буквенно-цифровые символы, тире («-») и подчеркивания («_»).` alpha_dash_dot_error=` может содержать только буквенно-цифровые символы, тире («-»), подчеркивания («_») и точки («.»).` @@ -625,7 +581,6 @@ lang_select_error=Выберите язык из списка. username_been_taken=Имя пользователя уже занято. username_change_not_local_user=Нелокальным пользователям запрещено изменять их имя пользователя. -username_has_not_been_changed=Имя пользователя не было изменено repo_name_been_taken=Название репозитория уже используется. repository_force_private=Включена принудительная приватность: приватные репозитории не могут быть сделаны публичными. repository_files_already_exist=Файлы уже существуют для этого репозитория. Обратитесь к системному администратору. @@ -705,7 +660,6 @@ unfollow=Отписаться user_bio=О себе disabled_public_activity=Этот пользователь отключил публичную видимость активности. email_visibility.limited=Ваш адрес эл. почты виден всем выполнившим вход пользователям -email_visibility.private=Ваш адрес эл. почты виден только вам и администраторам show_on_map=Показать это место на карте settings=Параметры пользователя @@ -740,13 +694,11 @@ password=Пароль security=Безопасность avatar=Изображение профиля ssh_gpg_keys=Ключи SSH / GPG -social=Учётные записи в соцсетях applications=Приложения orgs=Организации repos=Репозитории delete=Удалить учётную запись twofa=Двухфакторная аутентификация (TOTP) -account_link=Привязанные учётные записи organization=Организации uid=UID webauthn=Двухфакторная аутентификация (ключами безопасности) @@ -793,10 +745,7 @@ comment_type_group_issue_ref=Ссылка на задачу saved_successfully=Ваши настройки успешно сохранены. privacy=Конфиденциальность keep_activity_private=Скрыть активность со страницы профиля -keep_activity_private_popup=Ваша активность будет видна только вам и администраторам сервера - lookup_avatar_by_mail=Найти изображение по моему адресу эл. почты -federated_avatar_lookup=Федерированный поиск изображений профилей enable_custom_avatar=Использовать своё изображение профиля choose_new_avatar=Выберите новое изображение профиля update_avatar=Обновить изображение профиля @@ -814,7 +763,6 @@ password_incorrect=Текущий пароль неправильный. change_password_success=Ваш пароль был изменён. Теперь при входе используйте новый. password_change_disabled=Нелокальные учётные записи не могут изменить пароль в веб-интерфейсе Forgejo. -emails=Адреса эл. почты manage_emails=Управление адресами эл. почты manage_themes=Тема интерфейса manage_openid=Адреса OpenID @@ -856,8 +804,6 @@ principal_desc=Эти принципалы сертификатов SSH прив gpg_desc=Эти открытые ключи GPG связаны с вашей учётной записью и используются для проверки подлинности коммитов. Храните закрытые ключи в безопасности, т.к. ими можно подписывать коммиты от вашего лица. ssh_helper=Нужна помощь? Ознакомьтесь с руководством GitHub по созданию ключей SSH или решению возникающих проблем при использовании SSH. gpg_helper=Нужна помощь? Взгляните на руководство GitHub по 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_gpg_placeholder=Начинается с «-----BEGIN PGP PUBLIC KEY BLOCK-----» add_new_principal=Добавить принципал @@ -875,7 +821,6 @@ gpg_invalid_token_signature=Предоставленный ключ GPG, под gpg_token_required=Вы должны предоставить подпись для токена ниже gpg_token=Токен gpg_token_help=Вы можете сгенерировать подпись с помощью: -gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=Текстовая подпись GPG key_signature_gpg_placeholder=Начинается с «-----BEGIN PGP SIGNATURE-----» verify_gpg_key_success=Ключ GPG «%s» верифицирован. @@ -922,11 +867,6 @@ hide_openid=Скрыть из профиля ssh_disabled=SSH отключён ssh_signonly=SSH в настоящее время отключён, поэтому эти ключи используются только для проверки подписей коммитов. ssh_externally_managed=Этот ключ SSH управляется извне для этого пользователя -manage_social=Управление привязанными учётными записями в соцсетях -social_desc=Эти учётные записи социальных сетей можно использовать для входа в вашу учётную запись. Убедитесь, что они все принадлежат вам. -unbind=Удалить связь -unbind_success=Учётная запись социальной сети успешно удалена. - manage_access_token=Токены доступа generate_new_token=Создать новый токен tokens_desc=Эти токены предоставляют доступ к вашей учётной записи с помощью Forgejo API. @@ -936,8 +876,6 @@ generate_token_success=Новый токен создан. Скопируйте generate_token_name_duplicate=%s уже использовалось в качестве имени приложения. Пожалуйста, используйте другое имя. delete_token=Удалить access_token_deletion=Удалить токен доступа -access_token_deletion_cancel_action=Отменить -access_token_deletion_confirm_action=Удалить access_token_deletion_desc=Удаление токена отзовёт доступ к вашей учётной записи у приложений, использующих его. Это действие не может быть отменено. Продолжить? delete_token_success=Токен удалён. У приложений, использующих его, больше нет доступа к вашей учётной записи. repo_and_org_access=Доступ к репозиторию и организации @@ -1007,7 +945,6 @@ webauthn_key_loss_warning=Потеря ключей безопасности п manage_account_links=Привязанные учетные записи manage_account_links_desc=Эти сторонние учётные записи привязаны к вашей учётной записи Forgejo. -account_links_not_available=У вас нет привязанных сторонних учётных записей. link_account=Привязать учётную запись remove_account_link=Удалить привязанную учётную запись remove_account_link_desc=Удаление привязанной учётной записи отменит её доступ к вашей учётной записи Forgejo. Продолжить? @@ -1054,7 +991,6 @@ additional_repo_units_hint = Предлагать включить больше update_hints = Обновить подсказки update_hints_success = Подсказки обновлены. additional_repo_units_hint_description = Показывать подсказку «Включить больше разделов» в репозиториях, в которых включены не все разделы. -pronouns_custom = Другие pronouns = Местоимения pronouns_unspecified = Не указаны language.title = Язык интерфейса @@ -1062,7 +998,6 @@ keep_activity_private.description = Ваша публичная а language.description = Выбранный язык будет сохранён в вашей уч. записи и будет использован по умолчанию после входа. language.localization_project = Помогите с переводом Forgejo на свой язык! Подробнее. user_block_yourself = Нельзя заблокировать себя. -pronouns_custom_label = Другие местоимения change_username_redirect_prompt.with_cooldown.one = Прежнее имя будет доступно для использования другим пользователям после истечения простоя в %[1]d день. Вы сможете вернуть его себе во время срока простоя. change_username_redirect_prompt.with_cooldown.few = Прежнее имя будет доступно для использования другим пользователям после истечения защиты в %[1]d дней. Вы сможете вернуть его себе во время срока защиты. keep_pronouns_private = Показывать местоимения только зарегистрированным пользователям @@ -1118,7 +1053,6 @@ fork_visibility_helper=Нельзя изменить видимость отве fork_branch=Ветвь, клонируемая в ответвление all_branches=Все ветви use_template=Использовать этот шаблон -clone_in_vsc=Клонировать в VS Code download_zip=Скачать ZIP download_tar=Скачать TAR.GZ download_bundle=Скачать BUNDLE @@ -1138,11 +1072,6 @@ readme=README readme_helper=Выберите шаблон README readme_helper_desc=Это место, где вы можете написать подробное описание вашего проекта. auto_init=Инициализировать репозиторий -trust_model_helper=Выберите модель доверия для проверки подписи. Возможные варианты: -trust_model_helper_collaborator=Соучастник: доверять подписям соучастников -trust_model_helper_committer=Автор коммита: доверять подписям, соответствующим авторам коммитов -trust_model_helper_collaborator_committer=Соучастник+Коммитер: доверять подписям соучастников, которые соответствуют автору коммита -trust_model_helper_default=По умолчанию: используйте модель доверия по умолчанию для этой установки create_repo=Создать репозиторий default_branch=Ветвь по умолчанию default_branch_label=по умолчанию @@ -1206,9 +1135,6 @@ template.issue_labels=Метки задач template.one_item=Необходимо выбрать хотя бы один элемент шаблона template.invalid=Необходимо выбрать шаблон репозитория -archive.issue.nocomment=Этот репозиторий архивирован. Комментирование в задачах невозможно. -archive.pull.nocomment=Этот репозиторий архивирован. Комментирование в запросах слияний невозможно. - form.reach_limit_of_creation_1=Достигнуто ограничение на количество репозиториев: %d. form.reach_limit_of_creation_n=Достигнуто ограничение на количество репозиториев: %d. form.name_reserved=Название репозитория «%s» зарезервировано. @@ -1216,7 +1142,6 @@ form.name_pattern_not_allowed=Шаблон «%s» не допускается в need_auth=Авторизация migrate_options=Параметры переноса -migrate_service=Сервис миграции migrate_options_mirror_helper=Этот репозиторий будет зеркалом migrate_options_lfs=Перенос LFS файлов migrate_options_lfs_endpoint.label=Конечная точка LFS @@ -1301,7 +1226,6 @@ branches=ветви tags=теги issues=Задачи pulls=Слияния -project_board=Проекты packages=Пакеты actions=Действия labels=Метки @@ -1315,7 +1239,6 @@ release=Выпуск releases=Выпуски tag=тег released_this=выпуск опубликован -tagged_this=добавил(а) тег file.title=%s в %s file_raw=Исходный file_history=История @@ -1425,9 +1348,7 @@ commits.desc=Просмотр истории изменений исходног commits.commits=коммиты commits.no_commits=Нет общих коммитов. «%s» и «%s» имеют совершенно разные истории. commits.nothing_to_compare=Эти ветви одинаковы. -commits.search=Поиск коммитов… commits.search.tooltip=Можно предварять ключевые слова префиксами "author:", "committer:", "after:", или "before:", например "revert author:Alice before:2019-01-13". -commits.find=Поиск commits.search_all=Во всех ветвях commits.author=Автор commits.message=Сообщение @@ -1454,8 +1375,6 @@ commitstatus.pending=Ожидание commitstatus.success=Успех ext_issues=Внешние задачи -ext_issues.desc=Ссылка на внешнюю систему отслеживания задач. - projects=Проекты projects.desc=Управление задачами и pull'ами в досках проекта. projects.description=Описание (необязательно) @@ -1477,7 +1396,6 @@ projects.type.basic_kanban=Обычный канбан projects.type.bug_triage=Планирование работы с багами projects.template.desc=Шаблон projects.template.desc_helper=Для начала выберите шаблон проекта -projects.type.uncategorized=Без категории projects.column.edit=Изменить столбец projects.column.edit_title=Название projects.column.new_title=Название @@ -1485,8 +1403,6 @@ projects.column.new_submit=Добавить столбец projects.column.new=Добавить столбец projects.column.set_default=Установить по умолчанию projects.column.set_default_desc=Назначить этот столбец по умолчанию для задач и запросов на слияние без категории -projects.column.unset_default=Снять установку по умолчанию -projects.column.unset_default_desc=Снять установку этого столбца по умолчанию projects.column.delete=Удалить столбец projects.column.deletion_desc=При удалении столбца все задачи в нём будут перемещены в столбец по умолчанию. Продолжить? projects.column.color=Цвет @@ -1600,7 +1516,6 @@ issues.filter_sort.moststars=Больше звезд issues.filter_sort.feweststars=Меньше звезд issues.filter_sort.mostforks=Больше ответвлений issues.filter_sort.fewestforks=Меньше ответвлений -issues.keyword_search_unavailable=В настоящее время поиск по ключевым словам недоступен. Обратитесь к администратору сайта. issues.action_open=Открыть issues.action_close=Закрыть issues.action_label=Метка @@ -1645,11 +1560,8 @@ issues.ref_issue_from=`упоминание этой задач issues.ref_pull_from=`упомянул этот запрос на слияние %[3]s %[1]s` issues.ref_closing_from=`упомянул эту задачу в запросе на слияние %[3]s, который закроет её %[1]s` issues.ref_reopening_from=`упомянул эту задачу в запросе на слияние %[3]s, который переоткроет эту задачу %[1]s` -issues.ref_closed_from=`закрыл этот запрос %[4]s %[2]s` -issues.ref_reopened_from=`задача была открыта снова %[4]s %[2]s` issues.ref_from=`из %[1]s` issues.author=Автор -issues.author_helper=Этот пользователь является автором. issues.role.owner=Владелец issues.role.owner_helper=Этот пользователь является владельцем репозитория. issues.role.member=Участник @@ -1744,15 +1656,11 @@ issues.add_time_sum_to_small=Время не было введено. issues.time_spent_total=Всего затрачено времени issues.time_spent_from_all_authors=`Всего затрачено времени: %s` issues.due_date=Срок выполнения -issues.invalid_due_date_format=Срок выполнения должен быть в формате «гггг-мм-дд». -issues.error_modifying_due_date=Не удалось изменить срок выполнения. -issues.error_removing_due_date=Не удалось убрать срок выполнения. issues.push_commit_1=добавлен %d коммит %s issues.push_commits_n=добавлены %d коммита(ов) %s issues.force_push_codes=`форсированное обновление изменений %[1]s %[4]s %[8]s вместо %[2]s %[9]s %[6]s` issues.force_push_compare=Сравнить issues.due_date_form=гггг-мм-дд -issues.due_date_form_add=Добавить срок выполнения issues.due_date_form_edit=Изменить issues.due_date_form_remove=Удалить issues.due_date_not_set=Срок выполнения не установлен. @@ -1807,7 +1715,6 @@ issues.review.remove_review_request=отменён запрос рецензии issues.review.remove_review_request_self=отказ от рецензирования %s issues.review.pending=Ожидание issues.review.pending.tooltip=Этот комментарий в настоящее время не виден другим пользователям. Чтобы отправить отложенные комментарии, выберите «%s» → «%s/%s/%s» в верхней части страницы. -issues.review.review=Рецензия issues.review.reviewers=Рецензенты issues.review.outdated=Устаревшее issues.review.option.show_outdated_comments=Показать устаревшие комментарии @@ -1819,7 +1726,6 @@ issues.review.hide_resolved=Скрыть разрешенные issues.review.resolve_conversation=Пометить как разрешённое issues.review.un_resolve_conversation=Пометить как неразрешённое issues.review.resolved_by=пометить это обсуждение как разрешённое -issues.assignee.error=Не все назначения были добавлены из-за непредвиденной ошибки. issues.reference_issue.body=Тело issues.content_history.deleted=удалён issues.content_history.edited=изменён @@ -1827,8 +1733,6 @@ issues.content_history.created=создан issues.content_history.delete_from_history=Удалить из истории issues.content_history.delete_from_history_confirm=Удалить из истории? issues.content_history.options=Настройки -issues.reference_link=Ссылка: %s - compare.compare_base=Основа compare.compare_head=сравнить @@ -1860,10 +1764,6 @@ pulls.nothing_to_compare=Нечего сравнивать, родительск pulls.nothing_to_compare_and_allow_empty_pr=Ветви идентичны. Этот PR будет пустым. pulls.has_pull_request=`Запрос на слияние этих ветвей уже существует: %[2]s#%[3]d` pulls.create=Создать запрос на слияние -pulls.title_desc_one=хочет влить %[1]d коммит из %[2]s в %[3]s -pulls.title_desc_few=хочет влить %[1]d коммит(ов) из %[2]s в %[3]s -pulls.merged_title_desc_one=слит %[1]d коммит из %[2]s в %[3]s %[4]s -pulls.merged_title_desc_few=слито %[1]d коммит(ов) из %[2]s в %[3]s %[4]s pulls.change_target_branch_at=`изменил(а) целевую ветвь с %s на %s %s` pulls.tab_conversation=Обсуждение pulls.tab_commits=Коммиты @@ -2012,8 +1912,6 @@ signing.wont_sign.approved=Слияние не будет подписано, т signing.wont_sign.not_signed_in=Вы не вошли в систему. ext_wiki=Внешняя вики -ext_wiki.desc=Ссылка на внешнюю вики. - wiki=Вики wiki.welcome=Добро пожаловать в вики. wiki.welcome_desc=Вики позволяет писать документацию и делиться ей с соучастниками. @@ -2107,17 +2005,6 @@ activity.git_stats_deletion_1=%d удаление activity.git_stats_deletion_n=%d удалений contributors.contribution_type.commits = Коммиты -search=Поиск -search.search_repo=Поиск по репозиторию -search.type.tooltip=Тип поиска -search.fuzzy=Неточный -search.fuzzy.tooltip=Включать результаты, которые не полностью соответствуют поисковому запросу -search.match=Соответствие -search.match.tooltip=Включать только результаты, которые точно соответствуют поисковому запросу -search.results=Результаты поиска "%s" в %s -search.code_no_results=Не найдено исходного кода, соответствующего поисковому запросу. -search.code_search_unavailable=В настоящее время поиск по коду недоступен. Обратитесь к администратору сайта. - settings=Настройки settings.desc=В настройках вы можете менять различные параметры этого репозитория settings.options=Репозиторий @@ -2222,7 +2109,6 @@ settings.transfer_abort=Отменить передачу settings.transfer_abort_invalid=Невозможно отменить передачу несуществующего репозитория. settings.transfer_abort_success=Передача репозитория %s успешно отменена. settings.transfer_desc=Передать репозиторий другому пользователю или организации где у вас есть права администратора. -settings.transfer_form_title=Введите сопутствующую информацию для подтверждения операции: settings.transfer_in_progress=Имеется текущая передача. Отмените её, если хотите выполнить передачу другому пользователю. settings.transfer_notices_1=- Вы можете потерять доступ, если новый владелец является отдельным пользователем. settings.transfer_notices_2=- Вы сохраните доступ, если новым владельцем станет организация, владельцем которой вы являетесь. @@ -2267,7 +2153,6 @@ settings.delete_collaborator=Удалить settings.collaborator_deletion=Удалить соучастника settings.collaborator_deletion_desc=Этот пользователь больше не будет иметь доступа для совместной работы в этом репозитории после удаления. Вы хотите продолжить? settings.remove_collaborator_success=Соучастник удалён. -settings.search_user_placeholder=Поиск пользователя… settings.org_not_allowed_to_be_collaborator=Организации не могут быть добавлены как соучастники. settings.change_team_access_not_allowed=Доступ к репозиторию команде ограничен владельцем организации settings.team_not_in_organization=Команда не в той же организации, что и репозиторий @@ -2275,7 +2160,6 @@ settings.teams=Команды settings.add_team=Добавить команду settings.add_team_duplicate=Команда уже имеет репозиторий settings.add_team_success=Команда теперь имеет доступ к репозиторию. -settings.search_team=Поиск команды… settings.change_team_permission_tip=Разрешение команды установлено на странице настройки команды и не может быть изменено для каждого репозитория settings.delete_team_tip=Эта команда имеет доступ ко всем репозиториям и не может быть удалена settings.remove_team_success=Доступ команды к репозиторию удалён. @@ -2411,12 +2295,7 @@ settings.branches=Ветви settings.protected_branch=Защита ветвей settings.protected_branch.save_rule=Сохранить правило 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.protect_this_branch=Защитить эту ветвь -settings.protect_this_branch_desc=Предотвращает удаление, ограничивает Push и слияние Git в ветвь. settings.protect_disable_push=Запретить отправку изменений settings.protect_disable_push_desc=Отправка в эту ветвь не будет разрешена. settings.protect_enable_push=Разрешить отправку изменений @@ -2427,9 +2306,7 @@ settings.protect_whitelist_committers=Ограничение отправки п settings.protect_whitelist_committers_desc=Только пользователям или командам из белого списка будет разрешена отправка изменений в эту ветвь (но не принудительная отправка). settings.protect_whitelist_deploy_keys=Белый список развёртываемых ключей с доступом на запись в push. settings.protect_whitelist_users=Пользователи, которые могут отправлять изменения в эту ветвь -settings.protect_whitelist_search_users=Поиск пользователей… settings.protect_whitelist_teams=Команды, члены которых могут отправлять изменения в эту ветвь -settings.protect_whitelist_search_teams=Поиск команд… settings.protect_merge_whitelist_committers=Ограничить право на слияние белым списком settings.protect_merge_whitelist_committers_desc=Разрешить принимать запросы на слияние в эту ветвь только пользователям и командам из «белого списка». settings.protect_merge_whitelist_users=Пользователи с правом на слияние @@ -2459,8 +2336,6 @@ settings.protect_protected_file_patterns=Шаблоны защищённых ф settings.protect_protected_file_patterns_desc=Защищенные файлы нельзя изменить напрямую, даже если пользователь имеет право добавлять, редактировать или удалять файлы в этой ветви. Можно указать несколько шаблонов, разделяя их точкой с запятой («;»). О синтаксисе шаблонов читайте в документации %s . Примеры: .drone.yml, /docs/**/*.txt. settings.protect_unprotected_file_patterns=Шаблоны незащищённых файлов, разделённые точкой с запятой «;» settings.protect_unprotected_file_patterns_desc=Незащищенные файлы, которые допускается изменять напрямую, если пользователь имеет право на запись, несмотря на ограничение отправки изменений. Можно указать несколько шаблонов, разделяя их точкой с запятой («;»). О синтаксисе шаблонов читайте в документации %[2]s . Примеры: .drone.yml, /docs/**/*.txt. -settings.add_protected_branch=Включить защиту -settings.delete_protected_branch=Отключить защиту settings.update_protect_branch_success=Правила доступа веток «%s» изменена. settings.remove_protected_branch_success=Правила доступа веток «%s» удалена. settings.remove_protected_branch_failed=Не удалось удалить правило доступа ветвей «%s». @@ -2535,8 +2410,6 @@ settings.lfs_pointers.associateAccessible=Связать доступные %d O settings.rename_branch_failed_exist=Невозможно переименовать ветвь, потому что целевая ветвь %s уже существует. settings.rename_branch_failed_not_exist=Невозможно переименовать ветвь %s, потому что она не существует. settings.rename_branch_success=Ветвь %s была успешно переименована в %s. -settings.rename_branch_from=старое название ветви -settings.rename_branch_to=новое название ветви settings.rename_branch=Переименовать ветвь diff.browse_source=Просмотр исходного кода @@ -2545,7 +2418,6 @@ diff.commit=коммит diff.git-notes=Заметки diff.data_not_available=Различия отсутствуют или недоступны diff.options_button=Опции Diff -diff.show_diff_stats=Показать статистику diff.download_patch=Скачать .patch diff.download_diff=Скачать .diff diff.show_split_view=Разделённый вид @@ -2636,7 +2508,6 @@ release.tag_name_invalid=Имя тега является не допустим release.tag_name_protected=Имя тега защищено. release.tag_already_exist=Этот тег уже используется. release.downloads=Загрузки -release.download_count=Загрузки: %s release.add_tag_msg=Использовать заголовок и содержимое выпуска в качестве сообщения тега. release.add_tag=Создать тег release.releases_for=Выпуски %s @@ -2665,14 +2536,12 @@ branch.default_deletion_failed=Ветвь «%s» является ветвью branch.restore=Восстановить ветвь «%s» branch.download=Скачать ветвь «%s» branch.rename=Переименовать ветвь «%s» -branch.search=Поиск ветки branch.included_desc=Эта ветвь является частью ветви по умолчанию branch.included=Включено branch.create_new_branch=Создать ветвь из ветви: branch.confirm_create_branch=Создать ветвь branch.warning_rename_default_branch=Вы переименовываете ветвь по умолчанию. branch.rename_branch_to=Переименовать ветвь «%s» в: -branch.confirm_rename_branch=Переименовать ветвь branch.create_branch_operation=Создать ветвь branch.new_branch=Создать новую ветвь branch.new_branch_from=Создать новую ветвь из «%s» @@ -2700,7 +2569,6 @@ mirror_address_protocol_invalid = Эта ссылка недействитель fork_no_valid_owners = Невозможно создать ответвление этого репозитория, т.к. здесь нет действующих владельцев. new_repo_helper = Репозиторий содержит все файлы проекта и историю изменений. Уже где-то есть репозиторий? Выполните перенос. mirror_address_url_invalid = Указанная ссылка недействительна. Убедитесь, что все части экранированы правильно. -issues.comment.blocked_by_user = Вы не можете комментировать под этой задачей, т.к. вы заблокированы владельцем репозитория или автором задачи. pulls.blocked_by_user = Невозможно создать запрос на слияние в этом репозитории, т.к. вы заблокированы его владельцем. settings.add_collaborator_blocked_our = Невозможно добавить соучастника, т.к. он заблокирован в этом репозитории. admin.enabled_flags = Включенные флаги репозитория: @@ -2710,7 +2578,6 @@ rss.must_be_on_branch = Перейдите к ветви, чтобы сдела admin.manage_flags = Управление флагами admin.update_flags = Обновить флаги object_format = Формат объекта -clone_in_vscodium = Клонировать в VSCodium mirror_sync = синхронизирован blame.ignore_revs = Правки в .git-blame-ignore-revs проигнорированы. Нажмите здесь, чтобы обойти этот файл и просмотреть авторов полноценно. issues.blocked_by_user = Создание задач невозможно в этом репозитории, т.к. вы заблокированы его владельцем. @@ -2735,7 +2602,6 @@ transfer.no_permission_to_accept = У вас недостаточно прав transfer.no_permission_to_reject = У вас недостаточно прав для отклонения этой передачи. commits.view_path = Просмотреть в этом моменте истории commits.renamed_from = Переименован с %s -issues.due_date_not_writer = Для обновления срока выполнения задачи требуется право на запись в этом репозитории. issues.review.outdated_description = С момента добавления этого комментария содержимое изменилось pulls.nothing_to_compare_have_tag = Выбранные ветви/теги идентичны. pulls.select_commit_hold_shift_for_range = Выберите коммит. Зажмите Shift, чтобы выбрать диапазон @@ -2807,7 +2673,6 @@ settings.enforce_on_admins = Обязательно для администра settings.enforce_on_admins_desc = Администраторы репозитория не смогут обойти это ограничение. settings.rename_branch_failed_protected = Невозможно переименовать защищённую ветвь «%s». issues.archived_label_description = (Архивная) %s -settings.sourcehut_builds.graphql_url = Ссылка на GraphQL (напр. https://builds.sr.ht/query) settings.sourcehut_builds.secrets_helper = Дать задачам доступ к секретам сборки (требуется разрешение SECRETS:RO) settings.add_webhook.invalid_path = Путь не может включать части «.», «..» или «//». Он не может начинаться или заканчиваться на слеш. settings.web_hook_name_sourcehut_builds = SourceHut Builds @@ -2819,7 +2684,6 @@ release.download_count_few = %s скачиваний release.system_generated = Это вложение сгенерировано автоматически. settings.event_pull_request_enforcement = Форсирование pulls.cmd_instruction_checkout_desc = В репозитории вашего проекта перейдите на эту ветвь и протестируйте изменения. -error.broken_git_hook = Гит-хуки этого репозитория сломаны. Ознакомьтесь с документацией и исправьте их, затем отправьте какие-нибудь коммиты для обновления статуса. pulls.cmd_instruction_checkout_title = Перейдите к ветви settings.graphql_url = Ссылка GraphQL settings.sourcehut_builds.access_token_helper = Токен builds.sr.ht с разрешением JOBS:RW. Создайте обычный токен или токен с доступом к секретам на meta.sr.ht. @@ -2908,7 +2772,6 @@ commits.view_single_diff = Посмотреть изменения в этом pulls.editable = Изменяемый pulls.editable_explanation = Автор разрешил изменения от соучастников. Вы можете напрямую отправлять в него изменения. issues.reopen.blocked_by_user = Повторное открытие задачи невозможно, т.к. вы заблокированы владельцем репозитория или автором задачи. -pulls.comment.blocked_by_user = Вы не можете комментировать под этим запросом слияния, т.к. вы заблокированы владельцем репозитория или автором задачи. issues.filter_no_results = Ничего не нашлось issues.filter_no_results_placeholder = Попробуйте поискать по-другому. migrate.repo_desc_helper = Оставьте пустым, чтобы скопировать описание из источника @@ -3017,9 +2880,7 @@ teams.none_access=Нет доступа teams.none_access_helper=Настройка «нет доступа» полезна лишь в частных репозиториях. teams.general_access_helper=Разрешения участников будут определяться таблицей разрешений ниже. teams.read_access=Чтение -teams.read_access_helper=Участники могут просматривать и клонировать командные репозитории. teams.write_access=Запись -teams.write_access_helper=Участники могут читать и выполнять push в командные репозитории. teams.admin_access=Административный доступ teams.admin_access_helper=Участники могут выполнять pull, push в командные репозитории и добавлять соучастников в команду. teams.no_desc=Эта группа не имеет описания @@ -3034,12 +2895,9 @@ teams.invite_team_member.list=Ожидающие приглашения teams.delete_team_title=Удаление команды teams.delete_team_desc=Удаление команды лишит её членов доступа к репозиториям. Продолжить? teams.delete_team_success=Команда удалена. -teams.read_permission_desc=Эта команда предоставляет доступ на Чтение: члены могут просматривать и клонировать репозитории команды. -teams.write_permission_desc=Эта команда предоставляет доступ на Запись: члены могут получать и выполнять push команды в репозитории. teams.admin_permission_desc=Эта команда даёт административный доступ: участники могут читать, отправлять изменения и добавлять соучастников к её репозиториям. teams.create_repo_permission_desc=Кроме того, эта команда предоставляет право Создание репозитория: участники команды могут создавать новые репозитории в организации. teams.repositories=Репозитории команды -teams.search_repo_placeholder=Поиск репозитория… teams.remove_all_repos_title=Удалить все репозитории команды teams.remove_all_repos_desc=Удаляет все репозитории из команды. teams.add_all_repos_title=Добавить все репозитории @@ -3052,9 +2910,6 @@ teams.specific_repositories=Конкретные репозитории teams.specific_repositories_helper=Участники будут иметь доступ только к репозиториям, явно добавленным в команду. Выбор этого не автоматически удалит репозитории, уже добавленные в Все репозитории. teams.all_repositories=Все репозитории teams.all_repositories_helper=Команда имеет доступ ко всем репозиториям. Выбрав его, добавит все существующие репозитории в команду. -teams.all_repositories_read_permission_desc=Эта команда предоставляет прочтено доступ к всем репозиториям: участники могут просматривать и клонировать репозитории. -teams.all_repositories_write_permission_desc=Эта команда предоставляет Написать доступ к всем репозиториям: участники могут читать и выполнять push в репозитории. -teams.all_repositories_admin_permission_desc=Эта команда предоставляет администратору доступ к всем репозиториям: участники могут читать, отправлять сообщения и добавлять соучастников в репозитории. teams.invite.title=Вас пригласили присоединиться к команде %s организации %s. teams.invite.by=Приглашен(а) %s teams.invite.description=Нажмите на кнопку ниже, чтобы присоединиться к команде. @@ -3147,7 +3002,6 @@ dashboard.gc_metadata_obtained=Метаданных сборщика мусор dashboard.other_system_allocation_obtained=Прочие системные выделения памяти dashboard.next_gc_recycle=Следующее высвобождение сборщиком мусора dashboard.last_gc_time=Прошло с последнего сбора мусора -dashboard.total_gc_time=Итоговая задержка GC dashboard.total_gc_pause=Итоговая задержка сборщика dashboard.last_gc_pause=Последняя пауза сборщика dashboard.gc_times=Сборок мусора @@ -3243,9 +3097,6 @@ repos.unadopted.no_more=Непринятые репозитории не най repos.owner=Владелец repos.name=Название repos.private=Частный -repos.watches=Следят -repos.stars=Звезды -repos.forks=Ответвления repos.issues=Задачи repos.size=Размер repos.lfs_size=Размер LFS @@ -3348,17 +3199,6 @@ auths.oauth2_admin_group=Значение заявки группы для ад auths.oauth2_restricted_group=Значение заявки группы для ограниченных пользователей. (Необязательно - требуется имя заявки выше) auths.oauth2_map_group_to_team=Сопоставление заявленных групп командам организации. (Необязательно — требуется имя заявки выше) auths.oauth2_map_group_to_team_removal=Удалить пользователей из синхронизированных команд, если пользователь не принадлежит к соответствующей группе. -auths.enable_auto_register=Автоматическая регистрация -auths.sspi_auto_create_users=Автоматически создавать пользователей -auths.sspi_auto_create_users_helper=Разрешить метод аутентификации SSPI для автоматического создания новых учётных записей для пользователей, которые впервые входят в систему -auths.sspi_auto_activate_users=Автоматически активировать пользователей -auths.sspi_auto_activate_users_helper=Разрешить метод аутентификации SSPI для автоматической активации новых пользователей -auths.sspi_strip_domain_names=Удалять доменные имена из имён пользователей -auths.sspi_strip_domain_names_helper=Если отмечено, доменные имена будут удалены из имен входов (например, "DOMAIN\user" и "user@example.org" станут только "user"). -auths.sspi_separator_replacement=Разделитель для использования вместо \, / и @ -auths.sspi_separator_replacement_helper=Символ, используемый для замены разделителей имен входа нижнего уровня (например. \ в "DOMAIN\user") и имена основных пользователей (например, @ в "user@example.org"). -auths.sspi_default_language=Язык пользователя по умолчанию -auths.sspi_default_language_helper=Язык по умолчанию для пользователей, автоматически создаваемый методом аутентификации SSPI. Оставьте пустым, если вы предпочитаете, чтобы язык определялся автоматически. auths.tips=Советы auths.tips.oauth2.general=Аутентификация OAuth2 auths.tip.oauth2_provider=Поставщик OAuth2 @@ -3367,7 +3207,6 @@ auths.tip.nextcloud=Зарегистрируйте нового потребит auths.tip.dropbox=Создайте новое приложение на %s auths.tip.facebook=Зарегистрируйте новое приложение на %s и добавьте модуль «Facebook Login» auths.tip.github=Зарегистрируйте новое приложение OAuth на %s -auths.tip.gitlab=Зарегистрируйте новое приложение на https://gitlab.com/profile/applications auths.tip.google_plus=Получите учётные данные клиента OAuth2 в консоли Google API на странице %s auths.tip.openid_connect=Используйте URL в OpenID Connect Discovery (/.well-known/openid-configuration) для указания конечных точек auths.tip.twitter=Перейдите на %s, создайте приложение и убедитесь, что включена опция «Разрешить использовать это приложение для входа через Twitter» @@ -4002,8 +3841,6 @@ variables.creation.success=Переменная «%s» добавлена. variables.update.failed=Не удалось изменить переменную. variables.update.success=Переменная изменена. variables.id_not_exist = Переменная с идентификатором %d не существует. -runs.no_workflows.quick_start = Не знаете, как начать использовать Действия Forgejo? Читайте руководство по быстрому старту. -runs.no_workflows.documentation = Чтобы узнать больше о Действиях Forgejo, читайте документацию. runs.workflow = Рабочий поток runs.status_no_select = Любое состояние runs.no_matching_online_runner_helper = Нет работающего исполнителя с меткой: %s @@ -4042,7 +3879,6 @@ search = Поиск… fuzzy_tooltip = Включает результаты, достаточно похожие на запрос, даже при наличии неточностей type_tooltip = Тип поиска fuzzy = Приблизительный -match = Точный repo_kind = Найти репозитории… user_kind = Найти пользователей… org_kind = Найти организации… @@ -4054,17 +3890,14 @@ branch_kind = Найти ветви… commit_kind = Найти коммиты… no_results = По запросу ничего не найдено. keyword_search_unavailable = Поиск по ключевым словам недоступен. Уточните подробности у администратора сервера. -match_tooltip = Включать только результаты, точно соответствующие запросу code_search_unavailable = Поиск в коде недоступен. Уточните подробности у администратора сервера. runner_kind = Найти исполнителей… -code_search_by_git_grep = Эти результаты получены через «git grep». Результатов может быть больше, если на сервере будет включен индексатор кода. exact = Точный exact_tooltip = Включает только результаты, в точности соответствующие запросу issue_kind = Найти задачи… pull_kind = Найти слияния… union_tooltip = Включает результаты с совпавшими ключевыми словами, разделёнными пробелами union = Обычный -milestone_kind = Найти этапы... regexp = Регулярное выражение regexp_tooltip = Поисковый запрос будет воспринят как регулярное выражение diff --git a/options/locale/locale_si-LK.ini b/options/locale/locale_si-LK.ini index 4e1690af9f..5e75d41066 100644 --- a/options/locale/locale_si-LK.ini +++ b/options/locale/locale_si-LK.ini @@ -37,15 +37,10 @@ passcode=මුරකේතය repository=කෝෂ්ඨය organization=සංවිධානය mirror=මිරර් -new_repo=නව කෝෂ්ඨය -new_migrate=නව සංක්රමණ new_mirror=නව මිරර් new_fork=නව ගබඩාව ෆෝක් -new_org=නව සංවිධානය new_project=නව ව්‍යාපෘතිය -manage_org=සංවිධාන කළමනාකරණය admin_panel=අඩවිය පරිපාලනය -account_settings=ගිණුමේ සැකසුම් settings=සැකසුම් your_profile=පැතිකඩ your_starred=තරු පිරුණු @@ -115,7 +110,6 @@ filter.private = පෞද්ගලික [filter] [error] -missing_csrf=නරක ඉල්ලීම: CSRF ටෝකන් නොමැත [startpage] app_desc=වේදනාකාරී, ස්වයං-සත්කාරක Git සේවාවක් @@ -220,15 +214,10 @@ password_algorithm=මුරපදය හැෂ් ඇල්ගොරිතම [home] uname_holder=පරිශීලක නාමය හෝ වි-තැපෑල -password_holder=මුරපදය switch_dashboard_context=සංදර්භය උපකරණ පුවරුව මාරු my_repos=කෝෂ්ඨ -show_more_repos=තව කෝෂ්ඨ පෙන්වන්න… -collaborative_repos=සහයෝගී ගබඩාවලදී my_orgs=මාගේ සංවිධාන -my_mirrors=මගේ දර්පණ view_home=%s දකින්න -search_repos=ගබඩාවක් සොයා ගන්න… filter=වෙනත් පෙරහන් filter_by_team_repositories=කණ්ඩායම් කෝෂ්ඨ අනුව පෙරන්න @@ -248,25 +237,16 @@ issues.in_your_repos=ඔබගේ කෝෂ්ඨවල repos=කෝෂ්ඨ users=පරිශීලකයින් organizations=සංවිධාන -search=සොයන්න code=කේතය -search.match=තරගය -repo_no_results=ගැලපෙන ගබඩාවක් හමු නොවීය. -user_no_results=ගැලපෙන පරිශීලකයින් හමු නොවීය. -org_no_results=ගැලපෙන සංවිධාන හමු නොවීය. -code_no_results=ඔබගේ සෙවුම් පදය ගැලපෙන ප්රභව කේතයක් නොමැත. code_last_indexed_at=අවසන් සුචිගත %s [auth] create_new_account=ගිණුමක් ලියාපදිංචි කරන්න -register_helper_msg=දැනටමත් ගිණුමක් තිබේද? දැන්ම පුරනය වන්න! -social_register_helper_msg=දැනටමත් ගිණුමක් තිබේද? දැන් එය සම්බන්ධ කරන්න! disable_register_prompt=ලියාපදිංචිය අක්රීය කර ඇත. කරුණාකර ඔබේ වෙබ් අඩවි පරිපාලක අමතන්න. disable_register_mail=ලියාපදිංචි කිරීම සඳහා විද්යුත් තැපැල් තහවුරු කිරීම අක්රීය කර ඇත. remember_me=උපාංගය මතක තබාගන්න forgot_password_title=මුරපදය අමතක වුණා forgot_password=මුරපදය අමතක වුණා ද? -sign_up_now=ගිණුමක් ඇවැසිද? දැන් ලියාපදිංචි වන්න. confirmation_mail_sent_prompt=නව තහවුරු කිරීමේ විද්යුත් තැපෑලක් %sවෙත යවා ඇත. ලියාපදිංචි කිරීමේ ක්රියාවලිය සම්පූර්ණ කිරීම සඳහා කරුණාකර ඊළඟ %s තුළ ඔබගේ එන ලිපි පරීක්ෂා කරන්න. must_change_password=මුරපදය යාවත්කාල කරන්න allow_password_change=මුරපදය වෙනස් කිරීමට පරිශීලකයාට අවශ්ය වේ (නිර්දේශිත) @@ -277,7 +257,6 @@ prohibit_login=තහනම් දී අත්සන් resent_limit_prompt=ඔබ දැනටමත් මෑතකදී සක්රිය කිරීමේ විද්යුත් තැපෑලක් ඉල්ලා ඇත. කරුණාකර 3 මිනිත්තු බලා නැවත උත්සාහ කරන්න. has_unconfirmed_mail=හායි %s, ඔබට තහවුරු නොකළ විද්යුත් තැපැල් ලිපිනයක් ඇත (%s). ඔබට තහවුරු කිරීමේ විද්යුත් තැපෑලක් නොලැබුනේ නම් හෝ නව එකක් නැවත යැවීමට අවශ්ය නම්, කරුණාකර පහත බොත්තම ක්ලික් කරන්න. resend_mail=ඔබගේ සක්රිය කිරීමේ විද්යුත් තැපෑල නැවත යැවීමට මෙහි ක්ලික් කරන්න -email_not_associate=විද්යුත් තැපැල් ලිපිනය කිසිදු ගිණුමක් සමඟ සම්බන්ධ නොවේ. send_reset_mail=ගිණුම් රිකවරි විද්යුත් යවන්න reset_password=ගිණුම ප්‍රතිසාධනය invalid_code=ඔබගේ තහවුරු කිරීමේ කේතය අවලංගු හෝ කල් ඉකුත් වී ඇත. @@ -291,7 +270,6 @@ twofa_scratch_used=ඔබ ඔබේ සීරීම් කේතය භාවි twofa_passcode_incorrect=ඔබගේ මුර කේතය වැරදිය. ඔබ ඔබේ උපාංගය අස්ථානගත කර ඇත්නම්, පුරනය වීමට ඔබේ සීරීම් කේතය භාවිතා කරන්න. twofa_scratch_token_incorrect=ඔබේ සීරීම් කේතය වැරදියි. login_userpass=පිවිසෙන්න -tab_openid=විවෘතහැඳු. oauth_signup_tab=නව ගිණුමක් ලියාපදිංචි කරන්න oauth_signup_title=නව ගිණුම සම්පූර්ණ කරන්න oauth_signup_submit=ගිණුම සම්පූර්ණ කරන්න @@ -312,7 +290,6 @@ authorize_application_created_by=මෙම යෙදුම %sවිසින් authorize_application_description=ඔබ ප්රවේශය ලබා දෙන්නේ නම්, පුද්ගලික රිපෝස් සහ සංවිධාන ඇතුළු ඔබගේ ගිණුම් තොරතුරු වෙත ප්රවේශ වීමට සහ ලිවීමට හැකි වනු ඇත. authorize_title=ඔබගේ ගිණුමට ප්රවේශ වීමට "%s" බලය පවරන්නද? authorization_failed=බලය පැවරීම අසාර්ථකයි -sspi_auth_failed=SSPI සත්යාපන අසමත් විය password_pwned_err=HaveibeenPwned කිරීමට ඉල්ලීම සම්පූර්ණ කළ නොහැක [mail] @@ -321,7 +298,6 @@ link_not_working_do_paste=වැඩ කරන්නේ නැද්ද? ඔබ hi_user_x=ආයුබෝ %s, activate_account=ඔබගේ ගිණුම ක්‍රියාත්මක කරන්න -activate_account.title=%s, ඔබගේ ගිණුම ක්‍රියාත්මක කරන්න activate_account.text_1=ආයුබෝ %[1]s, %[2]s හි ලියාපදිංචි වීමට තුති! activate_account.text_2=%sතුළ ඔබගේ ගිණුම සක්රිය කිරීමට කරුණාකර පහත සබැඳිය ක්ලික් කරන්න: @@ -329,13 +305,11 @@ activate_email=ඔබගේ විද්යුත් තැපැල් ලි activate_email.text=තුළ ඔබගේ විද්යුත් තැපැල් ලිපිනය සත්යාපනය කිරීමට පහත සබැඳිය ක්ලික් කරන්න %s: register_notify=ගිටියා වෙත සාදරයෙන් පිළිගනිමු -register_notify.title=%[1]s, %[2]s වෙත සාදරයෙන් පිළිගනිමු register_notify.text_1=මෙය %sසඳහා ඔබගේ ලියාපදිංචි තහවුරු කිරීමේ විද්යුත් තැපෑලයි! register_notify.text_2=ඔබට දැන් පරිශීලක නාමය හරහා පිවිසිය හැකිය: %s. register_notify.text_3=මෙම ගිණුම ඔබ වෙනුවෙන් නිර්මාණය කර තිබේ නම්, කරුණාකර ඔබගේ මුරපදය පළමු සකසන්න. reset_password=ඔබගේ ගිණුම ප්‍රතිසාධනය -reset_password.title=%s, ඔබගේ ගිණුම නැවත ලබා ගැනීමට ඔබ ඉල්ලා ඇත reset_password.text=%sතුළ ඔබගේ ගිණුම නැවත ලබා ගැනීමට කරුණාකර පහත සබැඳිය ක්ලික් කරන්න: register_success=ලියාපදිංචි වීම සාර්ථකයි @@ -387,7 +361,6 @@ RepoName=කෝෂ්ඨයේ නම Email=වි-තැපැල් ලිපිනය Password=මුරපදය Retype=මුරපදය තහවුරු කරන්න -SSHTitle=SSH ප්රධාන නම PayloadUrl=ගෙවීම් URL TeamName=කණ්ඩායමේ නම AuthName=බලය පැවරීමේ නම @@ -400,9 +373,6 @@ CommitChoice=තේරීම කරන්න TreeName=ගොනුවේ මාර්ගය Content=අන්තර්ගතය -SSPISeparatorReplacement=වෙන්කර -SSPIDefaultLanguage=පෙරනිමි භාෂාව - require_error=` හිස් විය නොහැක.` alpha_dash_error=` අක්ෂරාංක, ඉරක් ('-') සහ යටි ඉරි ('_') අක්ෂර පමණක් අඩංගු විය යුතුය.` alpha_dash_dot_error=` අක්ෂරාංක, ඉරක් ('-'), යටි ඉරි ('_') සහ තිතක් ('.') අක්ෂර පමණක් අඩංගු විය යුතුය.` @@ -480,13 +450,11 @@ password=මුරපදය security=ආරක්‍ෂාව avatar=අවතාර් ssh_gpg_keys=SSH/ජීපීජී යතුරු -social=සමාජ ගිණුම් applications=යෙදුම් orgs=සංවිධාන repos=කෝෂ්ඨ delete=ගිණුම මකන්න twofa=ද්වි-සාධක සත්යාපනය -account_link=සම්බන්ධිත ගිණුම් organization=සංවිධාන public_profile=ප්‍රසිද්ධ පැතිකඩ @@ -506,10 +474,7 @@ language=භාෂාව ui=තේමාව comment_type_group_title=සිරැසිය privacy=පෞද්ගලිකත්වය -keep_activity_private_popup=ක්රියාකාරකම් දෘශ්යමාන වන්නේ ඔබට සහ පරිපාලකවරු සඳහා පමණි - lookup_avatar_by_mail=විද්යුත් තැපැල් ලිපිනය මගින් අවතාර් දෙස බලන්න -federated_avatar_lookup=ෆෙඩරේටඩ් අවතාර් Lookup enable_custom_avatar=අභිරුචි අවතාර් භාවිතා choose_new_avatar=නව අවතාරය තෝරන්න update_avatar=යාවත්කාලීන අවතාර් @@ -525,7 +490,6 @@ password_incorrect=වත්මන් මුරපදය වැරදිය. change_password_success=ඔබගේ මුරපදය යාවත්කාලීන කර ඇත. මෙතැන් සිට ඔබගේ නව මුරපදය භාවිතා කරමින් පුරනය වන්න. password_change_disabled=දේශීය නොවන පරිශීලකයින්ට Forgejo වෙබ් අතුරුමුහුණත හරහා ඔවුන්ගේ මුරපදය යාවත්කාලීන කළ නොහැක. -emails=වි-තැපැල් ලිපින manage_emails=වි-තැපැල් ලිපින කළමනාකරණය manage_themes=පෙරනිමි තේමාව manage_openid=OpenID ලිපින @@ -564,8 +528,6 @@ principal_desc=මෙම SSH සහතික විදුහල්පතිව gpg_desc=මෙම පොදු GPG යතුරු ඔබගේ ගිණුම සමඟ සම්බන්ධ වේ. කොපුවලට සත්යාපනය කිරීමට ඉඩ දෙන බැවින් ඔබේ පුද්ගලික යතුරු ආරක්ෂිතව තබා ගන්න. ssh_helper=උදව් අවශ්යද? GitHub හි මාර්ගෝපදේශය දෙස බලන්න ඔබේම SSH යතුරු නිර්මාණය කරන්න හෝ පොදු ගැටළු විසඳීමට ඔබට SSH භාවිතා කළ හැකිය. gpg_helper=උදව් අවශ්යද? GPGගැන GitHub හි මාර්ගෝපදේශය දෙස බලන්න. -add_new_key=SSH යතුර එක්කරන්න -add_new_gpg_key=ජීපීජී යතුර එක්කරන්න 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=ආරම්භ වන්නේ '-ආරම්භ කරන්න PGP පොදු ප්රධාන බ්ලොක්—' add_new_principal=විදුහල්පති එකතු කරන්න @@ -583,7 +545,6 @@ gpg_invalid_token_signature=සපයන ලද GPG යතුර, අත්ස gpg_token_required=පහත ටෝකනය සඳහා ඔබ අත්සනක් ලබා දිය යුතුය gpg_token=ටෝකනය gpg_token_help=ඔබට අත්සනක් ජනනය කළ හැකිය: -gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=සන්නද්ධ GPG අත්සන key_signature_gpg_placeholder=ආරම්භ වන්නේ '—ආරම්භ කරන්න PGP සිග්නේටුර්—' ssh_key_verified=සත්යාපිත යතුර @@ -618,9 +579,6 @@ show_openid=පැතිකඩ මත පෙන්වන්න hide_openid=පැතිකඩෙන් සඟවන්න ssh_disabled=SSH ආබාධිත ssh_externally_managed=මෙම SSH යතුර බාහිරව මෙම පරිශීලකයා සඳහා කළමනාකරණය කරනු ලැබේ -manage_social=ආශ්රිත සමාජ ගිණුම් කළමනාකරණය කරන්න -unbind=සබැඳිය - manage_access_token=ප්රවේශ ටෝකන කළමනාකරණය කරන්න generate_new_token=නව ටෝකනය ජනනය කරන්න tokens_desc=මෙම ටෝකන Forgejo API භාවිතයෙන් ඔබගේ ගිණුමට ප්රවේශය ලබා දෙයි. @@ -630,8 +588,6 @@ generate_token_success=ඔබේ නව ටෝකනය ජනනය කර ඇ generate_token_name_duplicate=%s දැනටමත් යෙදුම් නාමයක් ලෙස භාවිතා කර ඇත. කරුණාකර අලුත් එකක් භාවිතා කරන්න. delete_token=මකන්න access_token_deletion=ප්රවේශ ටෝකනය මකන්න -access_token_deletion_cancel_action=අවලංගු කරන්න -access_token_deletion_confirm_action=මකන්න delete_token_success=ටෝකනය මකා දමා ඇත. එය භාවිතා කරන යෙදුම් තවදුරටත් ඔබගේ ගිණුමට ප්රවේශය නොමැත. permission_read=කියවූ @@ -677,7 +633,6 @@ twofa_failed_get_secret=රහස්ය වීමට අසමත් විය. manage_account_links=සම්බන්ධිත ගිණුම් කළමනාකරණය කරන්න manage_account_links_desc=මෙම බාහිර ගිණුම් ඔබගේ Forgejo ගිණුමට සම්බන්ධ කර ඇත. -account_links_not_available=දැනට ඔබගේ Forgejo ගිණුමට සම්බන්ධ බාහිර ගිණුම් නොමැත. link_account=ගිණුම සබැඳින්න remove_account_link=සම්බන්ධිත ගිණුම ඉවත් කරන්න remove_account_link_desc=සම්බන්ධිත ගිණුමක් ඉවත් කිරීම ඔබගේ Forgejo ගිණුමට එහි ප්රවේශය අවලංගු කරනු ඇත. දිගටම? @@ -722,7 +677,6 @@ fork_repo=දෙබලක ගබඩාව fork_from=සිට දෙබලක fork_visibility_helper=ව්යාජ ගබඩාවේ දෘශ්යතාව වෙනස් කළ නොහැක. use_template=මෙම අච්චුව භාවිතා කරන්න -clone_in_vsc=VS කේතය පරිගණක ක්රිඩාවට සමාන download_zip=ZIP බාගන්න download_tar=TAR.GZ බාගන්න download_bundle=බණ්ඩලය බාගත කරන්න @@ -742,11 +696,6 @@ readme=මෙයකියවන්න readme_helper=README ගොනු සැකිල්ලක් තෝරන්න. readme_helper_desc=ඔබේ ව්යාපෘතිය සඳහා සම්පූර්ණ විස්තරයක් ලිවිය හැකි ස්ථානය මෙයයි. auto_init=ගබඩාව ආරම්භ කරන්න (.gitignore එකතු, බලපත්ර සහ README) -trust_model_helper=අත්සන සත්යාපනය සඳහා විශ්වාසනීය ආකෘතිය තෝරන්න. හැකි විකල්ප වන්නේ: -trust_model_helper_collaborator=සහයෝගීතාව: සහයෝගිතාකරුවන් විසින් විශ්වාස අත්සන් -trust_model_helper_committer=කමිටුව: කමිටුවන්ට ගැලපෙන විශ්වාසනීය අත්සන් -trust_model_helper_collaborator_committer=සහයෝගීතා+කමිටුව: කමිටුව සමඟ ගැලපෙන සහයෝගිතාකරුවන්ගේ විශ්වාසනීය අත්සන් -trust_model_helper_default=පෙරනිමි: මෙම ස්ථාපනය සඳහා පෙරනිමි විශ්වාස ආකෘතිය භාවිතා කරන්න create_repo=කෝෂ්ඨය සාදන්න default_branch=පෙරනිමි ශාඛාව default_branch_helper=පෙරනිමි ශාඛාව යනු අදින්න ඉල්ලීම් සහ කේත විවරණය සඳහා මූලික ශාඛාවයි. @@ -869,7 +818,6 @@ branches=ශාඛා tags=ටැග් issues=ගැටළු pulls=ඉල්ලීම් අදින්න -project_board=ව්‍යාපෘති labels=ලේබල org_labels_desc=මෙම සංවිධානය යටතේ සියලුම ගබඩාවලදී සමඟ භාවිතා කළ හැකි සංවිධාන මට්ටමේ ලේබල් org_labels_desc_manage=කළමනාකරණය @@ -948,8 +896,6 @@ editor.require_signed_commit=ශාඛාවට අත්සන් කළ කැ commits.desc=මූලාශ්ර කේත වෙනස් කිරීමේ ඉතිහාසය පිරික්සන්න. commits.commits=විවරයන් commits.nothing_to_compare=මෙම ශාඛා සමාන වේ. -commits.search=සෙවුම් වාර… -commits.find=සොයන්න commits.search_all=සියළුම ශාඛා commits.author=කතෘ commits.message=පණිවිඩය @@ -965,8 +911,6 @@ commits.gpg_key_id=ජීපීජී යතුරෙහි හැඳු. commitstatus.error=දෝෂයකි commitstatus.pending=වංගු -ext_issues.desc=බාහිර නිකුතුවකට සම්බන්ධ වන්න ට්රැකර්. - projects=ව්‍යාපෘති projects.desc=ව්යාපෘති මණ්ඩලවල ගැටළු සහ අදින කළමනාකරණය කිරීම. projects.description=විස්තරය (විකල්ප) @@ -986,7 +930,6 @@ projects.type.basic_kanban=මූලික කන්ෙවනි projects.type.bug_triage=දෝෂ ට්රයිජ් projects.template.desc=ව්යාපෘති සැකිල්ල projects.template.desc_helper=ආරම්භ කිරීම සඳහා ව්යාපෘති සැකිල්ලක් තෝරන්න -projects.type.uncategorized=ප්‍රවර්ග ගත නැති projects.column.edit_title=නම projects.column.new_title=නම projects.column.color=වර්ණය @@ -1106,8 +1049,6 @@ issues.ref_issue_from=`මෙම නිකුතුව %[3]s හ issues.ref_pull_from=`මෙම අදින්න ඉල්ලීම%[3]s %[1]s` issues.ref_closing_from=`මෙම ගැටළුව වසා දමනු ඇත%[3]s මෙම ගැටළුව %[1]s` issues.ref_reopening_from=`මෙම ගැටළුව නැවත විවෘත කරනු ඇත%[3]s මෙම ගැටළුව %[1]s` -issues.ref_closed_from=`මෙම නිකුතුව%[4]s %[2]s` -issues.ref_reopened_from=`මෙම නිකුතුව%[4]s %[2]sනැවත විවෘත කරන ලදි` issues.ref_from=`හිම%[1]s` issues.role.owner=හිමිකරු issues.role.member=සාමාජික @@ -1182,15 +1123,11 @@ issues.add_time_sum_to_small=කාලයක් ඇතුළු නොවීය. issues.time_spent_total=වැය කළ මුළු කාලය issues.time_spent_from_all_authors=වැය කළ මුළු කාලය: %s issues.due_date=නියමිත දිනය -issues.invalid_due_date_format=නියමිත දින ආකෘතිය 'yyy-mm-dd' විය යුතුය. -issues.error_modifying_due_date=නියමිත දිනය වෙනස් කිරීමට අපොහොසත් විය. -issues.error_removing_due_date=නියමිත දිනය ඉවත් කිරීමට අපොහොසත් විය. issues.push_commit_1=එකතු %d කැප %s issues.push_commits_n=එකතු %d විවරයන් %s issues.force_push_codes=`බලය-pushed%[1]s සිට %[2]s %[8]s %[4]s ගේ %[9]s %[6]s` issues.force_push_compare=සසඳන්න issues.due_date_form=Yyy-mm-dd -issues.due_date_form_add=නියමිත දිනය එකතු කරන්න issues.due_date_form_edit=සංස්කරණය issues.due_date_form_remove=ඉවත් කරන්න issues.due_date_not_set=නියමිත දිනය නියම කර නැත. @@ -1237,7 +1174,6 @@ issues.review.add_review_request=%s %sසිට සමාලෝචන ඉල් issues.review.remove_review_request=සඳහා ඉවත් සමාලෝචන ඉල්ලීම %s %s issues.review.remove_review_request_self=%sසමාලෝචනය කිරීම ප්රතික්ෂේප කළේය issues.review.pending=වංගු -issues.review.review=සමාලෝචනය issues.review.reviewers=සමාලෝචකයන් issues.review.outdated=යල් පැන ගිය issues.review.show_outdated=යල් පැන ගිය පෙන්වන්න @@ -1247,7 +1183,6 @@ issues.review.hide_resolved=විසඳා සඟවන්න issues.review.resolve_conversation=සංවාදය විසඳන්න issues.review.un_resolve_conversation=නොවිසඳිය හැකි සංවාදය issues.review.resolved_by=මෙම සංවාදය විසඳා ඇති පරිදි සලකුණු කර ඇත -issues.assignee.error=අනපේක්ෂිත දෝෂයක් හේතුවෙන් සියලුම ඇසිග්නස් එකතු නොකළේය. issues.reference_issue.body=ශරීරය issues.content_history.deleted=මකා දැමූ issues.content_history.edited=සංස්කරණය @@ -1273,8 +1208,6 @@ pulls.nothing_to_compare=මෙම ශාඛා සමාන වේ. අදි pulls.nothing_to_compare_and_allow_empty_pr=මෙම ශාඛා සමාන වේ. මෙම මහජන සම්බන්ධතා හිස් වනු ඇත. pulls.has_pull_request=`මෙම ශාඛා අතර අදින්න ඉල්ලීම දැනටමත් පවතී: %[2]s #%[3]d` pulls.create=අදින්න ඉල්ලීම නිර්මාණය -pulls.title_desc_few=%[1]d සිට %[2]s දක්වා %[3]s -pulls.merged_title_desc_few=මර්ජ්%[1]d සිට %[2]s දක්වා %[3]s %[4]s pulls.change_target_branch_at=`ඉලක්කගත ශාඛාව %s සිට %s %sදක්වා වෙනස් කර ඇත` pulls.tab_conversation=සංවාදය pulls.tab_commits=විවරයන් @@ -1376,8 +1309,6 @@ milestones.filter_sort.most_issues=බොහෝ ප්රශ්න milestones.filter_sort.least_issues=අවම ගැටළු -ext_wiki.desc=බාහිර විකියකට සබැඳිය. - wiki=විකි wiki.welcome=විකි වෙත සාදරයෙන් පිළිගනිමු. wiki.welcome_desc=විකි ඔබට සහයෝගිතාකරුවන් සමඟ ලේඛන ලිවීමට සහ බෙදා ගැනීමට ඉඩ දෙයි. @@ -1467,13 +1398,6 @@ activity.git_stats_deletion_n=%d මකාදැමීම් contributors.contribution_type.commits=විවරයන් -search=සොයන්න -search.search_repo=කෝෂ්ඨය සොයන්න -search.fuzzy=සිනිඳු -search.match=තරගය -search.results=%s හි "%s" සඳහා සෙවුම් ප්‍රතිඵල -search.code_no_results=ඔබගේ සෙවුම් පදය ගැලපෙන ප්රභව කේතයක් නොමැත. - settings=සැකසුම් settings.desc=සැකසුම් යනු ගබඩාව සඳහා සැකසුම් කළමනාකරණය කළ හැකි ස්ථානයයි settings.options=කෝෂ්ඨය @@ -1547,7 +1471,6 @@ settings.transfer.success=ගබඩාව මාරු කිරීම සාර settings.transfer_abort=මාරු කිරීම අවලංගු කරන්න settings.transfer_abort_invalid=ඔබට නොපවතින නිධි හුවමාරුවක් අවලංගු කළ නොහැක. settings.transfer_desc=මෙම ගබඩාව පරිශීලකයෙකුට හෝ ඔබට පරිපාලක අයිතිවාසිකම් ඇති සංවිධානයකට මාරු කරන්න. -settings.transfer_form_title=තහවුරු කිරීමක් ලෙස නිධි නාමය ඇතුලත් කරන්න: settings.transfer_in_progress=දැනට අඛණ්ඩ හුවමාරුවක් පවතී. මෙම ගබඩාව වෙනත් පරිශීලකයෙකුට මාරු කිරීමට ඔබ කැමති නම් කරුණාකර එය අවලංගු කරන්න. settings.transfer_notices_1=- ඔබ එය තනි පරිශීලකයෙකුට මාරු කළහොත් ඔබට ගබඩාවට ප්රවේශය අහිමි වනු ඇත. settings.transfer_notices_2=- ඔබ එය ඔබට (co-) අයිති සංවිධානයක් වෙත මාරු කළහොත් ඔබ ගබඩාවට ප්රවේශය තබා ගනු ඇත. @@ -1589,7 +1512,6 @@ settings.delete_collaborator=ඉවත් කරන්න settings.collaborator_deletion=සහයෝගිතාකරු ඉවත් කරන්න settings.collaborator_deletion_desc=සහයෝගිතාකරුවෙකු ඉවත් කිරීම මෙම ගබඩාවට ඔවුන්ගේ ප්රවේශය අවලංගු කරනු ඇත. දිගටම? settings.remove_collaborator_success=සහයෝගිතාකරු ඉවත් කර ඇත. -settings.search_user_placeholder=පරිශීලක සොයන්න… settings.org_not_allowed_to_be_collaborator=සහයෝගීකයෙකු ලෙස සංවිධාන එකතු කළ නොහැක. settings.change_team_access_not_allowed=ගබඩාව සඳහා කණ්ඩායම් ප්රවේශය වෙනස් කිරීම සංවිධාන හිමිකරුට සීමා කර ඇත settings.team_not_in_organization=මෙම කණ්ඩායම ගබඩාවේ එකම සංවිධානයේ නොමැත @@ -1597,7 +1519,6 @@ settings.teams=කණ්ඩායම් settings.add_team=කණ්ඩායම එකතු කරන්න settings.add_team_duplicate=කණ්ඩායම දැනටමත් ගබඩාවක් ඇත settings.add_team_success=කණ්ඩායමට දැන් කෝෂ්ඨයට ප්‍රවේශය ඇත. -settings.search_team=කණ්ඩායම සොයන්න… settings.change_team_permission_tip=කණ්ඩායමේ අවසරය කණ්ඩායම් සැකසුම් පිටුවේ සකසන අතර කෝෂ්ඨය අනුව වෙනස් කළ නොහැකිය settings.delete_team_tip=මෙම කණ්ඩායම සියළුම කෝෂ්ඨවලට ප්‍රවේශය ඇති අතර ඉවත් කළ නොහැකිය settings.remove_team_success=කෝෂ්ඨය වෙත කණ්ඩායමේ ප්‍රවේශය ඉවත් කර ඇත. @@ -1700,12 +1621,7 @@ settings.deploy_key_deletion_desc=යෙදවුම් යතුරක් ඉ settings.deploy_key_deletion_success=යෙදවීමේ යතුර ඉවත් කර ඇත. settings.branches=ශාඛා settings.protected_branch=ශාඛා ආරක්ෂාව -settings.protected_branch_can_push=තල්ලුව ඉඩ? -settings.protected_branch_can_push_yes=ඔබට තල්ලු කළ හැකිය -settings.protected_branch_can_push_no=ඔබට තල්ලු කළ නොහැක settings.branch_protection=ශාඛාව සඳහා ශාඛා ආරක්ෂාව -%s -settings.protect_this_branch=ශාඛා ආරක්ෂාව සක්රීය කරන්න -settings.protect_this_branch_desc=මකාදැමීම වැළැක්වීම සහ ශාඛා වෙත තල්ලු කිරීම සහ ඒකාබද්ධ කිරීම සීමා කරයි. settings.protect_disable_push=තල්ලුව අක්රීය settings.protect_disable_push_desc=මෙම ශාඛාවට තල්ලු කිරීමට ඉඩ නොදෙනු ඇත. settings.protect_enable_push=තල්ලුව සක්රීය කරන්න @@ -1714,9 +1630,7 @@ settings.protect_whitelist_committers=වයිට්ලිස්ට් සී settings.protect_whitelist_committers_desc=මෙම ශාඛාව වෙත තල්ලු කිරීමට අවසර ඇත්තේ වයිට්ලිස්ට් පරිශීලකයින්ට හෝ කණ්ඩායම්වලට පමණි (නමුත් බල තල්ලුව නොවේ). settings.protect_whitelist_deploy_keys=වයිට්ලිස්ට් තල්ලු කිරීමට ලිවීමේ ප්රවේශය සහිත යතුරු යොදවන්න. settings.protect_whitelist_users=තල්ලු කිරීම සඳහා වයිට්ලිස්ට් පරිශීලකයින්: -settings.protect_whitelist_search_users=පරිශීලකයින් සොයන්න… settings.protect_whitelist_teams=තල්ලු කිරීම සඳහා වයිට්ලිස්ට් කණ්ඩායම්: -settings.protect_whitelist_search_teams=කණ්ඩායම් සොයන්න… settings.protect_merge_whitelist_committers=ඒකාබද්ධ වයිට්ලිස්ට් සක්රීය කරන්න settings.protect_merge_whitelist_committers_desc=මෙම ශාඛාවට ඇද ගැනීමේ ඉල්ලීම් ඒකාබද්ධ කිරීමට සුදු පැහැති පරිශීලකයින්ට හෝ කණ්ඩායම්වලට පමණක් ඉඩ දෙන්න. settings.protect_merge_whitelist_users=ඒකාබද්ධ කිරීම සඳහා Whitelisted පරිශීලකයන්: @@ -1734,8 +1648,6 @@ settings.dismiss_stale_approvals=ස්ථාවර අනුමැතිය බ settings.dismiss_stale_approvals_desc=අදින්න ඉල්ලීමෙහි අන්තර්ගතය වෙනස් කරන නව විවරයන් ශාඛාවට තල්ලු කරන විට, පැරණි අනුමත කිරීම් නිෂ්ප්රභා කරනු ලැබේ. settings.require_signed_commits=අත්සන් කළ යුතු settings.require_signed_commits_desc=අත්සන් නොකළ හෝ සත්යාපනය කළ නොහැකි නම් මෙම ශාඛාවට තල්ලු කිරීම ප්රතික්ෂේප කරන්න. -settings.add_protected_branch=ආරක්ෂාව සක්රීය කරන්න -settings.delete_protected_branch=ආරක්ෂාව අක්‍රීය කරන්න settings.protected_branch_deletion=ශාඛා ආරක්ෂණය අක්රීය කරන්න settings.protected_branch_deletion_desc=ශාඛා ආරක්ෂාව අක්රිය කිරීමෙන් පරිශීලකයින්ට ශාඛාවට තල්ලු කිරීමට ලිඛිත අවසරයක් ඇත. දිගටම? settings.block_rejected_reviews=ප්රතික්ෂේප කරන ලද සමාලෝචන මත ඒකාබද්ධ කිරීම @@ -1798,8 +1710,6 @@ settings.lfs_pointers.associateAccessible=ආශ්රිත ප්රවේශ settings.rename_branch_failed_exist=ඉලක්කගත ශාඛාව %s පවතින බැවින් ශාඛාව නැවත නම් කළ නොහැක. settings.rename_branch_failed_not_exist=%s ශාඛාව නැවත නම් කළ නොහැක එය නොමැති නිසා. settings.rename_branch_success=ශාඛාව %s සාර්ථකව %sලෙස නම් කරන ලදී. -settings.rename_branch_from=පරණ ශාඛාවේ නම -settings.rename_branch_to=නව ශාඛාවේ නම settings.rename_branch=ශාඛාව යළි නම් කරන්න diff.browse_source=මූලාශ්‍රය පිරික්සන්න @@ -1808,7 +1718,6 @@ diff.commit=කැප diff.git-notes=සටහන් diff.data_not_available=Diff අන්තර්ගත ලබාගත නොහැක diff.options_button=විවිධ විකල්ප -diff.show_diff_stats=සංඛ්යාන පෙන්වන්න diff.download_patch=පැච් ගොනුව බාගත diff.download_diff=බාගත Dff ගොනුව diff.show_split_view=භේදය දැක්ම @@ -1888,7 +1797,6 @@ release.tag_name_invalid=ටැග් නම වලංගු නොවේ. release.tag_name_protected=ටැග් නම ආරක්ෂා කර ඇත. release.tag_already_exist=මෙම ටැග් නාමය දැනටමත් පවතී. release.downloads=බාගැනීම් -release.download_count=බාගැනීම්: %s release.add_tag_msg=ටැග් පණිවිඩයක් ලෙස නිකුත් කිරීමේ මාතෘකාව සහ අන්තර්ගතය භාවිතා කරන්න. release.add_tag=ටැග පමණක් සාදන්න @@ -1901,7 +1809,6 @@ branch.included_desc=මෙම ශාඛාව පෙරනිමි ශාඛ branch.included=ඇතුළත් branch.create_new_branch=ශාඛාවෙන් ශාඛාව සාදන්න: branch.confirm_create_branch=ශාඛාව සාදන්න -branch.confirm_rename_branch=ශාඛාව යළි නම් කරන්න branch.create_branch_operation=ශාඛාව සාදන්න branch.new_branch=නව ශාඛාවක් සාදන්න branch.renamed=ශාඛාව %s %sලෙස නම් කරන ලදී. @@ -1994,8 +1901,6 @@ teams.leave.detail=%s හැරයනවාද? teams.can_create_org_repo=කෝෂ්ඨය සාදන්න teams.can_create_org_repo_helper=සාමාජිකයින්ට සංවිධානයෙහි නව කෝෂ්ඨ සෑදීමට හැකිය. නිර්මාතෘ ට නව කෝෂ්ඨයෙහි පරිපාලක ප්‍රවේශය ලැබෙනු ඇත. teams.read_access=කියවූ -teams.read_access_helper=සාමාජිකයින්ට කණ්ඩායම් ගබඩාව බැලීමට හා පරිගණක ක්රිඩාවට සමාන කළ හැකිය. -teams.write_access_helper=සාමාජිකයින්ට කණ්ඩායම් ගබඩාවට කියවා තල්ලු කළ හැකිය. teams.admin_access=පරිපාලක ප්‍රවේශය teams.admin_access_helper=සාමාජිකයින්ට කණ්ඩායම් ගබඩාවට ඇදගෙන යාමට සහ තල්ලු කිරීමට සහ සහයෝගී කරුවන් එකතු කිරීමට හැකිය. teams.no_desc=මෙම කණ්ඩායමට සවිස්තරයක් නැත @@ -2008,12 +1913,9 @@ teams.add_team_member=කණ්ඩායම් සාමාජික එකත teams.delete_team_title=කණ්ඩායම මකන්න teams.delete_team_desc=කණ්ඩායමක් මකා දැමීම එහි සාමාජිකයන්ගෙන් ගබඩාව ප්රවේශය අවලංගු කරයි. දිගටම? teams.delete_team_success=කණ්ඩායම මකා දමා ඇත. -teams.read_permission_desc=මෙම කණ්ඩායම ප්රදානය කියවන්න ප්රවේශය: සාමාජිකයින්ට කණ්ඩායම් නිධි බැලීමට හා පරිගණක ක්රිඩාවට සමාන කළ හැකිය. -teams.write_permission_desc=මෙම කණ්ඩායම ප්රදානය කරයි ප්රවේශය ලියන්න: සාමාජිකයින්ට කියවා කණ්ඩායම් ගබඩාවන්ට තල්ලු කළ හැකිය. teams.admin_permission_desc=මෙම කණ්ඩායම පරිපාලක ප්රවේශය ලබා දෙයි: සාමාජිකයින්ට කියවීමට, කණ්ඩායම් ගබඩාවන්ට සහයෝගීකයින් වෙත තල්ලු කිරීමට සහ එකතු කිරීමට හැකිය. teams.create_repo_permission_desc=මීට අමතරව, මෙම කණ්ඩායම ලබා දෙයි ගබඩාව සාදන්න අවසරය: සාමාජිකයින්ට සංවිධානයේ නව ගබඩාවක් නිර්මාණය කළ හැකිය. teams.repositories=කණ්ඩායම් කෝෂ්ඨ -teams.search_repo_placeholder=කෝෂ්ඨය සොයන්න… teams.remove_all_repos_title=සියළුම කණ්ඩායම් කෝෂ්ඨ ඉවත් කරන්න teams.remove_all_repos_desc=මෙය කණ්ඩායමෙන් සියළුම කෝෂ්ඨ ඉවත් කෙරෙනු ඇත. teams.add_all_repos_title=සියළුම කෝෂ්ඨ එක්කරන්න @@ -2025,9 +1927,6 @@ teams.specific_repositories=විශේෂිත කෝෂ්ඨ teams.specific_repositories_helper=සාමාජිකයින්ට ප්රවේශය ඇත්තේ කණ්ඩායමට පැහැදිලිවම එකතු කරන ලද ගබඩාවන්ට පමණි. මෙම තෝරා නැත ස්වයංක්රීයව මේ වන විටත් සමග එකතු කර ඇති නිධි ඉවත් සියලුම නිධි. teams.all_repositories=සියළුම කෝෂ්ඨ teams.all_repositories_helper=කණ්ඩායමට සියලුම ගබඩාවන්ට ප්රවේශය ඇත. මෙය තෝරා ගැනීම දැනට පවතින සියලුම ගබඩාව කණ්ඩායමට එකතු කරයි. -teams.all_repositories_read_permission_desc=මෙම කණ්ඩායම ප්රදානය කියවන්න ප්රවේශ සියලු ගබඩාවන්ට: සාමාජිකයින්ට නිධි බැලීම හා පරිගණක ක්රිඩාවට සමාන කළ හැකිය. -teams.all_repositories_write_permission_desc=මෙම කණ්ඩායම ප්රදානය කරයි වෙත ප්රවේශය ලියන්න සියලු ගබඩාවන්ට: සාමාජිකයින්ට කියවීමට සහ ගබඩාවන්ට තල්ලු කළ හැකිය. -teams.all_repositories_admin_permission_desc=මෙම කණ්ඩායම ප්රදානය කරයි පරිපාලක වෙත ප්රවේශය සියලු ගබඩාවන්ට: සාමාජිකයින්ට කියවීමට, තල්ලු කිරීමට සහ ගබඩාවන්ට සහයෝගීකයින් එකතු කිරීමට. [admin] dashboard=උපකරණ පුවරුව @@ -2106,7 +2005,6 @@ dashboard.gc_metadata_obtained=ලබාගත් GC පාර-දත්ත dashboard.other_system_allocation_obtained=ලබා ගත් වෙනත් පද්ධති ප්රතිපාදන dashboard.next_gc_recycle=ඊලඟ GC, ප්රතිචක්රීකරණ dashboard.last_gc_time=පසුගිය GC වේලාව -dashboard.total_gc_time=මුළු GC විරාමය dashboard.total_gc_pause=මුළු GC විරාමය dashboard.last_gc_pause=අවසන් GC විරාමය dashboard.gc_times=GC ටයිම්ස් @@ -2185,9 +2083,6 @@ repos.unadopted.no_more=තවත් සම්මත නොකළ ගබඩා repos.owner=හිමිකරු repos.name=නම repos.private=පෞද්ගලික -repos.watches=අත් ඔරලෝසු -repos.stars=තරු -repos.forks=දෙබලක repos.issues=ගැටළු repos.size=ප්‍රමාණය @@ -2267,17 +2162,6 @@ auths.oauth2_emailURL=වි-තැපෑල ඒ.ස.නි. auths.skip_local_two_fa=දේශීය 2FA මඟ auths.skip_local_two_fa_helper=unset පිටත් 2FA කට්ටලයක් සමග දේශීය පරිශීලකයන් තවමත් මත ප්රවිෂ්ට වීමට 2FA සමත් වනු ඇත අදහස් auths.oauth2_tenant=අඳ -auths.enable_auto_register=ස්වයං ලියාපදිංචිය සබල කරන්න -auths.sspi_auto_create_users=ස්වයංක්‍රීයව පරිශීලකයින් සාදන්න -auths.sspi_auto_create_users_helper=පළමු වරට ලොගින් වන පරිශීලකයින් සඳහා නව ගිණුම් ස්වයංක්රීයව නිර්මාණය කිරීමට SSPI auth ක්රමයට ඉඩ දෙන්න -auths.sspi_auto_activate_users=පරිශීලකයින් ස්වයංක්රීයව සක්රිය කරන්න -auths.sspi_auto_activate_users_helper=නව පරිශීලකයින් ස්වයංක්රීයව සක්රිය කිරීමට SSPI auth ක්රමයට ඉඩ දෙන්න -auths.sspi_strip_domain_names=පරිශීලක නාම වලින් වසම් නාම ඉවත් කරන්න -auths.sspi_strip_domain_names_helper=පරීක්ෂා කර ඇත්නම්, ඩොමේන් නම් ලොගන් නම් වලින් ඉවත් කරනු ලැබේ (උදා. “ඩොමේන්\ පරිශීලක” සහ "user@example.org" යන දෙකම හුදෙක් “පරිශීලක” බවට පත්වනු ඇත). -auths.sspi_separator_replacement=\,/සහ @ වෙනුවට භාවිතා කිරීමට වෙන්කර -auths.sspi_separator_replacement_helper=පහළ මට්ටමේ පිවිසුම් නාම (ද. "ඩොමේන්\ පරිශීලක" හි) සහ පරිශීලක ප්රධාන නම් (ද. @ in "user@example.org"). -auths.sspi_default_language=පෙරනිමි පරිශීලක භාෂාව -auths.sspi_default_language_helper=SSPI auth ක්රමය මගින් ස්වයංක්රීයව නිර්මාණය කරන ලද පරිශීලකයින් සඳහා පෙරනිමි භාෂාව. ඔබ භාෂාව ස්වයංක්රීයව හඳුනා ගැනීමට කැමති නම් හිස්ව තබන්න. auths.tips=ඉඟි auths.tips.oauth2.general=OUTU2 සත්යාපන auths.tip.oauth2_provider=OUTU2 සැපයුම්කරු @@ -2285,7 +2169,6 @@ auths.tip.nextcloud=පහත සඳහන් මෙනුව භාවිතා auths.tip.dropbox=%s හි නව යෙදුමක් සාදන්න auths.tip.facebook=%s හි නව යෙදුමක් ලියාපදිංචි කර නිෂ්පාදනය එකතු කරන්න “ෆේස්බුක් ලොගින් වන්න” auths.tip.github=%s හි නව OAUTH අයදුම්පතක් ලියාපදිංචි කරන්න -auths.tip.gitlab=https://gitlab.com/profile/applications හි නව අයදුම්පතක් ලියාපදිංචි කරන්න auths.tip.google_plus=ගූගල් API කොන්සෝලය වෙතින් OUT2 සේවාදායක අක්තපත්ර ලබා ගන්න %s auths.tip.openid_connect=අන්ත ලක්ෂ්ය නියම කිරීම සඳහා OpenID Connect ඩිස්කවරි URL (/.හොඳින් දැන /openid-වින්යාසය) භාවිතා කරන්න auths.tip.twitter=%s වෙත යන්න, යෙදුමක් සාදන්න සහ “මෙම යෙදුම ට්විටර් සමඟ පුරනය වීමට භාවිතා කිරීමට ඉඩ දෙන්න” විකල්පය සක්රීය කර ඇති බවට සහතික වන්න diff --git a/options/locale/locale_sk-SK.ini b/options/locale/locale_sk-SK.ini index 567fe1f22e..8c6ee9fa9f 100644 --- a/options/locale/locale_sk-SK.ini +++ b/options/locale/locale_sk-SK.ini @@ -49,21 +49,14 @@ webauthn_error_unable_to_process=Server nemohol spracovať vašu požiadavku. webauthn_error_duplicated=Bezpečnostný kľúč nie je pre túto požiadavku povolený. Uistite sa, že kľúč ešte nie je zaregistrovaný. webauthn_error_empty=Musíte nastaviť meno pre tento kľúč. webauthn_error_timeout=Vypršal čas na čítanie vašeho kľúča. Znova načítajte túto stránku a skúste to opäť. -webauthn_reload=Znovu načítať - repository=Repozitár organization=Organizácia mirror=Zrkadlo -new_repo=Nový repozitár -new_migrate=Nová migrácia new_mirror=Nové zrkadlo new_fork=Nový fork repozitára -new_org=Nová organizácia new_project=Nový projekt new_project_column=Nový stĺpec -manage_org=Spravovať organizácie admin_panel=Administrácia stránky -account_settings=Nastavenia účtu settings=Nastavenia your_profile=Profil your_starred=Obľúbené @@ -219,8 +212,6 @@ string.desc=Z - A [error] occurred=Vyskytla sa chyba report_message=Ak si myslíte, že ide o chybu Forgejo, vyhľadajte problémy na Codeberg-e alebo v prípade potreby otvorte nový problém. -missing_csrf=Nesprávna žiadosť: neprítomný CSFR token -invalid_csrf=Nesprávna žiadosť: nesprávny CSFR token not_found=Nebolo možné nájsť cieľ. network_error=Chyba siete server_internal = Vnútorná chyba servera @@ -356,15 +347,10 @@ config_location_hint = Tieto možnosti konfigurácie budú uložené v: [home] uname_holder=Používateľské meno alebo emailová adresa -password_holder=Heslo switch_dashboard_context=Prepnúť kontext nástenky my_repos=Repozitáre -show_more_repos=Zobraziť ďalšie repozitáre… -collaborative_repos=Kolaboratívne repozitáre my_orgs=Moje organizácie -my_mirrors=Moje zrkadlá view_home=Zobraziť %s -search_repos=Nájsť repozitár… filter=Ostatné filtre filter_by_team_repositories=Filtrovať podľa tímových repozitárov feed_of=Informačný kanál „%s“ @@ -385,20 +371,8 @@ issues.in_your_repos=Vo vašich repozitároch repos=Repozitáre users=Používatelia organizations=Organizácie -search=Hľadať go_to=Ísť na code=Zdrojový kód -search.type.tooltip=Typ vyhľadávania -search.fuzzy=Fuzzy -search.fuzzy.tooltip=Zahrnúť iba výsledky, ktoré sa takmer zhodujú s hľadaným výrazom -search.match=Zhoda -search.match.tooltip=Zahrnúť iba výsledky, ktoré sa presne zhodujú s hľadaným výrazom -code_search_unavailable=Vyhľadávanie kódu momentálne nie je dostupné. Kontaktujte, prosím, správcu. -repo_no_results=Nenašli sa zodpovedajúce repozitáre. -user_no_results=Nenašli sa zodpovedajúci používatelia. -org_no_results=Nenašli sa zodpovedajúce organizácie. -code_no_results=Nenašiel sa žiaden zdrojový kód zodpovedajúci hľadanému výrazu. -code_search_results=`Výsledky hľadania pre "%s"` code_last_indexed_at=Naposledy indexované %s relevant_repositories_tooltip=Repozitáre, ktoré sú forkami alebo ktoré nemajú tému, žiadnu ikonu ani popis, sú skryté. relevant_repositories=Zobrazujú sa iba relevantné repozitáre, zobraziť nefiltrované výsledky. @@ -409,15 +383,12 @@ stars_few = %d hviezdy [auth] create_new_account=Zaregistrovať účet -register_helper_msg=Máte už účet? Prihláste sa teraz! -social_register_helper_msg=Máte už účet? Prepojte ho teraz! disable_register_prompt=Registrácia je zakázaná. Obráťte sa, prosím, na administrátora stránky. disable_register_mail=E-mailové potvrdzovanie registrácie je zakázané. manual_activation_only=Na dokončenie aktivácie kontaktujte správcu webu. remember_me=Zapamätať si toto zariadenie forgot_password_title=Zabudnuté heslo forgot_password=Zabudli ste heslo? -sign_up_now=Potrebujete účet? Zaregistrujte sa teraz. confirmation_mail_sent_prompt=Na adresu %s bol odoslaný nový potvrdzovací e-mail. Skontrolujte si, prosím, vašu doručenú poštu počas najbližších %s pre dokončenie procesu registrácie. allow_password_change=Vyžiadať od používateľa zmenu hesla (doporučuje sa) reset_password_mail_sent_prompt=Na adresu %s bol odoslaný potvrdzovací e-mail. Skontrolujte si, prosím, vašu doručenú poštu počas najbližších %s pre dokončenie procesu obnovenia účtu. @@ -427,7 +398,6 @@ prohibit_login=Prihlásenie zakázané resent_limit_prompt=Pred malou chvíľou ste už požiadali o aktivačný email. Počkajte, prosím, 3 minúty a potom skúste znova. has_unconfirmed_mail=Ahoj %s, tvoja e-mailová adresa (%s) je neoverená. Ak si ešte nedostal potvrdzovací e-mail, alebo je potrebné odoslať nový, klikni, prosím, na tlačidlo nižšie. resend_mail=Kliknite sem pre opätovné odoslanie aktivačného e-mailu -email_not_associate=Táto e-mailová adresa nie je priradená k žiadnemu účtu. send_reset_mail=Odoslať e-mail pre obnovenie účtu reset_password=Obnovenie účtu invalid_code=Váš potvrdzovací kód je chybný alebo vypršala jeho platnosť. @@ -442,7 +412,6 @@ twofa_scratch_used=Použili ste pomocný kód. Boli ste presmerovaní na stránk twofa_passcode_incorrect=Váš prístupový kód je nesprávny. Ak ste vaše zariadenie umiestnili nesprávne, použite pomocný kód na prihlásenie. twofa_scratch_token_incorrect=Váš pomocný kód je nesprávny. login_userpass=Prihlásiť sa -tab_openid=OpenID oauth_signup_tab=Zaregistrovať nový účet oauth_signup_title=Dokončiť nový účet oauth_signup_submit=Dokončiť účet @@ -466,7 +435,6 @@ authorize_application_created_by=Túto aplikáciu vytvoril %s. authorize_application_description=Ak udelíte prístup, bude možné pristupovať a zapisovať do všetkých vašich informácií o účte, vrátane súkromných repozitárov a organizácií. authorize_title=Autorizovať „%s“ pre prístup k vášmu účtu? authorization_failed=Autorizácia zlyhala -sspi_auth_failed=SSPI overenie zlyhalo password_pwned_err=Nie je možné dokončiť žiadosť na HaveIBeenPwned hint_login = Už máte účet? Prihláste sa! hint_register = Potrebujete účet? Zaregistrujte sa. @@ -495,7 +463,6 @@ link_not_working_do_paste=Nefunguje? Skúste ho skopírovať a vložiť do svojh hi_user_x=Ahoj %s, activate_account=Aktivujte si svoj účet, prosím -activate_account.title=%s, aktivujte si svoj účet, prosím activate_account.text_1=Ahoj %[1]s, ďakujeme za registráciu na %[2]s! activate_account.text_2=Pre aktiváciu vašeho účtu kliknite, prosím, na nasledovný odkaz do %s: @@ -503,13 +470,11 @@ activate_email=Overte svoju e-mailovú adresu activate_email.text=Pre overenie vašej e-mailovej adresy kliknite, prosím, na nasledovný odkaz do %s: register_notify=Vitajte v %s -register_notify.title=%[1]s, vitajte v %[2]s register_notify.text_1=toto je e-mail potvrdzujúci vašu registráciu pre %s! register_notify.text_2=Teraz sa môžete prihlásiť s používateľským menom: %s register_notify.text_3=Ak bol tento účet vytvorený pre vás, nastavte prosím najskôr svoje heslo. reset_password=Obnoviť váš účet -reset_password.title=%s, požiadali ste o obnovenie vášho účtu reset_password.text=Pre obnovenie vašeho účtu kliknite, prosím, na nasledovný odkaz do %s: register_success=Registrácia prebehla úspešne @@ -584,8 +549,6 @@ RepoName=Názov repozitára Email=E-mailová adresa Password=Heslo Retype=Potvrdiť heslo -SSHTitle=Názov SSH kľúča -HttpsUrl=HTTPS URL PayloadUrl=URL nákladu TeamName=Názov tímu AuthName=Názov autorizácie @@ -598,9 +561,6 @@ CommitChoice=Výber commitu TreeName=Cesta k súboru Content=Obsah -SSPISeparatorReplacement=Oddeľovač -SSPIDefaultLanguage=Predvolený jazyk - require_error=` nemôže byť prázdne.` alpha_dash_error=` by mal obsahovať iba alfanumerické znaky, pomlčku ('-') a podčiarkovník ('_').` alpha_dash_dot_error=` by mal obsahovať iba alfanumerické znaky, pomlčku ('-'), podčiarkovník ('_') a bodku ('.').` @@ -688,13 +648,11 @@ password=Heslo security=Zabezpečenie avatar=Avatar ssh_gpg_keys=SSH / GPG kľúče -social=Sociálne účty applications=Aplikácie orgs=Organizácie repos=Repozitáre delete=Zmazať účet twofa=Dvojfaktorové overenie -account_link=Prepojené účty organization=Organizácie webauthn=Bezpečnostné kľúče @@ -728,10 +686,7 @@ comment_type_group_pull_request_push=Pridané commity comment_type_group_project=Projekt saved_successfully=Nastavenia úspešne uložené. privacy=Súkromie -keep_activity_private_popup=Nastaviť aktivitu viditeľnú iba pre vás a administrátorov - lookup_avatar_by_mail=Vyhľadať avatar pomocou e-mailovej adresy -federated_avatar_lookup=Vyhľadanie avatarov z verejných zdrojov enable_custom_avatar=Použiť užívateľský avatar choose_new_avatar=Vybrať nový avatar update_avatar=Aktualizovať avatar @@ -747,7 +702,6 @@ password_incorrect=Aktuálne heslo nie je správne. change_password_success=Vaše heslo bolo aktualizované. Od teraz sa prihlasujte novým heslom. password_change_disabled=Externe overovaní používatelia nemôžu aktualizovať svoje heslo prostredníctvom webového rozhrania Forgejo. -emails=E-mailové adresy manage_emails=Správa e-mailových adries manage_themes=Predvolená téma manage_openid=Adresy OpenID @@ -786,8 +740,6 @@ principal_desc=Tieto SSH certifikačné identity sú prepojené s vašim účtom gpg_desc=Tieto verejné GPG kľúče sú prepojené s vašim účtom. Uchovajte vaše súkromné kľúče v bezpečí, pretože umožňujú overenie commitov. ssh_helper=Potrebujete pomoc? Pozrite sa do príručky GitHub-u ako vytvoriť svoje SSH kľúče alebo ako riešiť bežné problémy s ktorými sa môžete stretnúť pri používaní SSH. gpg_helper=Potrebujete pomoc? Pozrite sa do príručky GitHub-u o GPG. -add_new_key=Pridať SSH kľúč -add_new_gpg_key=Pridať GPG kľúč key_content_ssh_placeholder=Začína sa s 'ssh-ed25519', 'ssh-rsa', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', 'ecdsa-sha2-nistp521', 'sk-ecdsa-sha2-nistp256@openssh.com' alebo 'sk-ssh-ed25519@openssh.com' key_content_gpg_placeholder=Začína sa s '-----BEGIN PGP PUBLIC KEY BLOCK-----' add_new_principal=Pridať identitu @@ -805,7 +757,6 @@ gpg_invalid_token_signature=Zadaný GPG kľúč, podpis a token sa nezhodujú al gpg_token_required=Musíte zadať podpis pre nižšie uvedený token gpg_token=Token gpg_token_help=Podpis môžete vygenerovať pomocou: -gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=Zakódovaný (ASCII) podpis GPG key_signature_gpg_placeholder=Začína s '-----BEGIN PGP SIGNATURE-----' ssh_key_verified=Overený kľúč @@ -844,9 +795,6 @@ show_openid=Zobraziť v profile hide_openid=Odstrániť z profilu ssh_disabled=SSH zakázané ssh_externally_managed=Tento kľúč SSH je pre tohto používateľa spravovaný externe -manage_social=Spravovať súvisiace sociálne účty -unbind=Odpojiť - manage_access_token=Správa prístupových tokenov generate_new_token=Vygenerovať nový token tokens_desc=Tieto tokeny poskytujú prístup k vášmu účtu pomocou rozhrania Forgejo API. @@ -856,8 +804,6 @@ generate_token_success=Váš nový token bol vygenerovaný. Skopírujte ho teraz generate_token_name_duplicate=%s už bol použitý ako názov aplikácie. Použite nový. delete_token=Vymazať access_token_deletion=Odstrániť prístupový token -access_token_deletion_cancel_action=Zrušiť -access_token_deletion_confirm_action=Vymazať access_token_deletion_desc=Odstránením tokenu zrušíte prístup k vášmu účtu pre aplikácie, ktoré ho používajú. To nie je možné vrátiť späť. Ďalej? delete_token_success=Token bol odstránený. Aplikácie, ktoré ho používajú, už nemajú prístup k vášmu účtu. @@ -909,7 +855,6 @@ webauthn_delete_key_desc=Ak odstránite bezpečnostný kľúč, už sa s ním ne manage_account_links=Spravovať prepojené kontá manage_account_links_desc=Tieto externé účty sú prepojené s vaším účtom Forgejo. -account_links_not_available=V súčasnosti nie sú s vaším účtom Forgejo prepojené žiadne externé účty. link_account=Pripojiť účet remove_account_link=Odstrániť prepojený účet remove_account_link_desc=Odstránenie prepojeného účtu zruší jeho prístup k vášmu účtu Forgejo. Pokračovať? @@ -986,7 +931,6 @@ visibility_helper_forced=Váš správca vynucuje že nové repozitáre musia by visibility_fork_helper=(Zmena ovplyvní všetky forky.) clone_helper=Potrebujete pomoc s klonovaním? Navštívte Pomocníka. use_template=Použiť túto šablónu -clone_in_vsc=Klonovať vo VS Code generate_repo=Generovať repozitár generate_from=Generovať z repo_desc=Popis @@ -1001,11 +945,6 @@ readme=README readme_helper=Vyberte šablónu súboru README. readme_helper_desc=Toto je miesto, kde môžete napísať úplný popis vášho projektu. auto_init=Inicializovať repozitár (pridá súbory .gitignore, License a README) -trust_model_helper=Vyberte model dôveryhodnosti na overenie podpisu. Možnosti sú: -trust_model_helper_collaborator=Spolupracovník: Dôverovať podpisom spolupracovníkov -trust_model_helper_committer=Prispievateľ: Dôverovať podpisom, ktoré zodpovedajú prispievateľovi -trust_model_helper_collaborator_committer=Spolupracovník+Prispievateľ: Dôverovať podpisom spolupracovníkov, ktorí zodpovedajú prispievateľovi -trust_model_helper_default=Predvolené: Pre túto inštaláciu použiť predvolený model dôvery create_repo=Vytvoriť repozitár mirror_prune=Vyčistiť mirror_prune_desc=Odstráňte zastarané referencie vzdialeného sledovania @@ -1064,7 +1003,6 @@ form.reach_limit_of_creation_n=Už ste dosiahli svoj limit pre %d repozitáre. need_auth=Autorizácia migrate_options=Možnosti migrácie -migrate_service=Migračná služba migrate_options_mirror_helper=Tento repozitár bude zrkadlom migrate_options_lfs=Migrovať LFS súbory migrate_options_lfs_endpoint.label=Koncový bod LFS @@ -1123,7 +1061,6 @@ find_tag=Hľadať tag branches=Vetvy tags=Tagy pulls=Pull requesty -project_board=Projekty packages=Balíčky actions=Akcie labels=Štítky @@ -1170,7 +1107,6 @@ editor.no_commit_to_branch=Nedá sa odoslať priamo do vetvy, pretože: editor.require_signed_commit=Vetva vyžaduje podpísaný commit commits.commits=Commity -commits.find=Hľadať commits.search_all=Všetky vetvy commits.author=Autor commits.message=Správa @@ -1243,7 +1179,6 @@ issues.review.wait=bol požiadaný o revidovanie %s issues.review.add_review_request=požiadal o revidovanie od %s %s issues.review.remove_review_request=odstránil žiadosť o revidovanie na %s %s issues.review.remove_review_request_self=odmietol revidovať %s -issues.review.review=Revízia issues.review.reviewers=Revidenti @@ -1280,15 +1215,6 @@ activity.git_stats_commit_n=%d commity contributors.contribution_type.commits=Commitov -search=Hľadať -search.type.tooltip=Typ vyhľadávania -search.fuzzy=Fuzzy -search.fuzzy.tooltip=Zahrnúť iba výsledky, ktoré sa takmer zhodujú s hľadaným výrazom -search.match=Zhoda -search.match.tooltip=Zahrnúť iba výsledky, ktoré sa presne zhodujú s hľadaným výrazom -search.code_no_results=Nenašiel sa žiaden zdrojový kód zodpovedajúci hľadanému výrazu. -search.code_search_unavailable=Vyhľadávanie kódu momentálne nie je dostupné. Kontaktujte, prosím, správcu. - settings.collaboration.owner=Vlastník settings.hooks=Webhooky settings.githooks=Git hooky @@ -1406,9 +1332,6 @@ teams.specific_repositories=Konkrétne repozitáre teams.specific_repositories_helper=Členovia budú mať prístup iba k úložiskám, ktoré sú vyslovene pridané do tímu. Výber tejto možnosti neodstráni automaticky repozitáre, ktoré už boli pridané pomocou položky Všetky repozitáre. teams.all_repositories=Všetky repozitáre teams.all_repositories_helper=Tím má prístup ku všetkým repozitárom. Výberom tejto možnosti pridáte do tímu všetky existujúce repozitáre. -teams.all_repositories_read_permission_desc=Tomuto tímu je pridelený prístup na čítanie ku všetkým repozitárom: členovia môžu prezerať a klonovať repozitáre. -teams.all_repositories_write_permission_desc=Tomuto tímu je pridelený prístup na Zápis do všetkých repozitárov: členovia môžu prezerať a nahrávať do repozitárov. -teams.all_repositories_admin_permission_desc=Tomuto tímu je pridelený Admin prístup ku všetkým repozitárom: členovia môžu prezerať, nahrávať do repozitárov a pridávať do nich spolupracovníkov. [admin] repositories=Repozitáre @@ -1421,8 +1344,6 @@ dashboard.delete_generated_repository_avatars=Odstrániť vygenerované avatary repos.owner=Vlastník repos.private=Súkromný -repos.forks=Forky - packages.owner=Vlastník packages.repository=Repozitár @@ -1436,9 +1357,6 @@ systemhooks.update_webhook=Aktualizovať defaultný webhook auths.enabled=Povolené auths.oauth2_tokenURL=Token URL -auths.sspi_default_language=Predvolený jazyk používateľa -auths.sspi_default_language_helper=Predvolený jazyk pre používateľov automaticky vytvorený metódou SSPI auth. Ak uprednostňujete automatické zisťovanie jazyka, nechajte pole prázdne. - config.app_ver=Verzia Forgejo config.app_url=Základná URL Forgejo diff --git a/options/locale/locale_sl.ini b/options/locale/locale_sl.ini index 07ccaed259..f90a20391d 100644 --- a/options/locale/locale_sl.ini +++ b/options/locale/locale_sl.ini @@ -20,9 +20,7 @@ explore = Razišči return_to_forgejo = Nazaj na Forgejo write = Napišite webauthn_error_unknown = Zgodila se je neznana napaka. Prosimo, poskusite znova. -webauthn_reload = Ponovno polnjenje twofa = Dvofaktorsko preverjanje pristnosti -account_settings = Nastavitve računa version = Verzija copy_success = Kopirano! help = Pomoč @@ -56,7 +54,6 @@ re_type = Potrdite geslo webauthn_unsupported_browser = Vaš brskalnik trenutno ne podpira WebAuthna. copy = Kopiraj enabled = Omogočeno -new_org = Nova organizacija show_timestamps = Prikaži časovne žige rss_feed = RSS vir never = Nikoli @@ -74,11 +71,8 @@ new_project_column = Nova kolumna add = Dodaj active_stopwatch = Aktivno sledenje času organization = Organizacija -new_migrate = Nova migracija save = Shrani sign_in_with_provider = Prijava s/z %s -manage_org = Upravljanje organizacij -new_repo = Nov repozitorij webauthn_error_unable_to_process = Strežnik ni mogel obdelati vaše zahteve. register = Registracija mirror = Zrcalo @@ -242,7 +236,6 @@ users.allow_git_hook_tooltip = Kljuke Git se izvajajo kot uporabnik operacijskeg auths.force_smtps_helper = SMTPS se vedno uporablja na vratih 465. Če želite, da se SMTPS uporablja tudi na drugih vratih, to nastavite. (V nasprotnem primeru se bo STARTTLS uporabljal na drugih vratih, če ga gostitelj podpira.) self_check.database_fix_mysql = Uporabniki MySQL/MariaDB lahko za odpravo težav s kollacijo uporabite ukaz "forgejo doctor convert", lahko pa težavo odpravite tudi z ukazom "ALTER ... COLLATE ..." SQL ročno. users.purge_help = Prisilno izbrišite uporabnika in vsa skladišča, organizacije in pakete, ki so v njegovi lasti. Izbrisani bodo tudi vsi komentarji in vprašanja, ki jih je objavil ta uporabnik. -auths.sspi_default_language_helper = Privzet jezik za uporabnike, samodejno ustvarjene z metodo avtentikacije SSPI. Pustite prazno, če želite, da se jezik zazna samodejno. auths.restricted_filter_helper = Pustite prazno, če ne želite nastaviti nobenega uporabnika kot omejenega. Uporabite zvezdico ("*"), če želite vse uporabnike, ki se ne ujemajo z administratorskim filtrom, nastaviti kot omejene. auths.tip.twitter = Pojdite na %s, ustvarite aplikacijo in preverite, ali je omogočena možnost "Allow this application to be used to Sign in with Twitter" auths.tip.yandex = Ustvarite novo aplikacijo na spletnem mestu %s. V razdelku "Yandex.Passport API" izberite naslednja dovoljenja: "Dostop do e-poštnega naslova", "Dostop do avatarja uporabnika" in "Dostop do uporabniškega imena, imena in priimka, spola" @@ -308,7 +301,6 @@ account = Račun appearance = Videz password = Geslo authorized_oauth2_applications_description = Tem aplikacijam tretjih oseb ste odobrili dostop do svojega osebnega računa Forgejo. Prosimo, da prekličete dostop do aplikacij, ki jih ne uporabljate več. -social_desc = S temi družabnimi računi se lahko prijavite v svoj račun. Prepričajte se, da jih vse prepoznate. access_token_desc = Izbrana dovoljenja žetona omejujejo avtorizacijo samo na ustrezne poti API. Za več informacij preberite dokumentacijo. oauth2_client_secret_hint = Skrivnost se ne bo več prikazala, ko zapustite ali osvežite to stran. Prepričajte se, da ste jo shranili. twofa_desc = Za zaščito računa pred krajo gesla lahko uporabite pametni telefon ali drugo napravo za prejemanje časovno omejenih enkratnih gesel ("TOTP"). @@ -323,10 +315,8 @@ update_language_success = Jezik je bil posodobljen. ui = Tema location = Lokacija security = Varnost -social = Družbeni računi applications = Aplikacije twofa = Dvofaktorsko preverjanje pristnosti (TOTP) -account_link = Povezani računi organization = Organizacije blocked_users = Blokirani uporabniki biography_placeholder = Povejte nam nekaj o sebi! (Uporabite lahko Markdown) @@ -349,7 +339,6 @@ comment_type_group_project = Projekt saved_successfully = Vaše nastavitve so bile uspešno shranjene. privacy = Zasebnost keep_activity_private = Skrivanje dejavnosti s strani profila -federated_avatar_lookup = Federativno iskanje avatarjev enable_custom_avatar = Uporaba avatarja po meri choose_new_avatar = Izberite nov avatar delete_current_avatar = Izbriši trenutni avatar @@ -361,7 +350,6 @@ change_password = Sprememba gesla update_password = Posodabljanje gesla uid = UID password_username_disabled = Nedomovnim uporabnikom ni dovoljeno spreminjati uporabniškega imena. Za več podrobnosti se obrnite na skrbnika spletnega mesta. -keep_activity_private_popup = Dejavnost je vidna samo za vas in upravitelje update_language_not_found = Jezik "%s" ni na voljo. delete = Brisanje računa uploaded_avatar_is_too_big = Velikost naložene datoteke (%d KiB) presega največjo velikost (%d KiB). @@ -383,8 +371,6 @@ string.desc = Z - A [error] occurred = Zgodila se je napaka -missing_csrf = Slaba zahteva: žeton CSRF ni prisoten -invalid_csrf = Slaba zahteva: neveljaven žeton CSRF not_found = Tarče ni bilo mogoče najti. network_error = Napaka omrežja server_internal = Napaka notranjega strežnika @@ -398,35 +384,20 @@ license = Odprta koda platform = Različne platforme [explore] -code_search_unavailable = Iskanje kode trenutno ni na voljo. Obrnite se na skrbnika spletnega mesta. go_to = Pojdi na organizations = Organizacije -search.match.tooltip = Vključite samo rezultate, ki se natančno ujemajo z iskalno besedo relevant_repositories_tooltip = Skladišča, ki so vilice ali nimajo teme, ikone in opisa, so skrita. -org_no_results = Ni bilo najdenih ustreznih organizacij. -search.fuzzy.tooltip = Vključite rezultate, ki prav tako natančno ustrezajo iskalni besedi code = Koda repos = Repozitoriji users = Uporabniki -search = Iskanje -search.type.tooltip = Tip iskanja -search.fuzzy = Razpršeni -search.match = Tekma -code_no_results = Nisem našel izvorne kode, ki bi ustrezala iskalnemu izrazu. -repo_no_results = Ni bilo najdenih ustreznih skladišč. -user_no_results = Ni bilo najdenih ustreznih uporabnikov. -code_search_results = Rezultati iskanja za "%s" code_last_indexed_at = Zadnji indeksirani %s relevant_repositories = Prikazane so samo ustrezne shrambe, prikaži nefiltrirane rezultate. [auth] disable_register_prompt = Registracija je onemogočena. Obrnite se na skrbnika spletnega mesta. -register_helper_msg = Že imate račun? Prijavite se zdaj! manual_activation_only = Za dokončanje aktivacije se obrnite na skrbnika spletnega mesta. forgot_password = Pozabljeno geslo? -social_register_helper_msg = Že imate račun? Povežite ga zdaj! forgot_password_title = Pozabljeno geslo -sign_up_now = Potrebujete račun? Registrirajte se zdaj. sign_up_successful = Račun je bil uspešno ustvarjen. Dobrodošli! active_your_account = Aktivirajte svoj račun create_new_account = Registracija računa @@ -443,7 +414,6 @@ has_unconfirmed_mail = Pozdravljeni %s, imate nepotrjen e-poštni naslov (%s< change_unconfirmed_email = Če ste med registracijo navedli napačen e-poštni naslov, ga lahko spremenite spodaj in potrditev bo poslana na novi naslov. confirmation_mail_sent_prompt = Na naslov %s je bilo poslano novo potrditveno e-poštno sporočilo. Prosimo, da v naslednjem %s preverite svoj poštni predal in dokončate postopek registracije. Če je e-poštno sporočilo napačno, se lahko prijavite in zahtevate, da se na drug naslov pošlje drugo potrditveno e-poštno sporočilo. change_unconfirmed_email_error = Ni mogoče spremeniti e-poštnega naslova: %v -email_not_associate = E-poštni naslov ni povezan z nobenim računom. send_reset_mail = Pošlji e-pošto za obnovitev računa change_unconfirmed_email_summary = Spremenite e-poštni naslov, na katerega se pošilja aktivacijska pošta. reset_password = Izterjava računa @@ -482,30 +452,22 @@ authorize_title = Pooblaščate "%s" za dostop do svojega računa? twofa_passcode_incorrect = Vaše geslo je napačno. Če ste napravo izgubili, se vpišite s kodo, ki jo imate na voljo. last_admin = Zadnjega upravitelja ne morete odstraniti. Obstajati mora vsaj en skrbnik. authorization_failed_desc = Avtorizacija ni uspela, ker smo zaznali neveljavno zahtevo. Obrnite se na vzdrževalca aplikacije, ki ste jo poskušali avtorizirati. -sspi_auth_failed = Avtentikacija SSPI ni uspela password_pwned_err = Ni bilo mogoče dokončati zahteve za HaveIBeenPwned -remember_me.compromised = Prijavni žeton ni več veljaven, kar lahko pomeni, da je račun ogrožen. Preverite, ali v vašem računu potekajo nenavadne dejavnosti. disable_forgot_password_mail = Obnovitev računa je onemogočena, ker e-pošta ni nastavljena. Obrnite se na skrbnika spletnega mesta. disable_forgot_password_mail_admin = Obnovitev računa je na voljo le, če je nastavljena e-pošta. Če želite omogočiti obnovitev računa, nastavite e-pošto. email_domain_blacklisted = S svojim e-poštnim naslovom se ne morete registrirati. authorize_application = Odobritev vloge authorize_application_description = Če mu dovolite dostop, bo lahko dostopal do vseh informacij o vašem računu, vključno z zasebnimi skladišči in organizacijami, in pisal vanje. remember_me = Ne pozabite na to napravo -tab_openid = Odprta identiteta [home] show_both_archived_unarchived = Prikazovanje arhiviranih in nearhiviranih switch_dashboard_context = Kontekst stikala nadzorna plošča -search_repos = Poiščite skladišče… filter_by_team_repositories = Filtriranje po skupinskih skladiščih show_archived = Arhivirano -collaborative_repos = Sodelovalni repozitoriji -my_mirrors = Moja ogledala show_only_public = Prikazovanje samo javnih uname_holder = Uporabniško ime ali e-poštni naslov -password_holder = Geslo my_repos = Repozitoriji -show_more_repos = Prikaži več skladišč… my_orgs = Moje organizacije view_home = Ogled %s filter = Ostali filtri @@ -529,17 +491,14 @@ team_invite.text_2 = Če se želite pridružiti ekipi, kliknite naslednjo poveza view_it_on = Oglejte si ga na %s hi_user_x = Pozdravljeni %s, activate_account = Prosimo, aktivirajte svoj račun -activate_account.title = %s, aktivirajte svoj račun activate_account.text_1 = Pozdravljeni %[1]s, hvala za registracijo na %[2]s! admin.new_user.subject = Prijavil se je nov uporabnik %s admin.new_user.user_info = Informacije o uporabniku admin.new_user.text = Prosimo, da klikni tukaj za upravljanje tega uporabnika iz upraviteljske plošče. register_notify = Dobrodošli v %s -register_notify.title = %[1]s, dobrodošli v %[2]s register_notify.text_2 = V svoj račun se lahko prijavite z uporabniškim imenom: %s register_notify.text_3 = Če je ta račun namesto vas ustvaril nekdo drug, boste morali najprej nastaviti svoje geslo. reset_password = Obnovite svoj račun -reset_password.title = %s, prejeli smo zahtevo za izterjavo vašega računa register_success = Registracija je bila uspešna issue.x_mentioned_you = @%s vas je omenil: issue.action.close = @%[1]s zaprl #%[2]d. @@ -555,7 +514,6 @@ team_invite.text_1 = %[1]s vas je povabil, da se pridružite ekipi %[2]s v organ team_invite.text_3 = Opomba: To vabilo je bilo namenjeno %[1]s. Če tega vabila niste pričakovali, ga lahko ignorirate. reply = ali neposredno odgovorite na to e-poštno sporočilo activate_email = Preverite svoj e-poštni naslov -activate_email.title = %s, preverite svoj e-poštni naslov activate_email.text = Kliknite naslednjo povezavo, da preverite svoj e-poštni naslov v %s: register_notify.text_1 = to je vaše e-poštno sporočilo s potrditvijo registracije za %s! issue_assigned.pull = @%[1]s vam je dodelil zahtevo za poteg %[2]s v skladišču %[3]s. @@ -592,19 +550,15 @@ organization_leave_success = Uspešno ste zapustili organizacijo %s. admin_cannot_delete_self = Ko ste administrator, se ne morete izbrisati. Najprej odstranite svoje pravice upravitelja. RepoName = Ime repozitorija Email = E-poštni naslov -SSHTitle = Ime ključa SSH PayloadUrl = URL koristnega tovora TeamName = Ime ekipe AuthName = Ime avtorizacije Content = Vsebina -SSPISeparatorReplacement = Ločevalnik -SSPIDefaultLanguage = Privzet jezik captcha_incorrect = Koda CAPTCHA je napačna. password_not_match = Gesla se ne ujemajo. lang_select_error = S seznama izberite jezik. username_been_taken = Uporabniško ime je že zasedeno. username_change_not_local_user = Nedomovnim uporabnikom ni dovoljeno spreminjati uporabniškega imena. -username_has_not_been_changed = Uporabniško ime ni bilo spremenjeno visit_rate_limit = Obisk na daljavo je obravnaval omejitev hitrosti. 2fa_auth_required = Obisk na daljavo je zahteval preverjanje pristnosti z dvema dejavnikoma. org_name_been_taken = Ime organizacije je že zasedeno. diff --git a/options/locale/locale_sr-SP.ini b/options/locale/locale_sr-SP.ini index b14fdc1a35..af5d3dfff1 100644 --- a/options/locale/locale_sr-SP.ini +++ b/options/locale/locale_sr-SP.ini @@ -6,7 +6,6 @@ help=Помоћ sign_in=Пријавите Се sign_out=Одјава register=Регистрација -website=Веб-страница version=Верзија page=Страница template=Шаблон @@ -20,12 +19,7 @@ password=Лозинка repository=Спремиште organization=Организација mirror=Огледало -new_repo=Ново спремиште -new_migrate=Нова миграција new_mirror=Ново огледало -new_org=Нова организација -manage_org=Управљање организацијама -account_settings=Подешавања налога settings=Подешавања @@ -57,20 +51,14 @@ repo_path=Пут до корена спремишта log_root_path=Пут до журнала optional_title=Напредна подешавања -smtp_host=SMTP сервер -federated_avatar_lookup_popup=Омогућите federated avatars lookup да би сте користили федеративни сервис помоћу libravatar. -enable_captcha_popup=Тражи Captcha приликом регистрације корисника. admin_password=Лозинка confirm_password=Потврдите лозинку install_btn_confirm=Успостави Forgejo test_git_failed=Команда 'git' није успела: %v [home] -password_holder=Лозинка switch_dashboard_context=Пребаците контекст контролној панели -collaborative_repos=Заједничка спремишта my_orgs=Моје организације -my_mirrors=Моја огледала view_home=Прикажи %s @@ -80,10 +68,8 @@ issues.in_your_repos=У вашим спремиштима [explore] repos=Спремишта users=Корисници -search=Претрага [auth] -register_helper_msg=Већ имате налог? Пријавите се! active_your_account=Активирајте ваш налог has_unconfirmed_mail=Здраво, %s! Имате непотврђену адресу е-поште (%s). Ако вам није стигло писмо са потврдом или морате да пошаљете нову поруку, притисните на пратеће дугме. resend_mail=Кликните овде да поново пошаљете писмо @@ -110,8 +96,6 @@ UserName=Корисничко име RepoName=Име спремишта Email=Адреса ел. поште Password=Лозинка -SSHTitle=Име SSH кључа -HttpsUrl=HTTPS URL адреса PayloadUrl=URL адреса за слање TeamName=Име тима AuthName=Ауторизацијско име @@ -141,11 +125,8 @@ auth_failed=Грешка идентитета: %v target_branch_not_exist=Ова грана не постоји. [user] -join_on=Регистриран repositories=Спремишта activity=Активности -followers=Пратиоци -following=Пратим follow=Прати unfollow=Престани да пратиш @@ -154,7 +135,6 @@ unfollow=Престани да пратиш profile=Профил password=Лозинка avatar=Аватар -social=Налози на друштвеним мрежама delete=Уклоните налог public_profile=Јавни профил @@ -165,7 +145,6 @@ update_profile=Ажурирај профил continue=Настави cancel=Откажи -federated_avatar_lookup=Federated Avatar претрага enable_custom_avatar=Укључи ваш аватар choose_new_avatar=Изаберите нови аватар delete_current_avatar=Обришите тренутни аватар @@ -173,20 +152,15 @@ delete_current_avatar=Обришите тренутни аватар old_password=Тренутна лозинка new_password=Нова лозинка -emails=Адреса ел. поште email_desc=Ваша главна адреса ће се користити за обавештења и других операција. primary=Главно manage_ssh_keys=Управљање SSH кључева add_key=Додај кључ -add_new_key=Додај SSH кључ key_name=Име кључа key_content=Садржај -add_on=Додато last_used=Задње корршћено no_activity=Нема недавних активности -manage_social=Управљање прикључених друштвеним мрежама - generate_new_token=Генериши нови токен token_name=Име токена generate_token=Генериши токен @@ -297,8 +271,6 @@ issues.create_label=Креирај лабелу issues.label_templates.title=Преузмите унапред дефинисани скуп лабела issues.label_templates.helper=Изаберите скуп лабела issues.label_templates.fail_to_load_file=Није могуће преузети датотеку '%s': %v -issues.open_tab=%d отворено -issues.close_tab=%d затворено issues.filter_label=Лабела issues.filter_milestone=Фаза issues.filter_assignee=Одговорни @@ -323,13 +295,9 @@ issues.num_comments=%d коментара issues.commented_at=`коментирира %s` issues.delete_comment_confirm=Да ли желите да избришете овај коментар? issues.no_content=Још нема садржаја. -issues.close_issue=Затвори issues.reopen_issue=Поново отвори issues.create_comment=Коментирај issues.commit_ref_at=`поменуо овај задатак у комит %s` -issues.poster=Аутор -issues.collaborator=Коаутор -issues.owner=Власник issues.sign_in_require_desc=Пријавите се да се прикључе у овом разговору. issues.edit=Уреди issues.cancel=Откажи @@ -340,7 +308,6 @@ issues.label_count=%d лабела issues.label_open_issues=%d отворених задатака issues.label_edit=Уреди issues.label_delete=Уклони -issues.num_participants=%d учесника issues.attachment.open_tab=`Кликните "%s" да видите у новом прозору` issues.attachment.download=`Кликните да преузмете "%s"` @@ -349,15 +316,12 @@ pulls.new=Нови захтев за спајање pulls.filter_branch=Филтер по грани pulls.no_results=Нема резултата. pulls.create=Поднеси захтев за спајање -pulls.merged_title_desc=споји(ла) %[1]d комит(е) из %[2]s у %[3]s %[4]s pulls.tab_conversation=Дискусија pulls.tab_commits=Комити pulls.merged=Спојено pulls.can_auto_merge_desc=Овај захтев за спајање може бити обављен аутоматски. milestones.new=Нова фаза -milestones.open_tab=%d отворено -milestones.close_tab=%d затворено milestones.closed=Затворено %s milestones.no_due_date=Рок није наведен milestones.open=Отвори @@ -401,7 +365,6 @@ settings.tracker_issue_style.numeric=Нумерично settings.tracker_issue_style.alphanumeric=Алфанумерично settings.danger_zone=Опасна зона settings.new_owner_has_same_repo=Нови власник већ има спремиште по истим називом. Молимо вас изаберите друго име. -settings.transfer=Пренеси власништво settings.transfer_owner=Нови власник settings.delete=Уклони ово спремиште settings.delete_notices_1=- Ова операција НЕЋЕ МОЧИ бити укинута. @@ -450,7 +413,6 @@ release.source_code=Изворни код release.tag_name=Име ознаке release.target=Циљ release.title=Наслов -release.content=Садржај release.cancel=Откажи release.publish=Објави издање release.save_draft=Сачувај нацрт @@ -465,7 +427,6 @@ org_name_holder=Име организације org_full_name_holder=Пун назив организације create_org=Створи Организацију repo_updated=Ажурирано -people=Особе teams=Тимови lower_members=чланови lower_repositories=спремишта @@ -541,7 +502,6 @@ dashboard.gc_metadata_obtained=Добијених метаподатака cак dashboard.other_system_allocation_obtained=Добијено друга системска меморија dashboard.next_gc_recycle=Следећа рециклажа cакупљању смећа dashboard.last_gc_time=Времена од прошлог cакупљању смећа -dashboard.total_gc_time=Укупно време cакупљању смећа dashboard.total_gc_pause=Укупно време cакупљању смећа dashboard.last_gc_pause=Задња пауза у cакупљању смећа dashboard.gc_times=Времена cакупљању смећа @@ -562,7 +522,6 @@ orgs.members=Чланови repos.owner=Власник repos.name=Име repos.private=Приватно -repos.stars=Фаворити repos.issues=Задаци @@ -588,14 +547,12 @@ auths.smtpport=SMTP порт auths.allowed_domains=Дозвољени домени auths.skip_tls_verify=Прескочи TLS проверу auths.pam_service_name=Назив PAM сервиса -auths.enable_auto_register=Омогући аутоматску регистрацију auths.tips=Савети config.server_config=Конфигурација сервера config.disable_router_log=Онемогући журнал рутера config.run_mode=Режим извршавања config.repo_root_path=Пут до корена спремишта -config.static_file_root_path=Пут до статичке датотеке config.script_type=Врста скрипта config.reverse_auth_user=Корисничко име при обрнуту аутентикацију @@ -618,7 +575,6 @@ config.db_path=Пут config.service_config=Подешавања сервиса config.show_registration_button=Прикажи дугме за регистрацију -config.disable_key_size_check=Онемогући проверу на минималној величини кључа config.active_code_lives=Дужина живота активних кодова config.webhook_config=Подешавања Webhook @@ -626,9 +582,7 @@ config.queue_length=Дужина реда config.deliver_timeout=Време до отказивање слања config.mailer_enabled=Омогућено -config.mailer_disable_helo=Онемогући HELO config.mailer_name=Име -config.mailer_host=Хост config.mailer_user=Корисник config.oauth_config=Подешавања OAuth @@ -665,8 +619,6 @@ config.git_pull_timeout=Време до отказивања pull операци config.git_gc_timeout=Време до отказивања cакупљање смећа config.log_config=Kонфигурација журнала -config.log_mode=Режим журналовања - monitor.cron=Cron задаци monitor.name=Име monitor.schedule=Распоред @@ -680,7 +632,6 @@ monitor.execute_time=Време извршивања notices.system_notice_list=Системска обавештавања -notices.actions=Акције notices.select_all=Изабери све notices.deselect_all=Уклоните избор свих notices.inverse_selection=Обрна селекција @@ -697,8 +648,6 @@ rename_repo=преимензје спремиште од %[1]s на transfer_repo=преноси спремиште %s на %s [tool] -ago=пре %s -from_now=од сада %s now=сада 1s=1 секунд 1m=1 минут diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index 553db1b19a..a71b0ad114 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -36,15 +36,10 @@ passcode=Kod repository=Utvecklingskatalog organization=Organisation mirror=Spegel -new_repo=Ny utvecklingskatalog -new_migrate=Ny migrering new_mirror=Ny spegling new_fork=Ny förgrening av utvecklingskatalog -new_org=Ny organisation new_project=Nytt projekt -manage_org=Hantera organisationer admin_panel=Sidadministration -account_settings=Kontoinställningar settings=inställningar your_profile=Profil your_starred=Stjärnmärkt @@ -342,15 +337,10 @@ smtp_from_invalid = "Skicka E-post som" adressen är ogiltig [home] uname_holder=Användarnamn eller e-postadress -password_holder=Lösenord switch_dashboard_context=Växla visad instrumentpanel my_repos=Utvecklingskataloger -show_more_repos=Visa flera utvecklingskataloger… -collaborative_repos=Kollaborativa Utvecklingskataloger my_orgs=Organisationer -my_mirrors=Mina speglar view_home=Visa %s -search_repos=Hitta en utvecklingskatalog… filter=Övriga filter show_archived=Arkiverade @@ -370,12 +360,7 @@ filter_by_team_repositories = Filtrera efter lagutvecklingskataloger repos=Utvecklingskataloger users=Användare organizations=Organisationer -search=Sök code=Kod -repo_no_results=Inga matchande utvecklingskataloger hittades. -user_no_results=Inga matchande användare hittades. -org_no_results=Inga matchande organisationer hittades. -code_no_results=Ingen källkod hittades som matchar din sökterm. code_last_indexed_at=Indexerades senast %s stars_one = %d stjärna go_to = Gå till @@ -384,14 +369,11 @@ stars_few = %d stjärnor [auth] create_new_account=Registrera konto -register_helper_msg=Har du redan ett konto? Logga in nu! -social_register_helper_msg=Har du redan ett konto? Länka det nu! disable_register_prompt=Registrering inaktiverad. Vänligen kontakta din sidadministratör. disable_register_mail=Bekräftelsemejl vid registrering är inaktiverad. remember_me=Kom ihåg denna enhet forgot_password_title=Glömt lösenord forgot_password=Glömt lösenord? -sign_up_now=Behöver du ett konto? Registrera nu. confirmation_mail_sent_prompt=Ett nytt bekräftelsemejl has skickats till %s. För att slutföra registreringsprocessen, vänligen kolla din inkorg inom dom kommande %s. Om e-postadressen är felaktig så kan du logga in och begära att få ett nytt bekräftelsemejlet skickat till en annan e-postadressen. must_change_password=Ändra ditt lösenord allow_password_change=Kräv att användaren byter lösenord (rekommenderas) @@ -402,7 +384,6 @@ prohibit_login=Kontot är avstängd resent_limit_prompt=Du har redan begärt ett aktiveringsmejl nyligen. Vänligen vänta 3 minuter och försök igen. has_unconfirmed_mail=Hej %s, du har en obekräftad epostaddress (%s). Om du inte har fått ett bekräftelsemail eller behöver ett nytt, klicka på knappen nedan. resend_mail=Klicka här för att skicka ditt aktiveringsmejl igen -email_not_associate=Denna e-postadress är inte knutet till något konto. send_reset_mail=Skicka mejl för kontoåterställning reset_password=Kontoåterställning invalid_code=Din bekräftelsekod är ogiltig eller har löpt ut. @@ -416,7 +397,6 @@ twofa_scratch_used=Du har använt din skrapkod. Du har blivit omdirigerad till t twofa_passcode_incorrect=Din kod är inte giltig. Om du har tappat bort din enhet, använd din skrapkod för att logga in. twofa_scratch_token_incorrect=Din skrapkod är ogiltlig. login_userpass=Logga in -tab_openid=OpenID oauth_signup_tab=Skapa nytt konto oauth_signup_title=Slutför nytt konto oauth_signup_submit=Slutför kontot @@ -435,7 +415,6 @@ authorize_application_created_by=Denna applikation skapades av %s. authorize_application_description=Om du beviljar åtkomst kommer den att kunna läsa och skriva information om ditt konto, inklusive privata förråd och organisationer. authorize_title=Ge "%s" tillgång till ditt konto? authorization_failed=Auktorisering misslyckades -sspi_auth_failed=SSPI-autentisering misslyckades password_pwned_err=Kunde inte slutföra begäran till HaveIBeenPwned reset_password_wrong_user = Du är inloggad som %s, men kontoåterställningslänken är avsedd för %s invalid_code_forgot_password = Din bekräftelsekod är ogiltig eller har gått ut. Klicka på här för att påbörja en ny session. @@ -526,8 +505,6 @@ RepoName=Utvecklingskatalogens namn Email=E-postadress Password=Lösenord Retype=Bekräfta lösenord -SSHTitle=SSH-nyckelnamn -HttpsUrl=HTTPS-URL PayloadUrl=Payload-URL TeamName=Gruppnamn AuthName=Auktoriseringsnamn @@ -540,9 +517,6 @@ CommitChoice=Incheckningsval TreeName=Filsökväg Content=Innehåll -SSPISeparatorReplacement=Avgränsare -SSPIDefaultLanguage=Standardspråk - require_error=får inte vara tomt alpha_dash_error=` bör endast innehålla alfanumeriska tecken, bindestreck ("-") och understreck ("_").` alpha_dash_dot_error=` bör endast innehålla alfanumeriska tecken, bindestreck ("-"), understreck ("_") och punkter (".").` @@ -627,13 +601,11 @@ password=Lösenord security=Säkerhet avatar=Visningsbild ssh_gpg_keys=SSH/GPG-nycklar -social=Sociala konton applications=Applikationer orgs=Organisationer repos=Utvecklingskataloger delete=Radera konto twofa=Tvåfaktorsautentisering (TOTP) -account_link=Länkade Konton organization=Organisationer public_profile=Offentlig profil @@ -651,10 +623,7 @@ language=Språk ui=Tema comment_type_group_title=Titel privacy=Sekretess -keep_activity_private_popup=Gör aktiviteten endast synlig för dig och administratörerna - lookup_avatar_by_mail=Slå upp avatar efter e-postadress -federated_avatar_lookup=Förenad uppslagning av avatar enable_custom_avatar=Använd anpassad avatar choose_new_avatar=Välj ny avatar update_avatar=Uppdatera avatar @@ -669,7 +638,6 @@ password_incorrect=Det nuvarande lösenordet är felaktigt. change_password_success=Ditt lösenord har uppdaterats. Logga in med ditt nya lösenord fortsättningsvis. password_change_disabled=Externa användare kan inte ändra sitt lösenord genom Forgejos webbgränssnitt. -emails=E-postadresser manage_emails=Hantera e-postadresser manage_themes=Standardtema manage_openid=OpenID-adresser @@ -706,8 +674,6 @@ ssh_desc=Dessa publika SSH nycklar är associerade med ditt konto. De motsvarand gpg_desc=Dessa publika GPG nycklar är associerade med ditt konto. Håll dina privata nycklar säkra då de tillåter att commits kan verifieras. ssh_helper=Behöver du hjälp? Kolla in Github's guide för att skapa din egen SSH-nycklar eller lösa vanliga problem som kan uppstå med SSH. gpg_helper=Behöver du hjälp? Ta en titt på Github's guide om GPG. -add_new_key=Lägg till SSH-nyckel -add_new_gpg_key=Lägg till GPG-nyckel key_content_gpg_placeholder=Börjar med "-----BEGIN PGP PUBLIC KEY BLOCK-----" ssh_key_been_used=Denna SSH-nyckel har redan lagts till på servern. gpg_key_id_used=En publik GPG-nyckel med samma ID existerar redan. @@ -737,9 +703,6 @@ token_state_desc=Denna token har används inom dom senaste 7 dagarna show_openid=Synlig på min profil hide_openid=Dold från min profil ssh_disabled=SSH är inaktiverat -manage_social=Hantera länkade sociala konton -unbind=Koppla från - manage_access_token=Åtkomsttokens generate_new_token=Generera ny token tokens_desc=Dessa tokens tillåter åtkomst till ditt konto via Forgejo API. @@ -749,8 +712,6 @@ generate_token_success=Din nya token har genererats. Kopiera nu då den inte kom generate_token_name_duplicate=%s finns redan som programnamn. Välj ett annat. delete_token=Radera access_token_deletion=Ta bort åtkomsttoken -access_token_deletion_cancel_action=Avbryt -access_token_deletion_confirm_action=Radera delete_token_success=Token har tagits bort. Applikationer som använder den kommer inte längre ha åtkomst till ditt konto. permission_read=Lästa @@ -795,7 +756,6 @@ twofa_enrolled=Tvåfaktorsautentisering har aktiverats för ditt konto. Förvara manage_account_links=Länkade konton manage_account_links_desc=Dessa externa konton är länkade till ditt Forgejo-konto. -account_links_not_available=Det finns för närvarande inga externa konton länkade till ditt Forgejo-konto. link_account=Länka konto remove_account_link=Ta bort länkat konto remove_account_link_desc=Borttagning av länkade konton kommer häva dess åtkomst till ditt Forgejo-konto. Vill du fortsätta? @@ -900,12 +860,7 @@ template.issue_labels=Ärendeetiketter template.one_item=Du måste välja minst ett mallobjekt template.invalid=Du måste välja minst en utvecklingskatalog för mallar -archive.issue.nocomment=Den här utvecklingskatalogen är arkiverad. Du kan inte kommentera ärenden. -archive.pull.nocomment=Den här utvecklingskatalogen är arkiverad. Du kan inte kommentera på pull-förfrågningar. - - migrate_options=Migreringsalternativ -migrate_service=Migreringstjänst migrate_items=Migrationsobjekt migrate_items_wiki=Wiki migrate_items_milestones=Milstenar @@ -959,7 +914,6 @@ branches=Grenar tags=Taggar issues=Ärenden pulls=Pull-förfrågningar -project_board=Projekt labels=Etiketter org_labels_desc=Etiketter på organisationsnivå som kan användas i alla utvecklingskataloger tillhörande denna organisation org_labels_desc_manage=hantera @@ -1024,8 +978,6 @@ editor.require_signed_commit=Branchen kräver en signerad commit commits.desc=Bläddra i källkodens förändringshistorik. commits.commits=Incheckningar -commits.search=Sök commits… -commits.find=Sök commits.search_all=Alla grenar commits.author=Upphovsman commits.message=Meddelande @@ -1040,8 +992,6 @@ commits.gpg_key_id=GPG-nyckel-ID commitstatus.pending=Väntande -ext_issues.desc=Länk till externt ärendehanteringssystem. - projects=Projekt projects.description_placeholder=Beskrivning projects.create=Skapa projekt @@ -1053,7 +1003,6 @@ projects.edit=Redigera projekt projects.modify=Redigera projekt projects.type.none=Ingen projects.template.desc=Projektmall -projects.type.uncategorized=Okatergoriserad projects.column.edit_title=Namn projects.column.new_title=Namn projects.open=Öppna @@ -1170,8 +1119,6 @@ issues.ref_issue_from=`refererade till detta ärende %[3]s % issues.ref_pull_from=`refererade till denna pull-förfrågan %[3]s %[1]s` issues.ref_closing_from=`hänvisade till detta ärende från en pull-förfrågan %[3]s som kommer att stänga det %[1]s` issues.ref_reopening_from=`hänvisade till detta ärende från en pull-förfrågan %[3]s som kommer att öppna ärendet på nytt %[1]s` -issues.ref_closed_from=`stängde detta ärende %[4]s %[2]s` -issues.ref_reopened_from=`öpnnade detta ärende igen %[4]s %[2]s` issues.ref_from=`från %[1]s` issues.role.owner=Ägare issues.role.member=Medlem @@ -1241,14 +1188,10 @@ issues.add_time_sum_to_small=Inge tid har angivits. issues.time_spent_total=Total tid spenderad issues.time_spent_from_all_authors=`Total Tid Spenderad: %s` issues.due_date=Förfallodatum -issues.invalid_due_date_format=Datumsformatet för förfallodatum måste följa 'yyyy-MM-dd'. -issues.error_modifying_due_date=Det gick inte att ändra förfallodatumet. -issues.error_removing_due_date=Det gick inte att ta bort förfallodatumet. issues.push_commit_1=lade till %d commit %s issues.push_commits_n=lade till %d committer %s issues.force_push_compare=Jämför issues.due_date_form=yyyy-MM-dd -issues.due_date_form_add=Lägg till förfallodatum issues.due_date_form_edit=Ändra issues.due_date_form_remove=Ta bort issues.due_date_not_set=Inget förfallodatum satt. @@ -1291,7 +1234,6 @@ issues.review.add_review_request=efterfrågade granskning från %[1]s %[2]s issues.review.remove_review_request=tog bort granskningsförfrågan för %[1]s %[2]s issues.review.remove_review_request_self=vägrade att granska %s issues.review.pending=Väntande -issues.review.review=Granska issues.review.reviewers=Granskare issues.review.show_outdated=Visa föråldrade issues.review.hide_outdated=Dölj föråldrade @@ -1299,7 +1241,6 @@ issues.review.show_resolved=Visa löst issues.review.hide_resolved=Dölj löst issues.review.resolve_conversation=Lös konversation issues.review.resolved_by=markerade denna konversation som löst -issues.assignee.error=Inte alla tilldelade har lagts till på grund av ett oväntat fel. issues.content_history.options=Alternativ @@ -1313,8 +1254,6 @@ pulls.filter_branch=Filtrera gren pulls.no_results=Inga resultat hittades. pulls.nothing_to_compare=Dessa brancher är ekvivalenta. Det finns ingen anledning att skapa en pull-request. pulls.create=Skapa pull-förfrågan -pulls.title_desc_few=vill sammanfoga %[1]d incheckningar från s[2]s in i %[3]s -pulls.merged_title_desc_few=sammanfogade %[1]d incheckningar från %[2]s in i %[3]s %[4]s pulls.change_target_branch_at=`ändrade mål-branch från %s till %s%s` pulls.tab_conversation=Konversation pulls.tab_commits=Incheckningar @@ -1374,8 +1313,6 @@ milestones.filter_sort.most_issues=Mest ärenden milestones.filter_sort.least_issues=Minst ärenden -ext_wiki.desc=Länk till extern wiki. - wiki=Wiki wiki.welcome=Välkommen till Wikin. wiki.welcome_desc=Wikin låter dig skriva och dela dokumentation med medarbetare. @@ -1456,11 +1393,6 @@ activity.git_stats_deletion_n=%d borttagningar contributors.contribution_type.commits=Incheckningar -search=Sök -search.search_repo=Sök utvecklingskatalog -search.results=Sökresultat för ”%s” i %s -search.code_no_results=Ingen källkod hittades som matchar din sökterm. - settings=Inställningar settings.desc=Inställningarna är där du kan hantera inställningar för utvecklingskatalogen settings.options=Utvecklingskatalog @@ -1515,7 +1447,6 @@ settings.convert_fork=Konvertera till vanlig utvecklingskatalog settings.convert_fork_confirm=Konvertera utvecklingskatalog settings.transfer.title=Överför Ägarskap settings.transfer_desc=Överför denna utvecklingskatalog till en användare eller organisation för vilken du har administratörsrättigheter till. -settings.transfer_form_title=Ange utvecklingskatalogens namn för att bekräfta: settings.transfer_notices_1=- Du kommer förlora åtkomst till denna utvecklingskatalog om du för över den till en individuell användare. settings.transfer_notices_2=- Du kommer behålla åtkomst till utvecklingskatalogen om du för över den till en organisation som du antingen äger eller är delägare i. settings.transfer_owner=Ny ägare @@ -1541,7 +1472,6 @@ settings.delete_collaborator=Ta bort settings.collaborator_deletion=Ta bort medarbetare settings.collaborator_deletion_desc=Borttagning av en medarbetare kommer att återkalla deras åtkomst till utvecklingskatalogen. Vill du fortsätta? settings.remove_collaborator_success=Medarbetaren har blivit borttagen. -settings.search_user_placeholder=Sök användare… settings.org_not_allowed_to_be_collaborator=Organisationer kan inte läggas till som en medarbetare. settings.change_team_access_not_allowed=Att ändra teamåtkomst för utvecklingskatalogen har begränsats till organisationsägaren settings.team_not_in_organization=Teamet är inte i samma organisation som utvecklingskatalogen @@ -1622,20 +1552,14 @@ settings.deploy_key_deletion_desc=Borttagning utav en distributionsnyckel kommer settings.deploy_key_deletion_success=Distributionsnyckeln har blivit borttagen. settings.branches=Brancher settings.protected_branch=Grenskydd -settings.protected_branch_can_push=Tillåt push? -settings.protected_branch_can_push_yes=Du kan pusha -settings.protected_branch_can_push_no=Du kan inte pusha settings.branch_protection=Skyddsregler för gren "%s" -settings.protect_this_branch=Aktivera branchskydd settings.protect_disable_push=Inaktivera push settings.protect_disable_push_desc=Inga push-förfrågningar kommer att tillåtas till denna branch. settings.protect_enable_push=Aktivera push settings.protect_enable_push_desc=Alla med skrivrättigheter kommer att kunna pusha till denna branch (men inte force-pusha). settings.protect_whitelist_deploy_keys=Vitlista deploy-nyckar med skrivåtkomst till push. settings.protect_whitelist_users=Vitlistade användare för pushning -settings.protect_whitelist_search_users=Sök användare… settings.protect_whitelist_teams=Vitlistade team för pushning -settings.protect_whitelist_search_teams=Sök team… settings.protect_merge_whitelist_committers=Aktivera vitlista för sammanfogning settings.protect_merge_whitelist_committers_desc=Tillåt endast vitlistade användare eller team att sammanfoga pull requests i denna branch. settings.protect_merge_whitelist_users=Vitlistade användare för sammanfogning @@ -1648,8 +1572,6 @@ settings.protect_approvals_whitelist_users=Vitlistade granskare settings.protect_approvals_whitelist_teams=Vitlistade team för granskning settings.require_signed_commits=Kräv signerade commiter settings.require_signed_commits_desc=Avvisa pushar till den här grenen om dom är osignerade eller inte verifierbara. -settings.add_protected_branch=Aktivera skydd -settings.delete_protected_branch=Inaktivera skydd settings.protected_branch_deletion=Inaktivera grenskydd settings.protected_branch_deletion_desc=Genom att inaktivera branchskyddet tillåts användare med skrivrättigheter att pusha till branchen. Vill du fortsätta? settings.default_branch_desc=Välj en standard branch för Pull Requests och Code Commits: @@ -1748,8 +1670,6 @@ release.deletion_success=Releasen har blivit raderad. release.tag_name_already_exist=En release med denna tagg existerar redan. release.tag_name_invalid=Taggnamnet är inte giltigt. release.downloads=Nedladdningar -release.download_count=Nedladdningar: %s - branch.name=Grennamn branch.delete_head=Radera branch.delete_html=Ta borg gren @@ -1849,8 +1769,6 @@ teams.leave=Gå ur teams.can_create_org_repo=Skapa utvecklingskataloger teams.can_create_org_repo_helper=Medlemmar kan skapa nya utvecklingskataloger i organisationen. Skaparen får administratörsåtkomst till den nya katalogen. teams.read_access=Lästa -teams.read_access_helper=Medlemmar kan se och klona teamets utvecklingskataloger. -teams.write_access_helper=Medlemmar kan läsa och pusha till teamets utvecklingskataloger. teams.admin_access=Administratörsåtkomst teams.admin_access_helper=Medlemmar kan pulla och pusha till teamets utvecklingskataloger och lägga till medarbetare till dessa. teams.no_desc=Detta team har ingen beskrivning @@ -1863,12 +1781,9 @@ teams.add_team_member=Lägg till lagmedlem teams.delete_team_title=Ta bort lag teams.delete_team_desc=Borttagning av ett team återkallar åtkomsten till utvecklingskatalogen för dess medlemmar. Vill du fortsätta? teams.delete_team_success=Teamet har blivit borttaget. -teams.read_permission_desc=Medlemskap i detta team ger läsrättigheter: medlemmar kan se och klona teamets utvecklingskataloger. -teams.write_permission_desc=Medlemskap i detta team ger skrivrättigheter: medlemmar kan läsa och pusha till teamets utvecklingskataloger. teams.admin_permission_desc=Medlemskap i detta lag ger administratörsrättigheter: medlemmar kan läsa från, pusha till och lägga till medarbetare till lagets utvecklingskataloger. teams.create_repo_permission_desc=Vidare så ger detta team Skapa utvecklingskatalog rättigheten: medlemmar can skapa nya utvecklingskataloger i organisationen. teams.repositories=Lagets utvecklingskataloger -teams.search_repo_placeholder=Sök utvecklingskatalog… teams.remove_all_repos_title=Ta bort alla utvecklingskataloger för teamet teams.remove_all_repos_desc=Detta kommer att ta bort alla utvecklingskataloger från teamet. teams.add_all_repos_title=Lägg till alla utvecklingskataloger @@ -1880,9 +1795,6 @@ teams.specific_repositories=Specifika utvecklingskataloger teams.specific_repositories_helper=Medlemmar kommer endast ha tillgång till utvecklingskataloger som explicit har lagts till för teamet. Att välja detta kommer inte automatiskt ta bort utvecklingskataloger som redan lagts till genom Alla utvecklingskataloger. teams.all_repositories=Alla utvecklingskataloger teams.all_repositories_helper=Teamet har tillgång till alla utvecklingskataloger. När du väljer detta komma alla nuvarande utvecklingskataloger läggas till i teamet. -teams.all_repositories_read_permission_desc=Detta team beviljar Läs-rättigheter till alla utvecklingskataloger: medlemmar kan visa och klona utvecklingskataloger. -teams.all_repositories_write_permission_desc=Detta team beviljar Skriv-rättigheter till alla utvecklingskataloger: medlemmar kan läsa från och pusha till utvecklingskataloger. -teams.all_repositories_admin_permission_desc=Detta team beviljar Admin-rättigheter till alla utvecklingskataloger: medlemmar kan läsa från, pusha till och lägga till kollaboratörer för utvecklingskatalogerna. [admin] dashboard=Instrumentpanel @@ -1936,7 +1848,6 @@ dashboard.gc_metadata_obtained=Metainformation om Skräpsamlaren Ihopsamlad dashboard.other_system_allocation_obtained=Övriga Systemallokeringar dashboard.next_gc_recycle=Nästa Skräpsamlarrunda dashboard.last_gc_time=Tidpunkt för senaste skräpsamling -dashboard.total_gc_time=Total tid för pauser vid skräpsamling dashboard.total_gc_pause=Total tid för pauser vid skräpsamling dashboard.last_gc_pause=Senaste paus vid skräpsamling dashboard.gc_times=Skräpsamlingstider @@ -1992,9 +1903,6 @@ repos.repo_manage_panel=Hantera utvecklingskataloger repos.owner=Ägare repos.name=Namn repos.private=Privat -repos.watches=Vakter -repos.stars=Stjärnor -repos.forks=Forkar repos.issues=Ärenden repos.size=Storlek @@ -2052,7 +1960,6 @@ auths.oauth2_tokenURL=Tokenlänk auths.oauth2_authURL=Auktoriseringslänk auths.oauth2_profileURL=Profil-URL auths.oauth2_emailURL=E-post URL -auths.enable_auto_register=Aktivera Automatisk Registrering auths.tips=Tips auths.tips.oauth2.general=OAuth2-autensiering auths.tip.oauth2_provider=OAuth2-leverantör @@ -2060,7 +1967,6 @@ auths.tip.bitbucket=Registrera en ny OAuth konsument på %s auths.tip.dropbox=Skapa en ny applikation på %s auths.tip.facebook=Registrera en ny appliaktion på %s och lägg till produkten ”Facebook-inloggning” auths.tip.github=Registrera en ny OAuth applikation på %s -auths.tip.gitlab=Registrera en ny applikation på https://gitlab.com/profile/applications auths.tip.google_plus=Erhåll inloggningsuppgifter för OAuth2 från Google API-konsolen på %s auths.tip.openid_connect=Använd OpenID Connect Discovery länken (/.well-known/openid-configuration) för att ange slutpunkterna auths.tip.twitter=Gå till %s, skapa en applikation och försäkra att alternativet "Allow this application to be used to Sign in with Twitter" är aktiverat @@ -2325,7 +2231,6 @@ symbolic_link=Symbolisk länk [search] -milestone_kind = Sök milstolpar... exact = Exakt exact_tooltip = Inkludera bara resultat som exakt matchar söktermen repo_kind = Sök repon… @@ -2345,7 +2250,6 @@ regexp_tooltip = Tolka söktermen som ett reguljärt uttryck code_search_unavailable = Kodsökning är för närvarande inte tillgänglig. Vänligen kontakta webbplatsadministratören. fuzzy_tooltip = Inkludera resultat som är närliggande till söktermen no_results = Inga matchande resultat hittades. -code_search_by_git_grep = Nuvarande kodsökningsresultat gjordes med "git grep". Det kan finnas bättre resultat om webbplatsadministratören möjliggör indexering av kod. fuzzy = Ungefärlig union = Nyckelord union_tooltip = Inkludera resultat som matchar något av de med mellanslag separerade sökorden diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini index edb32e616f..d33e1330d2 100644 --- a/options/locale/locale_tr-TR.ini +++ b/options/locale/locale_tr-TR.ini @@ -49,21 +49,14 @@ webauthn_error_unable_to_process=Sunucu isteğinizi işleyemedi. webauthn_error_duplicated=Güvenlik anahtarının bu istek için izni yok. Anahtarın halihazırda kayıtlı olmadığından emin olun. webauthn_error_empty=Bu anahtar için bir isim belirlemelisiniz. webauthn_error_timeout=Anahtarınız okunamadan zaman aşımı oldu. Lütfen sayfayı yenileyin ve tekrar deneyin. -webauthn_reload=Yeniden yükle - repository=Depo organization=Organizasyon mirror=Yansı -new_repo=Yeni Depo -new_migrate=Yeni Göç new_mirror=Yeni yansıma new_fork=Yeni Depo Çatalı -new_org=Yeni Organizasyon new_project=Yeni proje new_project_column=Yeni sütun -manage_org=Organizasyonları Yönet admin_panel=Site yönetimi -account_settings=Hesap Ayarları settings=Ayarlar your_profile=Profil your_starred=Yıldızlı @@ -218,8 +211,6 @@ string.desc=Z - A [error] occurred=Bir hata oluştu report_message=Bunun bir Forgejo hatası olduğunu düşünüyorsanız, lütfen Codeberg sayfasında sorunu arayın veya gerekiyorsa yeni bir sorun oluşturun. -missing_csrf=Hatalı İstek: CSRF anahtarı yok -invalid_csrf=Hatalı İstek: geçersiz CSRF erişim anahtarı not_found=Hedef bulunamadı. network_error=Ağ hatası server_internal = İç sunucu hatası @@ -356,15 +347,10 @@ config_location_hint = Bu yapılandırma seçenekleri şuraya kaydedilecek: [home] uname_holder=Kullanıcı adı veya e-posta adresi -password_holder=Parola switch_dashboard_context=Panoya Geçiş Yap my_repos=Depolar -show_more_repos=Daha fazla depo göster… -collaborative_repos=Katkıya Açık Depolar my_orgs=Organizasyonlarım -my_mirrors=Yansılarım view_home=%s Görüntüle -search_repos=Depo bul… filter=Diğer Süzgeçler filter_by_team_repositories=Takım depolarına göre süz feed_of=`"%s" beslemesi` @@ -385,20 +371,8 @@ issues.in_your_repos=Depolarınızda repos=Depolar users=Kullanıcılar organizations=Organizasyonlar -search=Ara go_to=Git code=Kod -search.type.tooltip=Arama türü -search.fuzzy=Bulanık -search.fuzzy.tooltip=Arama terimine benzeyen sonuçları da içer -search.match=Eşleştir -search.match.tooltip=Sadece arama terimiyle tamamen eşleşen sonuçları içer -code_search_unavailable=Kod arama şu an mevcut değil. Lütfen site yöneticinizle bağlantıya geçin. -repo_no_results=Eşleşen depo bulunamadı. -user_no_results=Eşleşen kullanıcı bulunamadı. -org_no_results=Eşleşen organizasyon bulunamadı. -code_no_results=Arama teriminizi içeren kaynak kod bulunamadı. -code_search_results=`"%s" için sonuçları ara` code_last_indexed_at=Son dizinlenen %s relevant_repositories_tooltip=Çatal olan veya konusu, simgesi veya açıklaması olmayan depolar gizlenmiştir. relevant_repositories=Sadece ilişkili depolar gösteriliyor, süzülmemiş sonuçları göster. @@ -409,16 +383,12 @@ forks_few = %d çatal [auth] create_new_account=Hesap oluştur -register_helper_msg=Bir hesabınız var mı? Şimdi giriş yapın! -social_register_helper_msg=Hesabınız var mı? Hemen bağlayın! disable_register_prompt=Kayıt işlemi devre dışıdır. Lütfen site yöneticinizle iletişim kurun. disable_register_mail=Kayıt için e-posta doğrulama devre dışıdır. manual_activation_only=Etkinleştirmeyi tamamlamak için site yöneticinizle bağlantıya geçin. remember_me=Bu cihazı hatırla -remember_me.compromised=Oturum açma tokeni artık geçerli değil, bu ele geçirilmiş bir hesaba işaret ediyor olabilir. Lütfen hesabınızda olağandışı faaliyet olup olmadığını denetleyin. forgot_password_title=Şifremi unuttum forgot_password=Şifrenizi mi unuttunuz? -sign_up_now=Bir hesaba mı ihtiyacınız var? Hemen kaydolun. sign_up_successful=Hesap başarılı bir şekilde oluşturuldu. Hoşgeldiniz! confirmation_mail_sent_prompt=Yeni onay e-postası %s adresine gönderildi. Lütfen gelen kutunuzu bir sonraki %s e kadar kontrol edip kayıt işlemini tamamlayın. must_change_password=Parolanızı güncelleyin @@ -431,7 +401,6 @@ prohibit_login_desc=Hesabınız ile oturum açmanız yasaklanmış, lütfen site resent_limit_prompt=Zaten bir etkinleştirme e-postası talep ettiniz. Lütfen 3 dakika bekleyip tekrar deneyin. has_unconfirmed_mail=Merhaba %s, doğrulanmamış bir e-posta adresin var (%s). Bir doğrulama e-postası almadıysanız ya da yenisine ihtiyacınız varsa lütfen aşağıdaki düğmeye tıklayın. resend_mail=Etkinleştirme e-postasını tekrar almak için buraya tıklayın -email_not_associate=Bu e-posta adresi hiçbir hesap ile ilişkilendirilmemiştir. send_reset_mail=Hesap Kurtarma E-postası Gönder reset_password=Hesap kurtarma invalid_code=Doğrulama kodunuz geçersiz veya süresi dolmuş. @@ -448,7 +417,6 @@ twofa_scratch_used=Geçici kodunuzu kullandınız. İki aşamalı ayarlar sayfas twofa_passcode_incorrect=Şifreniz yanlış. Aygıtınızı yanlış yerleştirdiyseniz, oturum açmak için çizgi kodunuzu kullanın. twofa_scratch_token_incorrect=Çizgi kodunuz doğru değildir. login_userpass=Oturum aç -tab_openid=Açık Kimlik oauth_signup_tab=Yeni hesap oluştur oauth_signup_title=Yeni Hesabı Tamamla oauth_signup_submit=Hesabı Tamamla @@ -474,7 +442,6 @@ authorize_application_description=Erişime izin verirseniz, özel depolar ve org authorize_title=Hesabınıza erişmesi için "%s" yetkilendirilsin mi? authorization_failed=Yetkilendirme başarısız oldu authorization_failed_desc=Geçersiz bir istek tespit ettiğimiz için yetkilendirme başarısız oldu. Lütfen izin vermeye çalıştığınız uygulamanın sağlayıcısı ile iletişim kurun. -sspi_auth_failed=SSPI kimlik doğrulaması başarısız oldu password_pwned=Seçtiğiniz parola, daha önce herkese açık veri ihlallerinde açığa çıkan bir çalınan parola listesindedir. Lütfen farklı bir parola ile tekrar deneyin ve başka yerlerde de bu parolayı değiştirmeyi düşünün. password_pwned_err=HaveIBeenPwned'e yapılan istek tamamlanamadı change_unconfirmed_email_summary = Aktivasyon e-postasının geldiği adresi değiştir. @@ -495,22 +462,18 @@ link_not_working_do_paste=Çalışmıyorsa, kopyalayıp tarayıcıya yapıştır hi_user_x=Merhaba %s, activate_account=Lütfen hesabınızı aktifleştirin -activate_account.title=%s, lütfen hesabınızı etkinleştirin activate_account.text_1=Merhaba %[1]s, %[2]s kaydınızı yaptırdığınız için teşekkürler! activate_account.text_2=Hesabınızı etkinleştirmek için lütfen %s içinde linke tıklayın: activate_email=E-posta adresinizi doğrulayın -activate_email.title=%s, lütfen e-posta adresinizi doğrulayın activate_email.text=E posta adresinizi doğrulamak için lütfen %s içinde linke tıklayın: register_notify=%s'ya Hoş Geldiniz -register_notify.title=%[1]s, %[2]s e hoşgeldiniz register_notify.text_1=bu %s için kayıt onay e postanızdır! register_notify.text_2=Artık %s kullanıcı adı ile oturum açabilirsiniz. register_notify.text_3=Eğer bu hesap sizin için oluşturulduysa, lütfen önce şifrenizi ayarlayın. reset_password=Hesabınızı kurtarın -reset_password.title=%s, hesap kurtarma talep ettiniz reset_password.text=Hesabınızı kurtarmak için lütfen %s içinde linke tıklayın: register_success=Kayıt başarılı @@ -579,8 +542,6 @@ RepoName=Depo adı Email=E-posta adresi Password=Parola Retype=Parolayı Doğrula -SSHTitle=SSH anahtarının adı -HttpsUrl=HTTPS Bağlantısı PayloadUrl=Yük Bağlantısı TeamName=Takım ismi AuthName=Yetkilendirme adı @@ -593,9 +554,6 @@ CommitChoice=İşleme tercihi TreeName=Dosya yolu Content=İçerik -SSPISeparatorReplacement=Ayırıcı -SSPIDefaultLanguage=Varsayılan Dil - require_error=` boş olamaz.` alpha_dash_error=` yalnızca alfasayısal, çizgi ('-') ve alt çizgi ('_') karakterlerini içermelidir. ` alpha_dash_dot_error=` yalnızca alfasayısal, çizgi ('-'), alt çizgi ('_') ve nokta ('.') karakterlerini içermelidir. ` @@ -617,7 +575,6 @@ lang_select_error=Listeden bir dil seçin. username_been_taken=Bu kullanıcı adı daha önce alınmış. username_change_not_local_user=Yerel olmayan kullanıcılar kendi kullanıcı adlarını değiştiremezler. -username_has_not_been_changed=Kullanıcı adı değişmedi repo_name_been_taken=Depo adı zaten kullanılıyor. repository_force_private=Gizliyi Zorla devrede: gizli depolar herkese açık yapılamaz. repository_files_already_exist=Bu depo için dosyalar zaten var. Sistem yöneticisine başvurun. @@ -697,7 +654,6 @@ unfollow=Takibi Bırak user_bio=Biyografi disabled_public_activity=Bu kullanıcı, etkinliğin herkese görünür olmasını devre dışı bıraktı. email_visibility.limited=E-posta adresiniz giriş yapmış tüm kullanıcılar tarafından görünür -email_visibility.private=E-posta adresiniz sadece siz veya yöneticiler tarafından görünür show_on_map=Bu yeri harita üzerinde göster settings=Kullanıcı Ayarları @@ -730,13 +686,11 @@ password=Parola security=Güvenlik avatar=Avatar ssh_gpg_keys=SSH / GPG Anahtarları -social=Sosyal Medya Hesapları applications=Uygulamalar orgs=Kuruluşlar repos=Depolar delete=Hesabı sil twofa=İki aşamalı doğrulama -account_link=Bağlı Hesaplar organization=Organizasyonlar uid=UID webauthn=Güvenlik Anahtarları @@ -783,10 +737,7 @@ comment_type_group_issue_ref=Konu referansı saved_successfully=Ayarlarınız başarılı bir şekilde kaydedildi. privacy=Gizlilik keep_activity_private=Etkinliği profil sayfasında gizle -keep_activity_private_popup=Etkinliği yalnızca siz ve yöneticiler için görünür hale getirir - lookup_avatar_by_mail=Avatarı E-posta Adresine Göre Ara -federated_avatar_lookup=Birleşmiş Avatar Araması enable_custom_avatar=Özel Avatarı Etkinleştir choose_new_avatar=Yeni Avatar Seç update_avatar=Profil Resmini Güncelle @@ -804,7 +755,6 @@ password_incorrect=Mevcut parola hatalı. change_password_success=Parolanız güncelleştirildi. Şu andan itibaren yeni parolanızı kullanarak oturum açın. password_change_disabled=Yerel olmayan kullanıcılar parolalarını Forgejo web arayüzünden güncelleyemezler. -emails=E-Posta Adresleri manage_emails=E-posta Adreslerini Yönet manage_themes=Varsayılan tema manage_openid=OpenID adresleri @@ -847,8 +797,6 @@ principal_desc=Bu SSH sertifika sorumluları, hesabınızla ilişkilidir ve depo gpg_desc=Bu açık GPG anahtarları hesabınızla ilişkilendirildi. İşlemelerin doğrulanmasına izin verdiği için özel anahtarlarınızı güvende tutun. ssh_helper=Yardıma ihtiyacınız mı var? Github klavuzundaki Kendi SSH anahtarınızı oluşturun bölümüne göz atın veya SSH'ı kullanırken karşılaşabileceğinizortak problemler'i çözün. gpg_helper=Yardıma ihtiyacınız mı var?Github klavuzundaki GPG hakkında bölümüne göz atınız. -add_new_key=SSH Anahtarı Ekle -add_new_gpg_key=GPG Anahtarı Ekle key_content_ssh_placeholder='ssh-ed25519', 'ssh-rsa', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', 'ecdsa-sha2-nistp521', 'sk-ecdsa-sha2-nistp256@openssh.com', veya 'sk-ssh-ed25519@openssh.com ile başlar' key_content_gpg_placeholder='-----BEGIN PGP PUBLIC KEY BLOCK-----' ile başlar add_new_principal=Sorumlu Ekle @@ -866,7 +814,6 @@ gpg_invalid_token_signature=Verilen GPG anahtarı, imza ve anahtar uyuşmuyor ve gpg_token_required=Aşağıdaki anahtar için bir imza sağlamalısınız gpg_token=Anahtar gpg_token_help=Şunu kullanarak bir imza oluşturabilirsiniz: -gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=Korumalı GPG imzası key_signature_gpg_placeholder='-----PGP İMZA BAŞLAT -----' ile başlar verify_gpg_key_success=GPG anahtarı "%s" doğrulandı. @@ -913,11 +860,6 @@ hide_openid=Profilden gizle ssh_disabled=SSH devre dışı bırakıldı ssh_signonly=SSH şu an devre dışı, dolayısıyla bu anahtarlar sadece işlem imza doğrulama için kullanılıyor. ssh_externally_managed=Bu SSH anahtarı, bu kullanıcı için harici olarak yönetiliyor -manage_social=Bağlanmış Sosyal Hesapları Yönet -social_desc=Bu sosyal hesaplar oturum açmanız için kullanılabilir. Hepsini tanıdığınızdan emin olun. -unbind=Bağlantıyı Kaldır -unbind_success=Sosyal hesap başarılı bir şekilde kaldırıldı. - manage_access_token=Erişim Jetonlarını Yönet generate_new_token=Yeni Erişim Anahtarı Üret tokens_desc=Bu jetonlar Forgejo API'sini kullanarak hesabınıza erişim sağlar. @@ -927,8 +869,6 @@ generate_token_success=Yeni bir erişim anahtarı oluşturuldu. Tekrar gösteril generate_token_name_duplicate=%s zaten bir uygulama adı olarak kullanılmış. Lütfen yeni bir tane kullanın. delete_token=Sil access_token_deletion=Erişim Jetonunu Sil -access_token_deletion_cancel_action=İptal -access_token_deletion_confirm_action=Sil access_token_deletion_desc=Bir erişim anahtarını silmek, onu kullanan uygulamaların hesabınıza erişimini kaldırır. Bu geri alınamaz. Devam edilsin mi? delete_token_success=Jeton silindi. Onu kullanan uygulamalar artık hesabınıza erişemez. repo_and_org_access=Depo ve Organizasyon Erişimi @@ -1002,7 +942,6 @@ webauthn_alternative_tip=Ek bir kimlik doğrulama yöntemi ayarlamak isteyebilir manage_account_links=Bağlı Hesapları Yönet manage_account_links_desc=Bu harici hesaplar Forgejo hesabınızla bağlantılı. -account_links_not_available=Şu anda Forgejo hesabınıza bağlı harici bir hesap yok. link_account=Hesap Bağla remove_account_link=Bağlantılı Hesabı Kaldır remove_account_link_desc=Bağlantılı bir hesabı kaldırmak, onunla Forgejo hesabınıza erişimi iptal edecektir. Devam edilsin mi? @@ -1070,7 +1009,6 @@ fork_branch=Çatala klonlanacak dal all_branches=Tüm dallar fork_no_valid_owners=Geçerli bir sahibi olmadığı için bu depo çatallanamaz. use_template=Bu şablonu kullan -clone_in_vsc=VS Code'ta klonla download_zip=ZIP indir download_tar=TAR.GZ indir download_bundle=BUNDLE indir @@ -1090,11 +1028,6 @@ readme=README readme_helper=Bir README dosyası şablonu seçin. readme_helper_desc=Projeniz için eksiksiz bir açıklama yazabileceğiniz yer burasıdır. auto_init=Depoyu başlat (.gitignore, Lisans ve README dosyalarını ekler) -trust_model_helper=İmza doğrulaması için güven modelini seçin. Olası seçenekler şunlardır: -trust_model_helper_collaborator=Ortak çalışan: Ortak çalışanların imzalarına güven -trust_model_helper_committer=İşleyen: İşleyenlerle eşleşen imzalara güven -trust_model_helper_collaborator_committer=Ortak çalışan+İşleyen: İşleyenle eşleşen ortak çalışanların imzalarına güven -trust_model_helper_default=Varsayılan: Bu kurulum için varsayılan güven modelini kullan create_repo=Depo Oluştur default_branch=Varsayılan Dal default_branch_label=varsayılan @@ -1167,9 +1100,6 @@ template.invalid=Bir şablon deposu seçmelisiniz archive.title=Bu depo arşivlendi. Dosyaları görüntüleyebilir ve klonlayabilirsiniz ama işleme gönderemez veya konu veya değişiklik isteği açamazsınız. archive.title_date=Bu depo %s tarihinde arşivlendi. Dosyaları görüntüleyebilir ve klonlayabilirsiniz ama işleme gönderemez veya konu veya değişiklik isteği açamazsınız. -archive.issue.nocomment=Bu depo arşivlendi. Konular bölümünde yorum yapamazsınız. -archive.pull.nocomment=Bu depo arşivlendi. Değişiklik istekleri bölümünde yorum yapamazsınız. - form.reach_limit_of_creation_1=Zaten %d depo limitinize ulaştınız. form.reach_limit_of_creation_n=Zaten %d depo limitinize ulaştınız. form.name_reserved=Depo adı "%s" rezerve edilmiş. @@ -1177,7 +1107,6 @@ form.name_pattern_not_allowed=Depo adında "%s" deseni kullanılamaz. need_auth=Yetkilendirme migrate_options=Göç seçenekleri -migrate_service=Göç Hizmeti migrate_options_mirror_helper=Bu depo bir yansı olacaktır migrate_options_lfs=LFS dosyalarını taşı migrate_options_lfs_endpoint.label=LFS Uç Noktası @@ -1263,7 +1192,6 @@ branches=Dal tags=Etiket issues=Konular pulls=Değişiklik istekleri -project_board=Projeler packages=Paketler actions=İşlemler labels=Etiketler @@ -1277,7 +1205,6 @@ release=Sürüm releases=Sürüm tag=Etiket released_this=bu sürümü yayınladı -tagged_this=şunu etiketledi file.title=%s dalındaki/etiketindeki %s file_raw=Ham file_history=Geçmiş @@ -1390,9 +1317,7 @@ commits.desc=Kaynak kodu değişiklik geçmişine göz atın. commits.commits=İşleme commits.no_commits=Ortak bir işleme yok. "%s" ve "%s" tamamen farklı geçmişlere sahip. commits.nothing_to_compare=Bu dallar eşit. -commits.search=İşlemeleri ara… commits.search.tooltip=Anahtar kelimeleri "author:", "committer:", "after:" veya "before:" ile kullanabilirsiniz, örneğin "revert author:Alice before:2019-01-13". -commits.find=Ara commits.search_all=Tüm Dallar commits.author=Yazar commits.message=Mesaj @@ -1420,8 +1345,6 @@ commitstatus.pending=Beklemede commitstatus.success=Başarılı ext_issues=Harici Konulara Erişim -ext_issues.desc=Dışsal konu takip sistemine bağla. - projects=Projeler projects.desc=Proje panolarındaki konuları ve değişiklikleri yönetin. projects.description=Açıklama (isteğe bağlı) @@ -1443,7 +1366,6 @@ projects.type.basic_kanban=Kanban Tabanı projects.type.bug_triage=Hata Triyajı projects.template.desc=Proje şablonu projects.template.desc_helper=Başlamak için bir proje şablonu seçin -projects.type.uncategorized=Kategorize edilmemiş projects.column.edit=Sütun Düzenle projects.column.edit_title=İsim projects.column.new_title=İsim @@ -1451,8 +1373,6 @@ projects.column.new_submit=Sütun Oluştur projects.column.new=Yeni Sütun projects.column.set_default=Varsayılanı Ayarla projects.column.set_default_desc=Bu sütunu kategorize edilmemiş konular ve değişiklik istekleri için varsayılan olarak ayarlayın -projects.column.unset_default=Varsayılanları Geri Al -projects.column.unset_default_desc=Bu sütunu varsayılan olarak geri al projects.column.delete=Sütunu sil projects.column.deletion_desc=Bir proje sütununun silinmesi, ilgili tüm konuları 'Kategorize edilmemiş'e taşır. Devam edilsin mi? projects.column.color=Renk @@ -1566,7 +1486,6 @@ issues.filter_sort.moststars=En çok yıldızlılar issues.filter_sort.feweststars=En az yıldızlılar issues.filter_sort.mostforks=En çok çatallananlar issues.filter_sort.fewestforks=En az çatallananlar -issues.keyword_search_unavailable=Anahtar kelime ile arama şu an mevcut değil. Lütfen site yöneticisiyle iletişime geçin. issues.action_open=Açık issues.action_close=Kapat issues.action_label=Etiket @@ -1611,11 +1530,8 @@ issues.ref_issue_from=`bu konuya referansta bulundu %[3]s %[ issues.ref_pull_from=`bu değişiklik isteğine referansta bulundu %[3]s %[1]s` issues.ref_closing_from=`bir değişiklik isteğine referansta bulundu %[3]s bu konu kapatılacak %[1]s` issues.ref_reopening_from=`bir değişiklik isteğine referansta bulundu %[3]s bu konu yeniden açılacak %[1]s` -issues.ref_closed_from=`bu konuyu kapat%[4]s %[2]s` -issues.ref_reopened_from=`konuyu yeniden aç%[4]s %[2]s` issues.ref_from=`%[1]s'den` issues.author=Yazar -issues.author_helper=Bu kullanıcı yazardır. issues.role.owner=Sahibi issues.role.owner_helper=Bu kullanıcı bu deponun sahibidir. issues.role.member=Üye @@ -1710,18 +1626,13 @@ issues.add_time_sum_to_small=Zaman girilmedi. issues.time_spent_total=Toplam Harcanan Zaman issues.time_spent_from_all_authors=`Toplam Harcanan Zaman: %s` issues.due_date=Bitiş Tarihi -issues.invalid_due_date_format=Bitiş tarihinin biçimi 'yyyy-aa-gg' olmalıdır. -issues.error_modifying_due_date=Bitiş tarihi değiştirilemedi. -issues.error_removing_due_date=Bitiş tarihi silinemedi. issues.push_commit_1=%d işlemeyi %s ekledi issues.push_commits_n=%d işlemeyi %s ekledi issues.force_push_codes=`%[1]s %[2]s %[8]s hedefinden %[4]s %[9]s hedefine zorla gönderildi %[6]s` issues.force_push_compare=Karşılaştır issues.due_date_form=yyyy-aa-gg -issues.due_date_form_add=Bitiş tarihi ekle issues.due_date_form_edit=Düzenle issues.due_date_form_remove=Kaldır -issues.due_date_not_writer=Bir konunun bitiş tarihini güncellemek için bu depoda yazma iznine ihtiyacınız var. issues.due_date_not_set=Bitiş tarihi atanmadı. issues.due_date_added=bitiş tarihini %s olarak %s ekledi issues.due_date_modified=bitiş tarihini %[2]s iken %[1]s olarak %[3]s değiştirdi @@ -1774,7 +1685,6 @@ issues.review.remove_review_request=%s %s için inceleme isteği kaldırıldı issues.review.remove_review_request_self=%s incelemeyi reddetti issues.review.pending=Beklemede issues.review.pending.tooltip=Bu yorum başkaları tarafından görünmüyor. Bekleyen yorumlarınızı göndermek için, sayfanın üstünde "%s" -> "%s/%s/%s" seçin. -issues.review.review=Gözden Geçir issues.review.reviewers=Gözden Geçirenler issues.review.outdated=Eskimiş issues.review.outdated_description=Bu yorum yapıldığından beri içerik değişti @@ -1787,7 +1697,6 @@ issues.review.hide_resolved=Çözülenleri gizle issues.review.resolve_conversation=Konuşmayı çöz issues.review.un_resolve_conversation=Konuşmayı çözme issues.review.resolved_by=bu konuşmayı çözümlenmiş olarak işaretledi -issues.assignee.error=Beklenmeyen bir hata nedeniyle tüm atananlar eklenmedi. issues.reference_issue.body=Gövde issues.content_history.deleted=silindi issues.content_history.edited=düzenlendi @@ -1795,8 +1704,6 @@ issues.content_history.created=oluşturuldu issues.content_history.delete_from_history=Geçmişten kaldır issues.content_history.delete_from_history_confirm=Geçmişten kaldırılsın mı? issues.content_history.options=Seçenekler -issues.reference_link=Referans: %s - compare.compare_base=temel compare.compare_head=karşılaştır @@ -1830,8 +1737,6 @@ pulls.nothing_to_compare=Bu dallar eşit. Değişiklik isteği oluşturmaya gere pulls.nothing_to_compare_and_allow_empty_pr=Bu dallar eşittir. Bu Dİ boş olacak. pulls.has_pull_request=`Bu dallar arasında zaten bir değişiklik isteği var: %[2]s#%[3]d` pulls.create=Değişiklik İsteği Oluştur -pulls.title_desc_few=%[2]s içindeki %[1]d işlemeyi %[3]s ile birleştirmek istiyor -pulls.merged_title_desc_few=%[4]s %[2]s içindeki %[1]d işlemeyi %[3]s ile birleştirdi pulls.change_target_branch_at='hedef dal %s adresinden %s%s adresine değiştirildi' pulls.tab_conversation=Sohbet pulls.tab_commits=İşleme @@ -1991,8 +1896,6 @@ signing.wont_sign.approved=Değişiklik İsteği onaylanmadığı için birleşt signing.wont_sign.not_signed_in=Oturum açmadınız. ext_wiki=Harici Vikiye Erişim -ext_wiki.desc=Harici bir wiki'ye bağlantı. - wiki=Wiki wiki.welcome=Viki'ye Hoş geldiniz. wiki.welcome_desc=Wiki, katkıcılarla belge yazmanıza ve paylaşmanıza olanak tanır. @@ -2088,17 +1991,6 @@ activity.git_stats_deletion_n=%d silme oldu contributors.contribution_type.commits=İşleme -search=Ara -search.search_repo=Depo ara -search.type.tooltip=Arama türü -search.fuzzy=Belirsiz -search.fuzzy.tooltip=Arama terimine benzeyen sonuçları da içer -search.match=Eşleştir -search.match.tooltip=Sadece arama terimiyle tamamen eşleşen sonuçları içer -search.results=`"%s" için %s içinde sonuçları ara` -search.code_no_results=Arama teriminizi içeren kaynak kod bulunamadı. -search.code_search_unavailable=Kod arama şu an mevcut değil. Lütfen site yöneticinizle bağlantıya geçin. - settings=Ayarlar settings.desc=Ayarlar, deponun ayarlarını yönetebileceğiniz yerdir settings.options=Depo @@ -2205,7 +2097,6 @@ settings.transfer_abort=Aktarımı iptal et settings.transfer_abort_invalid=Var olmayan bir depo aktarımını iptal edemezsiniz. settings.transfer_abort_success=%s tarafına yapılan depo aktarımı başarıyla iptal edildi. settings.transfer_desc=Bu depoyu bir kullanıcıya veya yönetici haklarına sahip olduğunuz bir organizasyona aktarın. -settings.transfer_form_title=Onaylamak için depo adını girin: settings.transfer_in_progress=Şu anda devam etmekte olan bir aktarım mevcut. Eğer bu depoyu başka bir kullanıcıya aktarmak istiyorsanız mevcut aktarımı iptal edin. settings.transfer_notices_1=- Bireysel bir kullanıcıya aktarırsanız depoya erişiminizi kaybedersiniz. settings.transfer_notices_2=- Sahip (-yardımcı) olduğunuz bir organizasyona devrederseniz, depoya erişmeye devam edersiniz. @@ -2250,7 +2141,6 @@ settings.delete_collaborator=Sil settings.collaborator_deletion=Katkıcıyı Sil settings.collaborator_deletion_desc=Bir katkıcıyı silmek, bu depoya erişimini iptal edecektir. Devam et? settings.remove_collaborator_success=Katkıcı silindi. -settings.search_user_placeholder=Kullanıcı ara… settings.org_not_allowed_to_be_collaborator=Organizasyonlar katkıcı olarak eklenemez. settings.change_team_access_not_allowed=Depo için takım erişimini değiştirmek, organizasyon sahibiyle sınırlandırıldı settings.team_not_in_organization=Takım, depo ile aynı organizasyonda değil @@ -2258,7 +2148,6 @@ settings.teams=Takımlar settings.add_team=Takım Ekle settings.add_team_duplicate=Takım zaten bu depoya sahip settings.add_team_success=Takım artık bu depoya erişebilir. -settings.search_team=Takım Ara… settings.change_team_permission_tip=Takımın izni takım ayarı sayfasında ayarlanır ve depo başına değiştirilemez settings.delete_team_tip=Bu takımın tüm depolara erişimi var ve kaldırılamıyor settings.remove_team_success=Takımın depoya erişimi kaldırıldı. @@ -2396,12 +2285,7 @@ settings.branches=Dallar settings.protected_branch=Dal Koruması settings.protected_branch.save_rule=Kuralı Kaydet settings.protected_branch.delete_rule=Kural sil -settings.protected_branch_can_push=İtmeye izin verilsin mi? -settings.protected_branch_can_push_yes=İtebilirsiniz -settings.protected_branch_can_push_no=İtemezsiniz settings.branch_protection=%s dalı için Dal Koruması -settings.protect_this_branch=Dal Korumayı Etkinleştir -settings.protect_this_branch_desc=Silmeyi önler ve dala Git gönderimini ve birleştirmesini kısıtlar. settings.protect_disable_push=İtmeyi Devre Dışı Bırak settings.protect_disable_push_desc=Bu dala itme yapılmasına izin verilmeyecek. settings.protect_enable_push=İtmeyi Etkinleştir @@ -2412,9 +2296,7 @@ settings.protect_whitelist_committers=Beyaz Liste Kısıtlı Gönderme settings.protect_whitelist_committers_desc=Sadece beyaz listeye alınmış kullanıcıların veya takımların bu dala göndermesine izin verilir (ancak zorla gönderim yapmayın). settings.protect_whitelist_deploy_keys=Beyaz liste göndermek için yazma erişimi olan anahtarları dağıtır. settings.protect_whitelist_users=İtme için beyaz listedeki kullanıcılar: -settings.protect_whitelist_search_users=Kullanıcı ara… settings.protect_whitelist_teams=İtme için beyaz listedeki takımlar: -settings.protect_whitelist_search_teams=Takımları ara… settings.protect_merge_whitelist_committers=Birleştirme Beyaz Listesini Etkinleştir settings.protect_merge_whitelist_committers_desc=Yalnızca beyaz listedeki kullanıcıların veya takımların bu daldaki değişiklik isteklerini birleştirmesine izin verin. settings.protect_merge_whitelist_users=Birleştirme için beyaz listedeki kullanıcılar: @@ -2444,8 +2326,6 @@ settings.protect_protected_file_patterns=Korumalı dosya kalıpları (noktalı v settings.protect_protected_file_patterns_desc=Kullanıcının bu dalda dosya ekleme, düzenleme veya silme hakları olsa bile doğrudan değiştirilmesine izin verilmeyen korumalı dosyalar. Birden çok desen noktalı virgül (';') kullanılarak ayrılabilir. Desen sözdizimi için %[2]s belgelerine bakın. Örnekler: .drone.yml, /docs/**/*.txt. settings.protect_unprotected_file_patterns=Korunmasız dosya desenleri (noktalı virgülle ayrılmış ';'): settings.protect_unprotected_file_patterns_desc=Kullanıcının yazma erişimi, itme kısıtlamasını atlama hakkı olduğunda doğrudan değiştirmesine izin verilen korunmasız dosyalar. Birden çok desen noktalı virgül (';') kullanılarak ayrılabilir. Desen söz dizimi için %[2]s belgelerine bakın. Örnekler: .drone.yml, /docs/**/*.txt. -settings.add_protected_branch=Korumayı etkinleştir -settings.delete_protected_branch=Korumayı devre dışı bırak settings.update_protect_branch_success=Dal koruma kuralı "%s" güncellendi. settings.remove_protected_branch_success=Dal koruma kuralı "%s" kaldırıldı. settings.remove_protected_branch_failed=Dal koruma kuralı "%s" kaldırılamadı. @@ -2524,8 +2404,6 @@ settings.lfs_pointers.associateAccessible=Erişilebilir %d OID ilişkilendirme settings.rename_branch_failed_exist=%s dalı zaten mevcut olduğu için dalın adı değiştirilemiyor. settings.rename_branch_failed_not_exist=%s dalının adı değiştirilemiyor, çünkü böyle bir dal yok. settings.rename_branch_success=%s dalının adı başarılı bir şekilde %s oldu. -settings.rename_branch_from=önceki dal adı -settings.rename_branch_to=yeni dal adı settings.rename_branch=Dalı yeniden adlandır diff.browse_source=Kaynağa Gözat @@ -2534,7 +2412,6 @@ diff.commit=işleme diff.git-notes=Notlar diff.data_not_available=Farklı İçerik Mevut Değil diff.options_button=Diff Seçenekleri -diff.show_diff_stats=İstatistikleri Göster diff.download_patch=Yama Dosyasını İndir diff.download_diff=Diff Dosyasını İndir diff.show_split_view=Görünümü Böl @@ -2627,7 +2504,6 @@ release.tag_name_invalid=Etiket adı geçerli değil. release.tag_name_protected=Etiket ismi korumalıdır. release.tag_already_exist=Bu etiket adı zaten var. release.downloads=İndirmeler -release.download_count=İndirilen: %s release.add_tag_msg=Sürümün başlığını ve içeriğini etiket mesajı olarak kullanın. release.add_tag=Yalnızca Etiket Oluştur release.releases_for=%s sürümleri @@ -2656,14 +2532,12 @@ branch.default_deletion_failed=`"%s" dalı varsayılan daldır. Silinemez.` branch.restore=`"%s" Dalını Geri Yükle` branch.download=`"%s" Dalını İndir` branch.rename=`"%s" Dalının Adını Değiştir` -branch.search=Dal Ara branch.included_desc=Bu dal varsayılan dalın bir parçasıdır branch.included=Dahil branch.create_new_branch=Şu daldan dal oluştur: branch.confirm_create_branch=Dal oluştur branch.warning_rename_default_branch=Varsayılan dalın adını değiştiriyorsunuz. branch.rename_branch_to=`"%s" adını şuna değiştir:` -branch.confirm_rename_branch=Dalı yeniden adlandır branch.create_branch_operation=Dal oluştur branch.new_branch=Yeni dal oluştur branch.new_branch_from=`"%s" dalından yeni dal oluştur` @@ -2730,7 +2604,6 @@ activity.navbar.recent_commits = Son İşlemeler settings.mirror_settings.pushed_repository = İtilmiş depo settings.ignore_stale_approvals = Eskimiş onayları yoksay settings.ignore_stale_approvals_desc = Daha eski işlemelere (eski incelemelere) yapılmış olan onayları, Dİ'nin kaç onayı olduğunu belirlerken sayma. Eskimiş incelemeler atıldıysa bu ilgisizdir. -error.broken_git_hook = Bu deponun Git İstemcileri bozuk gibi gözüküyor. Onarmak için lütfen belgelere bakın, daha sonra durumu yenilemek için bazı işlemeler itin. commits.browse_further = Daha fazlasına göz at settings.units.units = Birimler commits.renamed_from = %s adından yeniden adlandırıldı @@ -2842,9 +2715,7 @@ teams.none_access_helper=Üyeler bu birimi görüntüleyemez veya üzerinde baş teams.general_access=Genel Erişim teams.general_access_helper=Üyelerin izinleri aşağıdaki izin tablosuna göre kararlaştırılacaktır. teams.read_access=Okuma -teams.read_access_helper=Üyeler, takım depolarını görüntüleyebilir ve klonlayabilir. teams.write_access=Yazma -teams.write_access_helper=Üyeler takım depolarını okuyabilir ve itme yapabilir. teams.admin_access=Yönetici Erişimi teams.admin_access_helper=Üyeler takım depolarını çekip itebilir ve katkıcı ekleyebilir. teams.no_desc=Herhangi bir takım açıklaması yok @@ -2859,12 +2730,9 @@ teams.invite_team_member.list=Bekleyen Davetler teams.delete_team_title=Takımı Sil teams.delete_team_desc=Bir takımı silmek, üyelerinden depo erişimini iptal eder. Devam edilsin mi? teams.delete_team_success=Takım silindi. -teams.read_permission_desc=Bu takım Okuma erişimi veriyor. Üyeler takım depolarını görüntüleyebilir ve klonlayabilir. -teams.write_permission_desc=Bu takım Yazma erişimi veriyor. Üyeler takım depolarından okuyabilir ve takım depolarına itme yapabilir. teams.admin_permission_desc=Bu takım Yönetici erişimi veriyor. Üyeler takım depolarını okuyabilir, itebilir ve katkıcı ekleyebilir. teams.create_repo_permission_desc=Ayrıca, bu takım Depo oluşturma izni verir: üyeler organizasyonda yeni depolar oluşturabilir. teams.repositories=Takım Depoları -teams.search_repo_placeholder=Depo ara… teams.remove_all_repos_title=Tüm takım depolarını kaldır teams.remove_all_repos_desc=Bu, tüm depoları takımdan kaldıracaktır. teams.add_all_repos_title=Tüm depoları ekle @@ -2877,9 +2745,6 @@ teams.specific_repositories=Belirli depolar teams.specific_repositories_helper=Üyeler, yalnızca takıma açıkça eklenen depolara erişebilir. Bunu seçmek, Tüm depolarla zaten eklenmiş olan depoları otomatik olarak kaldırmaz. teams.all_repositories=Tüm depolar teams.all_repositories_helper=Takımın tüm depolara erişimi vardır. Bunu seçmek, mevcut tüm depoları takıma ekleyecektir. -teams.all_repositories_read_permission_desc=Bu takım tüm depolara Okuma erişimi sağlar: üyeler depoları görüntüleyebilir ve kopyalayabilir. -teams.all_repositories_write_permission_desc=Bu takım tüm depolara Yazma erişimi sağlar: üyeler depolardan okuyabilir ve depolara itebilir. -teams.all_repositories_admin_permission_desc=Bu takım tüm depolara Yönetici erişimi sağlar: üyeler depolardan okuyabilir, itebilir ve katkıcıları ekleyebilir. teams.invite.title=%s takımına (Organizasyon: %s) katılmaya davet edildiniz. teams.invite.by=%s tarafından davet edildi teams.invite.description=Takıma katılmak için aşağıdaki düğmeye tıklayın. @@ -2971,7 +2836,6 @@ dashboard.gc_metadata_obtained=Elde Edilen GC Metadata dashboard.other_system_allocation_obtained=Elde Edilen Diğer Sistem Ayırmaları dashboard.next_gc_recycle=Sonraki GC Döngüsü dashboard.last_gc_time=Son GC Zamanından Beri -dashboard.total_gc_time=Toplam GC Durması dashboard.total_gc_pause=Toplam GC Durması dashboard.last_gc_pause=Son GC Durması dashboard.gc_times=GC Zamanları @@ -3070,9 +2934,6 @@ repos.unadopted.no_more=Kabul edilmemiş başka depo bulunamadı repos.owner=Sahibi repos.name=İsim repos.private=Özel -repos.watches=İzlemeler -repos.stars=Yıldızlar -repos.forks=Çatallar repos.issues=Konular repos.size=Boyut repos.lfs_size=LFS Boyutu @@ -3177,17 +3038,6 @@ auths.oauth2_admin_group=Yönetici kullanıcıları için Grup Talep değeri. ( auths.oauth2_restricted_group=Kısıtlı kullanıcılar için Grup Talep değeri. (İsteğe bağlı, yukarıda talep ismine gerek duyar) auths.oauth2_map_group_to_team=Talep edilen grupları Organizasyon takımlarına eşle. (İsteğe bağlıdır - yukarıdaki talep adına gerek duyar) auths.oauth2_map_group_to_team_removal=Eğer kullanıcı ilişkili gruba ait değilse, kullanıcıları eşleşmiş takımlardan çıkarın. -auths.enable_auto_register=Otomatik Kaydolmayı Etkinleştir -auths.sspi_auto_create_users=Kullanıcıları otomatik olarak oluştur -auths.sspi_auto_create_users_helper=SSPI kimlik doğrulama yönteminin ilk kez oturum açan kullanıcılar için otomatik olarak yeni hesaplar oluşturmasına izin ver -auths.sspi_auto_activate_users=Kullanıcıları otomatik olarak etkinleştir -auths.sspi_auto_activate_users_helper=SSPI kimlik doğrulama yönteminin yeni kullanıcıları otomatik olarak etkinleştirmesine izin ver -auths.sspi_strip_domain_names=Alan adlarını kullanıcı adlarından kaldır -auths.sspi_strip_domain_names_helper=İşaretlenirse, etki alanı adları oturum açma adlarından kaldırılacaktır (örn. "ETKİALANI\kullanıcı" ve " kullanıcı@örnek.org "her ikisi de sadece "kullanıcı" olacak). -auths.sspi_separator_replacement=\, / ve @ yerine kullanılacak ayırıcı -auths.sspi_separator_replacement_helper=Alt seviye oturum açma adlarının (örneğin, "ETKİALANI\kullanıcı" içindeki \) ve kullanıcı asıl adlarının (örneğin, "kullanıcı@örnek.org" daki @) ayırıcılarını değiştirmek için kullanılacak karakter. -auths.sspi_default_language=Varsayılan kullanıcı dili -auths.sspi_default_language_helper=SSPI kimlik doğrulama yöntemi tarafından otomatik olarak oluşturulan kullanıcılar için varsayılan dil. Dili otomatik olarak algılamayı tercih ederseniz boş bırakın. auths.tips=İpuçları auths.tips.oauth2.general=OAuth2 Kimlik Doğrulama auths.tips.oauth2.general.tip=Yeni bir OAuth2 kimlik doğrulama kaydederken, geri çağırma/yönlendirme URL'si şu olmalıdır: @@ -3197,7 +3047,6 @@ auths.tip.nextcloud=Aşağıdaki "Ayarlar -> Güvenlik -> OAuth 2.0 istemcisi" m auths.tip.dropbox=%s adresinde yeni bir uygulama oluştur auths.tip.facebook=%s adresinde yeni bir uygulama kaydedin ve "Facebook Giriş" ürününü ekleyin auths.tip.github=%s adresinde yeni bir OAuth uygulaması kaydedin -auths.tip.gitlab=https://gitlab.com/profile/applications adresinde yeni bir uygulama kaydedin auths.tip.google_plus=OAuth2 istemci kimlik bilgilerini %s adresindeki Google API konsolundan edinin auths.tip.openid_connect=Bitiş noktalarını belirlemek için OpenID Connect Discovery URL'sini kullanın (/.well-known/openid-configuration) auths.tip.twitter=%s adresine gidin, bir uygulama oluşturun ve “Bu uygulamanın Twitter ile oturum açmak için kullanılmasına izin ver” seçeneğinin etkin olduğundan emin olun @@ -3775,10 +3624,7 @@ variables.creation.failed=Değişken eklenemedi. variables.creation.success=`"%s" değişkeni eklendi.` variables.update.failed=Değişken düzenlenemedi. variables.update.success=Değişken düzenlendi. -runs.no_workflows.documentation = Gitea İşlem'i hakkında daha fazla bilgi için, belgeye bakabilirsiniz. variables.id_not_exist = %d kimlikli değişken mevcut değil. -runs.no_workflows.quick_start = Gitea İşlem'i nasıl başlatacağınızı bilmiyor musunuz? Hızlı başlangıç rehberine bakabilirsiniz. - runs.no_job_without_needs = İş akışı en azından bağımlılığı olmayan bir görev içermelidir. runs.no_job = İş akışı en azından bir görev içermelidir runs.expire_log_message = Günlükler, çok eski oldukları için temizlendiler. @@ -3808,7 +3654,6 @@ code_kind = Kod ara… type_tooltip = Arama türü repo_kind = Depoları ara… user_kind = Kullanıcıları ara… -milestone_kind = Kilometre taşlarını ara... branch_kind = Dalları ara… package_kind = Paketleri ara… commit_kind = Katkıları ara… @@ -3817,7 +3662,6 @@ no_results = Eşleşen sonuç bulunamadı. code_search_unavailable = Kod araması şu anda kullanıma açık değildir. Lütfen site yöneticisi ile iletişime geçin. issue_kind = Sorunları ara… pull_kind = Birleştirme isteklerini ara… -code_search_by_git_grep = Anlık kod araması sonuçları "git grep" komutu tarafından sağlanmaktadır. Site yöneticisinin kod endekslemesini açması durumunda daha iyi sonuçlar verilmesi mümkün olabilir. keyword_search_unavailable = Anahtar kelime ile arama şu anda kullanıma açık değildir. Lütfen site yöneticisi ile iletişime geçin. fuzzy_tooltip = Arama terimine yakın olan eşleşmeleri dahil et union_tooltip = Boşlukla ayrılmış anahtar kelime eşleşmelerini dahil et diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 3023ed0fa2..c9e25f1fa5 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -33,20 +33,13 @@ twofa=Двофакторна автентифікація twofa_scratch=Двофакторний одноразовий пароль passcode=Код доступу -webauthn_reload=Оновити - repository=Репозиторій organization=Організація mirror=Дзеркало -new_repo=Новий репозиторій -new_migrate=Нова міграція new_mirror=Нове дзеркало new_fork=Новий форк репозиторію -new_org=Нова організація new_project=Новий проєкт -manage_org=Керування організаціями admin_panel=Панель адміністрації -account_settings=Налаштування облікового запису settings=Налаштування your_profile=Профіль your_starred=Обрані @@ -217,7 +210,6 @@ string.desc = Я - А [error] occurred=Сталася помилка -missing_csrf=Некоректний запит: токен CSRF не задано network_error=Помилка мережі server_internal = Внутрішня помилка сервера report_message = Якщо ви думаєте, що це вада Forgejo, будь ласка, пошукайте її у списку задач на Codeberg чи створіть нову задачу, якщо необхідно. @@ -354,15 +346,10 @@ enable_update_checker_helper_forgejo = Наявність нових версі [home] uname_holder=Ім'я користувача або ел. пошта -password_holder=Пароль switch_dashboard_context=Переключити контекст панелі управління my_repos=Репозиторії -show_more_repos=Показати більше репозиторіїв… -collaborative_repos=Спільні репозиторії my_orgs=Організації -my_mirrors=Мої дзеркала view_home=Переглянути %s -search_repos=Шукати репозиторій… filter=Інші фільтри filter_by_team_repositories=Фільтрувати за репозиторіями команд feed_of=`Стрічка "%s"` @@ -383,14 +370,7 @@ issues.in_your_repos=В ваших репозиторіях repos=Репозиторії users=Користувачі organizations=Організації -search=Пошук code=Код -search.fuzzy=Неточний -search.match=Відповідність -repo_no_results=Відповідних репозиторіїв не знайдено. -user_no_results=Відповідних користувачів не знайдено. -org_no_results=Відповідних організацій не знайдено. -code_no_results=Відповідний пошуковому запитанню код не знайдено. code_last_indexed_at=Останні індексовані %s relevant_repositories = Показано лише релевантні репозиторії, переглянути результати без фільтру. relevant_repositories_tooltip = Приховано форки, а також репозиторії без теми, значка й опису. @@ -402,14 +382,11 @@ forks_few = %d форків [auth] create_new_account=Реєстрація облікового запису -register_helper_msg=Вже зареєстровані? Увійдіть зараз! -social_register_helper_msg=Вже є аккаунт? Зв'яжіть його зараз! disable_register_prompt=Вибачте, можливість реєстрації відключена. Будь ласка, зв'яжіться з адміністратором сайту. disable_register_mail=Підтвердження реєстрації електронною поштою вимкнено. remember_me=Запам'ятати цей пристрій forgot_password_title=Забули пароль forgot_password=Забули пароль? -sign_up_now=Потрібен обліковий запис? Зареєструйтеся зараз. confirmation_mail_sent_prompt=Новий лист підтвердження було надіслано %s. Щоб завершити реєстрацію, перевірте вхідні й перейдіть за наведеним посиланням (на це маєте %s). Якщо електронну адресу вказано неправильно, ви можете ввійти і створити запит для надсилання ще одного листа підтвердження на іншу адресу. must_change_password=Оновіть свій пароль allow_password_change=Вимагати в користувача змінити пароль (рекомендується) @@ -420,7 +397,6 @@ prohibit_login=Обліковий запис заблоковано resent_limit_prompt=Вибачте, ви вже запросили активацію по електронній пошті нещодавно. Будь ласка, зачекайте 3 хвилини, а потім спробуйте ще раз. has_unconfirmed_mail=Привіт %s, у вас є непідтверджена електронна адреса (%s ). Якщо ви не отримали електронний лист із підтвердженням або вам потрібно надіслати новий, натисніть на кнопку нижче. resend_mail=Натисніть тут, щоб вислати лист активації знову -email_not_associate=Ця електронна пошта не пов'язана ні з одним обліковим записом. send_reset_mail=Надіслати листа для відновлення reset_password=Відновлення облікового запису invalid_code=Цей код підтвердження недійсний або закінчився. @@ -434,7 +410,6 @@ twofa_scratch_used=Ви використовували одноразовий п twofa_passcode_incorrect=Ваш пароль є невірним. Якщо ви втратили пристрій, використовуйте ваш одноразовий пароль. twofa_scratch_token_incorrect=Невірний одноразовий пароль. login_userpass=Увійти -tab_openid=OpenID oauth_signup_tab=Зареєструвати обліковий запис oauth_signup_title=Завершити реєстрацію oauth_signup_submit=Завершити @@ -455,7 +430,6 @@ authorize_application_created_by=Ця програма створена %s. authorize_application_description=Якщо ви надасте дозвіл, то програма отримає доступ до всіх даних вашого облікового запису, включно з приватними репозиторіями та організаціями. authorize_title=Дозволити «%s» доступ до вашого облікового запису? authorization_failed=Помилка авторизації -sspi_auth_failed=Помилка SSPI-автентифікації password_pwned_err=Не вдалося виконати запит до HaveIBeenPwed change_unconfirmed_email_summary = Змінити адресу електронної пошти, на яку надходять активаційні листи. oauth.signin.error.temporarily_unavailable = Авторизація не вдалася, оскільки сервер автентифікації тимчасово недоступний. Будь ласка, спробуйте пізніше. @@ -487,7 +461,6 @@ link_not_working_do_paste=Посилання не працює? Спробуйт hi_user_x=Привіт %s, activate_account=Будь ласка, активуйте ваш обліковий запис -activate_account.title=%s, будь ласка, активуйте свій обліковий запис activate_account.text_1=Привіт, %[1]s, дякуємо за реєстрацію на %[2]s! activate_account.text_2=Перейдіть за цим посиланням, щоб активувати ваш обліковий запис в %s: @@ -495,13 +468,11 @@ activate_email=Підтвердить вашу адресу електронно activate_email.text=Перейдіть за цим посиланням, щоб підтвердити вашу електронну адресу в %s: register_notify=Вітаємо у %s -register_notify.title=%[1]s, ласкаво просимо до %[2]s register_notify.text_1=це ваша е-пошта для підтвердження реєстрації для %s! register_notify.text_2=Ви можете ввійти до свого облікового запису, використовуючи ім'я: %s register_notify.text_3=Якщо цей обліковий запис було створено не вами, будь ласка, спочатку встановіть свій пароль. reset_password=Відновлення вашого облікового запису -reset_password.title=%s, ви відправили запит на відновлення облікового запису reset_password.text=Перейдіть за цим посиланням, щоб відновити свій обліковий запис в %s: register_success=Реєстрація успішна @@ -577,8 +548,6 @@ RepoName=Назва репозиторію Email=Адреса електронної пошти Password=Пароль Retype=Підтвердження пароля -SSHTitle=Iм'я SSH ключа -HttpsUrl=Адреса HTTPS PayloadUrl=URL обробника TeamName=Назва команди AuthName=Назва авторизації @@ -591,9 +560,6 @@ CommitChoice=Вибір коміта TreeName=Шлях до файлу Content=Зміст -SSPISeparatorReplacement=Розділювач -SSPIDefaultLanguage=Типова мова - require_error=` не може бути пустим.` alpha_dash_error=` повинен містити тільки літерно-цифрові символи, дефіс («-») та підкреслення («_»).` alpha_dash_dot_error=` повинен містити тільки літерно-цифрові символи, дефіс («-») , підкреслення («_») та крапки («.»).` @@ -692,7 +658,6 @@ unfollow=Відписатися user_bio=Біографія disabled_public_activity=Цей користувач вимкнув публічний показ діяльності. joined_on = Реєстрація %s -email_visibility.private = Ваш email видно лише вам і адміністраторам email_visibility.limited = Вашу е-пошту видно всім авторизованим settings = Користувацькі налаштування block_user.detail_3 = Ви не зможете додати один одного в якості співавтора репозиторію. @@ -729,13 +694,11 @@ password=Пароль security=Безпека avatar=Аватар ssh_gpg_keys=Ключі SSH / GPG -social=Соціальні облікові записи applications=Додатки orgs=Організації repos=Репозиторії delete=Видалити обліковий запис twofa=Двофакторна автентифікація (TOTP) -account_link=Прив'язані облікові записи organization=Організації public_profile=Загальнодоступний профіль @@ -760,10 +723,7 @@ comment_type_group_title=Заголовок comment_type_group_branch=Гілка comment_type_group_project=Проєкт privacy=Приватність -keep_activity_private_popup=Показувати вашу активність лише Вам та адміністраторам - lookup_avatar_by_mail=Знайти аватар за адресою електронної пошти -federated_avatar_lookup=Знайти зовнішній аватар enable_custom_avatar=Увімкнути користувацькі аватари choose_new_avatar=Оберіть новий аватар update_avatar=Оновити аватар @@ -779,7 +739,6 @@ password_incorrect=Поточний пароль неправильний. change_password_success=Ваш пароль оновлено. Відтепер входьте в систему, використовуючи новий пароль. password_change_disabled=Нелокальні акаунти не можуть змінити пароль через Forgejo. -emails=Адреса електронної пошти manage_emails=Керування адресами ел. пошти manage_themes=Тема за замовчуванням manage_openid=Адреси OpenID @@ -818,8 +777,6 @@ principal_desc=Ці настройки SSH сертифікатів вказан gpg_desc=Ці відкриті ключі GPG пов'язані з вашим обліковим записом і використовуються для підтвердження комітів. Тримайте свої приватні ключі в безпеці, оскільки вони дозволяють підписувати коміти вашим особистим підписом. ssh_helper=Потрібна допомога? Дивіться гід на GitHub з генерації ключів SSH або виправлення типових неполадок SSH. gpg_helper= Потрібна допомога? Перегляньте посібник GitHub про 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_gpg_placeholder=Починається з «-----BEGIN PGP PUBLIC KEY BLOCK-----» add_new_principal=Додати принципал @@ -837,7 +794,6 @@ gpg_invalid_token_signature=Наданий ключ GPG, підпис і ток gpg_token_required=Вам потрібно надати підпис для нижчевказаного токена gpg_token=Токен gpg_token_help=Ви можете створити підпис за допомогою: -gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=Текстовий (armored) підпис GPG key_signature_gpg_placeholder=Починається з «-----BEGIN PGP SIGNATURE-----» ssh_key_verified=Перевірений ключ @@ -872,9 +828,6 @@ show_openid=Показати у профілю hide_openid=Не показувати у профілі ssh_disabled=SSH вимкнено ssh_externally_managed=Цей ключ SSH має зовнішнє управління для цього користувача -manage_social=Керувати зв'язаними обліковими записами соціальних мереж -unbind=Від'єднати - manage_access_token=Токени доступу generate_new_token=Згенерувати новий токен tokens_desc=Ці токени надають доступ до вашого облікового запису за допомогою Forgejo API. @@ -884,8 +837,6 @@ generate_token_success=Ваш новий токен був створений. generate_token_name_duplicate=Назва програми %s вже використовується. Будь ласка, використайте нову. delete_token=Видалити access_token_deletion=Видалити токен доступу -access_token_deletion_cancel_action=Відмінити -access_token_deletion_confirm_action=Видалити delete_token_success=Токен був знищений. Програми, що використовують його, більше не мають доступу до вашого облікового запису. permission_read=Прочитані @@ -931,7 +882,6 @@ twofa_failed_get_secret=Не вдалося отримати секрет. manage_account_links=Пов'язані облікові записи manage_account_links_desc=Ці зовнішні акаунти прив'язані до вашого аккаунту Forgejo. -account_links_not_available=Наразі немає зовнішніх облікових записів, пов'язаних із вашим обліковим записом Forgejo. link_account=Прив'язати обліковий запис remove_account_link=Видалити пов'язаний обліковий запис remove_account_link_desc=Видалення пов'язаного облікового запису скасує його доступ до вашого облікового запису Forgejo. Продовжити? @@ -1019,7 +969,6 @@ valid_until_date = Дійсний до %s added_on = Додано %s key_signature_ssh_placeholder = Починається з «-----BEGIN SSH SIGNATURE-----» user_block_yourself = Ви не можете заблокувати себе. -pronouns_custom_label = Інші займенники repo_and_org_access = Доступ до репозиторію та організації change_username_redirect_prompt.with_cooldown.few = Старе ім'я користувача буде доступне всім після періоду захисту, який триватиме %[1]d днів. Протягом періоду захисту ви ще можете повернути собі старе ім'я. change_username_redirect_prompt.with_cooldown.one = Старе ім'я користувача буде доступне всім після періоду захисту, який триватиме %[1]d день. Протягом періоду захисту ви ще можете повернути собі старе ім'я. @@ -1047,7 +996,6 @@ oauth2_application_remove_description = Видалена програма OAuth2 add_principal_success = Принципал SSH-сертифіката «%s» додано. hooks.desc = Додайте вебхуки, які спрацьовуватимуть для всіх репозиторіїв у вашій власності. ssh_token_signature = SSH-підпис у кодуванні Base64 -pronouns_custom = Власні comment_type_group_issue_ref = Посилання на задачу add_email_confirmation_sent = Лист підтвердження було надіслано «%s». Щоб підтвердити електронну пошту, перевірте вхідні й перейдіть за наведеним посиланням (на це маєте %s). comment_type_group_reference = Посилання @@ -1099,7 +1047,6 @@ fork_repo=Створити форк репозиторію fork_from=Форк з fork_visibility_helper=Неможливо змінити видимість форкнутого репозиторію. use_template=Застосувати цей шаблон -clone_in_vsc=Клонувати у VS Code download_zip=Завантажити ZIP download_tar=Завантажити TAR.GZ download_bundle=Завантажити BUNDLE @@ -1119,11 +1066,6 @@ readme=README readme_helper=Виберіть шаблон README readme_helper_desc=Це місце, де ви можете написати повний опис вашого проєкту. auto_init=Ініціалізувати репозиторій -trust_model_helper=Виберіть модель довіри для підтвердження підпису. Можливі варіанти: -trust_model_helper_collaborator=Співавтор: підписи довіри від співавторів -trust_model_helper_committer=Учасник: довірені підписи участників -trust_model_helper_collaborator_committer=Співавтор+Комітер: довірчі підписи від співавторів, які відповідають комітеру -trust_model_helper_default=За замовчуванням: використовувати стандартну модель довіри для цієї установки create_repo=Створити репозиторій default_branch=Типова гілка default_branch_helper=Гілка за замовчуванням є базовою гілкою для запитів на злиття та комітів коду. @@ -1179,15 +1121,11 @@ template.issue_labels=Мітки задач template.one_item=Слід обрати хоча б один елемент шаблону template.invalid=Слід обрати шаблонний репозиторій -archive.issue.nocomment=Цей репозиторій архівовано. Ви не можете коментувати задачі. -archive.pull.nocomment=Цей репозиторій архівовано. Ви не можете коментувати запити на злиття. - form.reach_limit_of_creation_1=Ви вже досягли ліміту в %d репозиторіїв. form.reach_limit_of_creation_n=Ви досягли максимальної кількості %d створених репозиторіїв. need_auth=Авторизація migrate_options=Параметри міграції -migrate_service=Сервіс міграції migrate_options_lfs=Перенесення LFS файлів migrate_options_lfs_endpoint.label=Кінцева точка LFS migrate_options_lfs_endpoint.description=Міграція буде намагатися використовувати ваш Git віддалено, щоб визначати LFS сервер. Ви також можете вказати свою кінцеву точку, якщо дані репозиторію LFS зберігаються в іншому місці. @@ -1262,7 +1200,6 @@ branches=Гілки tags=Теги issues=Задачі pulls=Запити на злиття -project_board=Проєкти labels=Мітки org_labels_desc=Мітки рівня організації можуть використовуватися в усіх репозиторіях цієї організації org_labels_desc_manage=керувати @@ -1341,8 +1278,6 @@ editor.require_signed_commit=Гілка вимагає підписаного к commits.desc=Переглянути історію зміни коду. commits.commits=Коміти commits.nothing_to_compare=Ці гілки однакові. -commits.search=Знайти коміт… -commits.find=Пошук commits.search_all=У всіх гілках commits.author=Автор commits.message=Повідомлення @@ -1359,8 +1294,6 @@ commitstatus.error=Помилка commitstatus.pending=Очікування ext_issues=Зовнішні задачі -ext_issues.desc=Посилання на зовнішню систему відстеження задач. - projects=Проєкти projects.desc=Керуйте задачами та запитами злиття на дошках проєкту. projects.description=Опис (необов'язково) @@ -1380,7 +1313,6 @@ projects.type.basic_kanban=Спрощений канбан projects.type.bug_triage=Сортування помилок projects.template.desc=Шаблон projects.template.desc_helper=Виберіть шаблон проєкту, аби почати -projects.type.uncategorized=Без категорії projects.column.edit_title=Назва projects.column.new_title=Назва projects.column.color=Колір @@ -1510,8 +1442,6 @@ issues.ref_issue_from=`посилається на цю зада issues.ref_pull_from=`посилається на цей запит на злиття %[3]s %[1]s` issues.ref_closing_from=`посилається в запиті на злиття %[3]s, який закриє цю задачу, %[1]s` issues.ref_reopening_from=`посилається в запиті на злиття %[3]s, який повторно відкриє цю задачу, %[1]s` -issues.ref_closed_from=`закрив цю задачу %[4]s %[2]s` -issues.ref_reopened_from=`повторно відкрито цю задачу %[4]s %[2]s` issues.ref_from=`із %[1]s` issues.role.owner=Власник issues.role.member=Учасник @@ -1586,15 +1516,11 @@ issues.add_time_sum_to_small=Час не введено. issues.time_spent_total=Загальний витрачений час issues.time_spent_from_all_authors=`Загальний витрачений час: %s` issues.due_date=Дата завершення -issues.invalid_due_date_format=Дата закінчення має бути в форматі 'ррр-мм-дд'. -issues.error_modifying_due_date=Не вдалося змінити дату завершення. -issues.error_removing_due_date=Не вдалося видалити дату завершення. issues.push_commit_1=додає %d коміт %s issues.push_commits_n=додає %d коміти(-ів) %s issues.force_push_codes=`примусово залито %[1]s з %[2]s %[8]s до %[4]s %[9]s %[6]s` issues.force_push_compare=Порівняти issues.due_date_form=рррр-мм-дд -issues.due_date_form_add=Додати дату завершення issues.due_date_form_edit=Редагувати issues.due_date_form_remove=Видалити issues.due_date_not_set=Термін виконання не встановлено. @@ -1641,7 +1567,6 @@ issues.review.add_review_request=попросив рецензію від %s %s issues.review.remove_review_request=видалив запит на рецензію до %s %s issues.review.remove_review_request_self=відмовився рецензувати %s issues.review.pending=Очікування -issues.review.review=Рецензії issues.review.reviewers=Рецензенти issues.review.outdated=Застарілі issues.review.show_outdated=Показати застарілі @@ -1651,7 +1576,6 @@ issues.review.hide_resolved=Приховати вирішене issues.review.resolve_conversation=Завершити обговорення issues.review.un_resolve_conversation=Поновити обговорення issues.review.resolved_by=позначив обговорення завершеним -issues.assignee.error=Додано не всіх виконавців через непередбачену помилку. issues.reference_issue.body=Тіло issues.content_history.deleted=видалено issues.content_history.edited=відредаговано @@ -1677,8 +1601,6 @@ pulls.nothing_to_compare=Ці гілки однакові. Немає необх pulls.nothing_to_compare_and_allow_empty_pr=Одинакові гілки. Цей PR буде порожнім. pulls.has_pull_request=`Запит злиття для цих гілок вже існує: %[2]s#%[3]d` pulls.create=Створити запит на злиття -pulls.title_desc_few=хоче об'єднати %[1]d комітів з %[2]s в %[3]s -pulls.merged_title_desc_few=об'єднав %[1]d комітів з %[2]s в %[3]s %[4]s pulls.change_target_branch_at=`змінена цільова гілка з %s на %s %s` pulls.tab_conversation=Обговорення pulls.tab_commits=Коміти @@ -1780,8 +1702,6 @@ milestones.filter_sort.most_issues=Найбільш задач milestones.filter_sort.least_issues=Найменш задач -ext_wiki.desc=Посилання на зовнішню вікі. - wiki=Вікі wiki.welcome=Ласкаво просимо до вікі. wiki.welcome_desc=Wiki дозволяє писати та ділитися документацією з співавторами. @@ -1872,13 +1792,6 @@ activity.git_stats_deletion_n=%d видалені contributors.contribution_type.commits=Коміти -search=Пошук -search.search_repo=Пошук репозиторію -search.fuzzy=Неточний -search.match=Збігається -search.results=Результати пошуку для "%s" в %s -search.code_no_results=Відповідний пошуковому запитанню код не знайдено. - settings=Налаштування settings.desc=У налаштуваннях ви можете змінювати різні параметри цього репозиторія settings.options=Репозиторій @@ -1952,7 +1865,6 @@ settings.transfer.success=Перенесення репозиторію вико settings.transfer_abort=Скасувати перенесення settings.transfer_abort_invalid=Ви не можете скасувати неіснуюче перенесення сховища. settings.transfer_desc=Передати репозиторій користувачеві або організації, де ви маєте права адміністратора. -settings.transfer_form_title=Введіть ім'я репозиторія як підтвердження: settings.transfer_in_progress=В даний час відбувається перенесення. Будь ласка, скасуйте його, якщо ви бажаєте перенести цей репозиторій іншому користувачу. settings.transfer_notices_1=- Ви втратите доступ до репозиторія, якщо ви переведете його окремому користувачеві. settings.transfer_notices_2=- Ви збережете доступ, якщо новим власником стане організація, власником якої ви є. @@ -1994,7 +1906,6 @@ settings.delete_collaborator=Видалити settings.collaborator_deletion=Видалити співавтора settings.collaborator_deletion_desc=Цей користувач більше не матиме доступу для спільної роботи в цьому репозиторії після видалення. Ви хочете продовжити? settings.remove_collaborator_success=Співавтор видалений. -settings.search_user_placeholder=Пошук користувача… settings.org_not_allowed_to_be_collaborator=Організації не можуть бути додані як співавтори. settings.change_team_access_not_allowed=Зміна доступу команди до репозитарію обмежена власником організації settings.team_not_in_organization=Команда та репозитарій мають привязки до різних організацій @@ -2002,7 +1913,6 @@ settings.teams=Команди settings.add_team=Додати команду settings.add_team_duplicate=Команда вже має привязку до репозитарію settings.add_team_success=Команда отримала доступ до репозиторію. -settings.search_team=Знайти команду… settings.change_team_permission_tip=Дозволи команди встановлюються на сторінці налаштувань команди та не можуть бути заданими для кожного з репозиторіїв окремо settings.delete_team_tip=Ця команда має доступ до всіх репозиторіїв та не може бути видалена settings.remove_team_success=Доступ команди до репозиторію видалений. @@ -2105,12 +2015,7 @@ settings.deploy_key_deletion_desc=Видалення ключа розгортк settings.deploy_key_deletion_success=Ключі розгортання було видалено. settings.branches=Гілки settings.protected_branch=Захист гілки -settings.protected_branch_can_push=Дозволити push? -settings.protected_branch_can_push_yes=Ви можете виконувати push -settings.protected_branch_can_push_no=Ви не можете виконувати push settings.branch_protection=Правила захисту для гілки «%s» -settings.protect_this_branch=Захистити цю гілку -settings.protect_this_branch_desc=Запобігає видаленню гілки та обмежує виконання в ній push та злиття. settings.protect_disable_push=Заборонити push settings.protect_disable_push_desc=Для цієї гілки буде заборонено виконання push. settings.protect_enable_push=Дозволити push @@ -2119,9 +2024,7 @@ settings.protect_whitelist_committers=Білий список обмеження settings.protect_whitelist_committers_desc=Лише користувачі та команди з білого списку зможуть виконувати push в цій гілці (за виключеням force push). settings.protect_whitelist_deploy_keys=Білий список ключів розгортання з правом на запис. settings.protect_whitelist_users=Користувачі, які можуть робити push в цю гілку -settings.protect_whitelist_search_users=Пошук користувачів… settings.protect_whitelist_teams=Команди, учасники яких можуть робити push в цю гілку -settings.protect_whitelist_search_teams=Пошук команд… settings.protect_merge_whitelist_committers=Обмежити право на об'єднання списком settings.protect_merge_whitelist_committers_desc=Ви можете додавати користувачів або цілі команди в 'білий' список цієї гілки. Тільки присутні в списку зможуть приймати запити на злиття. В іншому випадку будь-хто з правами запису до головного репозиторію буде володіти такою можливістю. settings.protect_merge_whitelist_users=Користувачі з правом на об'єднання @@ -2139,8 +2042,6 @@ settings.dismiss_stale_approvals=Відхилити застарілі пого settings.dismiss_stale_approvals_desc=Коли нові коміти що змінюють вміст пулл-запиту відправляються в гілку, старі погодження будуть відхилені. settings.require_signed_commits=Вимагати підпис комітів settings.require_signed_commits_desc=Відхиляти push до цієї гілки, якщо вони не підписані або підпис неможливо перевірити. -settings.add_protected_branch=Увімкнути захист -settings.delete_protected_branch=Вимкнути захист settings.protected_branch_deletion=Вимкнути захист гілки settings.protected_branch_deletion_desc=Будь-який користувач з дозволами на запис зможе виконувати push в цю гілку. Ви впевнені? settings.block_rejected_reviews=Блокувати злиття при відкидаючих рецензіях @@ -2205,8 +2106,6 @@ settings.lfs_pointers.associateAccessible=Пов'язати доступні %d settings.rename_branch_failed_exist=Неможливо перейменувати гілку, оскільки вже існує гілка %s. settings.rename_branch_failed_not_exist=Неможливо перейменувати гілку %s, оскільки її не існує. settings.rename_branch_success=Гілку %s успішно перейменовано на %s. -settings.rename_branch_from=стара назва гілки -settings.rename_branch_to=назва нової гілки settings.rename_branch=Перейменувати гілку diff.browse_source=Переглянути джерело @@ -2215,7 +2114,6 @@ diff.commit=коміт diff.git-notes=Примітки diff.data_not_available=Різниця недоступна diff.options_button=Параметри порівняння -diff.show_diff_stats=Показати статистику diff.download_patch=Завантажити патч diff.download_diff=Завантажити файл різниці diff.show_split_view=Розділений перегляд @@ -2295,7 +2193,6 @@ release.tag_name_invalid=Неприпустиме ім'я тега. release.tag_name_protected=Ім'я тега захищене. release.tag_already_exist=Цей тег вже використовується. release.downloads=Завантажити -release.download_count=Завантаження: %s release.add_tag_msg=Використовуйте заголовок і зміст релізу як повідомлення як тег повідомлення. release.add_tag=Створити тег @@ -2308,7 +2205,6 @@ branch.included_desc=Ця гілка є частиною типової гілк branch.included=Включено branch.create_new_branch=Створити гілку з гілки: branch.confirm_create_branch=Створити гілку -branch.confirm_rename_branch=Перейменувати гілку branch.create_branch_operation=Створити гілку branch.new_branch=Створити нову гілку branch.renamed=Гілку %s перейменовано на %s. @@ -2341,11 +2237,9 @@ projects.card_type.text_only = Лише текст projects.card_type.images_and_text = Зображення і текст issues.filter_poster = Автор issues.author = Автор -issues.author_helper = Цей користувач - автор. issues.close = Закрити задачу issues.role.owner_helper = Цей користувач є власником цього репозиторію. settings.mirror_settings.docs.more_information_if_disabled = Докладніше про push- та pull-дзеркала можна дізнатися тут: -issues.comment.blocked_by_user = Ви не можете коментувати цю задачу, оскільки вас заблокував власник репозиторію або автор цієї задачі. editor.add_file = Додати файл from_comment = (коментар) editor.add = Додати %s @@ -2410,7 +2304,6 @@ settings.protect_status_check_patterns = Шаблони перевірки ст issues.role.collaborator = Співавтор pulls.auto_merge_cancel_schedule = Скасувати автоматичне об'єднання issues.comment_pull_merged_at = об'єднав коміт %[1]s в %[2]s %[3]s -pulls.title_desc_one = хоче об'єднати %[1]d коміт з %[2]s в %[3]s settings.merge_style_desc = Стилі об'єднання pulls.auto_merge_when_succeed = Об'єднувати автоматично, якщо всі перевірки проходять успішно pulls.cmd_instruction_merge_title = Об'єднання @@ -2421,7 +2314,6 @@ editor.commit_id_not_matching = Файл було змінено, поки ви settings.event_pull_request_merge = Об'єднання запиту на злиття pulls.auto_merge_canceled_schedule = Автоматичне об'єднання скасовано для цього запиту на злиття. pulls.auto_merge_not_scheduled = Цей запит на злиття не заплановано для автоматичного об'єднання. -pulls.merged_title_desc_one = об'єднав %[1]d коміт з %[2]s в %[3]s %[4]s pulls.fast_forward_only_merge_pull_request = Тільки fast-forward pulls.merged_by = від %[3]s об'єднано %[1]s issues.comment_manually_pull_merged_at = вручну об'єднав коміт %[1]s в %[2]s %[3]s @@ -2570,7 +2462,6 @@ mirror_sync = синхронізовано mirror_use_ssh.helper = Forgejo може віддзеркалювати репозиторій за допомогою Git через SSH, згенерувавши вам пару ключів. Дозвольте відкритому ключу вивантажувати зміни в цільовий репозиторій. При виборі цієї опції вхід паролем неможливий. mirror_denied_combination = Неможливо водночас використовувати вхід відкритим ключем і паролем. new_repo_helper = Репозиторій містить усі файли проєкту, зокрема історію змін. У вас він уже десь є? Мігруйте репозиторій. -issues.reference_link = Посилання: %s object_format_helper = Формат об'єктів репозиторія. Змінити потім неможливо. SHA1 — найсумісніший. mirror_interval = Інтервал синхронізації дзеркала (часові одиниці — «h», «m», «s»). 0 вимикає синхронізацію. (Мінімальний інтервал: %s) mirror_address_url_invalid = Вказано хибну URL-адресу. Впевніться, що всі неоднозначні складники адреси замінено escape-послідовностями. @@ -2588,7 +2479,6 @@ n_release_few = %s випусків release.releases_for = Випуски %s release.type_attachment = Вкладення n_release_one = %s випуск -pulls.comment.blocked_by_user = Ви не можете коментувати цей запит на злиття, оскільки вас заблокував власник репозиторію або автор запиту на злиття. issues.reopen.blocked_by_user = Ви не можете знову відкрити цю задачу, оскільки вас заблокував власник репозиторію або автор задачі. settings.actions_desc = Увімкнути вбудовані конвеєри CI/CD з Діями Forgejo tree_path_not_found_commit = Шлях %[1]s не існує в коміті %[2]s @@ -2934,8 +2824,6 @@ teams.leave.detail=Ви впевнені, що хочете покинути к teams.can_create_org_repo=Створити репозиторії teams.can_create_org_repo_helper=Учасники можуть створювати нові репозиторії в організації. Автор отримає доступ адміністратора до нового репозиторію. teams.read_access=Прочитані -teams.read_access_helper=Учасники можуть переглядати та клонувати репозиторії команд. -teams.write_access_helper=Учасники можуть читати і виконувати push в репозиторії команд. teams.admin_access=Доступ адміністратора teams.admin_access_helper=Учасники можуть виконувати pull, push в репозиторії команд і додавати співавторів в команду. teams.no_desc=Ця команда не має опису @@ -2948,12 +2836,9 @@ teams.add_team_member=Додати учасника команди teams.delete_team_title=Видалити команду teams.delete_team_desc=Видалення команди скасовує доступ до репозиторія для її учасників. Продовжити? teams.delete_team_success=Команду було видалено. -teams.read_permission_desc=Ця команда має доступ для читання: учасники можуть переглядати та клонувати репозиторії. -teams.write_permission_desc=Ця команда надає доступ на запис: учасники можуть отримувати й виконувати push команди до репозитрію. teams.admin_permission_desc=Ця команда надає адміністраторський доступ: учасники можуть читати, виконувати push та додавати співавторів до її репозиторіїв. teams.create_repo_permission_desc=Крім того, ця команда надає дозвіл Створити репозиторій: учасники можуть створювати нові репозиторії в організації. teams.repositories=Репозиторії команди -teams.search_repo_placeholder=Пошук репозиторію… teams.remove_all_repos_title=Видалити всі репозиторії команди teams.remove_all_repos_desc=Це видалить усі репозиторії команди. teams.add_all_repos_title=Додати всі репозиторії @@ -2965,9 +2850,6 @@ teams.specific_repositories=Конкретні репозиторії teams.specific_repositories_helper=Учасники матимуть доступ лише до репозиторіїв, які були явно додані до команди. Вибір цього пункту не призводить до автоматичного видалення репозиторіїв, доданих з Всі репозиторії. teams.all_repositories=Всі репозиторії teams.all_repositories_helper=Команда має доступ до всіх репозиторіїв. Вибір цього пункту додасть всі наявні репозиторії до команди. -teams.all_repositories_read_permission_desc=Ця команда надає дозвіл Перегляд для всіх репозиторіїв: учасники можуть переглядати та клонувати їх. -teams.all_repositories_write_permission_desc=Ця команда надає дозвіл Запис для всіх репозиторіїв: учасники можуть переглядати та виконувати push в репозиторіях. -teams.all_repositories_admin_permission_desc=Ця команда надає дозвіл Адміністрування для всіх репозиторіїв: учасники можуть переглядати, виконувати push та додавати співробітників. code = Код open_dashboard = Відкрити панель управління follow_blocked_user = Ви не можете стежити за цією організацією, тому що вас у ній заблокували. @@ -3065,7 +2947,6 @@ dashboard.gc_metadata_obtained=Отримано метаданих збирач dashboard.other_system_allocation_obtained=Отримання інших виділень пам'яті dashboard.next_gc_recycle=Наступний цикл збирача сміття dashboard.last_gc_time=З останнього запуску збирача сміття -dashboard.total_gc_time=Загальна пауза збирача сміття (GC) dashboard.total_gc_pause=Загальна пауза збирача сміття dashboard.last_gc_pause=Остання пауза збирача сміття dashboard.gc_times=Кількість запусків збирача сміття @@ -3145,9 +3026,6 @@ repos.unadopted.no_more=Не знайдено неприйнятих репоз repos.owner=Власник repos.name=Назва repos.private=Приватний -repos.watches=Стежать -repos.stars=В обраному -repos.forks=Форки repos.issues=Задачі repos.size=Розмір @@ -3226,17 +3104,6 @@ auths.oauth2_emailURL=URL електронної пошти auths.skip_local_two_fa=Пропустити локальну 2FA auths.skip_local_two_fa_helper=Якщо значення не вказано, локальнам користувачам, що використовують двофакторну автентифікацію, все одно проходитимуть її для входу в систему auths.oauth2_tenant=Tenant -auths.enable_auto_register=Увімкнути автоматичну реєстрацію -auths.sspi_auto_create_users=Автоматично створювати користувачів -auths.sspi_auto_create_users_helper=Дозволити автоматичне створення нових облікових записів для користувачів, які вперше увійшли з використання автентифікації SSPI -auths.sspi_auto_activate_users=Автоматично активувати користувачів -auths.sspi_auto_activate_users_helper=Дозволити автоматичну активацію облікових записів, створених при автентифікації SSPI -auths.sspi_strip_domain_names=Вилучати назви доменів з імен користувачів -auths.sspi_strip_domain_names_helper=Якщо увімкнено, доменні імена будуть видалятися з імені входу (наприклад, "DOMAIN\user" та "user@example.org" стануть "user"). -auths.sspi_separator_replacement=Використовувати замість \, / та @ роздільник -auths.sspi_separator_replacement_helper=Символ, який замінює роздільники імен входу нижнього рівня (наприклад, \ в "DOMAIN\user") та основних імен користувачів (наприклад, @ "user@example.org"). -auths.sspi_default_language=Типова мова користувача -auths.sspi_default_language_helper=Типова мова для користувачів, які створюються автоматично при SSPI-автентифікації. Залиште не вказаним, якщо надаєте перевагу автоматичному визначенню мови. auths.tips=Поради auths.tips.oauth2.general=Автентифікація OAuth2 auths.tip.oauth2_provider=Постачальник OAuth2 @@ -3245,7 +3112,6 @@ auths.tip.nextcloud=`Зареєструйте нового споживача OA auths.tip.dropbox=Створіть нову програму на %s auths.tip.facebook=Зареєструйте нову програму на %s і додайте модуль «Facebook Login» auths.tip.github=Зареєструйте нову програму OAuth на %s -auths.tip.gitlab=Додайте новий додаток на https://gitlab.com/profile/applications auths.tip.google_plus=Отримайте облікові дані клієнта OAuth2 в консолі Google API на сторінці %s auths.tip.openid_connect=Використовуйте OpenID Connect Discovery URL (/.well-known/openid-configuration) для автоматичної настройки входу OAuth auths.tip.twitter=Перейдіть на %s, створіть програму і переконайтеся, що ввімкнено опцію «Дозволити використання цієї програми для входу через Twitter» @@ -3840,7 +3706,6 @@ runs.status_no_select = Усі стани runs.status = Стан runners.task_list.status = Стан runners.status = Стан -runs.no_workflows.documentation = Докладніше про Дії Forgejo читайте в документації. runners.reset_registration_token = Скинути токен реєстрації workflow.enable_success = Робочий потік «%s» успішно ввімкнено. runs.workflow = Робочий потік @@ -3926,11 +3791,9 @@ regexp = Регулярні вирази regexp_tooltip = Опрацьовувати пошуковий запит як регулярний вираз org_kind = Шукати організації… team_kind = Шукати команди… -milestone_kind = Шукати віхи... commit_kind = Шукати коментарі… no_results = Не знайдено відповідних результатів. keyword_search_unavailable = Пошук за ключовими словами наразі недоступний. Будь ласка, зв'яжіться з адміністратором сайту. -code_search_by_git_grep = Поточні результати пошуку коду надаються з «git grep». Тут можуть бути кращі результати, якщо адміністратор сайту ввімкнув індексацію коду. package_kind = Шукати пакунки… project_kind = Шукати проєкти… branch_kind = Шукати гілки… diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index ce863def1e..417e950fd9 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -49,21 +49,14 @@ webauthn_error_unable_to_process=服务器无法处理您的请求。 webauthn_error_duplicated=此安全密钥未被许可用于这个请求。请确保该密钥尚未注册。 webauthn_error_empty=您必须为此密钥设置一个名称。 webauthn_error_timeout=未能在允许的时限内读取密钥。请重新加载此页面并重试。 -webauthn_reload=重新加载 - repository=仓库 organization=组织 mirror=镜像 -new_repo=创建仓库 -new_migrate=迁移外部仓库 new_mirror=创建镜像 new_fork=创建派生仓库 -new_org=创建组织 new_project=创建项目 new_project_column=创建列 -manage_org=管理我的组织 admin_panel=网站管理 -account_settings=帐户设置 settings=设置 your_profile=个人信息 your_starred=点赞 @@ -218,8 +211,6 @@ string.desc=Z - A [error] occurred=发生了一个错误 report_message=如果您确定这是一个 Forgejo 的 bug,请在 Codeberg 上搜索相关问题或在必要时创建一个新议题。 -missing_csrf=错误的请求:没有 CSRF 令牌 -invalid_csrf=错误的请求:无效的 CSRF 令牌 not_found=找不到目标。 network_error=网络错误 server_internal = 服务器内部错误 @@ -355,15 +346,10 @@ app_slogan_helper = 在此处输入您的实例标语。留空则禁用。 [home] uname_holder=用户名或电子邮件地址 -password_holder=密码 switch_dashboard_context=切换控制面板用户 my_repos=仓库列表 -show_more_repos=显示更多仓库… -collaborative_repos=参与协作的仓库 my_orgs=我的组织 -my_mirrors=我的镜像 view_home=访问 %s -search_repos=查找仓库… filter=其他过滤器 filter_by_team_repositories=按团队仓库筛选 feed_of=`"%s"的源` @@ -384,20 +370,8 @@ issues.in_your_repos=在您的仓库中 repos=仓库 users=用户 organizations=组织 -search=搜索 go_to=转到 code=代码 -search.type.tooltip=搜索类型 -search.fuzzy=模糊 -search.fuzzy.tooltip=包含近似匹配搜索词的结果 -search.match=匹配 -search.match.tooltip=仅包含精确匹配搜索词的结果 -code_search_unavailable=目前代码搜索不可用。请与网站管理员联系。 -repo_no_results=未找到匹配的仓库。 -user_no_results=未找到匹配的用户。 -org_no_results=未找到匹配的组织。 -code_no_results=未找到与搜索字词匹配的源代码。 -code_search_results=“%s” 的搜索结果是 code_last_indexed_at=最后索引于 %s relevant_repositories_tooltip=派生的、缺少主题、图标和描述的仓库已被隐藏。 relevant_repositories=只显示相关的仓库, 显示未过滤结果。 @@ -408,16 +382,12 @@ forks_few = %d 派生 [auth] create_new_account=注册帐号 -register_helper_msg=已经注册?立即登录! -social_register_helper_msg=已经注册?立即绑定! disable_register_prompt=对不起,注册功能已被关闭。请联系网站管理员。 disable_register_mail=已禁用注册的电子邮件确认。 manual_activation_only=请联系您的站点管理员来完成激活。 remember_me=记住此设备 -remember_me.compromised=登录令牌不再有效,因为它可能表明帐户已被破坏。请检查您的帐户是否有异常活动。 forgot_password_title=忘记密码 forgot_password=忘记密码? -sign_up_now=还没帐户?马上注册。 sign_up_successful=帐户创建成功。欢迎! confirmation_mail_sent_prompt=新的确认邮件已发送至 %s。请检查您的收件箱并在接下来的 %s 内点击提供的链接以完成注册过程。如果电子邮件不正确,您可以登录并请求将另一封确认邮件发送到其他地址。 must_change_password=更新您的密码 @@ -430,7 +400,6 @@ prohibit_login_desc=您的账号已暂停与实例交互。请与实例管理员 resent_limit_prompt=您请求发送激活邮件过于频繁,请等待 3 分钟后再试。 has_unconfirmed_mail=%s 您好,系统检测到您有一封发送至 %s 但未被确认的邮件。如果您未收到激活邮件,或需要重新发送,请单击下方的按钮。 resend_mail=单击此处重新发送确认邮件 -email_not_associate=您输入的邮箱地址未被关联到任何帐号! send_reset_mail=发送恢复邮件 reset_password=账户恢复 invalid_code=此确认密钥无效或已过期。 @@ -447,7 +416,6 @@ twofa_scratch_used=你已经使用了你的验证口令。你将会转到两步 twofa_passcode_incorrect=你的验证码不正确。如果你丢失了你的设备,请使用你的验证口令。 twofa_scratch_token_incorrect=你的验证口令不正确。 login_userpass=登录 -tab_openid=OpenID oauth_signup_tab=注册新帐号 oauth_signup_title=完成新帐户创建 oauth_signup_submit=完成账号 @@ -473,15 +441,12 @@ authorize_application_description=如果您允许,它将能够读取和修改 authorize_title=授权 %s 访问您的帐户? authorization_failed=授权失败 authorization_failed_desc=因为检测到无效请求,授权失败。请尝试联系您授权应用的管理员。 -sspi_auth_failed=SSPI 认证失败 password_pwned=此密码出现在 被盗密码 列表上并且曾经被公开。 请使用另一个密码再试一次。 password_pwned_err=无法完成对 HaveIBeenPwned 的请求 last_admin=您不能删除最后一个管理员。必须至少保留一个管理员。 change_unconfirmed_email = 如果您在注册时提供了错误的邮箱地址,您可以在下方修改,激活邮件会发送到修改后的邮箱地址。 change_unconfirmed_email_summary = 修改用来接收激活邮件的邮箱地址。 change_unconfirmed_email_error = 无法修改邮箱地址:%v -tab_signin = 登录 -tab_signup = 注册 hint_login = 已经有账户了吗?立即登录! back_to_sign_in = 返回登录 sign_in_openid = 继续使用 OpenID @@ -497,22 +462,18 @@ link_not_working_do_paste=链接点不了?尝试复制并粘贴到您的浏览 hi_user_x=%s 您好, activate_account=请激活您的帐户 -activate_account.title=%s,请激活您的帐户 activate_account.text_1=%[1]s 您好,感谢注册 %[2]s ! activate_account.text_2=请在 %s 时间内,点击以下链接激活您的账户: activate_email=请验证您的邮箱地址 -activate_email.title=%s,请验证您的邮箱 activate_email.text=请在 %s 时间内,点击以下链接,以验证你的电子邮件地址: register_notify=欢迎来到 %s -register_notify.title=%[1]s,欢迎来到 %[2]s register_notify.text_1=这是您的 %s 注册确认电子邮件 ! register_notify.text_2=您现在可以以用户名 %s 登录 register_notify.text_3=如果此账户是别人为您创建的,请先 设置您的密码。 reset_password=恢复您的账户 -reset_password.title=%s,我们收到了恢复您的帐户的请求 reset_password.text=如果此请求是您本人作出的,则请在 %s 时间内,点击以下链接,恢复你的账户: register_success=注册成功 @@ -587,8 +548,6 @@ RepoName=仓库名称 Email=邮箱地址 Password=密码 Retype=确认密码 -SSHTitle=SSH 密钥名称 -HttpsUrl=HTTPS URL 地址 PayloadUrl=推送地址 TeamName=团队名称 AuthName=认证名称 @@ -601,9 +560,6 @@ CommitChoice=提交选择 TreeName=文件路径 Content=内容 -SSPISeparatorReplacement=分隔符 -SSPIDefaultLanguage=默认语言 - require_error=` 不能为空。` alpha_dash_error=` 应只包含字母数字、破折号(“-”)和下划线(“_”)字符。` alpha_dash_dot_error=` 应该只包含半角字母、数字、破折号(“-”)、下划线(“_”)和半角句号(“.”) 。` @@ -625,7 +581,6 @@ lang_select_error=从列表中选择一个语言。 username_been_taken=用户名已被使用。 username_change_not_local_user=非本地用户不允许更改用户名。 -username_has_not_been_changed=用户名未更改 repo_name_been_taken=仓库名称已被使用。 repository_force_private=“强制私有”已启用:私有仓库不能被公开。 repository_files_already_exist=此仓库已存在文件。请联系系统管理员。 @@ -704,7 +659,6 @@ unfollow=取消关注 user_bio=简历 disabled_public_activity=该用户已隐藏公开活动记录。 email_visibility.limited=所有已认证用户均可看到您的电子邮件地址 -email_visibility.private=只有你本人和管理员可以看到你的电子邮件地址 show_on_map=在地图上显示这个位置 settings=用户设置 @@ -739,13 +693,11 @@ password=修改密码 security=安全 avatar=头像设置 ssh_gpg_keys=SSH / GPG 密钥 -social=社交帐号 applications=应用 orgs=组织 repos=仓库列表 delete=删除账号 twofa=两步验证(TOTP) -account_link=已绑定的帐户 organization=组织 uid=UID webauthn=两步验证(安全密钥) @@ -792,10 +744,7 @@ comment_type_group_issue_ref=议题引用 saved_successfully=您的设置已成功保存。 privacy=隐私设置 keep_activity_private=隐藏个人资料页面中的活动 -keep_activity_private_popup=您的活动将只对您自己和本实例的管理员可见 - lookup_avatar_by_mail=使用电子邮件地址查找头像 -federated_avatar_lookup=查找联合头像 enable_custom_avatar=使用自定义头像 choose_new_avatar=选择新的头像 update_avatar=更新头像 @@ -813,7 +762,6 @@ password_incorrect=当前密码不正确。 change_password_success=您的密码已更新。从现在开始请使用您的新密码登录。 password_change_disabled=非本地帐户不能通过 Forgejo 的 web 界面更改密码。 -emails=邮箱地址 manage_emails=管理邮箱地址 manage_themes=默认主题 manage_openid=OpenID 地址 @@ -856,8 +804,6 @@ principal_desc=这些SSH证书规则已关联到你的账号将允许完全访 gpg_desc=这些 GPG 公钥已经关联到你的账号,并用于验证您的提交。请妥善保管你的私钥,因为这些私钥可以用于以你的身份签名提交。 ssh_helper=需要帮助? 请查看有关 如何生成 SSH 密钥常见 SSH 问题 寻找答案。 gpg_helper=需要帮助吗?建议看一看 GitHub 的 关于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_gpg_placeholder=以 “-----BEGIN PGP PUBLIC KEY BLOCK-----” 开头 add_new_principal=添加规则 @@ -875,7 +821,6 @@ gpg_invalid_token_signature=提供的 GPG 密钥、签名和令牌不匹配或 gpg_token_required=您必须为下面的令牌提供签名 gpg_token=令牌 gpg_token_help=您可以使用以下方式生成签名: -gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=GPG 增强签名 key_signature_gpg_placeholder=以 “-----BEGIN PGP SIGNATURE-----” 开头 verify_gpg_key_success=GPG 密钥 %s 已被验证。 @@ -922,11 +867,6 @@ hide_openid=在个人信息上隐藏 ssh_disabled=SSH 已禁用 ssh_signonly=SSH 目前已禁用,因此这些密钥仅用于提交签名验证。 ssh_externally_managed=此 SSH 密钥是由外部管理的 -manage_social=管理关联社交帐户 -social_desc=这些社交账户可以用来登录您的账户。确保您认识它们中的所有账户。 -unbind=取消链接 -unbind_success=社交账户已成功移除。 - manage_access_token=访问令牌 generate_new_token=生成新的令牌 tokens_desc=这些令牌拥有通过 Forgejo API 对您的帐户的访问权限。 @@ -936,8 +876,6 @@ generate_token_success=新令牌生成成功。请拷贝因为令牌将只会显 generate_token_name_duplicate=%s 已被用作应用程序名称。请使用一个新的名称。 delete_token=删除令牌 access_token_deletion=删除访问令牌 -access_token_deletion_cancel_action=取消 -access_token_deletion_confirm_action=刪除 access_token_deletion_desc=删除令牌将撤销程序对您账户的访问权限。此操作无法撤消。是否继续? delete_token_success=令牌已经被删除。使用该令牌的应用将不再能够访问你的账号。 repo_and_org_access=仓库和组织访问权限 @@ -1011,7 +949,6 @@ webauthn_alternative_tip=您可能想要配置额外的身份验证方法。 manage_account_links=已绑定的账号 manage_account_links_desc=这些外部帐户已经绑定到您的 Forgejo 帐户。 -account_links_not_available=当前没有与您的 Forgejo 帐户绑定的外部帐户。 link_account=链接账户 remove_account_link=删除已绑定的账号 remove_account_link_desc=删除已绑定帐户将吊销其对您的 Forgejo 帐户的访问权限。继续? @@ -1053,7 +990,6 @@ hints = 提示 update_hints = 更新提示 additional_repo_units_hint_description = 在所有存在未启用的功能的仓库内显示“启用更多”提示。 update_hints_success = 提示更改成功。 -pronouns_custom = 自定义 pronouns = 代词 pronouns_unspecified = 未指定 language.title = 默认语言 @@ -1061,7 +997,6 @@ keep_activity_private.description = 您的公开活动将仅对 language.description = 此语言将保存到您的账号中,并在您登录后用作默认语言。 language.localization_project = 帮助我们将 Forgejo 翻译成您的语言!了解更多。 user_block_yourself = 您不能屏蔽自己。 -pronouns_custom_label = 自定义代词 change_username_redirect_prompt.with_cooldown.one = 旧用户名将在 %[1]d 天的保护期后对所有人可用。您仍可以在此期间重新认领旧用户名。 change_username_redirect_prompt.with_cooldown.few = 旧用户名将在 %[1]d 天的保护期后对所有人可用,您仍可以在此期间重新认领旧用户名。 keep_pronouns_private = 仅向已认证用户显示代词 @@ -1118,7 +1053,6 @@ fork_branch=要复制到派生的分支 all_branches=所有分支 fork_no_valid_owners=这个代码仓库无法被派生,因为没有有效的所有者。 use_template=使用此模板 -clone_in_vsc=在 VS Code 中克隆 download_zip=下载 ZIP download_tar=下载 TAR.GZ download_bundle=下载 BUNDLE @@ -1140,11 +1074,6 @@ readme=自述 readme_helper=选择自述文件模板 readme_helper_desc=这是您可以为您的项目撰写完整描述的地方。 auto_init=初始化仓库 -trust_model_helper=选择签名验证的“信任模型”。可能的选项是: -trust_model_helper_collaborator=协作者:信任协作者的签名 -trust_model_helper_committer=提交者:信任与提交者相符的签名 -trust_model_helper_collaborator_committer=协作者+提交者:信任协作者同时是提交者的签名 -trust_model_helper_default=默认:使用此安装的默认信任模型 create_repo=创建仓库 default_branch=默认分支 default_branch_label=默认 @@ -1218,9 +1147,6 @@ template.invalid=必须选择一个模板仓库 archive.title=此仓库已存档。您可以查看文件和克隆仓库,但无法对其状态进行任何更改,例如推送和创建新议题、合并请求或评论。 archive.title_date=此仓库已于 %s 存档。您可以查看文件或克隆它,但无法对其状态进行任何更改,例如推送和创建新议题、合并请求或评论。 -archive.issue.nocomment=此仓库已存档,您不能在工单添加评论。 -archive.pull.nocomment=此仓库已存档,您不能在合并请求添加评论。 - form.reach_limit_of_creation_1=你已经达到了 %d 仓库的上限。 form.reach_limit_of_creation_n=你已经达到了 %d 个仓库的上限。 form.name_reserved=仓库名称 %s 是被保留的。 @@ -1228,7 +1154,6 @@ form.name_pattern_not_allowed=仓库名称中不允许使用 %s 格式。 need_auth=授权 migrate_options=迁移选项 -migrate_service=迁移服务 migrate_options_mirror_helper=该仓库将是一个镜像 migrate_options_lfs=迁移 LFS 文件 migrate_options_lfs_endpoint.label=LFS 网址 @@ -1314,7 +1239,6 @@ branches=分支列表 tags=标签列表 issues=议题 pulls=合并请求 -project_board=项目 packages=软件包 actions=Actions labels=标签 @@ -1328,7 +1252,6 @@ release=版本发布 releases=版本发布 tag=Git标签 released_this=发布 -tagged_this=已标记 file.title=%s 位于 %s file_raw=原始文件 file_history=文件历史 @@ -1442,9 +1365,7 @@ commits.desc=浏览代码修改历史。 commits.commits=次代码提交 commits.no_commits=没有共同的提交。%s 和 %s 的历史完全不同。 commits.nothing_to_compare=这些分支是相同的。 -commits.search=搜索提交历史 commits.search.tooltip=您可以在关键词前加上前缀,如"author:", "committer:", "after:", 或"before:", 例如 "retrin author:Alice before:2019-01-13"。 -commits.find=搜索 commits.search_all=所有分支 commits.author=作者 commits.message=备注 @@ -1472,8 +1393,6 @@ commitstatus.pending=待定 commitstatus.success=成功 ext_issues=外部议题 -ext_issues.desc=链接到外部工单跟踪系统。 - projects=项目 projects.desc=在项目看板中管理议题和合并请求。 projects.description=描述(可选) @@ -1495,7 +1414,6 @@ projects.type.basic_kanban=基础看板 projects.type.bug_triage=Bug分类看板 projects.template.desc=项目模板 projects.template.desc_helper=选择一个项目模板以开始 -projects.type.uncategorized=未分类 projects.column.edit=编辑列 projects.column.edit_title=名称 projects.column.new_title=名称 @@ -1503,8 +1421,6 @@ projects.column.new_submit=创建列 projects.column.new=创建列 projects.column.set_default=设为默认 projects.column.set_default_desc=设置此列为未分类议题和合并请求的默认值 -projects.column.unset_default=取消设为默认 -projects.column.unset_default_desc=取消此列为默认值 projects.column.delete=删除列 projects.column.deletion_desc=删除项目列会将所有相关议题移到默认的列。是否继续? projects.column.color=颜色 @@ -1618,7 +1534,6 @@ issues.filter_sort.moststars=点赞由多到少 issues.filter_sort.feweststars=点赞由少到多 issues.filter_sort.mostforks=派生由多到少 issues.filter_sort.fewestforks=派生由少到多 -issues.keyword_search_unavailable=关键词搜索目前不可用。请联系网站管理员。 issues.action_open=开放 issues.action_close=关闭 issues.action_label=标签 @@ -1663,11 +1578,8 @@ issues.ref_issue_from=`引用了此议题 %[3]s %[1]s` issues.ref_pull_from=`引用了此合并请求 %[3]s %[1]s` issues.ref_closing_from=`于 %[1]s 从合并请求 %[3]s 引用了此议题,将关闭此议题` issues.ref_reopening_from=`于 %[1]s 从合并请求 %[3]s 引用了此议题,将重新打开此议题 ` -issues.ref_closed_from=`关闭了这个议题 %[4]s %[2]s` -issues.ref_reopened_from=`重新打开这个议题 %[4]s %[2]s` issues.ref_from=`来自 %[1]s` issues.author=作者 -issues.author_helper=此用户是作者。 issues.role.owner=管理员 issues.role.owner_helper=该用户是该仓库的所有者。 issues.role.member=成员 @@ -1762,18 +1674,13 @@ issues.add_time_sum_to_small=没有输入时间。 issues.time_spent_total=总用时 issues.time_spent_from_all_authors=`总花费时间:%s` issues.due_date=到期时间 -issues.invalid_due_date_format=到期时间的格式必须是“yyyy-mm-dd”。 -issues.error_modifying_due_date=修改到期时间失败。 -issues.error_removing_due_date=删除到期时间失败。 issues.push_commit_1=于 %[2]s 推送了 %[1]d 个提交 issues.push_commits_n=于 %[2]s 推送了 %[1]d 个提交 issues.force_push_codes=`于 %[6]s 强制推送 %[1]s,从 %[2]s %[8]s,至 %[4]s %[9]s` issues.force_push_compare=比较 issues.due_date_form=yyyy-mm-dd -issues.due_date_form_add=设置到期时间 issues.due_date_form_edit=编辑 issues.due_date_form_remove=删除 -issues.due_date_not_writer=您需要该仓库的写权限才能更新工单的到期日期。 issues.due_date_not_set=未设置到期时间。 issues.due_date_added=于 %[2]s 设置到期时间为 %[1]s issues.due_date_modified=于 %[3]s 将到期日从 %[2]s 修改为 %[1]s @@ -1826,7 +1733,6 @@ issues.review.remove_review_request=于 %[2]s 取消对 %[1]s 的评审请求 issues.review.remove_review_request_self=于 %s 拒绝评审 issues.review.pending=待定 issues.review.pending.tooltip=此评论目前对其他用户不可见。 若要提交您的待定评论,请在页面顶部选择 %s -> %s/%s/%s。 -issues.review.review=评审 issues.review.reviewers=评审人 issues.review.outdated=已过时 issues.review.outdated_description=评论发布后内容已经修改 @@ -1839,7 +1745,6 @@ issues.review.hide_resolved=隐藏已解决的 issues.review.resolve_conversation=已解决 issues.review.un_resolve_conversation=未解决 issues.review.resolved_by=标记问题为已解决 -issues.assignee.error=因为未知原因,并非所有的指派都成功。 issues.reference_issue.body=内容 issues.content_history.deleted=删除于 issues.content_history.edited=最后编辑于 @@ -1847,8 +1752,6 @@ issues.content_history.created=创建于 issues.content_history.delete_from_history=从历史记录中删除 issues.content_history.delete_from_history_confirm=从历史记录中删除吗? issues.content_history.options=选项 -issues.reference_link=引用:%s - compare.compare_base=基准 compare.compare_head=比较 @@ -1883,8 +1786,6 @@ pulls.nothing_to_compare_have_tag = 所选分支/标签相同。 pulls.nothing_to_compare_and_allow_empty_pr=这些分支是相等的,此合并请求将为空。 pulls.has_pull_request=这些分支之间的合并请求已存在:%[2]s#%[3]d pulls.create=创建合并请求 -pulls.title_desc_few=请求将 %[1]d 次代码提交从 %[2]s 合并至 %[3]s -pulls.merged_title_desc_few=于 %[4]s 将 %[1]d 次代码提交从 %[2]s合并至 %[3]s pulls.change_target_branch_at=将目标分支从 %s 更改为 %s %s pulls.tab_conversation=对话 pulls.tab_commits=代码提交 @@ -2044,8 +1945,6 @@ signing.wont_sign.approved=合并将不会被签名,因为合并请求未被 signing.wont_sign.not_signed_in=您还没有登录。 ext_wiki=外部百科 -ext_wiki.desc=链接到外部 wiki。 - wiki=百科 wiki.welcome=欢迎来到百科。 wiki.welcome_desc=百科允许你撰写并与协作者分享文档。 @@ -2145,17 +2044,6 @@ contributors.contribution_type.commits=提交 contributors.contribution_type.additions=增加 contributors.contribution_type.deletions=删除 -search=搜索 -search.search_repo=搜索仓库... -search.type.tooltip=搜索类型 -search.fuzzy=模糊 -search.fuzzy.tooltip=包含近似匹配搜索词的结果 -search.match=匹配 -search.match.tooltip=仅包含精确匹配搜索词的结果 -search.results=在 %[3]s 中搜索 "%[1]s" 的结果 -search.code_no_results=未找到与搜索字词匹配的源代码。 -search.code_search_unavailable=当前代码搜索不可用。请与网站管理员联系。 - settings=设置 settings.desc=设置是你可以管理仓库设置的地方 settings.options=仓库 @@ -2263,7 +2151,6 @@ settings.transfer_abort=取消转移 settings.transfer_abort_invalid=你不能取消不存在的代码库转移。 settings.transfer_abort_success=成功取消了将代码库转让给 %s。 settings.transfer_desc=您可以将仓库转移至您拥有管理员权限的帐户或组织。 -settings.transfer_form_title=输入仓库名称以做确认: settings.transfer_in_progress=当前正在进行转让。 如果你想将此代码库转让给另一个用户,请取消它。 settings.transfer_notices_1=- 如果将此仓库转移给其他用户, 您将失去对此仓库的访问权限。 settings.transfer_notices_2=-如果将其转移到您(共同) 拥有的组织,您可以继续访问该仓库。 @@ -2308,7 +2195,6 @@ settings.delete_collaborator=删除 settings.collaborator_deletion=移除协作者 settings.collaborator_deletion_desc=删除协作者后他将无法再对此仓库的访问。继续? settings.remove_collaborator_success=已成功删除协作者。 -settings.search_user_placeholder=搜索用户... settings.org_not_allowed_to_be_collaborator=组织不可被添加为仓库协作者。 settings.change_team_access_not_allowed=更改仓库的团队访问权限仅限于组织所有者 settings.team_not_in_organization=团队不在与仓库相同的组织中 @@ -2316,7 +2202,6 @@ settings.teams=团队 settings.add_team=添加团队 settings.add_team_duplicate=团队已经拥有仓库 settings.add_team_success=团队现在可以访问仓库。 -settings.search_team=搜索团队... settings.change_team_permission_tip=团队权限设置于团队设置页面,不能根据仓库更改 settings.delete_team_tip=该团队仍有仓库, 无法删除 settings.remove_team_success=团队访问仓库的权限已被删除。 @@ -2454,12 +2339,7 @@ settings.branches=分支 settings.protected_branch=分支保护 settings.protected_branch.save_rule=保存规则 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.protect_this_branch=启用分支保护 -settings.protect_this_branch_desc=阻止删除并限制Git推送和合并到分支。 settings.protect_disable_push=禁用推送 settings.protect_disable_push_desc=此分支不允许推送。 settings.protect_enable_push=启用推送 @@ -2470,9 +2350,7 @@ settings.protect_whitelist_committers=受白名单限制的推送 settings.protect_whitelist_committers_desc=只有列入白名单的用户或团队才能被允许推送到此分支(但不能强行推送)。 settings.protect_whitelist_deploy_keys=将具有推送权限的部署密钥加入白名单。 settings.protect_whitelist_users=推送白名单用户 -settings.protect_whitelist_search_users=搜索用户... settings.protect_whitelist_teams=推送白名单团队 -settings.protect_whitelist_search_teams=搜索团队... settings.protect_merge_whitelist_committers=启用合并白名单 settings.protect_merge_whitelist_committers_desc=仅允许白名单用户或团队合并合并请求到此分支。 settings.protect_merge_whitelist_users=合并白名单用户 @@ -2504,8 +2382,6 @@ settings.protect_protected_file_patterns=受保护的文件模式(使用半角 settings.protect_protected_file_patterns_desc=即使用户有权添加、编辑或删除此分支中的文件,也不允许直接更改受保护的文件。 可以使用半角分号(“;”)分隔多个模式。 见%[2]s文档了解模式语法。例如:.drone.yml, /docs/**/*.txt。 settings.protect_unprotected_file_patterns=不受保护的文件模式(使用半角分号“;”分隔) settings.protect_unprotected_file_patterns_desc=在用户有写权限的情况下允许绕过限制,直接修改设为不保护的文件。如有多个匹配模式,则可用半角分号(“;”)分隔开。见 %[2]s 的文档以了解匹配模式的格式。例子:.drone.yml/docs/**/*.txt。 -settings.add_protected_branch=启用保护 -settings.delete_protected_branch=禁用保护 settings.update_protect_branch_success=分支保护规则 %s 更新成功。 settings.remove_protected_branch_success=移除分支保护规则"%s"成功。 settings.remove_protected_branch_failed=移除分支保护规则"%s"失败。 @@ -2585,8 +2461,6 @@ settings.lfs_pointers.associateAccessible=关联可访问的 %d OID settings.rename_branch_failed_exist=无法重命名分支,因为目标分支 %s 存在。 settings.rename_branch_failed_not_exist=无法重命名分支 %s ,因为它不存在。 settings.rename_branch_success=分支 %s 已成功重命名为 %s。 -settings.rename_branch_from=旧分支名称 -settings.rename_branch_to=新分支名称 settings.rename_branch=重命名分支 diff.browse_source=浏览代码 @@ -2595,7 +2469,6 @@ diff.commit=当前提交 diff.git-notes=注释 diff.data_not_available=比较内容不可用 diff.options_button=Diff 选项 -diff.show_diff_stats=显示统计信息 diff.download_patch=下载 Patch 文件 diff.download_diff=下载 Diff 文件 diff.show_split_view=拆分视图 @@ -2688,7 +2561,6 @@ release.tag_name_invalid=标签名称无效。 release.tag_name_protected=Git标签名称已受保护。 release.tag_already_exist=此 Git 标签已存在。 release.downloads=下载附件 -release.download_count=下载:%s release.add_tag_msg=使用发布的标题和内容作为标签消息。 release.add_tag=创建标签 release.releases_for=%s 的版本发布 @@ -2717,14 +2589,12 @@ branch.default_deletion_failed=不能删除默认分支"%s"。 branch.restore=恢复分支 "%s" branch.download=下载分支 "%s" branch.rename=重命名分支 "%s" -branch.search=搜索分支 branch.included_desc=此分支是默认分支的一部分 branch.included=已包含 branch.create_new_branch=从下列分支创建分支: branch.confirm_create_branch=创建分支 branch.warning_rename_default_branch=您正在重命名默认分支。 branch.rename_branch_to=重命名 %s 为: -branch.confirm_rename_branch=重命名分支 branch.create_branch_operation=创建分支 branch.new_branch=创建新分支 branch.new_branch_from=基于"%s"创建新分支 @@ -2754,9 +2624,7 @@ admin.update_flags = 更新标志 rss.must_be_on_branch = 您必须处于一个分支上才能拥有一个RSS订阅源。 admin.manage_flags = 管理标志 admin.failed_to_replace_flags = 替换仓库标志失败 -clone_in_vscodium = 在 VSCodium 中克隆 issues.blocked_by_user = 由于你已被仓库所有者屏蔽,你无法在此仓库创建议题。 -issues.comment.blocked_by_user = 因为你已被仓库所有者或工单作者屏蔽,你无法对此工单进行评论。 settings.wiki_rename_branch_main_desc = 将百科内部使用的分支重命名为“%s”。此更改是永久性的且不可撤销。 editor.invalid_commit_mail = 用于创建提交的邮件地址无效。 pulls.blocked_by_user = 你无法在此仓库上创建合并请求,因为您已被仓库所有者屏蔽。 @@ -2788,11 +2656,8 @@ activity.navbar.pulse = 动态 activity.navbar.code_frequency = 代码频率 activity.navbar.recent_commits = 近期提交 pulls.agit_explanation = 该合并请求是用 AGit 工作流创建的。使用 AGit,贡献者无需派生或创建分支就可以直接通过 “git push” 提出更改代码。 -error.broken_git_hook = 该仓库的 Git 钩子似乎已经损坏,请按照 此文档来修复这些问题,然后推送一些提交来刷新状态。 -pulls.merged_title_desc_one = 已将来自 %[2]s 的 %[1]d 提交合并入 %[3]s %[4]s commits.search_branch = 此分支 open_with_editor = 使用 %s 打开 -pulls.title_desc_one = 想要将来自 %[2]s 的 %[1]d 笔提交合并到 %[3]s settings.rename_branch_failed_protected = 无法重命名受保护的分支 %s。 stars = 点赞 settings.confirmation_string = 确认输入 @@ -2810,7 +2675,6 @@ settings.enforce_on_admins = 对仓库的管理员适用该规则 settings.enforce_on_admins_desc = 使仓库管理员也须遵守此规则。 settings.sourcehut_builds.secrets = 密钥 size_format = %[1]s:%[2]s, %[3]s:%[4]s -settings.sourcehut_builds.graphql_url = GraphQL URL (例如: https://builds.sr.ht/query) settings.add_webhook.invalid_path = 路径中不能包含“.”或“..”,也不能在开头或结尾中使用斜杠。 settings.sourcehut_builds.secrets_helper = 给予任务访问构建密钥的权限(需要 SECRETS:RO 权限) release.download_count_one = %s 下载 @@ -2907,7 +2771,6 @@ commits.view_single_diff = 查看该提交对本文件的更改 pulls.editable = 可编辑 pulls.editable_explanation = 此合并请求允许维护者进行编辑。你可以直接向其贡献。 issues.reopen.blocked_by_user = 由于你已被仓库所有者或议题作者屏蔽,你不能重新打开此议题。 -pulls.comment.blocked_by_user = 由于你已被仓库所有者或合并请求作者屏蔽,你不能在此合并请求发表评论。 issues.filter_no_results = 无结果 issues.filter_no_results_placeholder = 尝试调整搜索筛选条件。 migrate.repo_desc_helper = 留空以导入现有描述 @@ -3016,9 +2879,7 @@ teams.none_access_helper=“禁止访问”选项仅对私有仓库有效。 teams.general_access=自定义访问 teams.general_access_helper=成员权限将由以下权限表决定。 teams.read_access=可读 -teams.read_access_helper=成员可以查看和克隆团队仓库。 teams.write_access=写入 -teams.write_access_helper=成员可以查看和推送提交到团队仓库。 teams.admin_access=管理员权限 teams.admin_access_helper=成员可以拉取和推送到团队仓库同时可以添加协作者。 teams.no_desc=该团队暂无描述 @@ -3033,12 +2894,9 @@ teams.invite_team_member.list=待处理的邀请 teams.delete_team_title=删除团队 teams.delete_team_desc=删除一个团队将删除团队成员的访问权限,继续? teams.delete_team_success=该团队已被删除。 -teams.read_permission_desc=该团队拥有对所属仓库的 读取 权限,团队成员可以进行查看和克隆等只读操作。 -teams.write_permission_desc=该团队拥有对所属仓库的写入权限:成员可以查看和推送至团队仓库。 teams.admin_permission_desc=此团队授予管理员访问权限:成员可从团队仓库中读取、推送和添加协作者。 teams.create_repo_permission_desc=此外,该团队拥有了 创建仓库 的权限:成员可以在组织中创建新的仓库。 teams.repositories=团队仓库 -teams.search_repo_placeholder=搜索仓库... teams.remove_all_repos_title=移除所有团队仓库 teams.remove_all_repos_desc=这将从团队中移除所有仓库。 teams.add_all_repos_title=添加所有仓库 @@ -3051,9 +2909,6 @@ teams.specific_repositories=指定仓库 teams.specific_repositories_helper=团队成员将只能访问添加到团队的仓库。 选择此项将不会自动删除通过所有仓库添加的仓库。 teams.all_repositories=所有仓库 teams.all_repositories_helper=团队可以访问所有仓库。选择此选项将 添加所有现有的 仓库到指定团队。 -teams.all_repositories_read_permission_desc=此团队授予读取所有仓库的访问权限: 成员可以查看和克隆仓库。 -teams.all_repositories_write_permission_desc=此团队授予修改所有仓库的访问权限: 成员可以查看和推送至仓库。 -teams.all_repositories_admin_permission_desc=该团队拥有 管理 所有仓库的权限:团队成员可以读取、克隆、推送以及添加其它仓库协作者。 teams.invite.title=您已被邀请加入组织 %s 中的团队 %s。 teams.invite.by=邀请人 %s teams.invite.description=请点击下面的按钮加入团队。 @@ -3151,7 +3006,6 @@ dashboard.gc_metadata_obtained=被分配的 GC 元数据内存 dashboard.other_system_allocation_obtained=其它被分配的系统内存 dashboard.next_gc_recycle=下次 GC 内存回收量 dashboard.last_gc_time=距离上次 GC 时间 -dashboard.total_gc_time=GC 暂停时间总量 dashboard.total_gc_pause=GC 暂停时间总量 dashboard.last_gc_pause=上次 GC 暂停时间 dashboard.gc_times=GC 执行次数 @@ -3251,9 +3105,6 @@ repos.unadopted.no_more=找不到更多未被收录的仓库。 repos.owner=所有者 repos.name=名称 repos.private=私有 -repos.watches=关注数 -repos.stars=点赞数 -repos.forks=派生数 repos.issues=议题数 repos.size=大小 repos.lfs_size=LFS 大小 @@ -3358,17 +3209,6 @@ auths.oauth2_admin_group=管理员用户组的 Claim 声明值。(可选 - 需 auths.oauth2_restricted_group=受限用户组的 Claim 声明值。(可选 - 需要上面的声明名称) auths.oauth2_map_group_to_team=映射声明的组到组织团队。(可选 - 要求在上面填写声明的名字) auths.oauth2_map_group_to_team_removal=如果用户不属于相应的组,则从同步的团队中移除用户。 -auths.enable_auto_register=允许自动注册 -auths.sspi_auto_create_users=自动创建用户 -auths.sspi_auto_create_users_helper=允许 SSPI 认证在用户第一次登录时自动创建新账号 -auths.sspi_auto_activate_users=自动激活用户 -auths.sspi_auto_activate_users_helper=允许 SSPI 认证自动激活新用户 -auths.sspi_strip_domain_names=从用户名中删除域名部分 -auths.sspi_strip_domain_names_helper=如果选中此项,域名将从登录名中删除(例如,"DOMAIN\user"和"user@example.org",两者都将变成只是 "user")。 -auths.sspi_separator_replacement=要使用的分隔符代替\, / 和 @ -auths.sspi_separator_replacement_helper=用于替换下级登录名称分隔符的字符(例如 "DOMAIN\user") 中的 \ 和用户主名字(如"user@example.org"中的 @)。 -auths.sspi_default_language=默认语言 -auths.sspi_default_language_helper=SSPI 认证方法为用户自动创建的默认语言。如果您想要自动检测到语言,请留空。 auths.tips=帮助提示 auths.tips.oauth2.general=OAuth2 认证 auths.tips.oauth2.general.tip=当注册新的 OAuth2 身份验证时,回调/重定向 URL 应该是: @@ -3378,7 +3218,6 @@ auths.tip.nextcloud=使用菜单“设置->安全->OAuth 2.0客户端”在您 auths.tip.dropbox=在 %s 上创建一个新的应用程序 auths.tip.facebook=`在 %s 注册一个新的应用,并添加产品"Facebook 登录"` auths.tip.github=在 %s 注册一个 OAuth 应用程序 -auths.tip.gitlab=在 https://gitlab.com/profile/applications 上注册新应用程序 auths.tip.google_plus=从谷歌 API 控制台(%s) 获得 OAuth2 客户端凭据 auths.tip.openid_connect=使用 OpenID 连接发现 URL(/.well-known/openid-configuration) 来指定终点 auths.tip.twitter=前往 %s,创建一个应用程序并确保启用了“允许此应用程序用于使用 Twitter 登录”选项 @@ -3966,8 +3805,6 @@ runs.actors_no_select=所有操作者 runs.status_no_select=所有状态 runs.no_results=没有匹配的结果。 runs.no_workflows=目前还没有工作流。 -runs.no_workflows.quick_start=不知道如何使用 Forgejo Actions吗?请查看 快速启动指南。 -runs.no_workflows.documentation=关于Forgejo Actions的更多信息,请参阅 文档。 runs.no_runs=工作流尚未运行过。 runs.empty_commit_message=(空白的提交消息) @@ -4042,15 +3879,11 @@ runner_kind = 搜索运行器… no_results = 未找到匹配的结果。 type_tooltip = 搜索类型 fuzzy = 模糊 -code_search_by_git_grep = 当前搜索结果由 git grep 提供,如果站点管理员启用了代码索引可能会有更好的结果。 -match = 匹配 -match_tooltip = 仅包含与搜索词完全匹配的结果 fuzzy_tooltip = 包含与搜索词相近的结果 exact = 精确 issue_kind = 搜索议题… pull_kind = 搜索合并请求… exact_tooltip = 仅包含与搜索词精确匹配的结果 -milestone_kind = 搜索里程碑… union_tooltip = 包括与以空格分隔的关键字中任意一个相匹配的结果 union = 关键字 regexp = 正则表达式 diff --git a/options/locale/locale_zh-HK.ini b/options/locale/locale_zh-HK.ini index 45534801de..e19e23c51f 100644 --- a/options/locale/locale_zh-HK.ini +++ b/options/locale/locale_zh-HK.ini @@ -22,13 +22,8 @@ passcode=驗證碼 repository=儲存庫 organization=組織 mirror=鏡像 -new_repo=新增儲存庫 -new_migrate=遷移外部儲存庫 new_mirror=新增鏡像 new_fork=新增儲存庫分叉 -new_org=新增組織 -manage_org=管理組織 -account_settings=帳號設定 settings=設定 your_settings=組織設定 @@ -99,7 +94,6 @@ disabled = 已停用 copy = 複製 preview = 預覽 value = 值 -webauthn_reload = 重新載入 your_profile = 個人資料 milestones = 里程碑 ok = 好的 @@ -183,12 +177,9 @@ db_schema = 資料結構 ssl_mode = SSL [home] -password_holder=密碼 switch_dashboard_context=切換控制面版用戶 my_repos=儲存庫管理 -collaborative_repos=參與協作的儲存庫 my_orgs=組織 -my_mirrors=我的鏡像 view_home=訪問 %s @@ -201,18 +192,15 @@ show_archived = 已封存 repos=儲存庫 users=使用者 organizations=組織 -search=搜尋 code = 程式碼 [auth] -register_helper_msg=已經註冊?立即登錄! forgot_password_title=忘記密碼 forgot_password=忘記密碼? confirmation_mail_sent_prompt=一封新的確認郵件已發送至 %s。請檢查您的收件箱並在 %s 小時內完成確認註冊操作。 active_your_account=啟用您的帳戶 has_unconfirmed_mail=%s 您好,您有一封發送至( %s) 但未被確認的郵件。如果您未收到啟用郵件,或需要重新發送,請單擊下方的按鈕。 resend_mail=單擊此處重新發送確認郵件 -email_not_associate=此電子郵件地址未與任何帳戶連結 verify=驗證 scratch_code=備用碼 use_scratch_code=使用備用碼 @@ -260,8 +248,6 @@ RepoName=儲存庫名稱 Email=郵箱地址 Password=密碼 Retype=確認密碼 -SSHTitle=SSH 金鑰名稱 -HttpsUrl=HTTPS URL 地址 PayloadUrl=推送地址 TeamName=團隊名稱 AuthName=認證名稱 @@ -288,9 +274,6 @@ auth_failed=授權驗證失敗:%v target_branch_not_exist=目標分支不存在 -SSPISeparatorReplacement = 分隔符 -SSPIDefaultLanguage = 預設語言 - [user] repositories=儲存庫列表 @@ -310,7 +293,6 @@ profile=個人訊息 password=修改密碼 avatar=頭像 ssh_gpg_keys=SSH / GPG 金鑰 -social=社交帳戶 orgs=組織 repos=儲存庫管理 delete=刪除帳戶 @@ -328,7 +310,6 @@ cancel=取消操作 language=語言 comment_type_group_title=標題 -federated_avatar_lookup=Federated Avatar 查詢 enable_custom_avatar=啟動自定義頭像 choose_new_avatar=選擇新的頭像 delete_current_avatar=刪除當前頭像 @@ -336,7 +317,6 @@ delete_current_avatar=刪除當前頭像 old_password=當前密碼 new_password=新的密碼 -emails=電子郵件地址 primary=主要 activated=已啟用 delete_email=移除成員 @@ -347,8 +327,6 @@ manage_gpg_keys=管理 GPG 金鑰 add_key=增加金鑰 ssh_helper=需要協助? 查詢GitHub的文件以 您自有SSH金鑰 or solve common problems you may encounter using SSH. gpg_helper=需要協助嗎?建議可看看 GitHub 的 about GPG 文件。 -add_new_key=增加 SSH 金鑰 -add_new_gpg_key=新增 GPG 金鑰 gpg_key_verify=驗證 gpg_token=令牌 ssh_key_verify=驗證 @@ -367,13 +345,10 @@ key_state_desc=該金鑰在 7 天內被使用過 token_state_desc=此 token 在過去七天內曾經被使用過 show_openid=在設定檔顯示 hide_openid=從設定檔隱藏 -manage_social=管理關聯社交帳戶 - generate_new_token=生成新的令牌 token_name=令牌名稱 generate_token=生成令牌 delete_token=删除令牌 -access_token_deletion_cancel_action=取消 permission_read=已讀 oauth2_client_secret=用戶端金鑰 @@ -402,14 +377,11 @@ uid = UID appearance = 外觀 security = 安全性 manage_themes = 預設主題 -account_link = 已連結的帳戶 -access_token_deletion_confirm_action = 刪除 permissions_list = 權限: ui = 主題 privacy = 私隱 account = 帳戶 visibility.public = 公開 -unbind = 解除連結 visibility.limited = 受限 comment_type_group_reference = 參考 comment_type_group_label = 標籤 @@ -499,7 +471,6 @@ editor.cancel=取消 editor.no_changes_to_show=沒有可以顯示的變更。 commits.commits=次程式碼提交 -commits.find=搜尋 commits.author=作者 commits.message=備註 commits.date=提交日期 @@ -607,7 +578,6 @@ pulls.compare_changes=建立合併請求 pulls.filter_branch=過濾分支 pulls.no_results=未找到結果 pulls.create=建立合併請求 -pulls.merged_title_desc_few=於 %[4]s 將 %[1]d 次代碼提交從 %[2]s合併至 %[3]s pulls.tab_conversation=對話內容 pulls.tab_commits=程式碼提交 pulls.reopen_to_merge=請重新開啟合併請求來完成合併操作。 @@ -664,8 +634,6 @@ activity.new_issues_count_1=建立問題 contributors.contribution_type.commits=提交歷史 -search=搜尋 - settings=儲存庫設定 settings.desc=設定是您可以管理儲存庫設定的地方 settings.options=儲存庫 @@ -726,11 +694,6 @@ settings.title=標題 settings.deploy_key_content=金鑰文本 settings.branches=分支列表 settings.protected_branch=分支保護 -settings.protected_branch_can_push=允許推送? -settings.protected_branch_can_push_yes=你可以推送 -settings.protected_branch_can_push_no=你不能推送 -settings.add_protected_branch=啟用保護 -settings.delete_protected_branch=停用保護 settings.edit_protected_branch=編輯 diff.browse_source=瀏覽代碼 @@ -888,7 +851,6 @@ dashboard.gc_metadata_obtained=被分配的垃圾收集元資料內存 dashboard.other_system_allocation_obtained=其它被分配的系統內存 dashboard.next_gc_recycle=下次垃圾收集內存回收量 dashboard.last_gc_time=距離上次垃圾收集時間 -dashboard.total_gc_time=垃圾收集執行時間總量 dashboard.total_gc_pause=垃圾收集暫停時間總量 dashboard.last_gc_pause=上次垃圾收集暫停時間 dashboard.gc_times=垃圾收集執行次數 @@ -914,8 +876,6 @@ repos.repo_manage_panel=儲存庫管理 repos.owner=所有者 repos.name=儲存庫名稱 repos.private=私有庫 -repos.watches=關註數 -repos.stars=讚好數 repos.issues=問題數 repos.size=大小 @@ -956,14 +916,12 @@ auths.openIdConnectAutoDiscoveryURL=OpenID 連接自動探索 URL auths.oauth2_authURL=授權 URL auths.oauth2_profileURL=個人訊息 URL auths.oauth2_emailURL=電子郵件 URL -auths.enable_auto_register=允許授權用戶自動註冊 auths.tips=幫助提示 auths.tips.oauth2.general=OAuth2 認證 auths.tip.oauth2_provider=OAuth2 提供者 auths.tip.dropbox=建立新 App 在 %s auths.tip.facebook=`在 %s 註冊一個新的應用,並且新增一個產品 "Facebook Login"` auths.tip.github=在 %s 註冊一個新的 OAuth 應用程式 -auths.tip.gitlab=在 https://gitlab.com/profile/applications 註冊一個新的應用程式 auths.tip.openid_connect=使用 OpenID 連接探索 URL (/.well-known/openid-configuration) 來指定節點 auths.delete=刪除認證來源 auths.delete_auth_title=刪除認證來源 @@ -1075,7 +1033,6 @@ notices.op=操作 notices.delete_success=已刪除系統提示。 defaulthooks.update_webhook = 更新預設 Webhook defaulthooks.add_webhook = 新增預設 Webhook -auths.sspi_default_language = 預設使用者語言 users = 使用者帳戶 defaulthooks = 預設 Webhook diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index d56c397812..4ec880bda9 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -47,21 +47,14 @@ webauthn_error_unable_to_process=伺服器無法處理您的請求。 webauthn_error_duplicated=此安全金鑰無法允許這個請求。請確保該金鑰尚未被註冊。 webauthn_error_empty=您必須命名此金鑰。 webauthn_error_timeout=在成功讀取金鑰之前已逾時,請重新載入此頁面並重試。 -webauthn_reload=重新載入 - repository=儲存庫 organization=組織 mirror=鏡像 -new_repo=新增儲存庫 -new_migrate=遷移外部儲存庫 new_mirror=新增鏡像 new_fork=建立新的儲存庫分叉 -new_org=新增組織 new_project=新增專案 new_project_column=新增欄位 -manage_org=管理組織 admin_panel=網站管理 -account_settings=帳戶設定 settings=設定 your_profile=個人資料 your_starred=已加星號 @@ -217,8 +210,6 @@ string.desc=Z - A [error] occurred=發生錯誤 -missing_csrf=錯誤的請求:未提供 CSRF 符記 -invalid_csrf=錯誤的請求:無效的 CSRF 符記 not_found=找不到目標。 network_error=網路錯誤 report_message = 如果您相信這是一個 Forgejo 的錯誤,請在 Codeberg 上搜尋相關議題,或在必要時提出一個新議題。 @@ -355,15 +346,10 @@ allow_only_external_registration = 僅允許透過外部服務註冊 [home] uname_holder=帳號名稱或電子信箱 -password_holder=密碼 switch_dashboard_context=切換儀錶板內容 my_repos=儲存庫 -show_more_repos=顯示更多儲存庫… -collaborative_repos=參與協作的儲存庫 my_orgs=組織 -my_mirrors=我的鏡像 view_home=檢視 %s -search_repos=搜尋儲存庫... filter=其他篩選條件 filter_by_team_repositories=以團隊儲存庫篩選 feed_of=「%s」的訊息來源 @@ -384,19 +370,7 @@ issues.in_your_repos=在您的儲存庫中 repos=儲存庫 users=使用者 organizations=組織 -search=搜尋 code=程式碼 -search.type.tooltip=搜尋類型 -search.fuzzy=模糊 -search.fuzzy.tooltip=包含近似關鍵字的結果 -search.match=符合 -search.match.tooltip=只包含完全符合關鍵字的結果 -code_search_unavailable=現在無法使用程式碼搜尋。請與網站管理員聯絡。 -repo_no_results=沒有找到符合的儲存庫。 -user_no_results=沒有找到符合的使用者。 -org_no_results=沒有找到符合的組織。 -code_no_results=找不到符合您關鍵字的原始碼。 -code_search_results=「%s」的搜尋結果 code_last_indexed_at=最後索引 %s relevant_repositories_tooltip=已隱藏缺少主題、圖示、說明、或是是分叉的儲存庫。 relevant_repositories=只顯示相關的儲存庫,顯示未篩選的結果。 @@ -408,15 +382,12 @@ go_to = 造訪 [auth] create_new_account=註冊帳號 -register_helper_msg=已經有帳號了?馬上登入! -social_register_helper_msg=已經有帳號了?馬上連結! disable_register_prompt=註冊功能已停用。 請聯繫您的網站管理員。 disable_register_mail=已停用註冊確認電子郵件。 manual_activation_only=請聯絡您的網站管理員以完成啟用程序。 remember_me=記住這台裝置 forgot_password_title=忘記密碼 forgot_password=忘記密碼? -sign_up_now=還沒有帳號?馬上註冊。 confirmation_mail_sent_prompt=新的確認電子郵件已傳送至 %s。要完成註冊過程,請檢查你的收件匣並在接下來的 %s 內按照提供的連結完成註冊手續。如果電子郵件不正確,你可以再登入並請求另一封新的確認電子郵件傳送至其他電子信箱。 must_change_password=更新您的密碼 allow_password_change=要求使用者更改密碼(建議) @@ -427,7 +398,6 @@ prohibit_login=帳號已停權 resent_limit_prompt=您剛剛已經請求發送驗證電子郵件,請等待 3 分鐘後再試一次。 has_unconfirmed_mail=%s 您好,您有一個尚未被確認的信箱地址(%s)。如果您還沒收到確認信或需要一封新的,請點擊下方的按鈕。 resend_mail=點擊此處來重新發送確認郵件 -email_not_associate=此電子信箱未與任何帳號連結。 send_reset_mail=寄送帳號復原信 reset_password=帳號復原 invalid_code=您的確認代碼無效或已過期。 @@ -442,7 +412,6 @@ twofa_scratch_used=您已經用掉了您的備用驗證碼。您已被轉址到 twofa_passcode_incorrect=您的驗證碼不正確。如果您遺失設備,請使用您的備用驗證碼登入。 twofa_scratch_token_incorrect=您的備用驗證碼不正確。 login_userpass=登入 -tab_openid=OpenID oauth_signup_tab=註冊新帳號 oauth_signup_title=完成新帳號 oauth_signup_submit=完成帳號 @@ -466,13 +435,10 @@ authorize_application_created_by=此應用程式是由 %s 建立的。 authorize_application_description=如果你授予存取權限,它將能夠存取和寫入你的所有帳號資訊,包括私人儲存庫和組織。 authorize_title=授權「%s」存取您的帳號? authorization_failed=授權失效 -sspi_auth_failed=SSPI 認證失敗 password_pwned_err=無法完成對 HaveIBeenPwned 的請求 -tab_signin = 登入 change_unconfirmed_email_summary = 更改接收帳號啟用信的信箱地址。 change_unconfirmed_email = 如果您在註冊帳號時寫錯了信箱地址,您可以在下面更改它。您會在這個新地址收到一封確認信。 change_unconfirmed_email_error = 無法更改信箱地址:%v -tab_signup = 註冊 last_admin = 您無法刪除最後一個管理員。必須至少有一個管理員。 prohibit_login_desc = 你的帳號已被暫停與站點互動。聯絡站點管理員以重新獲得存取權限。 sign_up_successful = 已成功建立帳號。歡迎! @@ -481,7 +447,6 @@ reset_password_wrong_user = 您以 %s 登入,但是帳號復原連結是給 %s password_pwned = 該密碼出現在先前資料洩露的被盜密碼清單中。請用一個不同的密碼再試一次,並考慮在其他地方也更換此密碼。 authorization_failed_desc = 因為偵測到無效請求,授權失敗。請連絡您嘗試授權的應用的維護者。 openid_signin_desc = 輸入您的 OpenID URI。例如:alice.openid.example.org 或是 https://openid.example.org/alice。 -remember_me.compromised = 此登入符記已經無效,這可能是因為您的帳號被盜用了。請檢查您的帳號是否有異常活動。 hint_login = 已經有帳號了嗎?馬上登入! hint_register = 需要一個帳號嗎?馬上註冊。 sign_up_button = 馬上註冊。 @@ -497,7 +462,6 @@ link_not_working_do_paste=連結沒有用嗎?試試將其複製並於瀏覽器 hi_user_x=%s 您好, activate_account=請啟用您的帳號 -activate_account.title=%s,請啟用您的帳戶 activate_account.text_1=%[1]s 您好,感謝您註冊 %[2]s! activate_account.text_2=請在%s內點擊下列連結以啟用您的帳號: @@ -505,13 +469,11 @@ activate_email=請驗證您的電子信箱 activate_email.text=請在%s內點擊下列連結以驗證您的電子信箱: register_notify=歡迎來到 %s -register_notify.title=%[1]s,歡迎來到 %[2]s register_notify.text_1=這是您在 %s 的註冊確認信! register_notify.text_2=您現在可以使用您的使用者名稱登入:%s register_notify.text_3=如果其他人為您建立了此帳號,請先設定您的密碼。 reset_password=復原您的帳號 -reset_password.title=%s,我們收到了您的帳號恢復請求 reset_password.text=如果是您做出的請求,請在%s 內點擊下列連結以復原您的帳號: register_success=註冊成功 @@ -554,7 +516,6 @@ team_invite.subject=%[1]s 邀請您加入組織 %[2]s team_invite.text_1=%[1]s 邀請您加入組織 %[3]s 中的 %[2]s 團隊。 team_invite.text_2=請點擊下方連結加入團隊: team_invite.text_3=備註: 這是寄給 %[1]s 的邀請。若您未預期收到此邀請,請忽略此郵件。 -activate_email.title = %s,請驗證你的信箱地址 admin.new_user.subject = 新使用者 %s 剛剛完成註冊 admin.new_user.user_info = 使用者資訊 admin.new_user.text = 請點擊這裡以在管理員控制台管理此使用者。 @@ -587,8 +548,6 @@ RepoName=儲存庫名稱 Email=電子信箱 Password=密碼 Retype=確認密碼 -SSHTitle=SSH 金鑰名稱 -HttpsUrl=HTTPS URL 地址 PayloadUrl=推送地址 TeamName=團隊名稱 AuthName=授權名稱 @@ -601,9 +560,6 @@ CommitChoice=提交選擇 TreeName=檔案路徑 Content=內容 -SSPISeparatorReplacement=分隔符 -SSPIDefaultLanguage=預設語言 - require_error=` 不能為空。` alpha_dash_error=`應該只包含英文字母、數字、破折號("-")和底線("_") 字元。` alpha_dash_dot_error=`應該只包含英文字母、數字、破折號 ("-")、下底線("_")和小數點(".")字元。` @@ -680,7 +636,6 @@ Biography = 個人簡介 Website = 網站 Location = 地區 AccessToken = 存取符記 -username_has_not_been_changed = 帳號名稱未被更改 admin_cannot_delete_self = 當您是管理員時,您不能刪除自己。請先移除您的管理員權限。 username_error_no_dots = ` 只能包含英數字符("0-9","a-z","A-Z"),破折號("-")和底線("_")。只能以英數字元開頭或結尾,連續的非英數字元也不被允許。` required_prefix = 輸入文字必須以「%s」開頭 @@ -704,8 +659,6 @@ unfollow=取消追蹤 user_bio=個人簡介 disabled_public_activity=這個使用者已隱藏公開動態。 email_visibility.limited=所有已驗證身分的使用者都可以看到您的電子信箱地址 -email_visibility.private=只有您和系統管理員可以看到您的電子信箱地址 - form.name_reserved=「%s」是保留的帳號。 form.name_pattern_not_allowed=帳號名稱內不可包含「%s」式樣。 form.name_chars_not_allowed=使用者名稱「%s」包含無效字元。 @@ -740,13 +693,11 @@ password=修改密碼 security=安全性 avatar=大頭貼 ssh_gpg_keys=SSH / GPG 金鑰 -social=社群帳號 applications=應用程式 orgs=組織 repos=儲存庫 delete=刪除帳號 twofa=兩步驟驗證 (TOTP) -account_link=連結的帳號 organization=組織 webauthn=兩步驟驗證(安全金鑰) @@ -783,10 +734,7 @@ comment_type_group_project=專案 comment_type_group_issue_ref=問題參考 saved_successfully=您的設定已成功儲存。 privacy=隱私 -keep_activity_private_popup=讓動態只有你和站點管理員看得到 - lookup_avatar_by_mail=以電子信箱查詢大頭貼 -federated_avatar_lookup=聯邦式大頭貼查詢 enable_custom_avatar=使用自訂大頭貼 choose_new_avatar=選擇新的大頭貼 update_avatar=更新大頭貼 @@ -803,7 +751,6 @@ password_incorrect=輸入的密碼不正確。 change_password_success=您的密碼已更新。 從現在開始,使用您的新密碼登入。 password_change_disabled=非本地帳號無法透過 Forgejo 的網頁介面更改密碼。 -emails=電子信箱 manage_emails=管理電子信箱 manage_themes=預設佈景主題 manage_openid=OpenID 地址 @@ -842,8 +789,6 @@ principal_desc=這些 SSH 認證主體已連結至您的帳號並擁有完全存 gpg_desc=這些 GPG 公鑰已經連結到您的帳號,並被用於校驗您的提交。因為它們能用您的身分簽署提交,請妥善保管您的私鑰。 ssh_helper=需要協助嗎?建議可看看 GitHub 的文件以建立您的 SSH 金鑰或解決您使用 SSH 時碰到的常見問題。 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_gpg_placeholder=以 「-----BEGIN PGP PUBLIC KEY BLOCK-----」 開頭 add_new_principal=新增主體 @@ -861,7 +806,6 @@ gpg_invalid_token_signature=提供的 GPG 金鑰、簽署、符記不符合或 gpg_token_required=您必須為下列的符記提供簽署 gpg_token=符記 gpg_token_help=您可以使用以下方法產生簽署: -gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=Armored GPG 簽署 key_signature_gpg_placeholder=以 「-----BEGIN PGP SIGNATURE-----」 開頭 verify_gpg_key_success=已驗證 GPG 金鑰「%s」。 @@ -905,9 +849,6 @@ show_openid=在個人資料顯示 hide_openid=從個人資料隱藏 ssh_disabled=已停用 SSH ssh_externally_managed=此 SSH 金鑰由此使用者的外部服務所管理 -manage_social=管理與其連結的社群帳號 -unbind=解除連結 - manage_access_token=管理存取符記 generate_new_token=產生新的符記 tokens_desc=這些符記透過 Forgejo API 授予存取您帳號的權限。 @@ -917,8 +858,6 @@ generate_token_success=已經產生新的符記。請立刻複製它,因為它 generate_token_name_duplicate=應用程式名稱 %s 已被使用,請換一個試試。 delete_token=刪除 access_token_deletion=刪除存取符記 -access_token_deletion_cancel_action=取消 -access_token_deletion_confirm_action=刪除 access_token_deletion_desc=刪除符記後,使用此符記的應用程式將無法再存取您的帳號。您將無法取消此操作。要繼續嗎? delete_token_success=已刪除符記。使用此符記的應用程式無法再存取您的帳號。 permission_no_access=沒有存取權 @@ -972,7 +911,6 @@ webauthn_delete_key_desc=如果您移除安全金鑰,將不能再使用它登 manage_account_links=連結的帳號 manage_account_links_desc=這些外部帳號已連結至您的 Forgejo 帳號。 -account_links_not_available=目前沒有外部帳號連結至您的 Forgejo 帳號。 link_account=連結帳號 remove_account_link=刪除連結的帳號 remove_account_link_desc=移除連結帳號將撤銷其對 Forgejo 帳號的存取權限。要繼續嗎? @@ -1023,8 +961,6 @@ can_not_add_email_activations_pending = 已有一個待處理的啟用請求, uid = UID change_password = 更改密碼 valid_until_date = 至 %s 有效 -social_desc = 這些社群帳號可以被用來登入您的帳號。請確保您認得每一個。 -unbind_success = 已成功移除該社群帳號。 create_oauth2_application_success = 您已成功建立一個新的 OAuth2 應用程式。 change_username_prompt = 註:更改您的使用者名稱也會更改您的帳號 URL。 change_username_redirect_prompt = 舊的使用者名稱在被其他使用者認領之前將會轉址到新的使用者名稱。 @@ -1033,7 +969,6 @@ visibility.private_tooltip = 只有您加入的組織之成員能看見 keep_email_private_popup = 您的電子郵件地址不會顯示在個人資料頁面中,也不會成為透過網頁介面(例如上傳檔案、編輯或合併提交)所建立的提交紀錄的預設地址。取而代之的是,可以使用特殊地址 %s 將這些提交關聯到您的帳號。此設定不會影響既有的提交紀錄。 ssh_signonly = 因為目前 SSH 已被停用,這個金鑰只被用來校驗提交簽署。 email_desc = 您的主要電子信箱將被用於通知、密碼復原、和網頁 Git 操作(如果您的信箱不是隱藏的)。 -pronouns_custom = 自訂 oauth2_client_secret_hint = 這把密鑰在您離開或重新整理此頁面後將不再被顯示。請確保您已儲存它。 additional_repo_units_hint_description = 對於未啟用所有可用功能的儲存庫顯示「啟用更多」提示。 hidden_comment_types.issue_ref_tooltip = 使用者更改與問題相關分支/標籤的留言 @@ -1061,7 +996,6 @@ authorized_oauth2_applications_description = 您已授權給這些第三方應 language.localization_project = 幫助我們翻譯 Forgejo 至您的語言!了解更多。 language.description = 這個語言會被儲存至您的帳號,並被用作您登入後的預設語言。 user_block_yourself = 你不能封鎖自己。 -pronouns_custom_label = 自訂代名詞 change_username_redirect_prompt.with_cooldown.one = 舊的使用者名稱將在 %[1]d 天的冷卻期後對所有人開放。你仍然可以在冷卻期內重新獲得舊的使用者名稱。 change_username_redirect_prompt.with_cooldown.few = 舊的使用者名稱將在 %[1]d 天的冷卻期後對所有人開放,你仍然可以在冷卻期內重新獲得舊的使用者名稱。 keep_activity_private.description = 你的公開活動只有你和站點管理員可見。 @@ -1113,7 +1047,6 @@ already_forked=您已經分叉過 %s fork_to_different_account=分叉至其他帳號 fork_visibility_helper=無法更改分叉儲存庫的瀏覽權限。 use_template=使用此範本 -clone_in_vsc=在 VS Code 中 Clone download_zip=下載 ZIP download_tar=下載 TAR.GZ download_bundle=下載 BUNDLE @@ -1133,11 +1066,6 @@ readme=讀我檔案 readme_helper=選擇讀我檔案範本 readme_helper_desc=這是您能為專案撰寫完整描述的地方。 auto_init=初始化儲存庫 -trust_model_helper=選擇簽署驗證的信任模型。可用的選項: -trust_model_helper_collaborator=協作者: 信任協作者的簽署 -trust_model_helper_committer=提交者: 信任與提交者相符的簽署 -trust_model_helper_collaborator_committer=協作者 + 提交者: 信任協作者同時是提交者的簽署 -trust_model_helper_default=預設: 使用此 Forgejo 的預設儲存庫信任模式 create_repo=建立儲存庫 default_branch=預設分支 default_branch_helper=預設分支是合併請求和提交程式碼的基底分支。 @@ -1197,16 +1125,12 @@ template.issue_labels=問題標籤 template.one_item=至少須選擇一個範本項目 template.invalid=必須選擇一個儲存庫範本 -archive.issue.nocomment=此存儲庫已封存,您不能在問題上留言。 -archive.pull.nocomment=此存儲庫已封存,您不能在合併請求上留言。 - form.reach_limit_of_creation_1=您已經達到了您儲存庫的數量上限(%d 個)。 form.reach_limit_of_creation_n=您已經達到了您儲存庫的數量上限(%d 個)。 form.name_reserved=「%s」是保留的儲存庫名稱。 need_auth=授權 migrate_options=遷移選項 -migrate_service=遷移服務 migrate_options_mirror_helper=將此儲存庫設定為鏡像 migrate_options_lfs=遷移 LFS 檔案 migrate_options_lfs_endpoint.label=LFS 端點 @@ -1288,7 +1212,6 @@ branches=分支 tags=標籤 issues=問題 pulls=合併請求 -project_board=專案 packages=軟體包 actions=Actions labels=標籤 @@ -1302,7 +1225,6 @@ release=版本發布 releases=版本發布 tag=標籤 released_this=發布了此版本 -tagged_this=標記了此標籤 file.title=%s 於 %s file_raw=原始文件 file_history=歷史記錄 @@ -1402,9 +1324,7 @@ commits.desc=瀏覽原始碼修改歷程。 commits.commits=次程式碼提交 commits.no_commits=沒有共同的提交。「%s」和「%s」的歷史完全不同。 commits.nothing_to_compare=這些分支是相同的。 -commits.search=搜尋提交歷史... commits.search.tooltip=你可以用「author:」、「committer:」、「after:」、「before:」等作為關鍵字的前綴,例如: 「revert author:Alice before:2019-01-13」。 -commits.find=搜尋 commits.search_all=所有分支 commits.author=作者 commits.message=備註 @@ -1431,8 +1351,6 @@ commitstatus.pending=待處理 commitstatus.success=成功 ext_issues=外部問題 -ext_issues.desc=連結到外部問題追蹤器。 - projects=專案 projects.desc=在專案看板中管理問題與合併請求。 projects.description=描述 (選用) @@ -1454,7 +1372,6 @@ projects.type.basic_kanban=基本看板 projects.type.bug_triage=Bug 分類 projects.template.desc=範本 projects.template.desc_helper=請選擇專案範本來開始 -projects.type.uncategorized=未分類 projects.column.edit=編輯欄位 projects.column.edit_title=名稱 projects.column.new_title=名稱 @@ -1611,8 +1528,6 @@ issues.ref_issue_from=`關聯了這個問題 %[3]s %[1]s` issues.ref_pull_from=`關聯了這個合併請求 %[3]s %[1]s` issues.ref_closing_from=從將關閉此問題的拉取請求 %[3]s 中提及了此問題,%[1]s issues.ref_reopening_from=從將重新開啟此問題的拉取請求 %[3]s 中提及了此問題,%[1]s -issues.ref_closed_from=`關閉了這個問題 %[4]s %[2]s` -issues.ref_reopened_from=`重新開放了這個問題 %[4]s %[2]s` issues.ref_from=`自 %[1]s` issues.author=作者 issues.role.owner=所有者 @@ -1697,15 +1612,11 @@ issues.add_time_sum_to_small=沒有輸入時間。 issues.time_spent_total=總花費時間 issues.time_spent_from_all_authors=`總花費時間:%s` issues.due_date=到期日 -issues.invalid_due_date_format=截止日期的格式必須為「yyyy-mm-dd」。 -issues.error_modifying_due_date=無法修改截止日期。 -issues.error_removing_due_date=無法移除截止日期。 issues.push_commit_1=加入了 %d 個提交 %s issues.push_commits_n=加入了 %d 個提交 %s issues.force_push_codes=`強制推送了 %[1]s 自 %[2]s %[8]s 至 %[4]s %[9]s %[6]s` issues.force_push_compare=比較 issues.due_date_form=yyyy年mm月dd日 -issues.due_date_form_add=新增截止日期 issues.due_date_form_edit=編輯 issues.due_date_form_remove=移除 issues.due_date_not_set=未設定到期日。 @@ -1758,7 +1669,6 @@ issues.review.add_review_request=請求 %[1]s 進行審查 %[2]s issues.review.remove_review_request=移除了對 %[1]s 的審查請求 %[2]s issues.review.remove_review_request_self=拒絕了審核 %s issues.review.pending=待處理 -issues.review.review=審核 issues.review.reviewers=審核者 issues.review.outdated=過時的 issues.review.show_outdated=顯示過時的 @@ -1768,7 +1678,6 @@ issues.review.hide_resolved=隱藏已解決 issues.review.resolve_conversation=解決對話 issues.review.un_resolve_conversation=取消解決對話 issues.review.resolved_by=標記了此對話為已解決 -issues.assignee.error=因為未預期的錯誤,未能成功加入所有負責人。 issues.reference_issue.body=內容 issues.content_history.deleted=刪除 issues.content_history.edited=編輯 @@ -1776,8 +1685,6 @@ issues.content_history.created=建立 issues.content_history.delete_from_history=刪除歷程記錄 issues.content_history.delete_from_history_confirm=刪除歷程記錄? issues.content_history.options=選項 -issues.reference_link=參考: %s - compare.compare_base=基底分支 compare.compare_head=比較 @@ -1804,8 +1711,6 @@ pulls.nothing_to_compare=這些分支的內容相同,無需建立合併請求 pulls.nothing_to_compare_and_allow_empty_pr=這些分支的內容相同,此合併請求將會是空白的。 pulls.has_pull_request=`已有介於這些分支間的合併請求:%[2]s#%[3]d` pulls.create=建立合併請求 -pulls.title_desc_few=請求將 %[1]d 次程式碼提交從 %[2]s 合併至 %[3]s -pulls.merged_title_desc_few=將 %[1]d 次提交從 %[2]s 合併至 %[3]s %[4]s pulls.change_target_branch_at=`將目標分支從 %s 更改為 %s %s` pulls.tab_conversation=對話內容 pulls.tab_commits=程式碼提交 @@ -1930,8 +1835,6 @@ milestones.filter_sort.least_issues=問題由少到多 ext_wiki=外部百科 -ext_wiki.desc=連結外部 Wiki。 - wiki=Wiki wiki.welcome=歡迎使用 Wiki。 wiki.welcome_desc=Wiki 允許你撰寫且與協作者分享文件。 @@ -2026,17 +1929,6 @@ activity.git_stats_deletion_n=刪除 %d 行 contributors.contribution_type.commits=提交歷史 -search=搜尋 -search.search_repo=搜尋儲存庫 -search.type.tooltip=搜尋類型 -search.fuzzy=模糊 -search.fuzzy.tooltip=包含近似關鍵字的結果 -search.match=符合 -search.match.tooltip=只包含完全符合關鍵字的結果 -search.results=在 %s 中搜尋 "%s" 的结果 -search.code_no_results=找不到符合您關鍵字的原始碼。 -search.code_search_unavailable=現在無法使用程式碼搜尋。請與網站管理員聯絡。 - settings=設定 settings.desc=設定是您可以管理儲存庫設定的地方 settings.options=儲存庫 @@ -2125,7 +2017,6 @@ settings.transfer.success=儲存庫已成功轉移。 settings.transfer_abort=取消轉移 settings.transfer_abort_invalid=您無法取消不存在的儲存庫轉移。 settings.transfer_desc=將此儲存庫轉移給其他使用者或受您管理的組織。 -settings.transfer_form_title=輸入儲存庫名稱以確認: settings.transfer_in_progress=目前正在進行轉移。如果您想要將此儲存庫轉移給其他使用者,請取消他。 settings.transfer_notices_1=- 如果將此儲存庫轉移給個別使用者,您將會失去此儲存庫的存取權。 settings.transfer_notices_2=- 如果將此儲存庫轉移到您(共同)擁有的組織,您將能繼續保有此儲存庫的存取權。 @@ -2169,7 +2060,6 @@ settings.delete_collaborator=移除 settings.collaborator_deletion=移除協作者 settings.collaborator_deletion_desc=移除協作者將拒絕他存取此儲存庫。是否繼續? settings.remove_collaborator_success=已移除協作者。 -settings.search_user_placeholder=搜尋使用者... settings.org_not_allowed_to_be_collaborator=不可加入組織為協作者。 settings.change_team_access_not_allowed=只有組織所有者可修改團隊的儲存庫存取權限 settings.team_not_in_organization=團隊和儲存庫不在相同的組織內 @@ -2177,7 +2067,6 @@ settings.teams=團隊 settings.add_team=增加團隊 settings.add_team_duplicate=團隊已擁有該儲存庫 settings.add_team_success=團隊現在可存取該儲存庫了。 -settings.search_team=搜尋團隊... settings.change_team_permission_tip=團隊權限只能於團隊設定頁面修改,不能針對儲存庫分別調整 settings.delete_team_tip=此團隊可存取所有儲存庫,無法移除 settings.remove_team_success=已移除團隊存取儲存庫的權限。 @@ -2309,12 +2198,7 @@ settings.branches=分支 settings.protected_branch=分支保護 settings.protected_branch.save_rule=儲存規則 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.protect_this_branch=啟用分支保護 -settings.protect_this_branch_desc=防止刪除分支,並限制 Git 推送與合併到分支。 settings.protect_disable_push=停用推送 settings.protect_disable_push_desc=不允許推送到此分支。 settings.protect_enable_push=啟用推送 @@ -2325,9 +2209,7 @@ settings.protect_whitelist_committers=使用白名單控管推送 settings.protect_whitelist_committers_desc=僅允許白名單內的使用者或團隊推送至該分支(但不可使用force push)。 settings.protect_whitelist_deploy_keys=將擁有寫入權限的部署金鑰加入白名單。 settings.protect_whitelist_users=允許推送的使用者 -settings.protect_whitelist_search_users=搜尋使用者... settings.protect_whitelist_teams=允許推送的團隊 -settings.protect_whitelist_search_teams=搜尋團隊... settings.protect_merge_whitelist_committers=啟用合併白名單 settings.protect_merge_whitelist_committers_desc=僅允許白名單內的使用者或團隊將合併請求合併至該分支。 settings.protect_merge_whitelist_users=允許合併的使用者 @@ -2350,8 +2232,6 @@ settings.protect_protected_file_patterns=受保護檔案的式樣(以半形分 settings.protect_protected_file_patterns_desc=即便使用者有權限新增、修改、刪除此分支的檔案,仍不允許直接修改受保護的檔案。可以用半形分號「;」分隔多個式樣。請於 %[2]s 文件查看模式格式。範例: .drone.yml, /docs/**/*.txt。 settings.protect_unprotected_file_patterns=未受保護檔案的式樣(以半形分號區隔「;」) settings.protect_unprotected_file_patterns_desc=當使用者有寫入權限時,可繞過推送限制,直接修改未受保護的檔案。可以用半形分號「;」分隔多個模式。請於 %[2]s 文件查看模式格式。範例: .drone.yml, /docs/**/*.txt。 -settings.add_protected_branch=啟用保護 -settings.delete_protected_branch=停用保護 settings.protected_branch_deletion=刪除分支保護 settings.protected_branch_deletion_desc=停用分支保護將允許有寫入權限的使用者推送至該分支,是否繼續? settings.block_rejected_reviews=有退回的審核時阻擋合併 @@ -2419,8 +2299,6 @@ settings.lfs_pointers.associateAccessible=關聯可存取的 %d 個 OID settings.rename_branch_failed_exist=無法重新命名分支,因為目標分支 %s 已存在。 settings.rename_branch_failed_not_exist=無法重新命名分支 %s,因為他不存在。 settings.rename_branch_success=分支 %s 已成功被重新命名為 %s。 -settings.rename_branch_from=原分支名稱 -settings.rename_branch_to=新分支名稱 settings.rename_branch=重新命名分支 diff.browse_source=瀏覽代碼 @@ -2429,7 +2307,6 @@ diff.commit=當前提交 diff.git-notes=備註 diff.data_not_available=沒有內容比較可以使用 diff.options_button=差異選項 -diff.show_diff_stats=顯示統計資料 diff.download_patch=下載補綴檔案 diff.download_diff=下載差異檔案 diff.show_split_view=分割檢視 @@ -2518,7 +2395,6 @@ release.tag_name_invalid=標籤名稱無效。 release.tag_name_protected=標籤名稱已受保護。 release.tag_already_exist=此標籤名稱已存在。 release.downloads=下載附件 -release.download_count=下載次數:%s release.add_tag_msg=使用此版本的標題和內容作為標籤訊息。 release.add_tag=建立標籤 release.releases_for=%s 的版本發佈 @@ -2548,7 +2424,6 @@ branch.included_desc=此分支是預設分支的一部分 branch.included=包含 branch.create_new_branch=從下列分支建立分支: branch.confirm_create_branch=建立分支 -branch.confirm_rename_branch=重新命名分支 branch.create_branch_operation=建立分支 branch.new_branch=建立新分支 branch.new_branch_from=從「%s」建立新分支 @@ -2641,7 +2516,6 @@ new_repo_helper = 一個儲存庫包含專案的所有檔案和它們的修訂 editor.commit_id_not_matching = 在您編輯檔案的同時,該檔案被改變了。請提交到一條新的分支然後合併。 issues.role.owner_helper = 此使用者是這個儲存庫的所有者。 issues.filter_milestone_all = 所有里程碑 -issues.author_helper = 此使用者是作者。 pulls.blocked_by_approvals = 此合併請求還沒有足夠的核可。已有 %d 個,總共需要 %d 個核可。 wiki.search = 搜尋百科 settings.mirror_settings.docs.disabled_pull_mirror.instructions = 設定你的專案使其自動將提交、標籤與分支推送到另一個儲存庫。您的網站管理員已停用拉取鏡像功能。 @@ -2683,16 +2557,12 @@ pulls.reopen_failed.base_branch = 因為這個合併請求的基礎分支不存 issues.label_archive_tooltip = 在預設情況下,標籤搜尋時會排除被封存的標籤。 signing.wont_sign.approved = 因為合併請求沒有被核可,這個合併不會被簽署。 activity.navbar.recent_commits = 最近的提交 -issues.comment.blocked_by_user = 因為您被該儲存庫的所有者或問題的提出者封鎖,您不能在這則問題上留言。 pulls.closed = 合併請求已關閉 -pulls.title_desc_one = 想從 %[2]s 合併 %[1]d 個提交至 %[3]s -pulls.merged_title_desc_one = 於 %[4]s 自 %[2]s 合併了 %[1]d 個提交至 %[3]s issues.archived_label_description = (已封存)%s signing.wont_sign.always = 永遠簽署提交。 signing.wont_sign.never = 永不簽署提交。 editor.push_out_of_date = 該推送似乎過期了。 issues.cancel_tracking_history = `已取消時間追蹤 %s` -issues.due_date_not_writer = 您需要有寫入這個儲存庫的權限才能更新其問題的到期日。 pulls.commit_ref_at = `在提交 %s 引用了這個合併請求` pulls.cmd_instruction_checkout_desc = 從您的專案儲存庫中,建立並切換到一個新分支以測試這些變更。 pulls.cmd_instruction_merge_title = 合併 @@ -2869,7 +2739,6 @@ issues.reaction.alt_many = %[1]s 和另外 %[2]d 人對 %[3]s 做出了反應。 issues.context.menu = 留言選單 issues.summary_card_alt = 儲存庫 %[2]s 中標題為「%[1]s」的問題摘要卡 release.summary_card_alt = 儲存庫 %[2]s 中名為「%[1]s」的發行摘要卡 -error.broken_git_hook = 此儲存庫的 Git 鉤子似乎已損壞。請按照文件修復它們,然後推送一些提交以重新整理狀態。 issues.reaction.alt_remove = 從留言中移除 %[1]s 的反應。 vendored = 已供應 @@ -3007,9 +2876,7 @@ teams.none_access_helper=「無權存取」選項僅對私人儲存庫有效。 teams.general_access=自訂存取 teams.general_access_helper=成員權限將由下列權限表決定。 teams.read_access=讀取 -teams.read_access_helper=成員可以查看和 Clone 團隊儲存庫。 teams.write_access=寫入 -teams.write_access_helper=成員可以查看和推送到團隊儲存庫。 teams.admin_access=管理員權限 teams.admin_access_helper=成員可以拉取、推送和新增協作者到團隊儲存庫中。 teams.no_desc=該團隊暫無描述 @@ -3024,12 +2891,9 @@ teams.invite_team_member.list=待處理的邀請 teams.delete_team_title=刪除團隊 teams.delete_team_desc=刪除團隊將會撤銷成員的儲存庫存取權,是否繼續? teams.delete_team_success=該團隊已被刪除。 -teams.read_permission_desc=這個團隊擁有讀取 權限:成員可以查看和 Clone 團隊儲存庫。 -teams.write_permission_desc=這個團隊擁有寫入 權限:成員可以查看和推送到團隊儲存庫。 teams.admin_permission_desc=這個團隊擁有管理員 權限:成員可以讀取、推送和增加協作者到儲存庫。 teams.create_repo_permission_desc=此外,這個團隊還擁有建立儲存庫的權限:成員可以在組織中新增儲存庫。 teams.repositories=團隊儲存庫 -teams.search_repo_placeholder=搜尋儲存庫... teams.remove_all_repos_title=移除所有團隊儲存庫 teams.remove_all_repos_desc=這將從團隊中移除所有儲存庫。 teams.add_all_repos_title=增加所有儲存庫 @@ -3042,9 +2906,6 @@ teams.specific_repositories=指定儲存庫 teams.specific_repositories_helper=成員只能存取明確加入此團隊的儲存庫。選擇這個選項不會自動移除透過所有儲存庫加入的儲存庫。 teams.all_repositories=所有儲存庫 teams.all_repositories_helper=團隊擁有可存取所有儲存庫。選擇此選項會增加所有儲存庫到此團隊。 -teams.all_repositories_read_permission_desc=這個團隊擁有所有儲存庫讀取 權限:成員可以查看和 Clone 儲存庫。 -teams.all_repositories_write_permission_desc=這個團隊擁有所有儲存庫寫入 權限:成員可以讀取和推送到儲存庫。 -teams.all_repositories_admin_permission_desc=這個團隊擁有所有儲存庫管理員 權限:成員可以讀取、推送和增加協作者到儲存庫。 teams.invite.by=邀請人 %s teams.invite.description=請點擊下方按鈕加入團隊。 open_dashboard = 開啟儀錶板 @@ -3135,7 +2996,6 @@ dashboard.gc_metadata_obtained=被分配 GC Metadata dashboard.other_system_allocation_obtained=其他獲得的系統記憶體 dashboard.next_gc_recycle=下次 GC 記憶體回收量 dashboard.last_gc_time=距離上次 GC 時間 -dashboard.total_gc_time=總 GC 暫停時間 dashboard.total_gc_pause=總 GC 暫停時間 dashboard.last_gc_pause=上次 GC 暫停時間 dashboard.gc_times=GC 執行次數 @@ -3226,9 +3086,6 @@ repos.unadopted.no_more=找不到未接管的儲存庫。 repos.owner=所有者 repos.name=名稱 repos.private=私有 -repos.watches=關注數 -repos.stars=星號數 -repos.forks=Fork 數 repos.issues=問題數 repos.size=大小 @@ -3328,17 +3185,6 @@ auths.oauth2_admin_group=管理員使用者的群組 Claim 值。(選用 - 需 auths.oauth2_restricted_group=受限制使用者的群組 Claim 值。(選用 - 需要上面的 Claim 名稱) auths.oauth2_map_group_to_team=將已 Claim 的群組對應到組織團隊。(選用 - 需要上述 Claim 名稱) auths.oauth2_map_group_to_team_removal=如果使用者不屬於相對應的群組,將使用者從已同步的團隊移除。 -auths.enable_auto_register=允許授權用戶自動註冊 -auths.sspi_auto_create_users=自動建立使用者 -auths.sspi_auto_create_users_helper=允許 SSPI 認證方法於使用者首次登入時自動建立新帳號 -auths.sspi_auto_activate_users=自動啟用使用者 -auths.sspi_auto_activate_users_helper=允許 SSPI 認證方法自動啟用新使用者 -auths.sspi_strip_domain_names=從帳號中移除域名 -auths.sspi_strip_domain_names_helper=勾選後,將從登入名稱中移除域名(例如:「DOMAIN\user」和「user@example.org」都會變成「user」)。 -auths.sspi_separator_replacement=用來替換 \, / 和 @ 的分隔符號 -auths.sspi_separator_replacement_helper=用來替換下級登入名稱分隔符號的字元 (例如:「DOMAIN\user」中的「\」) 和使用者主體名稱 (例如:「user@example.org」中的「@」)。 -auths.sspi_default_language=使用者預設語言 -auths.sspi_default_language_helper=SSPI 認證方法自動建立之使用者的預設語言,留白以自動偵測。 auths.tips=幫助提示 auths.tips.oauth2.general=OAuth2 認證 auths.tip.oauth2_provider=OAuth2 提供者 @@ -3347,7 +3193,6 @@ auths.tip.nextcloud=在您的站點上,於選單「設定 -> 安全性 -> OAut auths.tip.dropbox=建立新的 App。網址:%s auths.tip.facebook=註冊新的應用程式並新增產品「Facebook 登入」。網址:%s auths.tip.github=註冊新的 OAuth 應用程式。網址:%s -auths.tip.gitlab=註冊新的應用程式。網址:https://gitlab.com/profile/applications auths.tip.google_plus=從 Google API 控制台取得 OAuth2 使用者端憑證。網址:%s auths.tip.openid_connect=使用 OpenID 連接探索 URL (/.well-known/openid-configuration) 來指定節點 auths.tip.twitter=前往 %s,建立應用程式並確保啟用了「允許此應用程式用於使用 Twitter 登入」選項 @@ -3996,7 +3841,6 @@ runs.expire_log_message = 日誌已被清除,因為它們太舊了。 runs.no_job_without_needs = 工作流程必須包含至少一項沒有依賴性的作業。 runs.no_matching_online_runner_helper = 沒有在線的執行器且匹配標籤:%s workflow.dispatch.success = 已成功請求工作流程運行。 -runs.no_workflows.documentation = 有關 Forgejo Actions 的更多資訊,請參閱文件。 runners.reset_registration_token = 重置註冊符記 workflow.dispatch.use_from = 使用工作流程自 runs.no_workflows.help_no_write_access = 要了解 Forgejo Actions,請參閱文件。 @@ -4024,11 +3868,9 @@ directory = 目錄 package_kind = 搜尋軟體包… search = 搜尋… type_tooltip = 搜尋類型 -match_tooltip = 僅包含與搜尋字詞完全相符的結果 repo_kind = 搜尋儲存庫… fuzzy = 模糊 fuzzy_tooltip = 讓搜尋結果也包含與搜尋詞相近的的項目 -match = 相符 user_kind = 搜尋使用者… org_kind = 搜尋組織… team_kind = 搜尋團隊… @@ -4040,9 +3882,7 @@ runner_kind = 搜尋 Runners… project_kind = 搜尋專案… branch_kind = 搜尋分支… commit_kind = 搜尋提交… -code_search_by_git_grep = 目前搜尋結果由「git grep」提供。如果網站管理員啟用程式碼索引,可能會有更好的結果。 exact = 精確 -milestone_kind = 搜尋里程碑... issue_kind = 搜尋議題… exact_tooltip = 只包含與搜尋詞完全相符的結合 pull_kind = 搜尋合併請求… diff --git a/options/locale_next/locale_is-IS.json b/options/locale_next/locale_is-IS.json index a92d924232..9dccd424ac 100644 --- a/options/locale_next/locale_is-IS.json +++ b/options/locale_next/locale_is-IS.json @@ -1,5 +1,5 @@ { - "repo.pulls.title_desc": { - "other": "vill sameina %[1]d framlög frá %[2]s í %[3]s" - } + "repo.pulls.title_desc": { + "other": "vill sameina %[1]d framlög frá %[2]s í %[3]s" + } } diff --git a/options/locale_next/locale_si-LK.json b/options/locale_next/locale_si-LK.json index 0cdd44acd0..d9e51930ac 100644 --- a/options/locale_next/locale_si-LK.json +++ b/options/locale_next/locale_si-LK.json @@ -1,8 +1,8 @@ { - "repo.pulls.merged_title_desc": { - "other": "මර්ජ්%[1]d සිට %[2]s දක්වා %[3]s %[4]s" - }, - "repo.pulls.title_desc": { - "other": "%[1]d සිට %[2]s දක්වා %[3]s" - } + "repo.pulls.merged_title_desc": { + "other": "මර්ජ්%[1]d සිට %[2]s දක්වා %[3]s %[4]s" + }, + "repo.pulls.title_desc": { + "other": "%[1]d සිට %[2]s දක්වා %[3]s" + } } From 0447117b6b9622efb9f371524d9187d5524a1e1f Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 24 Aug 2025 12:00:16 +0200 Subject: [PATCH 351/495] Update dependency webpack to v5.101.3 (forgejo) (#8947) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [webpack](https://github.com/webpack/webpack) | [`5.101.1` -> `5.101.3`](https://renovatebot.com/diffs/npm/webpack/5.101.1/5.101.3) | [![age](https://developer.mend.io/api/mc/badges/age/npm/webpack/5.101.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/webpack/5.101.1/5.101.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
    webpack/webpack (webpack) ### [`v5.101.3`](https://github.com/webpack/webpack/releases/tag/v5.101.3) [Compare Source](https://github.com/webpack/webpack/compare/v5.101.2...v5.101.3) ##### Fixes - Fixed resolve execution order issue from extra await in async modules - Avoid empty block for unused statement - Collect only specific expressions for destructuring assignment ### [`v5.101.2`](https://github.com/webpack/webpack/releases/tag/v5.101.2) [Compare Source](https://github.com/webpack/webpack/compare/v5.101.1...v5.101.2) ##### Fixes - Fixed syntax error when comment is on the last line - Handle var declaration for `createRequire` - Distinguish free variable and tagged variable
    --- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8947 Reviewed-by: Gusted Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9f3f1aef12..a5004ec71e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,7 +56,7 @@ "vue-chartjs": "5.3.1", "vue-loader": "17.4.2", "vue3-calendar-heatmap": "2.0.5", - "webpack": "5.101.1", + "webpack": "5.101.3", "webpack-cli": "6.0.1", "wrap-ansi": "9.0.0" }, @@ -15577,9 +15577,9 @@ "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.101.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.1.tgz", - "integrity": "sha512-rHY3vHXRbkSfhG6fH8zYQdth/BtDgXXuR2pHF++1f/EBkI8zkgM5XWfsC3BvOoW9pr1CvZ1qQCxhCEsbNgT50g==", + "version": "5.101.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz", + "integrity": "sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==", "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", diff --git a/package.json b/package.json index b2cd765ed3..53365427d8 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "vue-chartjs": "5.3.1", "vue-loader": "17.4.2", "vue3-calendar-heatmap": "2.0.5", - "webpack": "5.101.1", + "webpack": "5.101.3", "webpack-cli": "6.0.1", "wrap-ansi": "9.0.0" }, From 8bfb9d210ff267c6df5d78138a3d4b3532e6e1d4 Mon Sep 17 00:00:00 2001 From: Gusted Date: Sun, 24 Aug 2025 16:17:30 +0200 Subject: [PATCH 352/495] fix: parse extra weird tree mode value (#8900) - It also seems possible `040775` to be a valid tree mode. - Ref: https://codeberg.org/Codeberg/Community/issues/2086 - As this is 'officially' not possible I cannot make a small reproducer without importing a existing repository. ## Testing 1. Import https://codeberg.org/GeekRuthie/Dist-Zilla-PluginBundle-Author-GEEKRUTH via the migration tool (either git or github type) 2. Observe that there's no error when viewing the migrated repository. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8900 Reviewed-by: Earl Warren Co-authored-by: Gusted Co-committed-by: Gusted --- modules/git/parse.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/git/parse.go b/modules/git/parse.go index 6bc32057a7..69649460b4 100644 --- a/modules/git/parse.go +++ b/modules/git/parse.go @@ -64,7 +64,7 @@ func parseTreeEntries(data []byte, ptree *Tree) ([]*TreeEntry, error) { entry.entryMode = EntryModeSymlink case "160000": entry.entryMode = EntryModeCommit - case "040000", "040755": // git uses 040000 for tree object, but some users may get 040755 for unknown reasons + case "040000", "040755", "040775": // git uses 040000 for tree object, but some users may get 040755 or 040775 for unknown reasons entry.entryMode = EntryModeTree default: return nil, fmt.Errorf("unknown type: %v", string(entryMode)) @@ -118,7 +118,7 @@ loop: entry.entryMode = EntryModeSymlink case "160000": entry.entryMode = EntryModeCommit - case "40000", "40755": // git uses 40000 for tree object, but some users may get 40755 for unknown reasons + case "40000", "40755", "40775": // git uses 40000 for tree object, but some users may get 40755 or 40775 for unknown reasons entry.entryMode = EntryModeTree default: log.Debug("Unknown mode: %v", string(mode)) From c258003be99805ee89731ce4448ddda7f0e3bd71 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Mon, 25 Aug 2025 15:51:26 +0200 Subject: [PATCH 353/495] feat: artifacts can be downloaded using their id instead of their name (#8957) The web endpoint `/{owner}/{repo}/actions/runs/{run_id}/artifacts/{artifact_name_or_id}` can be used with either the artifact name used when it is uploaded or the instance wide unique number of the artifact, if it is not found. For instance: `/root/myrepo/actions/run/3/artifacts/my_artifact_name` or `/root/myrepo/actions/run/3/artifacts/42` The `upload-artifact@v4` output value `artifact-url` is built in this way and is now a valid URL to access the artifact. Refs https://codeberg.org/forgejo/forgejo/issues/6147 Refs https://code.forgejo.org/forgejo/runner/issues/187 Refs https://code.forgejo.org/forgejo/upload-artifact/src/tag/v4#outputs ## Checklist The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org). ### Tests - I added test coverage for Go changes... - [x] in their respective `*_test.go` for unit tests. - [x] in the `tests/integration` directory if it involves interactions with a live Forgejo server. - I added test coverage for JavaScript changes... - [ ] in `web_src/js/*.test.js` if it can be unit tested. - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)). ### Documentation - [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [ ] I do not want this change to show in the release notes. - [x] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/.md` to be be used for the release notes instead of the title. ## Release notes - Bug fixes - [PR](https://codeberg.org/forgejo/forgejo/pulls/8957): artifacts can be downloaded using their id instead of their name Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8957 Reviewed-by: Mathieu Fenniak Co-authored-by: Earl Warren Co-committed-by: Earl Warren --- models/actions/artifact.go | 4 + models/fixtures/action_artifact.yml | 2 +- routers/web/repo/actions/view.go | 60 +++++++++--- routers/web/repo/actions/view_test.go | 95 +++++++++++++++++++ routers/web/web.go | 2 +- .../integration/api_actions_artifact_test.go | 5 + .../api_actions_artifact_v4_test.go | 1 + 7 files changed, 155 insertions(+), 14 deletions(-) create mode 100644 routers/web/repo/actions/view_test.go diff --git a/models/actions/artifact.go b/models/actions/artifact.go index 95c4bead8f..492e3f6cea 100644 --- a/models/actions/artifact.go +++ b/models/actions/artifact.go @@ -108,6 +108,7 @@ func UpdateArtifactByID(ctx context.Context, id int64, art *ActionArtifact) erro type FindArtifactsOptions struct { db.ListOptions + ID int64 RepoID int64 RunID int64 ArtifactName string @@ -116,6 +117,9 @@ type FindArtifactsOptions struct { func (opts FindArtifactsOptions) ToConds() builder.Cond { cond := builder.NewCond() + if opts.ID > 0 { + cond = cond.And(builder.Eq{"id": opts.ID}) + } if opts.RepoID > 0 { cond = cond.And(builder.Eq{"repo_id": opts.RepoID}) } diff --git a/models/fixtures/action_artifact.yml b/models/fixtures/action_artifact.yml index 2c51c11ebd..a591719aee 100644 --- a/models/fixtures/action_artifact.yml +++ b/models/fixtures/action_artifact.yml @@ -57,7 +57,7 @@ run_id: 792 runner_id: 1 repo_id: 4 - owner_id: 1 + owner_id: 5 commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 storage_path: "27/5/1730330775594233150.chunk" file_size: 1024 diff --git a/routers/web/repo/actions/view.go b/routers/web/repo/actions/view.go index 260468f207..a325c51afe 100644 --- a/routers/web/repo/actions/view.go +++ b/routers/web/repo/actions/view.go @@ -668,9 +668,51 @@ func ArtifactsDeleteView(ctx *context_module.Context) { ctx.JSON(http.StatusOK, struct{}{}) } +func artifactsFind(ctx *context_module.Context, opts actions_model.FindArtifactsOptions) []*actions_model.ActionArtifact { + artifacts, err := db.Find[actions_model.ActionArtifact](ctx, opts) + if err != nil { + ctx.Error(http.StatusInternalServerError, err.Error()) + return nil + } + if len(artifacts) == 0 { + return nil + } + return artifacts +} + +func artifactsFindByNameOrID(ctx *context_module.Context, runID int64, nameOrID string) []*actions_model.ActionArtifact { + artifacts := artifactsFind(ctx, actions_model.FindArtifactsOptions{ + RunID: runID, + ArtifactName: nameOrID, + }) + if ctx.Written() { + return nil + } + // if lookup by name found nothing, maybe it is an ID + if len(artifacts) == 0 { + id, err := strconv.ParseInt(nameOrID, 10, 64) + if err != nil || id == 0 { + ctx.Error(http.StatusNotFound, fmt.Sprintf("runID %d: artifact name not found: %v", runID, nameOrID)) + return nil + } + artifacts = artifactsFind(ctx, actions_model.FindArtifactsOptions{ + RunID: runID, + ID: id, + }) + if ctx.Written() { + return nil + } + if len(artifacts) == 0 { + ctx.Error(http.StatusNotFound, fmt.Sprintf("runID %d: artifact ID not found: %v", runID, nameOrID)) + return nil + } + } + return artifacts +} + func ArtifactsDownloadView(ctx *context_module.Context) { runIndex := ctx.ParamsInt64("run") - artifactName := ctx.Params("artifact_name") + artifactNameOrID := ctx.Params("artifact_name_or_id") run, err := actions_model.GetRunByIndex(ctx, ctx.Repo.Repository.ID, runIndex) if err != nil { @@ -682,16 +724,8 @@ func ArtifactsDownloadView(ctx *context_module.Context) { return } - artifacts, err := db.Find[actions_model.ActionArtifact](ctx, actions_model.FindArtifactsOptions{ - RunID: run.ID, - ArtifactName: artifactName, - }) - if err != nil { - ctx.Error(http.StatusInternalServerError, err.Error()) - return - } - if len(artifacts) == 0 { - ctx.Error(http.StatusNotFound, "artifact not found") + artifacts := artifactsFindByNameOrID(ctx, run.ID, artifactNameOrID) + if ctx.Written() { return } @@ -720,12 +754,14 @@ func ArtifactsDownloadView(ctx *context_module.Context) { ctx.Error(http.StatusInternalServerError, err.Error()) return } - common.ServeContentByReadSeeker(ctx.Base, artifactName, util.ToPointer(art.UpdatedUnix.AsTime()), f) + common.ServeContentByReadSeeker(ctx.Base, artifacts[0].ArtifactName+".zip", util.ToPointer(art.UpdatedUnix.AsTime()), f) return } // Artifacts using the v1-v3 backend are stored as multiple individual files per artifact on the backend // Those need to be zipped for download + artifactName := artifacts[0].ArtifactName + ctx.Resp.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s.zip; filename*=UTF-8''%s.zip", url.PathEscape(artifactName), artifactName)) writer := zip.NewWriter(ctx.Resp) defer writer.Close() diff --git a/routers/web/repo/actions/view_test.go b/routers/web/repo/actions/view_test.go new file mode 100644 index 0000000000..d6a390befc --- /dev/null +++ b/routers/web/repo/actions/view_test.go @@ -0,0 +1,95 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package actions + +import ( + "fmt" + "testing" + + actions_model "forgejo.org/models/actions" + unittest "forgejo.org/models/unittest" + "forgejo.org/services/contexttest" + + "github.com/stretchr/testify/assert" +) + +func Test_artifactsFind(t *testing.T) { + unittest.PrepareTestEnv(t) + + for _, testCase := range []struct { + name string + artifactName string + count int + }{ + { + name: "Found", + artifactName: "artifact-v4-download", + count: 1, + }, + { + name: "NotFound", + artifactName: "notexist", + count: 0, + }, + } { + t.Run(testCase.name, func(t *testing.T) { + runID := int64(792) + ctx, _ := contexttest.MockContext(t, fmt.Sprintf("user5/repo4/actions/runs/%v/artifacts/%v", runID, testCase.artifactName)) + artifacts := artifactsFind(ctx, actions_model.FindArtifactsOptions{ + RunID: runID, + ArtifactName: testCase.artifactName, + }) + assert.False(t, ctx.Written()) + assert.Len(t, artifacts, testCase.count) + }) + } +} + +func Test_artifactsFindByNameOrID(t *testing.T) { + unittest.PrepareTestEnv(t) + + for _, testCase := range []struct { + name string + nameOrID string + err string + }{ + { + name: "NameFound", + nameOrID: "artifact-v4-download", + }, + { + name: "NameNotFound", + nameOrID: "notexist", + err: "artifact name not found", + }, + { + name: "IDFound", + nameOrID: "22", + }, + { + name: "IDNotFound", + nameOrID: "666", + err: "artifact ID not found", + }, + { + name: "IDZeroNotFound", + nameOrID: "0", + err: "artifact name not found", + }, + } { + t.Run(testCase.name, func(t *testing.T) { + runID := int64(792) + ctx, resp := contexttest.MockContext(t, fmt.Sprintf("user5/repo4/actions/runs/%v/artifacts/%v", runID, testCase.nameOrID)) + artifacts := artifactsFindByNameOrID(ctx, runID, testCase.nameOrID) + if testCase.err == "" { + assert.NotEmpty(t, artifacts) + assert.False(t, ctx.Written(), resp.Body.String()) + } else { + assert.Empty(t, artifacts) + assert.True(t, ctx.Written()) + assert.Contains(t, resp.Body.String(), testCase.err) + } + }) + } +} diff --git a/routers/web/web.go b/routers/web/web.go index f1cbc6b7ad..a47ce2bff7 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -1455,7 +1455,7 @@ func registerRoutes(m *web.Route) { m.Post("/cancel", reqRepoActionsWriter, actions.Cancel) m.Post("/approve", reqRepoActionsWriter, actions.Approve) m.Get("/artifacts", actions.ArtifactsView) - m.Get("/artifacts/{artifact_name}", actions.ArtifactsDownloadView) + m.Get("/artifacts/{artifact_name_or_id}", actions.ArtifactsDownloadView) m.Delete("/artifacts/{artifact_name}", reqRepoActionsWriter, actions.ArtifactsDeleteView) m.Post("/rerun", reqRepoActionsWriter, actions.Rerun) }) diff --git a/tests/integration/api_actions_artifact_test.go b/tests/integration/api_actions_artifact_test.go index 1526ae3585..4ecbbeb92c 100644 --- a/tests/integration/api_actions_artifact_test.go +++ b/tests/integration/api_actions_artifact_test.go @@ -267,6 +267,11 @@ func TestActionsArtifactDownloadMultiFiles(t *testing.T) { resp = MakeRequest(t, req, http.StatusOK) assert.Equal(t, strings.Repeat(bodyChar, 1024), resp.Body.String()) } + + // Download artifact via user-facing URL + req = NewRequest(t, "GET", "/user5/repo4/actions/runs/187/artifacts/multi-file-download") + resp = MakeRequest(t, req, http.StatusOK) + assert.Contains(t, resp.Header().Get("content-disposition"), "multi-file-download.zip") } func TestActionsArtifactUploadWithRetentionDays(t *testing.T) { diff --git a/tests/integration/api_actions_artifact_v4_test.go b/tests/integration/api_actions_artifact_v4_test.go index af0dcb98a9..716d9e1abe 100644 --- a/tests/integration/api_actions_artifact_v4_test.go +++ b/tests/integration/api_actions_artifact_v4_test.go @@ -344,6 +344,7 @@ func TestActionsArtifactV4DownloadSingle(t *testing.T) { req = NewRequest(t, "GET", "/user5/repo4/actions/runs/188/artifacts/artifact-v4-download") resp = MakeRequest(t, req, http.StatusOK) assert.Equal(t, "bytes", resp.Header().Get("accept-ranges")) + assert.Contains(t, resp.Header().Get("content-disposition"), "artifact-v4-download.zip") assert.Equal(t, body, resp.Body.String()) // Partial artifact download From cf0e697d13610513b89942f88332932935e153fa Mon Sep 17 00:00:00 2001 From: BtbN Date: Mon, 25 Aug 2025 20:11:45 +0200 Subject: [PATCH 354/495] fix: Actions workflows triggered by comments or labels to pull requests may access secrets (#9003) This avoids issue_comment events on pull requests to get that flag set and subsequently not get access to secrets. ### Tests - I added test coverage for Go changes... - [x] in their respective `*_test.go` for unit tests. - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server. - I added test coverage for JavaScript changes... - [ ] in `web_src/js/*.test.js` if it can be unit tested. - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)). ### Documentation - [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [ ] I do not want this change to show in the release notes. - [x] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/.md` to be be used for the release notes instead of the title. ## Release notes - Bug fixes - [PR](https://codeberg.org/forgejo/forgejo/pulls/9003): Actions workflows triggered by comments or labels to pull requests may access secrets Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9003 Reviewed-by: Earl Warren Co-authored-by: BtbN Co-committed-by: BtbN --- services/actions/notifier.go | 2 +- services/actions/notifier_helper.go | 10 ++- services/actions/notifier_helper_test.go | 95 ++++++++++++++++++++++++ 3 files changed, 104 insertions(+), 3 deletions(-) diff --git a/services/actions/notifier.go b/services/actions/notifier.go index a5bac730be..33ac675fcc 100644 --- a/services/actions/notifier.go +++ b/services/actions/notifier.go @@ -343,7 +343,7 @@ func notifyIssueCommentChange(ctx context.Context, doer *user_model.User, commen newNotifyInputFromIssue(comment.Issue, event). WithDoer(doer). WithPayload(payload). - WithPullRequest(comment.Issue.PullRequest). + WithPullRequestData(comment.Issue.PullRequest). Notify(ctx) return } diff --git a/services/actions/notifier_helper.go b/services/actions/notifier_helper.go index e1df5776fb..14621744b4 100644 --- a/services/actions/notifier_helper.go +++ b/services/actions/notifier_helper.go @@ -102,6 +102,12 @@ func (input *notifyInput) WithPayload(payload api.Payloader) *notifyInput { return input } +// for cases like issue comments on PRs, which have the PR data, but don't run on its ref +func (input *notifyInput) WithPullRequestData(pr *issues_model.PullRequest) *notifyInput { + input.PullRequest = pr + return input +} + func (input *notifyInput) WithPullRequest(pr *issues_model.PullRequest) *notifyInput { input.PullRequest = pr if input.Ref == "" { @@ -219,7 +225,7 @@ func notify(ctx context.Context, input *notifyInput) error { } } - if input.PullRequest != nil { + if input.PullRequest != nil && !actions_module.IsDefaultBranchWorkflow(input.Event) { // detect pull_request_target workflows baseRef := git.BranchPrefix + input.PullRequest.BaseBranch baseCommit, err := gitRepo.GetCommit(baseRef) @@ -315,7 +321,7 @@ func handleWorkflows( } isForkPullRequest := false - if pr := input.PullRequest; pr != nil { + if pr := input.PullRequest; pr != nil && !actions_module.IsDefaultBranchWorkflow(input.Event) { switch pr.Flow { case issues_model.PullRequestFlowGithub: isForkPullRequest = pr.IsFromFork() diff --git a/services/actions/notifier_helper_test.go b/services/actions/notifier_helper_test.go index 9166dc3b95..57c7894526 100644 --- a/services/actions/notifier_helper_test.go +++ b/services/actions/notifier_helper_test.go @@ -8,9 +8,16 @@ import ( actions_model "forgejo.org/models/actions" "forgejo.org/models/db" + issues_model "forgejo.org/models/issues" + repo_model "forgejo.org/models/repo" "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + actions_module "forgejo.org/modules/actions" + "forgejo.org/modules/git" + api "forgejo.org/modules/structs" webhook_module "forgejo.org/modules/webhook" + "code.forgejo.org/forgejo/runner/v9/act/jobparser" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -49,3 +56,91 @@ func Test_SkipPullRequestEvent(t *testing.T) { unittest.AssertSuccessfulInsert(t, run) assert.True(t, SkipPullRequestEvent(db.DefaultContext, webhook_module.HookEventPullRequestSync, repoID, commitSHA)) } + +func Test_IssueCommentOnForkPullRequestEvent(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 10}) + doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 3}) + require.NoError(t, pr.LoadIssue(db.DefaultContext)) + + require.True(t, pr.IsFromFork()) + + commit := &git.Commit{ + ID: git.MustIDFromString("0000000000000000000000000000000000000000"), + CommitMessage: "test", + } + detectedWorkflows := []*actions_module.DetectedWorkflow{ + { + TriggerEvent: &jobparser.Event{ + Name: "issue_comment", + }, + }, + } + input := ¬ifyInput{ + Repo: repo, + Doer: doer, + Event: webhook_module.HookEventIssueComment, + PullRequest: pr, + Payload: &api.IssueCommentPayload{}, + } + + unittest.AssertSuccessfulDelete(t, &actions_model.ActionRun{RepoID: repo.ID}) + + err := handleWorkflows(db.DefaultContext, detectedWorkflows, commit, input, "") + require.NoError(t, err) + + runs, err := db.Find[actions_model.ActionRun](db.DefaultContext, actions_model.FindRunOptions{ + RepoID: repo.ID, + }) + require.NoError(t, err) + require.Len(t, runs, 1) + + assert.Equal(t, webhook_module.HookEventIssueComment, runs[0].Event) + assert.False(t, runs[0].IsForkPullRequest) +} + +func Test_OpenForkPullRequestEvent(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 10}) + doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 3}) + require.NoError(t, pr.LoadIssue(db.DefaultContext)) + + require.True(t, pr.IsFromFork()) + + commit := &git.Commit{ + ID: git.MustIDFromString("0000000000000000000000000000000000000000"), + CommitMessage: "test", + } + detectedWorkflows := []*actions_module.DetectedWorkflow{ + { + TriggerEvent: &jobparser.Event{ + Name: "pull_request", + }, + }, + } + input := ¬ifyInput{ + Repo: repo, + Doer: doer, + Event: webhook_module.HookEventPullRequest, + PullRequest: pr, + Payload: &api.PullRequestPayload{}, + } + + unittest.AssertSuccessfulDelete(t, &actions_model.ActionRun{RepoID: repo.ID}) + + err := handleWorkflows(db.DefaultContext, detectedWorkflows, commit, input, "") + require.NoError(t, err) + + runs, err := db.Find[actions_model.ActionRun](db.DefaultContext, actions_model.FindRunOptions{ + RepoID: repo.ID, + }) + require.NoError(t, err) + require.Len(t, runs, 1) + + assert.Equal(t, webhook_module.HookEventPullRequest, runs[0].Event) + assert.True(t, runs[0].IsForkPullRequest) +} From ff03a4eff660bc474272d580bea6405f752279bd Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Tue, 26 Aug 2025 07:36:00 +0200 Subject: [PATCH 355/495] chore: make migration tests relative to the root of the repository (#8999) This is a noop refactor. It is on the path of each integration tests and this is why it needs no additional testing. It makes it possible to run the migration tests using `go test` (which runs from the root) instead of building a test binary with `go test -c` that runs in the target directory, which is what the current tests are doing. This will be put to use to extract coverage in a unified way. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8999 Reviewed-by: jerger Co-authored-by: Earl Warren Co-committed-by: Earl Warren --- .../migration-test/migration_test.go | 69 +++++++++---------- 1 file changed, 32 insertions(+), 37 deletions(-) diff --git a/tests/integration/migration-test/migration_test.go b/tests/integration/migration-test/migration_test.go index 798161a560..d62afbf0f7 100644 --- a/tests/integration/migration-test/migration_test.go +++ b/tests/integration/migration-test/migration_test.go @@ -36,16 +36,21 @@ import ( var currentEngine *xorm.Engine +func getRoot(t *testing.T) string { + t.Helper() + root := base.SetupGiteaRoot() + if root == "" { + t.Fatal("Environment variable $GITEA_ROOT not set") + } + return root +} + func initMigrationTest(t *testing.T) func() { log.RegisterEventWriter("test", testlogger.NewTestLoggerWriter) deferFn := tests.PrintCurrentTest(t, 2) - giteaRoot := base.SetupGiteaRoot() - if giteaRoot == "" { - tests.Printf("Environment variable $GITEA_ROOT not set\n") - os.Exit(1) - } - setting.AppPath = path.Join(giteaRoot, "gitea") + root := getRoot(t) + setting.AppPath = path.Join(root, "gitea") if _, err := os.Stat(setting.AppPath); err != nil { tests.Printf("Could not find gitea binary at %s\n", setting.AppPath) os.Exit(1) @@ -56,7 +61,7 @@ func initMigrationTest(t *testing.T) func() { tests.Printf("Environment variable $GITEA_CONF not set\n") os.Exit(1) } else if !path.IsAbs(giteaConf) { - setting.CustomConf = path.Join(giteaRoot, giteaConf) + setting.CustomConf = path.Join(root, giteaConf) } else { setting.CustomConf = giteaConf } @@ -92,21 +97,17 @@ func initMigrationTest(t *testing.T) func() { return deferFn } -func availableVersions() ([]string, error) { - migrationsDir, err := os.Open("tests/integration/migration-test") - if err != nil { - return nil, err - } +func availableVersions(t *testing.T) []string { + t.Helper() + root := getRoot(t) + migrationsDir, err := os.Open(path.Join(root, "tests/integration/migration-test")) + require.NoError(t, err) defer migrationsDir.Close() versionRE, err := regexp.Compile(".*-v(?P.+)\\." + regexp.QuoteMeta(setting.Database.Type.String()) + "\\.sql.gz") - if err != nil { - return nil, err - } + require.NoError(t, err) filenames, err := migrationsDir.Readdirnames(-1) - if err != nil { - return nil, err - } + require.NoError(t, err) versions := []string{} for _, filename := range filenames { if versionRE.MatchString(filename) { @@ -115,41 +116,36 @@ func availableVersions() ([]string, error) { } } sort.Strings(versions) - return versions, nil + return versions } -func readSQLFromFile(version string) (string, error) { - filename := fmt.Sprintf("tests/integration/migration-test/gitea-v%s.%s.sql.gz", version, setting.Database.Type) +func readSQLFromFile(t *testing.T, version string) string { + t.Helper() + root := getRoot(t) + filename := fmt.Sprintf(path.Join(root, "tests/integration/migration-test/gitea-v%s.%s.sql.gz"), version, setting.Database.Type) if _, err := os.Stat(filename); os.IsNotExist(err) { - filename = fmt.Sprintf("tests/integration/migration-test/forgejo-v%s.%s.sql.gz", version, setting.Database.Type) + filename = fmt.Sprintf(path.Join(root, "tests/integration/migration-test/forgejo-v%s.%s.sql.gz"), version, setting.Database.Type) if _, err := os.Stat(filename); os.IsNotExist(err) { - return "", nil + require.NoError(t, err) } } file, err := os.Open(filename) - if err != nil { - return "", err - } + require.NoError(t, err) defer file.Close() gr, err := gzip.NewReader(file) - if err != nil { - return "", err - } + require.NoError(t, err) defer gr.Close() bytes, err := io.ReadAll(gr) - if err != nil { - return "", err - } - return string(charset.MaybeRemoveBOM(bytes, charset.ConvertOpts{})), nil + require.NoError(t, err) + return string(charset.MaybeRemoveBOM(bytes, charset.ConvertOpts{})) } func restoreOldDB(t *testing.T, version string) bool { - data, err := readSQLFromFile(version) - require.NoError(t, err) + data := readSQLFromFile(t, version) if len(data) == 0 { tests.Printf("No db found to restore for %s version: %s\n", setting.Database.Type, version) return false @@ -318,8 +314,7 @@ func TestMigrations(t *testing.T) { defer initMigrationTest(t)() dialect := setting.Database.Type - versions, err := availableVersions() - require.NoError(t, err) + versions := availableVersions(t) if len(versions) == 0 { tests.Printf("No old database versions available to migration test for %s\n", dialect) From 7d3fcde71c074bcc1eef601493a5a01b141f693c Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Tue, 26 Aug 2025 10:10:46 +0200 Subject: [PATCH 356/495] chore: collect coverage using GOCOVERDIR (#9004) - run all unit tests and integration tests in sequence in the same job - upload the coverage data as an artifact to the run - only run via dispatch because it is very long - arguments are used to select which unit or integration tests to focus on Refs https://go.dev/blog/integration-test-coverage ### Testing - Run this workflow via workflow_dispatch (see https://codeberg.org/forgejo-integration/forgejo/actions/runs/11889) - Download the coverage information (see https://codeberg.org/forgejo-integration/forgejo/actions/runs/11889/artifacts/coverage) - Download the coverage information from an end-to-end cascade test (see https://code.forgejo.org/forgejo/end-to-end/actions/runs/3961) - Unzip them in a the `coverage/data` sub-directory at the root of the Forgejo source tree ```sh $ ls coverage/data actions coverage-actions.zip coverage-federation.zip coverage-tests.zip coverage-upgrade.zip federation tests upgrade ``` - Display the coverage percentage ``` $ make coverage-show-percentage ... forgejo.org/services/wiki/wiki_path.go:96: WebPathToGitPath 81.8% forgejo.org/services/wiki/wiki_path.go:113: GitPathToWebPath 90.0% forgejo.org/services/wiki/wiki_path.go:129: WebPathToUserTitle 71.4% forgejo.org/services/wiki/wiki_path.go:140: WebPathToURLPath 100.0% forgejo.org/services/wiki/wiki_path.go:144: WebPathFromRequest 100.0% forgejo.org/services/wiki/wiki_path.go:151: UserTitleToWebPath 80.0% forgejo.org/services/wiki/wiki_path.go:163: ToWikiPageMetaData 100.0% forgejo.org/tests/integration/api_repo_file_helpers.go:18: createFileInBranch 100.0% ... total: (statements) 63.9% ``` Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9004 Reviewed-by: jerger Co-authored-by: Earl Warren Co-committed-by: Earl Warren --- .forgejo/workflows/coverage.yml | 89 +++++++++++++++++++++++++++++++++ Makefile | 56 ++++++++++++--------- contrib/coverage-helper.sh | 50 ++++++++++++++++++ 3 files changed, 171 insertions(+), 24 deletions(-) create mode 100644 .forgejo/workflows/coverage.yml create mode 100755 contrib/coverage-helper.sh diff --git a/.forgejo/workflows/coverage.yml b/.forgejo/workflows/coverage.yml new file mode 100644 index 0000000000..7eb0ef7ecb --- /dev/null +++ b/.forgejo/workflows/coverage.yml @@ -0,0 +1,89 @@ +name: coverage + +on: + workflow_dispatch: + inputs: + repository: + description: 'repository' + type: string + ref: + description: 'ref' + type: string + unit-tests-env: + description: 'COVERAGE_TEST_PACKAGES=forgejo.org/modules/actions' + type: string + integration-tests-env: + description: 'COVERAGE_TEST_ARGS=-run=TestAPIListRepoComments' + type: string + +jobs: + all: + runs-on: docker + container: + image: 'data.forgejo.org/oci/ci:1' + options: --tmpfs /tmp:exec,noatime + services: + elasticsearch: + image: data.forgejo.org/oci/bitnami/elasticsearch:7 + options: --tmpfs /bitnami/elasticsearch/data + env: + discovery.type: single-node + ES_JAVA_OPTS: "-Xms512m -Xmx512m" + minio: + image: data.forgejo.org/oci/bitnami/minio:2024.8.17 + options: >- + --hostname gitea.minio --tmpfs /bitnami/minio/data:noatime + env: + MINIO_DOMAIN: minio + MINIO_ROOT_USER: 123456 + MINIO_ROOT_PASSWORD: 12345678 + mysql: + image: 'data.forgejo.org/oci/bitnami/mysql:8.4' + env: + ALLOW_EMPTY_PASSWORD: yes + MYSQL_DATABASE: testgitea + # + # See also https://codeberg.org/forgejo/forgejo/issues/976 + # + MYSQL_EXTRA_FLAGS: --innodb-adaptive-flushing=OFF --innodb-buffer-pool-size=4G --innodb-log-buffer-size=128M --innodb-flush-log-at-trx-commit=0 --innodb-flush-log-at-timeout=30 --innodb-flush-method=nosync --innodb-fsync-threshold=1000000000 --disable-log-bin + options: --tmpfs /bitnami/mysql/data:noatime + ldap: + image: data.forgejo.org/oci/test-openldap:latest + pgsql: + image: data.forgejo.org/oci/bitnami/postgresql:16 + env: + POSTGRESQL_DATABASE: test + POSTGRESQL_PASSWORD: postgres + POSTGRESQL_FSYNC: off + POSTGRESQL_EXTRA_FLAGS: -c full_page_writes=off + options: --tmpfs /bitnami/postgresql + cacher: + image: registry.redict.io/redict:7.3.0-scratch + options: --tmpfs /data:noatime + steps: + - uses: https://data.forgejo.org/actions/checkout@v4 + with: + repository: ${{ inputs.repository }} + ref: ${{ inputs.ref }} + - uses: ./.forgejo/workflows-composite/setup-env + - name: install git >= 2.42 + uses: ./.forgejo/workflows-composite/apt-install-from + with: + packages: git + - uses: ./.forgejo/workflows-composite/build-backend + - run: | + su forgejo -c '${{ inputs.unit-tests-env }} make coverage-run' + su forgejo -c '${{ inputs.integration-tests-env }} make coverage-run-pgsql' + su forgejo -c '${{ inputs.integration-tests-env }} make coverage-run-mysql' + su forgejo -c '${{ inputs.integration-tests-env }} make coverage-run-sqlite' + su forgejo -c 'make coverage-merge' + timeout-minutes: 180 + env: + TEST_ELASTICSEARCH_URL: http://elasticsearch:9200 + TEST_MINIO_ENDPOINT: minio:9000 + TEST_LDAP: 1 + TEST_REDIS_SERVER: cacher:6379 + - uses: https://code.forgejo.org/forgejo/upload-artifact@v4 + with: + name: coverage + path: ${{ forge.workspace }}/coverage/merged diff --git a/Makefile b/Makefile index 03d873c544..9b87eb4af0 100644 --- a/Makefile +++ b/Makefile @@ -238,6 +238,9 @@ help: @echo " - test-frontend-coverage test frontend files and display code coverage" @echo " - test-backend test backend files" @echo " - test-remote-cacher test backend files that use a remote cache" + @echo " - coverage-run* test and collect coverages in the coverage/data directory" + @echo " - coverage-show-html display coverage-run results in an HTML page" + @echo " - coverage-show-percent display coverage-run per package coverage percentage" @echo " - test-e2e-sqlite[\#name.test.e2e] test end to end using playwright and sqlite" @echo " - webpack build webpack files" @echo " - svg build svg files" @@ -556,16 +559,35 @@ test\#%: @echo "Running go test with $(GOTESTFLAGS) -tags '$(TEST_TAGS)'..." @$(GOTEST) $(GOTESTFLAGS) -tags='$(TEST_TAGS)' -run $(subst .,/,$*) $(GO_TEST_PACKAGES) -.PHONY: coverage -coverage: - grep '^\(mode: .*\)\|\(.*:[0-9]\+\.[0-9]\+,[0-9]\+\.[0-9]\+ [0-9]\+ [0-9]\+\)$$' coverage.out > coverage-bodged.out - grep '^\(mode: .*\)\|\(.*:[0-9]\+\.[0-9]\+,[0-9]\+\.[0-9]\+ [0-9]\+ [0-9]\+\)$$' integration.coverage.out > integration.coverage-bodged.out - $(GO) run build/gocovmerge.go integration.coverage-bodged.out coverage-bodged.out > coverage.all +coverage-merge: + rm -fr coverage/merged ; mkdir -p coverage/merged + $(GO) tool covdata merge -i `find coverage/data -name 'covmeta.*' | sed -e 's|/covmeta.*|,|' | tr -d '\n' | sed -e 's/,$$//'` -o coverage/merged -.PHONY: unit-test-coverage -unit-test-coverage: - @echo "Running unit-test-coverage $(GOTESTFLAGS) -tags '$(TEST_TAGS)'..." - @$(GOTEST) $(GOTESTFLAGS) -timeout=20m -tags='$(TEST_TAGS)' -cover -coverprofile coverage.out $(GO_TEST_PACKAGES) && echo "\n==>\033[32m Ok\033[m\n" || exit 1 +coverage-convert: coverage-merge + $(GO) tool covdata textfmt -i=coverage/merged -o=coverage/textfmt.out + +coverage-show-html: coverage-convert + ( cd coverage ; $(GO) tool cover -html=textfmt.out -o coverage.html ) + xdg-open coverage/coverage.html + +coverage-show-percentage: coverage-convert + go tool cover -func=coverage/textfmt.out + +coverage-run: + contrib/coverage-helper.sh test_packages $(COVERAGE_TEST_PACKAGES) + +coverage-run-%: generate-ini-% + # + # Migration tests go first + # + $(MAKE) GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/$*.ini COVERAGE_TEST_ARGS= COVERAGE_TEST_PACKAGES=forgejo.org/tests/integration/migration-test coverage-run + for pkg in $(MIGRATION_PACKAGES); do \ + $(MAKE) GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/$*.ini COVERAGE_TEST_DATABASE=$* COVERAGE_TEST_ARGS= COVERAGE_TEST_PACKAGES=$$pkg coverage-run ; \ + done + # + # All other integration tests follow + # + $(MAKE) GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/$*.ini COVERAGE_TEST_DATABASE=$* COVERAGE_TEST_PACKAGES=forgejo.org/tests/integration coverage-run .PHONY: tidy tidy: @@ -685,7 +707,7 @@ test-e2e-mysql\#%: playwright e2e.mysql.test generate-ini-mysql GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini $(GOTESTCOMPILEDRUNPREFIX) ./e2e.mysql.test $(GOTESTCOMPILEDRUNSUFFIX) -test.run TestE2e/$* .PHONY: test-e2e-pgsql -test-e2e-pgsql: playwright e2e.pgsql.test generate-ini-pgsql +GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.initest-e2e-pgsql: playwright e2e.pgsql.test generate-ini-pgsql GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini $(GOTESTCOMPILEDRUNPREFIX) ./e2e.pgsql.test $(GOTESTCOMPILEDRUNSUFFIX) -test.run TestE2e .PHONY: test-e2e-pgsql\#% @@ -708,14 +730,6 @@ bench-mysql: integrations.mysql.test generate-ini-mysql bench-pgsql: integrations.pgsql.test generate-ini-pgsql GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini ./integrations.pgsql.test -test.cpuprofile=cpu.out -test.run DontRunTests -test.bench . -.PHONY: integration-test-coverage -integration-test-coverage: integrations.cover.test generate-ini-mysql - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini ./integrations.cover.test -test.coverprofile=integration.coverage.out - -.PHONY: integration-test-coverage-sqlite -integration-test-coverage-sqlite: integrations.cover.sqlite.test generate-ini-sqlite - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini ./integrations.cover.sqlite.test -test.coverprofile=integration.coverage.out - integrations.mysql.test: git-check $(GO_SOURCES) $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/integration -o integrations.mysql.test @@ -725,12 +739,6 @@ integrations.pgsql.test: git-check $(GO_SOURCES) integrations.sqlite.test: git-check $(GO_SOURCES) $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/integration -o integrations.sqlite.test -tags '$(TEST_TAGS)' -integrations.cover.test: git-check $(GO_SOURCES) - $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/integration -coverpkg $(shell echo $(GO_TEST_PACKAGES) | tr ' ' ',') -o integrations.cover.test - -integrations.cover.sqlite.test: git-check $(GO_SOURCES) - $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/integration -coverpkg $(shell echo $(GO_TEST_PACKAGES) | tr ' ' ',') -o integrations.cover.sqlite.test -tags '$(TEST_TAGS)' - .PHONY: migrations.mysql.test migrations.mysql.test: $(GO_SOURCES) generate-ini-mysql $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/integration/migration-test -o migrations.mysql.test diff --git a/contrib/coverage-helper.sh b/contrib/coverage-helper.sh new file mode 100755 index 0000000000..ec9f5469ea --- /dev/null +++ b/contrib/coverage-helper.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +set -e +#set -x +PS4='${BASH_SOURCE[0]}:$LINENO: ${FUNCNAME[0]}: ' + +# +# Those must be explicitly required and are excluded from the full list of packages because they +# would interfere with the testing fixtures. +# +excluded+='forgejo.org/models/migrations|' # must be run before database specific tests +excluded+='forgejo.org/models/forgejo_migrations|' # must be run before database specific tests +excluded+='forgejo.org/tests/integration/migration-test|' # must be run before database specific tests +excluded+='forgejo.org/tests|' # only tests, no coverage to get there +excluded+='forgejo.org/tests/e2e|' # JavaScript is not in scope here and if it adds coverage it should not be counted +excluded+='FAKETERMINATOR' # do not modify + +: ${COVERAGEDIR:=$(pwd)/coverage/data} +: ${GO:=$(go env GOROOT)/bin/go} + +DEFAULT_TEST_PACKAGES=$($GO list ./... | grep -E -v "$excluded") + +COVERED_PACKAGES=$($GO list ./...) +COVERED_PACKAGES=$(echo $COVERED_PACKAGES | sed -e 's/ /,/g') + +function run_test() { + local package="$1" + if echo "$package" | grep --quiet --fixed-string ".."; then + echo "$package contains a suspicious .." + return 1 + fi + + local coverage="$COVERAGEDIR/$COVERAGE_TEST_DATABASE/$package" + rm -fr $coverage + mkdir -p $coverage + + # + # -race cannot be used because it requires -covermode atomic which is + # different from the end-to-end tests and would cause issues wen merging + # + $GO test -timeout=20m -tags='sqlite sqlite_unlock_notify' -cover $package -coverpkg $COVERED_PACKAGES $COVERAGE_TEST_ARGS -args -test.gocoverdir=$coverage |& grep -v 'warning: no packages being tested depend on matches for pattern' +} + +function test_packages() { + for package in ${@:-$DEFAULT_TEST_PACKAGES}; do + run_test $package + done +} + +"$@" From 0606f057071ef31084988397b7c8aa3d28b6d780 Mon Sep 17 00:00:00 2001 From: Leni Kadali Date: Tue, 26 Aug 2025 20:30:18 +0200 Subject: [PATCH 357/495] chore: Use common SetCaptchaData in link account (#8592) Fixes [#7990](https://codeberg.org/forgejo/forgejo/issues/7990) This PR upstreams commit [2bf3621c99](https://codeberg.org/Codeberg-Infrastructure/forgejo/commit/2bf3621c99f04112015ecbdc2106744a2370844c) which fixes `SetCaptcha` not being called when it is typically used in other places. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8592 Reviewed-by: Beowulf Co-authored-by: Leni Kadali Co-committed-by: Leni Kadali --- routers/web/auth/linkaccount.go | 36 +++++++++------------------------ 1 file changed, 9 insertions(+), 27 deletions(-) diff --git a/routers/web/auth/linkaccount.go b/routers/web/auth/linkaccount.go index 2bba614d8c..031998d3a1 100644 --- a/routers/web/auth/linkaccount.go +++ b/routers/web/auth/linkaccount.go @@ -32,15 +32,9 @@ func LinkAccount(ctx *context.Context) { ctx.Data["DisablePassword"] = !setting.Service.RequireExternalRegistrationPassword || setting.Service.AllowOnlyExternalRegistration ctx.Data["Title"] = ctx.Tr("link_account") ctx.Data["LinkAccountMode"] = true - ctx.Data["EnableCaptcha"] = setting.Service.EnableCaptcha && setting.Service.RequireExternalRegistrationCaptcha - ctx.Data["Captcha"] = context.GetImageCaptcha() - ctx.Data["CaptchaType"] = setting.Service.CaptchaType - ctx.Data["RecaptchaURL"] = setting.Service.RecaptchaURL - ctx.Data["RecaptchaSitekey"] = setting.Service.RecaptchaSitekey - ctx.Data["HcaptchaSitekey"] = setting.Service.HcaptchaSitekey - ctx.Data["McaptchaSitekey"] = setting.Service.McaptchaSitekey - ctx.Data["McaptchaURL"] = setting.Service.McaptchaURL - ctx.Data["CfTurnstileSitekey"] = setting.Service.CfTurnstileSitekey + if setting.Service.RequireExternalRegistrationCaptcha { + context.SetCaptchaData(ctx) + } ctx.Data["DisableRegistration"] = setting.Service.DisableRegistration ctx.Data["AllowOnlyInternalRegistration"] = setting.Service.AllowOnlyInternalRegistration ctx.Data["ShowRegistrationButton"] = false @@ -112,15 +106,9 @@ func LinkAccountPostSignIn(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("link_account") ctx.Data["LinkAccountMode"] = true ctx.Data["LinkAccountModeSignIn"] = true - ctx.Data["EnableCaptcha"] = setting.Service.EnableCaptcha && setting.Service.RequireExternalRegistrationCaptcha - ctx.Data["RecaptchaURL"] = setting.Service.RecaptchaURL - ctx.Data["Captcha"] = context.GetImageCaptcha() - ctx.Data["CaptchaType"] = setting.Service.CaptchaType - ctx.Data["RecaptchaSitekey"] = setting.Service.RecaptchaSitekey - ctx.Data["HcaptchaSitekey"] = setting.Service.HcaptchaSitekey - ctx.Data["McaptchaSitekey"] = setting.Service.McaptchaSitekey - ctx.Data["McaptchaURL"] = setting.Service.McaptchaURL - ctx.Data["CfTurnstileSitekey"] = setting.Service.CfTurnstileSitekey + if setting.Service.EnableCaptcha && setting.Service.RequireExternalRegistrationCaptcha { + context.SetCaptchaData(ctx) + } ctx.Data["DisableRegistration"] = setting.Service.DisableRegistration ctx.Data["ShowRegistrationButton"] = false ctx.Data["EnableInternalSignIn"] = true @@ -200,15 +188,9 @@ func LinkAccountPostRegister(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("link_account") ctx.Data["LinkAccountMode"] = true ctx.Data["LinkAccountModeRegister"] = true - ctx.Data["EnableCaptcha"] = setting.Service.EnableCaptcha && setting.Service.RequireExternalRegistrationCaptcha - ctx.Data["RecaptchaURL"] = setting.Service.RecaptchaURL - ctx.Data["Captcha"] = context.GetImageCaptcha() - ctx.Data["CaptchaType"] = setting.Service.CaptchaType - ctx.Data["RecaptchaSitekey"] = setting.Service.RecaptchaSitekey - ctx.Data["HcaptchaSitekey"] = setting.Service.HcaptchaSitekey - ctx.Data["McaptchaSitekey"] = setting.Service.McaptchaSitekey - ctx.Data["McaptchaURL"] = setting.Service.McaptchaURL - ctx.Data["CfTurnstileSitekey"] = setting.Service.CfTurnstileSitekey + if setting.Service.RequireExternalRegistrationCaptcha { + context.SetCaptchaData(ctx) + } ctx.Data["DisableRegistration"] = setting.Service.DisableRegistration ctx.Data["ShowRegistrationButton"] = false From 6c506fc2f062357ef7c1097b2e75dff17c5af893 Mon Sep 17 00:00:00 2001 From: Gusted Date: Tue, 26 Aug 2025 21:45:14 +0200 Subject: [PATCH 358/495] fix: Use mocked HTTP request --- services/migrations/pagure_test.go | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/services/migrations/pagure_test.go b/services/migrations/pagure_test.go index c81bd28904..c894266d74 100644 --- a/services/migrations/pagure_test.go +++ b/services/migrations/pagure_test.go @@ -25,16 +25,22 @@ func TestPagureDownloadRepoWithPublicIssues(t *testing.T) { apiUser := os.Getenv("PAGURE_API_USER") apiPassword := os.Getenv("PAGURE_API_TOKEN") - cloneAddr := fmt.Sprintf("https://%s:%s@pagure.io/protop2g-test-srce.git", cloneUser, clonePassword) - u, _ := url.Parse(cloneAddr) - fixtPath := "./testdata/pagure/full_download/unauthorized" server := unittest.NewMockWebServer(t, "https://pagure.io", fixtPath, false) defer server.Close() + serverURL, err := url.Parse(server.URL) + require.NoError(t, err) + + if clonePassword != "" || cloneUser != "" { + serverURL.User = url.UserPassword(cloneUser, clonePassword) + } + serverURL.Path = "protop2g-test-srce.git" + cloneAddr := serverURL.String() + factory := &PagureDownloaderFactory{} downloader, err := factory.New(t.Context(), base.MigrateOptions{ - CloneAddr: u.String(), + CloneAddr: cloneAddr, AuthUsername: apiUser, AuthPassword: apiPassword, }) @@ -217,6 +223,7 @@ func TestPagureDownloadRepoWithPublicIssues(t *testing.T) { Closed: timePtr(time.Date(2025, time.May, 19, 6, 17, 11, 0, time.UTC)), MergedTime: timePtr(time.Date(2025, time.May, 19, 6, 17, 11, 0, time.UTC)), Merged: true, + PatchURL: server.URL + "/protop2g-test-srce/pull-request/10.patch", Labels: []*base.Label{ { Name: "ffff", @@ -226,6 +233,7 @@ func TestPagureDownloadRepoWithPublicIssues(t *testing.T) { Ref: "test-ffff", SHA: "1a6ccc212aa958a0fe76155c2907c889969a7224", RepoName: "protop2g-test-srce", + CloneURL: server.URL + "/protop2g-test-srce.git", }, Base: base.PullRequestBranch{ Ref: "main", @@ -245,6 +253,7 @@ func TestPagureDownloadRepoWithPublicIssues(t *testing.T) { Closed: timePtr(time.Date(2025, time.May, 19, 6, 14, 3, 0, time.UTC)), MergedTime: timePtr(time.Date(2025, time.May, 19, 6, 14, 3, 0, time.UTC)), Merged: true, + PatchURL: server.URL + "/protop2g-test-srce/pull-request/9.patch", Labels: []*base.Label{ { Name: "eeee", @@ -254,6 +263,7 @@ func TestPagureDownloadRepoWithPublicIssues(t *testing.T) { Ref: "test-eeee", SHA: "01b420e2964928a15f790f9b7c1a0053e7b5f0a5", RepoName: "protop2g-test-srce", + CloneURL: server.URL + "/protop2g-test-srce.git", }, Base: base.PullRequestBranch{ Ref: "main", @@ -273,6 +283,7 @@ func TestPagureDownloadRepoWithPublicIssues(t *testing.T) { Closed: timePtr(time.Date(2025, time.May, 5, 6, 54, 13, 0, time.UTC)), MergedTime: timePtr(time.Date(2025, time.May, 5, 6, 54, 13, 0, time.UTC)), // THIS IS WRONG Merged: false, + PatchURL: server.URL + "/protop2g-test-srce/pull-request/8.patch", Labels: []*base.Label{ { Name: "dddd", @@ -282,6 +293,7 @@ func TestPagureDownloadRepoWithPublicIssues(t *testing.T) { Ref: "test-dddd", SHA: "0bc8b0c38e0790e9ef5c8d512a00b9c4dd048160", RepoName: "protop2g-test-srce", + CloneURL: server.URL + "/protop2g-test-srce.git", }, Base: base.PullRequestBranch{ Ref: "main", @@ -301,6 +313,7 @@ func TestPagureDownloadRepoWithPublicIssues(t *testing.T) { Closed: timePtr(time.Date(2025, time.May, 5, 6, 54, 3, 0, time.UTC)), // IT is CLOSED, Not MERGED so SHOULD NOT BE NIL MergedTime: timePtr(time.Date(2025, time.May, 5, 6, 54, 3, 0, time.UTC)), // THIS IS WRONG Merged: false, + PatchURL: server.URL + "/protop2g-test-srce/pull-request/7.patch", Labels: []*base.Label{ { Name: "cccc", @@ -310,6 +323,7 @@ func TestPagureDownloadRepoWithPublicIssues(t *testing.T) { Ref: "test-cccc", SHA: "f1246e331cade9341b9e4f311b7a134f99893d21", RepoName: "protop2g-test-srce", + CloneURL: server.URL + "/protop2g-test-srce.git", }, Base: base.PullRequestBranch{ Ref: "main", @@ -329,6 +343,7 @@ func TestPagureDownloadRepoWithPublicIssues(t *testing.T) { Closed: timePtr(time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC)), MergedTime: timePtr(time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC)), Merged: false, + PatchURL: server.URL + "/protop2g-test-srce/pull-request/6.patch", Labels: []*base.Label{ { Name: "bbbb", @@ -338,6 +353,7 @@ func TestPagureDownloadRepoWithPublicIssues(t *testing.T) { Ref: "test-bbbb", SHA: "2d40761dc53e6fa060ac49d88e1452c6751d4b1c", RepoName: "protop2g-test-srce", + CloneURL: server.URL + "/protop2g-test-srce.git", }, Base: base.PullRequestBranch{ Ref: "main", @@ -357,6 +373,7 @@ func TestPagureDownloadRepoWithPublicIssues(t *testing.T) { Closed: timePtr(time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC)), MergedTime: timePtr(time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC)), Merged: false, + PatchURL: server.URL + "/protop2g-test-srce/pull-request/5.patch", Labels: []*base.Label{ { Name: "aaaa", @@ -366,6 +383,7 @@ func TestPagureDownloadRepoWithPublicIssues(t *testing.T) { Ref: "test-aaaa", SHA: "b55e5c91d2572d60a8d7e71b3d3003e523127bd4", RepoName: "protop2g-test-srce", + CloneURL: server.URL + "/protop2g-test-srce.git", }, Base: base.PullRequestBranch{ Ref: "main", From 3f7f977834602100063174a085ffde59803d8db7 Mon Sep 17 00:00:00 2001 From: Gusted Date: Tue, 26 Aug 2025 21:45:25 +0200 Subject: [PATCH 359/495] fix: generate response via mock server --- .../GET_%2Fapi%2F0%2Fprotop2g-test-srce | 1 - ...0e2964928a15f790f9b7c1a0053e7b5f0a5%2Finfo | 1 - ...0c38e0790e9ef5c8d512a00b9c4dd048160%2Finfo | 1 - ...c212aa958a0fe76155c2907c889969a7224%2Finfo | 1 - ...61dc53e6fa060ac49d88e1452c6751d4b1c%2Finfo | 1 - ...c91d2572d60a8d7e71b3d3003e523127bd4%2Finfo | 1 - ...e331cade9341b9e4f311b7a134f99893d21%2Finfo | 1 - ...2Fapi%2F0%2Fprotop2g-test-srce%2Fissue%2F3 | 1 - ...2Fapi%2F0%2Fprotop2g-test-srce%2Fissue%2F4 | 1 - ...T_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissues | 1 - ...0%2Fprotop2g-test-srce%2Fpull-request%2F10 | 1 - ...F0%2Fprotop2g-test-srce%2Fpull-request%2F5 | 1 - ...F0%2Fprotop2g-test-srce%2Fpull-request%2F6 | 1 - ...F0%2Fprotop2g-test-srce%2Fpull-request%2F7 | 1 - ...F0%2Fprotop2g-test-srce%2Fpull-request%2F8 | 1 - ...F0%2Fprotop2g-test-srce%2Fpull-request%2F9 | 1 - ...i%2F0%2Fprotop2g-test-srce%2Fpull-requests | 1 - ...Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Faaaa | 1 - ...Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fbbbb | 1 - ...Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fcccc | 1 - ...Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fdddd | 1 - ...Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Feeee | 1 - ...Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fffff | 1 - ...Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fgggg | 1 - ...GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftags | 1 - .../GET_%2Fapi%2F0%2Fprotop2g-test-srce | 21 +- ...0e2964928a15f790f9b7c1a0053e7b5f0a5%2Finfo | 21 +- ...0c38e0790e9ef5c8d512a00b9c4dd048160%2Finfo | 21 +- ...c212aa958a0fe76155c2907c889969a7224%2Finfo | 21 +- ...61dc53e6fa060ac49d88e1452c6751d4b1c%2Finfo | 21 +- ...c91d2572d60a8d7e71b3d3003e523127bd4%2Finfo | 21 +- ...e331cade9341b9e4f311b7a134f99893d21%2Finfo | 21 +- ...2Fapi%2F0%2Fprotop2g-test-srce%2Fissue%2F1 | 125 -- ...2Fapi%2F0%2Fprotop2g-test-srce%2Fissue%2F2 | 206 ++- ...T_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissues | 331 ---- ...e%2Fissues%3Fpage=1&per_page=20&status=all | 328 ++++ ...0%2Fprotop2g-test-srce%2Fpull-request%2F10 | 259 --- ...F0%2Fprotop2g-test-srce%2Fpull-request%2F5 | 21 +- ...F0%2Fprotop2g-test-srce%2Fpull-request%2F6 | 249 --- ...F0%2Fprotop2g-test-srce%2Fpull-request%2F7 | 234 --- ...F0%2Fprotop2g-test-srce%2Fpull-request%2F8 | 234 --- ...F0%2Fprotop2g-test-srce%2Fpull-request%2F9 | 239 --- ...i%2F0%2Fprotop2g-test-srce%2Fpull-requests | 507 ------ ...l-requests%3Fpage=1&per_page=20&status=all | 1418 +++++++++++++++++ ...Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Faaaa | 21 +- ...Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fbbbb | 21 +- ...Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fcccc | 21 +- ...Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fdddd | 21 +- ...Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Feeee | 21 +- ...Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fffff | 21 +- ...Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fgggg | 21 +- ...Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fhhhh | 15 + ...GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftags | 37 +- 53 files changed, 2103 insertions(+), 2419 deletions(-) delete mode 100644 services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissue%2F1 delete mode 100644 services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissues create mode 100644 services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissues%3Fpage=1&per_page=20&status=all delete mode 100644 services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F10 delete mode 100644 services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F6 delete mode 100644 services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F7 delete mode 100644 services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F8 delete mode 100644 services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F9 delete mode 100644 services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-requests create mode 100644 services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-requests%3Fpage=1&per_page=20&status=all create mode 100644 services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fhhhh diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce index 5f569b145c..d1693ef67f 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce @@ -1,4 +1,3 @@ -HTTP/2 200 date: Wed, 23 Jul 2025 06:51:21 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F01b420e2964928a15f790f9b7c1a0053e7b5f0a5%2Finfo b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F01b420e2964928a15f790f9b7c1a0053e7b5f0a5%2Finfo index e31c4193e0..063950557b 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F01b420e2964928a15f790f9b7c1a0053e7b5f0a5%2Finfo +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F01b420e2964928a15f790f9b7c1a0053e7b5f0a5%2Finfo @@ -1,4 +1,3 @@ -HTTP/2 200 date: Wed, 23 Jul 2025 06:44:23 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F0bc8b0c38e0790e9ef5c8d512a00b9c4dd048160%2Finfo b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F0bc8b0c38e0790e9ef5c8d512a00b9c4dd048160%2Finfo index 722b59a6dd..dbd4992dbd 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F0bc8b0c38e0790e9ef5c8d512a00b9c4dd048160%2Finfo +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F0bc8b0c38e0790e9ef5c8d512a00b9c4dd048160%2Finfo @@ -1,4 +1,3 @@ -HTTP/2 200 date: Wed, 23 Jul 2025 06:44:57 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F1a6ccc212aa958a0fe76155c2907c889969a7224%2Finfo b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F1a6ccc212aa958a0fe76155c2907c889969a7224%2Finfo index 8d3fb6f5f2..ce899b5e29 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F1a6ccc212aa958a0fe76155c2907c889969a7224%2Finfo +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F1a6ccc212aa958a0fe76155c2907c889969a7224%2Finfo @@ -1,4 +1,3 @@ -HTTP/2 200 date: Wed, 23 Jul 2025 06:43:47 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F2d40761dc53e6fa060ac49d88e1452c6751d4b1c%2Finfo b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F2d40761dc53e6fa060ac49d88e1452c6751d4b1c%2Finfo index 852a4b724d..412298b22c 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F2d40761dc53e6fa060ac49d88e1452c6751d4b1c%2Finfo +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F2d40761dc53e6fa060ac49d88e1452c6751d4b1c%2Finfo @@ -1,4 +1,3 @@ -HTTP/2 200 date: Wed, 23 Jul 2025 06:46:23 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2Fb55e5c91d2572d60a8d7e71b3d3003e523127bd4%2Finfo b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2Fb55e5c91d2572d60a8d7e71b3d3003e523127bd4%2Finfo index a35fb1f416..6ac5ccf674 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2Fb55e5c91d2572d60a8d7e71b3d3003e523127bd4%2Finfo +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2Fb55e5c91d2572d60a8d7e71b3d3003e523127bd4%2Finfo @@ -1,4 +1,3 @@ -HTTP/2 200 date: Wed, 23 Jul 2025 06:46:59 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2Ff1246e331cade9341b9e4f311b7a134f99893d21%2Finfo b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2Ff1246e331cade9341b9e4f311b7a134f99893d21%2Finfo index 8e161ce97c..3505297407 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2Ff1246e331cade9341b9e4f311b7a134f99893d21%2Finfo +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2Ff1246e331cade9341b9e4f311b7a134f99893d21%2Finfo @@ -1,4 +1,3 @@ -HTTP/2 200 date: Wed, 23 Jul 2025 06:45:31 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissue%2F3 b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissue%2F3 index d9b5d17073..a5116fa017 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissue%2F3 +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissue%2F3 @@ -1,4 +1,3 @@ -HTTP/2 404 date: Wed, 23 Jul 2025 06:17:46 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissue%2F4 b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissue%2F4 index 6aa95bba6a..e4dbc1976d 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissue%2F4 +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissue%2F4 @@ -1,4 +1,3 @@ -HTTP/2 404 date: Wed, 23 Jul 2025 06:17:58 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissues b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissues index 84a9e44c35..e04d6fd928 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissues +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissues @@ -1,4 +1,3 @@ -HTTP/2 200 date: Wed, 30 Jul 2025 05:15:59 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F10 b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F10 index e43f97a590..9c2bd27396 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F10 +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F10 @@ -1,4 +1,3 @@ -HTTP/2 200 date: Wed, 23 Jul 2025 06:21:04 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F5 b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F5 index be1c0e3a25..3fc0a4be13 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F5 +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F5 @@ -1,4 +1,3 @@ -HTTP/2 200 date: Wed, 23 Jul 2025 06:19:26 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F6 b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F6 index 878989a6cd..46a27d2130 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F6 +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F6 @@ -1,4 +1,3 @@ -HTTP/2 200 date: Wed, 23 Jul 2025 06:19:47 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F7 b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F7 index 51c269273c..0693dc39f3 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F7 +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F7 @@ -1,4 +1,3 @@ -HTTP/2 200 date: Wed, 23 Jul 2025 06:20:00 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F8 b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F8 index 45ae72d6e8..f5a3ad4712 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F8 +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F8 @@ -1,4 +1,3 @@ -HTTP/2 200 date: Wed, 23 Jul 2025 06:20:17 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F9 b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F9 index 2e19157948..f65e51e90d 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F9 +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F9 @@ -1,4 +1,3 @@ -HTTP/2 200 date: Wed, 23 Jul 2025 06:20:51 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-requests b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-requests index 15b69e8f03..a047968f02 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-requests +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-requests @@ -1,4 +1,3 @@ -HTTP/2 200 date: Wed, 23 Jul 2025 06:18:47 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Faaaa b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Faaaa index d0f24e646e..5afe87654e 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Faaaa +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Faaaa @@ -1,4 +1,3 @@ -HTTP/2 200 date: Wed, 23 Jul 2025 05:34:39 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fbbbb b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fbbbb index a859096f25..37d40b9c6e 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fbbbb +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fbbbb @@ -1,4 +1,3 @@ -HTTP/2 200 date: Wed, 23 Jul 2025 05:34:50 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fcccc b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fcccc index c4fdc9aa46..4f170a50fe 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fcccc +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fcccc @@ -1,4 +1,3 @@ -HTTP/2 200 date: Wed, 23 Jul 2025 05:35:02 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fdddd b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fdddd index db9ad09a74..fb79ce7a97 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fdddd +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fdddd @@ -1,4 +1,3 @@ -HTTP/2 200 date: Wed, 23 Jul 2025 05:36:23 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Feeee b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Feeee index eac0faf464..5e968f23b9 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Feeee +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Feeee @@ -1,4 +1,3 @@ -HTTP/2 200 date: Wed, 23 Jul 2025 05:36:34 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fffff b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fffff index af5935aa46..83d48ee851 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fffff +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fffff @@ -1,4 +1,3 @@ -HTTP/2 200 date: Wed, 23 Jul 2025 05:36:48 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fgggg b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fgggg index 28fd0ef15d..85a07333f8 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fgggg +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fgggg @@ -1,4 +1,3 @@ -HTTP/2 200 date: Wed, 23 Jul 2025 05:37:23 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftags b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftags index 1176b532a4..131f4b34a8 100644 --- a/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftags +++ b/services/migrations/testdata/pagure/full_download/authorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftags @@ -1,4 +1,3 @@ -HTTP/2 200 date: Wed, 23 Jul 2025 05:16:48 GMT server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 x-xss-protection: 1; mode=block diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce index 5f569b145c..ef69d4bdb8 100644 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce +++ b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce @@ -1,15 +1,12 @@ -HTTP/2 200 -date: Wed, 23 Jul 2025 06:51:21 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 1464 -content-security-policy: default-src 'self';script-src 'self' 'nonce-Tr8ktNGt3XoBWQBIXrrPTeA1v'; style-src 'self' 'nonce-Tr8ktNGt3XoBWQBIXrrPTeA1v'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiYmI4NGRmYWMyY2Q2MzVlOWRkOTQwMGYwNzk2NzdlOGQxN2UxYTJlMCJ9.G2IX6Q.ETAG_sYgE1V9xYQNy_CD4HOP32Q; Expires=Sat, 23-Aug-2025 06:51:21 GMT; Secure; HttpOnly; Path=/ -content-type: application/json +Content-Length: 1464 +Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-tnXvEZGNmF5HI1BOPEvAXnIFi'; style-src 'self' 'nonce-tnXvEZGNmF5HI1BOPEvAXnIFi'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; +Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiOGEzYjk3NGI3NWM1MjdjYzY5MjdhM2E5MjZhNjZiZTBlNWFmYjM5MCJ9.G4-gsg.8A24PiXaZg1Cu-jRIk80lUXLWFo; Expires=Fri, 26-Sep-2025 19:46:58 GMT; Secure; HttpOnly; Path=/ +Content-Type: application/json +X-Xss-Protection: 1; mode=block +X-Content-Type-Options: nosniff +Referrer-Policy: same-origin +X-Frame-Options: ALLOW-FROM https://pagure.io/ +Strict-Transport-Security: max-age=31536000; includeSubDomains; preload { "access_groups": { diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F01b420e2964928a15f790f9b7c1a0053e7b5f0a5%2Finfo b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F01b420e2964928a15f790f9b7c1a0053e7b5f0a5%2Finfo index e31c4193e0..2501f4f6e3 100644 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F01b420e2964928a15f790f9b7c1a0053e7b5f0a5%2Finfo +++ b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F01b420e2964928a15f790f9b7c1a0053e7b5f0a5%2Finfo @@ -1,15 +1,12 @@ -HTTP/2 200 -date: Wed, 23 Jul 2025 06:44:23 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 452 -content-security-policy: default-src 'self';script-src 'self' 'nonce-jtS0HiLSSKCUK3FUuLv7XD9KG'; style-src 'self' 'nonce-jtS0HiLSSKCUK3FUuLv7XD9KG'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiY2EzN2Y5MTI1ZjkxNTkzMDViMWQ5ZGVhYjkyNzVlZTkwNmVjYzgzYiJ9.G2IWRw.1ZmhWySKFk3Lw_bA-EwmcNCgcz0; Expires=Sat, 23-Aug-2025 06:44:23 GMT; Secure; HttpOnly; Path=/ -content-type: application/json +Strict-Transport-Security: max-age=31536000; includeSubDomains; preload +X-Xss-Protection: 1; mode=block +Referrer-Policy: same-origin +Content-Length: 452 +Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-Y3ZN3d6QZqSLwh8xAkWYBzeiT'; style-src 'self' 'nonce-Y3ZN3d6QZqSLwh8xAkWYBzeiT'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; +Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiMzJiMzRmYTllNjVkMTQzYjQzNGIxOTlmNzliODZlOTRjMzA3NmQ1MiJ9.G4-gtg.PdKDFShx8RPQiN9BHaw7eAf_uzI; Expires=Fri, 26-Sep-2025 19:47:02 GMT; Secure; HttpOnly; Path=/ +Content-Type: application/json +X-Content-Type-Options: nosniff +X-Frame-Options: ALLOW-FROM https://pagure.io/ { "author": "Akashdeep Dhar", diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F0bc8b0c38e0790e9ef5c8d512a00b9c4dd048160%2Finfo b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F0bc8b0c38e0790e9ef5c8d512a00b9c4dd048160%2Finfo index 722b59a6dd..89e6c4cae6 100644 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F0bc8b0c38e0790e9ef5c8d512a00b9c4dd048160%2Finfo +++ b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F0bc8b0c38e0790e9ef5c8d512a00b9c4dd048160%2Finfo @@ -1,15 +1,12 @@ -HTTP/2 200 -date: Wed, 23 Jul 2025 06:44:57 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 454 -content-security-policy: default-src 'self';script-src 'self' 'nonce-6gKus9S40eu36HFYePUnyxB36'; style-src 'self' 'nonce-6gKus9S40eu36HFYePUnyxB36'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiZjM5ZTYyYWM5NDViYTYwMjg1MjFlMTAzNjU4OWQ3Zjc1NjA5ZmUzMSJ9.G2IWaQ._b9edyW_4DSX-umHlyVib496s00; Expires=Sat, 23-Aug-2025 06:44:57 GMT; Secure; HttpOnly; Path=/ -content-type: application/json +Referrer-Policy: same-origin +X-Frame-Options: ALLOW-FROM https://pagure.io/ +Strict-Transport-Security: max-age=31536000; includeSubDomains; preload +Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiNGU2MzY4YmE0MGE3NDdhYWVlZDUwNDczOTlhMWZiZGY5YjhjNWJjMSJ9.G4-gtg.nsP6pJHATDf8xW73FOOSlwhGUkE; Expires=Fri, 26-Sep-2025 19:47:02 GMT; Secure; HttpOnly; Path=/ +Content-Length: 454 +Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-LfLHOABekbvGWQH4XCgWCCMsc'; style-src 'self' 'nonce-LfLHOABekbvGWQH4XCgWCCMsc'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; +Content-Type: application/json +X-Xss-Protection: 1; mode=block +X-Content-Type-Options: nosniff { "author": "Akashdeep Dhar", diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F1a6ccc212aa958a0fe76155c2907c889969a7224%2Finfo b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F1a6ccc212aa958a0fe76155c2907c889969a7224%2Finfo index 8d3fb6f5f2..5fc6687589 100644 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F1a6ccc212aa958a0fe76155c2907c889969a7224%2Finfo +++ b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F1a6ccc212aa958a0fe76155c2907c889969a7224%2Finfo @@ -1,15 +1,12 @@ -HTTP/2 200 -date: Wed, 23 Jul 2025 06:43:47 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 452 -content-security-policy: default-src 'self';script-src 'self' 'nonce-bDXeQlGZOYsS26Mr1BJPgodzY'; style-src 'self' 'nonce-bDXeQlGZOYsS26Mr1BJPgodzY'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiNDRkYmIwMjQwODI1ODc4MGUzYWM4ZDZhZTkxYWQ2NTkyMDFhNTg0ZSJ9.G2IWIw.U2Rb6xUm4Wk9ODweB3hH1cggWkM; Expires=Sat, 23-Aug-2025 06:43:47 GMT; Secure; HttpOnly; Path=/ -content-type: application/json +X-Xss-Protection: 1; mode=block +Content-Length: 452 +Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiZDAxNjdjNGQwYTI4ZDRiY2RlNDVmN2NmMjE4YmExOTEyZDQyMTNhMCJ9.G4-gtQ.pOTn9bI3Kb4T50pd_-8wV840Reg; Expires=Fri, 26-Sep-2025 19:47:01 GMT; Secure; HttpOnly; Path=/ +Content-Type: application/json +X-Content-Type-Options: nosniff +Referrer-Policy: same-origin +X-Frame-Options: ALLOW-FROM https://pagure.io/ +Strict-Transport-Security: max-age=31536000; includeSubDomains; preload +Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-ye8eyhQR7cRy062VVRWLSeYzI'; style-src 'self' 'nonce-ye8eyhQR7cRy062VVRWLSeYzI'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; { "author": "Akashdeep Dhar", diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F2d40761dc53e6fa060ac49d88e1452c6751d4b1c%2Finfo b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F2d40761dc53e6fa060ac49d88e1452c6751d4b1c%2Finfo index 852a4b724d..637f9b44da 100644 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F2d40761dc53e6fa060ac49d88e1452c6751d4b1c%2Finfo +++ b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2F2d40761dc53e6fa060ac49d88e1452c6751d4b1c%2Finfo @@ -1,15 +1,12 @@ -HTTP/2 200 -date: Wed, 23 Jul 2025 06:46:23 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 454 -content-security-policy: default-src 'self';script-src 'self' 'nonce-JLGc3LbKkMMzOnQTvUIIZbAwF'; style-src 'self' 'nonce-JLGc3LbKkMMzOnQTvUIIZbAwF'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiYTE0Y2EzMTZiMWRkZGZjOTJjMjkwZTkyNjM5OWEzYWZiNjA0OTZiMCJ9.G2IWvw.SNBn8NelY5GBQ-8SmLY-Uwy-uq0; Expires=Sat, 23-Aug-2025 06:46:23 GMT; Secure; HttpOnly; Path=/ -content-type: application/json +Content-Type: application/json +X-Xss-Protection: 1; mode=block +Referrer-Policy: same-origin +X-Frame-Options: ALLOW-FROM https://pagure.io/ +Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-z4zIwQCgXhVVY9lil5w37aAVg'; style-src 'self' 'nonce-z4zIwQCgXhVVY9lil5w37aAVg'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; +X-Content-Type-Options: nosniff +Strict-Transport-Security: max-age=31536000; includeSubDomains; preload +Content-Length: 454 +Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiNzRiY2Q2NzUzYmMyMDgyZmNmYTQ2NGQ0N2Y5ODhmNjhiMzYxMjMwMyJ9.G4-gtg.mUZvuxqGocR65nDhnE43Iwl7qtQ; Expires=Fri, 26-Sep-2025 19:47:02 GMT; Secure; HttpOnly; Path=/ { "author": "Akashdeep Dhar", diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2Fb55e5c91d2572d60a8d7e71b3d3003e523127bd4%2Finfo b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2Fb55e5c91d2572d60a8d7e71b3d3003e523127bd4%2Finfo index a35fb1f416..5f04c62717 100644 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2Fb55e5c91d2572d60a8d7e71b3d3003e523127bd4%2Finfo +++ b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2Fb55e5c91d2572d60a8d7e71b3d3003e523127bd4%2Finfo @@ -1,15 +1,12 @@ -HTTP/2 200 -date: Wed, 23 Jul 2025 06:46:59 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 454 -content-security-policy: default-src 'self';script-src 'self' 'nonce-ORfdixyFztBA0Sx54SlhQuMio'; style-src 'self' 'nonce-ORfdixyFztBA0Sx54SlhQuMio'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiYmY2MjEyYzNmMDkzMmZkZDMxYjYwYzVmMDdjYzEzY2JhZTJkMjVmZCJ9.G2IW4w.JCI6ih36NlW5IPwNX1LaCbb6v5U; Expires=Sat, 23-Aug-2025 06:46:59 GMT; Secure; HttpOnly; Path=/ -content-type: application/json +X-Content-Type-Options: nosniff +Content-Length: 454 +Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiZGYyYjkwMjU1YWI2MTU1MGMzN2IwNDk5NDMyNmQ5MDhjOTQwNDM1MCJ9.G4-gtg.lauXHyPuU-GpljnUX7l5muhxnQ4; Expires=Fri, 26-Sep-2025 19:47:02 GMT; Secure; HttpOnly; Path=/ +Content-Type: application/json +X-Xss-Protection: 1; mode=block +Referrer-Policy: same-origin +X-Frame-Options: ALLOW-FROM https://pagure.io/ +Strict-Transport-Security: max-age=31536000; includeSubDomains; preload +Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-gTkLO2hyzMbZ7VoCsariFBw5p'; style-src 'self' 'nonce-gTkLO2hyzMbZ7VoCsariFBw5p'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; { "author": "Akashdeep Dhar", diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2Ff1246e331cade9341b9e4f311b7a134f99893d21%2Finfo b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2Ff1246e331cade9341b9e4f311b7a134f99893d21%2Finfo index 8e161ce97c..a0f1ee088e 100644 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2Ff1246e331cade9341b9e4f311b7a134f99893d21%2Finfo +++ b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fc%2Ff1246e331cade9341b9e4f311b7a134f99893d21%2Finfo @@ -1,15 +1,12 @@ -HTTP/2 200 -date: Wed, 23 Jul 2025 06:45:31 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 454 -content-security-policy: default-src 'self';script-src 'self' 'nonce-chsmQCN0V1J9MIqK5NU6MqBJv'; style-src 'self' 'nonce-chsmQCN0V1J9MIqK5NU6MqBJv'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiZDNmYWUzNTBlOWZkNDY0MTJlOWNkMjQ0M2FjZmYyY2VkZjBlY2ZiYSJ9.G2IWjA.co1poP1T_e07frtYRBAkxcp2RTM; Expires=Sat, 23-Aug-2025 06:45:32 GMT; Secure; HttpOnly; Path=/ -content-type: application/json +Content-Length: 454 +Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiYWQyOWJlMDZjOTE5OTdlMGJjZDY5Y2U2NWZiZDQ1N2I0YzFjNzcyYiJ9.G4-gtg.AcC4LKuD5ETKZhTYsrK7sIMQTkU; Expires=Fri, 26-Sep-2025 19:47:02 GMT; Secure; HttpOnly; Path=/ +Content-Type: application/json +X-Xss-Protection: 1; mode=block +X-Content-Type-Options: nosniff +Referrer-Policy: same-origin +X-Frame-Options: ALLOW-FROM https://pagure.io/ +Strict-Transport-Security: max-age=31536000; includeSubDomains; preload +Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-7wtiizCOJwkK1brnaNWuEQwLc'; style-src 'self' 'nonce-7wtiizCOJwkK1brnaNWuEQwLc'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; { "author": "Akashdeep Dhar", diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissue%2F1 b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissue%2F1 deleted file mode 100644 index ab96eec4a3..0000000000 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissue%2F1 +++ /dev/null @@ -1,125 +0,0 @@ -HTTP/2 200 -date: Wed, 23 Jul 2025 06:17:07 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 3105 -content-security-policy: default-src 'self';script-src 'self' 'nonce-yBIiXAYKuVAlrSnvYuxYU2MVh'; style-src 'self' 'nonce-yBIiXAYKuVAlrSnvYuxYU2MVh'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiZDQ4YWUxNzRmZGRjNDE3MGE3Zjg4YTY2OWJmMzI4MTA3OGQ0NDJmNyJ9.G2IP4w.fBfDUgO0_qt8TTh1QGvCxyEoNw8; Expires=Sat, 23-Aug-2025 06:17:07 GMT; Secure; HttpOnly; Path=/ -content-type: application/json - -{ - "assignee": null, - "blocks": [], - "close_status": null, - "closed_at": null, - "closed_by": null, - "comments": [ - { - "comment": "**Metadata Update from @t0xic0der**:\n- Issue tagged with: aaaa, bbbb", - "date_created": "1697169699", - "edited_on": null, - "editor": null, - "id": 878471, - "notification": true, - "parent": null, - "reactions": {}, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "This is the first comment under the first test issue", - "date_created": "1697169880", - "edited_on": null, - "editor": null, - "id": 878473, - "notification": false, - "parent": null, - "reactions": {}, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "This is the second comment under the first test issue", - "date_created": "1697169924", - "edited_on": null, - "editor": null, - "id": 878474, - "notification": false, - "parent": null, - "reactions": {}, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "**Metadata Update from @t0xic0der**:\n- Issue set to the milestone: Milestone AAAA", - "date_created": "1746679806", - "edited_on": null, - "editor": null, - "id": 971677, - "notification": true, - "parent": null, - "reactions": {}, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "**Metadata Update from @t0xic0der**:\n- Issue priority set to: Epic", - "date_created": "1750832745", - "edited_on": null, - "editor": null, - "id": 976719, - "notification": true, - "parent": null, - "reactions": {}, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - } - ], - "content": "This is the body of the first test issue", - "custom_fields": [], - "date_created": "1697169462", - "depends": [], - "full_url": "https://pagure.io/protop2g-test-srce/issue/1", - "id": 1, - "last_updated": "1750832745", - "milestone": "Milestone AAAA", - "priority": 4, - "private": false, - "related_prs": [], - "status": "Open", - "tags": [ - "aaaa", - "bbbb" - ], - "title": "This is the title of the first test issue", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } -} diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissue%2F2 b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissue%2F2 index 7488423491..34547248b4 100644 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissue%2F2 +++ b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissue%2F2 @@ -1,17 +1,191 @@ -HTTP/2 404 -date: Wed, 23 Jul 2025 06:17:34 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 233 -content-security-policy: default-src 'self';script-src 'self' 'nonce-sIVvSKRvcU00FQYaXHjgZGoqv'; style-src 'self' 'nonce-sIVvSKRvcU00FQYaXHjgZGoqv'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiOTE1NmEzNWM2ZWU4ZGI1M2U5MTFlOGIzN2UzYzRkNzcxNDZlMjk1MCJ9.G2IP_g.YZx_ll-7EyLvtel9UcO0uQAoujM; Expires=Sat, 23-Aug-2025 06:17:34 GMT; Secure; HttpOnly; Path=/ -content-type: text/html; charset=UTF-8 +X-Xss-Protection: 1; mode=block +X-Content-Type-Options: nosniff +Referrer-Policy: same-origin +Strict-Transport-Security: max-age=31536000; includeSubDomains; preload +Content-Length: 5327 +Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-ZantBGThWBCI2APLt4SMU7xGo'; style-src 'self' 'nonce-ZantBGThWBCI2APLt4SMU7xGo'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; +Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiN2MyZWQyMWNlNTAyMDZhYTNlNjY2MThhZWE1ODJhM2Q0YjNlYWJiOCJ9.G4-gtQ.qChOO4poXg469ntQDFbUfu7Cdoo; Expires=Fri, 26-Sep-2025 19:47:01 GMT; Secure; HttpOnly; Path=/ +X-Frame-Options: ALLOW-FROM https://pagure.io/ +Content-Type: application/json - -404 Not Found -

    Not Found

    -

    The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.

    +{ + "assignee": null, + "blocks": [], + "close_status": "Complete", + "closed_at": "1750832579", + "closed_by": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + }, + "comments": [ + { + "comment": "**Metadata Update from @t0xic0der**:\n- Issue tagged with: cccc, dddd", + "date_created": "1697169810", + "edited_on": null, + "editor": null, + "id": 878472, + "notification": true, + "parent": null, + "reactions": {}, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "The is the first comment under the second test issue", + "date_created": "1697169964", + "edited_on": null, + "editor": null, + "id": 878475, + "notification": false, + "parent": null, + "reactions": {}, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "The is the second comment under the second test issue", + "date_created": "1697169976", + "edited_on": null, + "editor": null, + "id": 878476, + "notification": false, + "parent": null, + "reactions": {}, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "**Metadata Update from @t0xic0der**:\n- Issue status updated to: Closed (was: Open)", + "date_created": "1697170032", + "edited_on": null, + "editor": null, + "id": 878477, + "notification": true, + "parent": null, + "reactions": {}, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "**Metadata Update from @t0xic0der**:\n- Issue set to the milestone: Milestone BBBB", + "date_created": "1746679821", + "edited_on": null, + "editor": null, + "id": 971678, + "notification": true, + "parent": null, + "reactions": {}, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "**Metadata Update from @t0xic0der**:\n- Issue set to the milestone: None (was: Milestone BBBB)\n- Issue status updated to: Open (was: Closed)", + "date_created": "1750832572", + "edited_on": null, + "editor": null, + "id": 976713, + "notification": true, + "parent": null, + "reactions": {}, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "**Metadata Update from @t0xic0der**:\n- Issue close_status updated to: Complete\n- Issue status updated to: Closed (was: Open)", + "date_created": "1750832582", + "edited_on": null, + "editor": null, + "id": 976714, + "notification": true, + "parent": null, + "reactions": {}, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "**Metadata Update from @t0xic0der**:\n- Issue set to the milestone: Milestone BBBB", + "date_created": "1750832674", + "edited_on": null, + "editor": null, + "id": 976717, + "notification": true, + "parent": null, + "reactions": {}, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "**Metadata Update from @t0xic0der**:\n- Issue priority set to: Rare", + "date_created": "1750832757", + "edited_on": null, + "editor": null, + "id": 976720, + "notification": true, + "parent": null, + "reactions": {}, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + } + ], + "content": "This is the body of the second test issue", + "custom_fields": [], + "date_created": "1697169676", + "depends": [], + "full_url": "https://pagure.io/protop2g-test-srce/issue/2", + "id": 2, + "last_updated": "1750832757", + "milestone": "Milestone BBBB", + "priority": 3, + "private": false, + "related_prs": [], + "status": "Closed", + "tags": [ + "cccc", + "dddd" + ], + "title": "This is the title of the second test issue", + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } +} diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissues b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissues deleted file mode 100644 index 4f14350af2..0000000000 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissues +++ /dev/null @@ -1,331 +0,0 @@ -HTTP/2 200 -date: Wed, 30 Jul 2025 05:17:03 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 10166 -content-security-policy: default-src 'self';script-src 'self' 'nonce-rxZTVpKgLDOgYu1TX1ab1qR2p'; style-src 'self' 'nonce-rxZTVpKgLDOgYu1TX1ab1qR2p'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiOGRkN2YyNjZiMGQ5YmM4Mjc3YjllYjkzMjUyNjZlMmQ5OTExMWI2NCJ9.G2s8UA.oQa5peejoMGwTzJF3vWHgcS8naQ; Expires=Sat, 30-Aug-2025 05:17:04 GMT; Secure; HttpOnly; Path=/ -content-type: application/json - -{ - "args": { - "assignee": null, - "author": null, - "milestones": [], - "no_stones": null, - "order": null, - "priority": null, - "since": null, - "status": "all", - "tags": [] - }, - "issues": [ - { - "assignee": null, - "blocks": [], - "close_status": "Complete", - "closed_at": "1750832579", - "closed_by": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - }, - "comments": [ - { - "comment": "**Metadata Update from @t0xic0der**:\n- Issue tagged with: cccc, dddd", - "date_created": "1697169810", - "edited_on": null, - "editor": null, - "id": 878472, - "notification": true, - "parent": null, - "reactions": {}, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "The is the first comment under the second test issue", - "date_created": "1697169964", - "edited_on": null, - "editor": null, - "id": 878475, - "notification": false, - "parent": null, - "reactions": {}, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "The is the second comment under the second test issue", - "date_created": "1697169976", - "edited_on": null, - "editor": null, - "id": 878476, - "notification": false, - "parent": null, - "reactions": {}, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "**Metadata Update from @t0xic0der**:\n- Issue status updated to: Closed (was: Open)", - "date_created": "1697170032", - "edited_on": null, - "editor": null, - "id": 878477, - "notification": true, - "parent": null, - "reactions": {}, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "**Metadata Update from @t0xic0der**:\n- Issue set to the milestone: Milestone BBBB", - "date_created": "1746679821", - "edited_on": null, - "editor": null, - "id": 971678, - "notification": true, - "parent": null, - "reactions": {}, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "**Metadata Update from @t0xic0der**:\n- Issue set to the milestone: None (was: Milestone BBBB)\n- Issue status updated to: Open (was: Closed)", - "date_created": "1750832572", - "edited_on": null, - "editor": null, - "id": 976713, - "notification": true, - "parent": null, - "reactions": {}, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "**Metadata Update from @t0xic0der**:\n- Issue close_status updated to: Complete\n- Issue status updated to: Closed (was: Open)", - "date_created": "1750832582", - "edited_on": null, - "editor": null, - "id": 976714, - "notification": true, - "parent": null, - "reactions": {}, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "**Metadata Update from @t0xic0der**:\n- Issue set to the milestone: Milestone BBBB", - "date_created": "1750832674", - "edited_on": null, - "editor": null, - "id": 976717, - "notification": true, - "parent": null, - "reactions": {}, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "**Metadata Update from @t0xic0der**:\n- Issue priority set to: Rare", - "date_created": "1750832757", - "edited_on": null, - "editor": null, - "id": 976720, - "notification": true, - "parent": null, - "reactions": {}, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - } - ], - "content": "This is the body of the second test issue", - "custom_fields": [], - "date_created": "1697169676", - "depends": [], - "full_url": "https://pagure.io/protop2g-test-srce/issue/2", - "id": 2, - "last_updated": "1750832757", - "milestone": "Milestone BBBB", - "priority": 3, - "private": false, - "related_prs": [], - "status": "Closed", - "tags": [ - "cccc", - "dddd" - ], - "title": "This is the title of the second test issue", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "assignee": null, - "blocks": [], - "close_status": null, - "closed_at": null, - "closed_by": null, - "comments": [ - { - "comment": "**Metadata Update from @t0xic0der**:\n- Issue tagged with: aaaa, bbbb", - "date_created": "1697169699", - "edited_on": null, - "editor": null, - "id": 878471, - "notification": true, - "parent": null, - "reactions": {}, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "This is the first comment under the first test issue", - "date_created": "1697169880", - "edited_on": null, - "editor": null, - "id": 878473, - "notification": false, - "parent": null, - "reactions": {}, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "This is the second comment under the first test issue", - "date_created": "1697169924", - "edited_on": null, - "editor": null, - "id": 878474, - "notification": false, - "parent": null, - "reactions": {}, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "**Metadata Update from @t0xic0der**:\n- Issue set to the milestone: Milestone AAAA", - "date_created": "1746679806", - "edited_on": null, - "editor": null, - "id": 971677, - "notification": true, - "parent": null, - "reactions": {}, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "**Metadata Update from @t0xic0der**:\n- Issue priority set to: Epic", - "date_created": "1750832745", - "edited_on": null, - "editor": null, - "id": 976719, - "notification": true, - "parent": null, - "reactions": {}, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - } - ], - "content": "This is the body of the first test issue", - "custom_fields": [], - "date_created": "1697169462", - "depends": [], - "full_url": "https://pagure.io/protop2g-test-srce/issue/1", - "id": 1, - "last_updated": "1750832745", - "milestone": "Milestone AAAA", - "priority": 4, - "private": false, - "related_prs": [], - "status": "Open", - "tags": [ - "aaaa", - "bbbb" - ], - "title": "This is the title of the first test issue", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - } - ], - "pagination": { - "first": "https://pagure.io/api/0/protop2g-test-srce/issues?per_page=20&status=all&page=1", - "last": "https://pagure.io/api/0/protop2g-test-srce/issues?per_page=20&status=all&page=1", - "next": null, - "page": 1, - "pages": 1, - "per_page": 20, - "prev": null - }, - "total_issues": 2 -} diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissues%3Fpage=1&per_page=20&status=all b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissues%3Fpage=1&per_page=20&status=all new file mode 100644 index 0000000000..683954bdfa --- /dev/null +++ b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fissues%3Fpage=1&per_page=20&status=all @@ -0,0 +1,328 @@ +Strict-Transport-Security: max-age=31536000; includeSubDomains; preload +Content-Length: 10166 +Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-PksumVGOMvBkmvCTEaSHSrExE'; style-src 'self' 'nonce-PksumVGOMvBkmvCTEaSHSrExE'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; +Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiZDRiMzUyNTA1NDU0MDU4ZTJhNjA5NWFkZjNkYjRkMmUwYjYzZGZkNCJ9.G4-gtA.hMuX3dKcBI5jKIZp5DlZWJhSDPw; Expires=Fri, 26-Sep-2025 19:47:00 GMT; Secure; HttpOnly; Path=/ +X-Frame-Options: ALLOW-FROM https://pagure.io/ +Content-Type: application/json +X-Xss-Protection: 1; mode=block +X-Content-Type-Options: nosniff +Referrer-Policy: same-origin + +{ + "args": { + "assignee": null, + "author": null, + "milestones": [], + "no_stones": null, + "order": null, + "priority": null, + "since": null, + "status": "all", + "tags": [] + }, + "issues": [ + { + "assignee": null, + "blocks": [], + "close_status": "Complete", + "closed_at": "1750832579", + "closed_by": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + }, + "comments": [ + { + "comment": "**Metadata Update from @t0xic0der**:\n- Issue tagged with: cccc, dddd", + "date_created": "1697169810", + "edited_on": null, + "editor": null, + "id": 878472, + "notification": true, + "parent": null, + "reactions": {}, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "The is the first comment under the second test issue", + "date_created": "1697169964", + "edited_on": null, + "editor": null, + "id": 878475, + "notification": false, + "parent": null, + "reactions": {}, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "The is the second comment under the second test issue", + "date_created": "1697169976", + "edited_on": null, + "editor": null, + "id": 878476, + "notification": false, + "parent": null, + "reactions": {}, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "**Metadata Update from @t0xic0der**:\n- Issue status updated to: Closed (was: Open)", + "date_created": "1697170032", + "edited_on": null, + "editor": null, + "id": 878477, + "notification": true, + "parent": null, + "reactions": {}, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "**Metadata Update from @t0xic0der**:\n- Issue set to the milestone: Milestone BBBB", + "date_created": "1746679821", + "edited_on": null, + "editor": null, + "id": 971678, + "notification": true, + "parent": null, + "reactions": {}, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "**Metadata Update from @t0xic0der**:\n- Issue set to the milestone: None (was: Milestone BBBB)\n- Issue status updated to: Open (was: Closed)", + "date_created": "1750832572", + "edited_on": null, + "editor": null, + "id": 976713, + "notification": true, + "parent": null, + "reactions": {}, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "**Metadata Update from @t0xic0der**:\n- Issue close_status updated to: Complete\n- Issue status updated to: Closed (was: Open)", + "date_created": "1750832582", + "edited_on": null, + "editor": null, + "id": 976714, + "notification": true, + "parent": null, + "reactions": {}, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "**Metadata Update from @t0xic0der**:\n- Issue set to the milestone: Milestone BBBB", + "date_created": "1750832674", + "edited_on": null, + "editor": null, + "id": 976717, + "notification": true, + "parent": null, + "reactions": {}, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "**Metadata Update from @t0xic0der**:\n- Issue priority set to: Rare", + "date_created": "1750832757", + "edited_on": null, + "editor": null, + "id": 976720, + "notification": true, + "parent": null, + "reactions": {}, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + } + ], + "content": "This is the body of the second test issue", + "custom_fields": [], + "date_created": "1697169676", + "depends": [], + "full_url": "https://pagure.io/protop2g-test-srce/issue/2", + "id": 2, + "last_updated": "1750832757", + "milestone": "Milestone BBBB", + "priority": 3, + "private": false, + "related_prs": [], + "status": "Closed", + "tags": [ + "cccc", + "dddd" + ], + "title": "This is the title of the second test issue", + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "assignee": null, + "blocks": [], + "close_status": null, + "closed_at": null, + "closed_by": null, + "comments": [ + { + "comment": "**Metadata Update from @t0xic0der**:\n- Issue tagged with: aaaa, bbbb", + "date_created": "1697169699", + "edited_on": null, + "editor": null, + "id": 878471, + "notification": true, + "parent": null, + "reactions": {}, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "This is the first comment under the first test issue", + "date_created": "1697169880", + "edited_on": null, + "editor": null, + "id": 878473, + "notification": false, + "parent": null, + "reactions": {}, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "This is the second comment under the first test issue", + "date_created": "1697169924", + "edited_on": null, + "editor": null, + "id": 878474, + "notification": false, + "parent": null, + "reactions": {}, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "**Metadata Update from @t0xic0der**:\n- Issue set to the milestone: Milestone AAAA", + "date_created": "1746679806", + "edited_on": null, + "editor": null, + "id": 971677, + "notification": true, + "parent": null, + "reactions": {}, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "**Metadata Update from @t0xic0der**:\n- Issue priority set to: Epic", + "date_created": "1750832745", + "edited_on": null, + "editor": null, + "id": 976719, + "notification": true, + "parent": null, + "reactions": {}, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + } + ], + "content": "This is the body of the first test issue", + "custom_fields": [], + "date_created": "1697169462", + "depends": [], + "full_url": "https://pagure.io/protop2g-test-srce/issue/1", + "id": 1, + "last_updated": "1750832745", + "milestone": "Milestone AAAA", + "priority": 4, + "private": false, + "related_prs": [], + "status": "Open", + "tags": [ + "aaaa", + "bbbb" + ], + "title": "This is the title of the first test issue", + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + } + ], + "pagination": { + "first": "https://pagure.io/api/0/protop2g-test-srce/issues?per_page=20&status=all&page=1", + "last": "https://pagure.io/api/0/protop2g-test-srce/issues?per_page=20&status=all&page=1", + "next": null, + "page": 1, + "pages": 1, + "per_page": 20, + "prev": null + }, + "total_issues": 2 +} diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F10 b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F10 deleted file mode 100644 index e43f97a590..0000000000 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F10 +++ /dev/null @@ -1,259 +0,0 @@ -HTTP/2 200 -date: Wed, 23 Jul 2025 06:21:04 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 6179 -content-security-policy: default-src 'self';script-src 'self' 'nonce-BK18r6rq2MUNhc0CXTZKJQyJY'; style-src 'self' 'nonce-BK18r6rq2MUNhc0CXTZKJQyJY'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiOTQ3NGFiNjdkNjdlZjNiNWNmOWYwZGFmODg1MDMxMTYzNTc5OTkxMyJ9.G2IQ0A.97bsQ3k_CAN3UOID130UESba38M; Expires=Sat, 23-Aug-2025 06:21:04 GMT; Secure; HttpOnly; Path=/ -content-type: application/json - -{ - "assignee": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - }, - "branch": "main", - "branch_from": "test-ffff", - "cached_merge_status": "unknown", - "closed_at": "1747635431", - "closed_by": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - }, - "comments": [ - { - "comment": "**Metadata Update from @t0xic0der**:\n- Pull-request tagged with: ffff\n- Request assigned", - "commit": null, - "date_created": "1747635211", - "edited_on": null, - "editor": null, - "filename": null, - "id": 219623, - "line": null, - "notification": true, - "parent": null, - "reactions": {}, - "tree": null, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "rebased onto 01b420e2964928a15f790f9b7c1a0053e7b5f0a5", - "commit": null, - "date_created": "1747635389", - "edited_on": null, - "editor": null, - "filename": null, - "id": 219625, - "line": null, - "notification": true, - "parent": null, - "reactions": {}, - "tree": null, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "Pull-Request has been merged by t0xic0der", - "commit": null, - "date_created": "1747635431", - "edited_on": null, - "editor": null, - "filename": null, - "id": 219626, - "line": null, - "notification": true, - "parent": null, - "reactions": {}, - "tree": null, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - } - ], - "commit_start": "1a6ccc212aa958a0fe76155c2907c889969a7224", - "commit_stop": "1a6ccc212aa958a0fe76155c2907c889969a7224", - "date_created": "1747635165", - "full_url": "https://pagure.io/protop2g-test-srce/pull-request/10", - "id": 10, - "initial_comment": "Signed-off-by: Akashdeep Dhar ", - "last_updated": "1747635431", - "project": { - "access_groups": { - "admin": [], - "collaborator": [], - "commit": [], - "ticket": [] - }, - "access_users": { - "admin": [ - "ryanlerch" - ], - "collaborator": [], - "commit": [], - "owner": [ - "t0xic0der" - ], - "ticket": [] - }, - "close_status": [ - "Complete", - "Baseless" - ], - "custom_keys": [], - "date_created": "1697168063", - "date_modified": "1744795940", - "description": "The source namespace for the Pagure Exporter project to run tests against", - "full_url": "https://pagure.io/protop2g-test-srce", - "fullname": "protop2g-test-srce", - "id": 17042, - "milestones": { - "Milestone AAAA": { - "active": true, - "date": "1765497600" - }, - "Milestone BBBB": { - "active": false, - "date": "1765497600" - }, - "Milestone CCCC": { - "active": true, - "date": "1765497600" - }, - "Milestone DDDD": { - "active": false, - "date": "1765497600" - } - }, - "name": "protop2g-test-srce", - "namespace": null, - "parent": null, - "priorities": { - "": "", - "1": "Common", - "2": "Uncommon", - "3": "Rare", - "4": "Epic", - "5": "Mythic" - }, - "tags": [ - "srce", - "test", - "gridhead", - "protop2g" - ], - "url_path": "protop2g-test-srce", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - "remote_git": null, - "repo_from": { - "access_groups": { - "admin": [], - "collaborator": [], - "commit": [], - "ticket": [] - }, - "access_users": { - "admin": [ - "ryanlerch" - ], - "collaborator": [], - "commit": [], - "owner": [ - "t0xic0der" - ], - "ticket": [] - }, - "close_status": [ - "Complete", - "Baseless" - ], - "custom_keys": [], - "date_created": "1697168063", - "date_modified": "1744795940", - "description": "The source namespace for the Pagure Exporter project to run tests against", - "full_url": "https://pagure.io/protop2g-test-srce", - "fullname": "protop2g-test-srce", - "id": 17042, - "milestones": { - "Milestone AAAA": { - "active": true, - "date": "1765497600" - }, - "Milestone BBBB": { - "active": false, - "date": "1765497600" - }, - "Milestone CCCC": { - "active": true, - "date": "1765497600" - }, - "Milestone DDDD": { - "active": false, - "date": "1765497600" - } - }, - "name": "protop2g-test-srce", - "namespace": null, - "parent": null, - "priorities": { - "": "", - "1": "Common", - "2": "Uncommon", - "3": "Rare", - "4": "Epic", - "5": "Mythic" - }, - "tags": [ - "srce", - "test", - "gridhead", - "protop2g" - ], - "url_path": "protop2g-test-srce", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - "status": "Merged", - "tags": [ - "ffff" - ], - "threshold_reached": null, - "title": "Change the branch identity to `test-ffff` in the README.md file", - "uid": "d3b7100abf8b4b02aa220d899e063295", - "updated_on": "1747635431", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } -} diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F5 b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F5 index be1c0e3a25..18475372de 100644 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F5 +++ b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F5 @@ -1,15 +1,12 @@ -HTTP/2 200 -date: Wed, 23 Jul 2025 06:19:26 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 5859 -content-security-policy: default-src 'self';script-src 'self' 'nonce-x3rXi7f95hPSGE2mV9PPJv0Db'; style-src 'self' 'nonce-x3rXi7f95hPSGE2mV9PPJv0Db'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiODFiMTQzZWQwZGEzMWIxNmE3NTk1ODYyNWE0MGZjNjcwNThmMDc3ZSJ9.G2IQbg.9qdYqcrGIqnCKtjsWYjcfMCTzok; Expires=Sat, 23-Aug-2025 06:19:26 GMT; Secure; HttpOnly; Path=/ -content-type: application/json +X-Xss-Protection: 1; mode=block +X-Content-Type-Options: nosniff +X-Frame-Options: ALLOW-FROM https://pagure.io/ +Content-Length: 5859 +Referrer-Policy: same-origin +Strict-Transport-Security: max-age=31536000; includeSubDomains; preload +Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-cKJRnMfn3wZ2XOdNVb5fJc3EU'; style-src 'self' 'nonce-cKJRnMfn3wZ2XOdNVb5fJc3EU'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; +Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiNDI2OTlmMzdkNzliNDBhZTNjNWVjMzI0ZjJiZTZhZTRiOTllMDc1YiJ9.G4-gtw.IeZ5E3NAmb0f8u4EtYgCVD8wupw; Expires=Fri, 26-Sep-2025 19:47:03 GMT; Secure; HttpOnly; Path=/ +Content-Type: application/json { "assignee": null, diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F6 b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F6 deleted file mode 100644 index 878989a6cd..0000000000 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F6 +++ /dev/null @@ -1,249 +0,0 @@ -HTTP/2 200 -date: Wed, 23 Jul 2025 06:19:47 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 5859 -content-security-policy: default-src 'self';script-src 'self' 'nonce-3mH3rM1hwmaCorIQiTfUsFwdZ'; style-src 'self' 'nonce-3mH3rM1hwmaCorIQiTfUsFwdZ'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiNWY5OWMwYjViOTkzZjM0YTY3OTJiYTZmNDk4YzY3MzUwMzY3MzY2OCJ9.G2IQgw.dxyk0aB89uDJGN15BTWrZEvCFWg; Expires=Sat, 23-Aug-2025 06:19:47 GMT; Secure; HttpOnly; Path=/ -content-type: application/json - -{ - "assignee": null, - "branch": "main", - "branch_from": "test-bbbb", - "cached_merge_status": "CONFLICTS", - "closed_at": null, - "closed_by": null, - "comments": [ - { - "comment": "**Metadata Update from @t0xic0der**:\n- Pull-request tagged with: bbbb", - "commit": null, - "date_created": "1746427480", - "edited_on": null, - "editor": null, - "filename": null, - "id": 219087, - "line": null, - "notification": true, - "parent": null, - "reactions": {}, - "tree": null, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "This is the first comment under this pull request.", - "commit": null, - "date_created": "1746595539", - "edited_on": null, - "editor": null, - "filename": null, - "id": 219192, - "line": null, - "notification": false, - "parent": null, - "reactions": {}, - "tree": null, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "This is the second comment under this pull request.", - "commit": null, - "date_created": "1746595552", - "edited_on": null, - "editor": null, - "filename": null, - "id": 219193, - "line": null, - "notification": false, - "parent": null, - "reactions": {}, - "tree": null, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - } - ], - "commit_start": "2d40761dc53e6fa060ac49d88e1452c6751d4b1c", - "commit_stop": "2d40761dc53e6fa060ac49d88e1452c6751d4b1c", - "date_created": "1746427470", - "full_url": "https://pagure.io/protop2g-test-srce/pull-request/6", - "id": 6, - "initial_comment": "Signed-off-by: Akashdeep Dhar ", - "last_updated": "1747643450", - "project": { - "access_groups": { - "admin": [], - "collaborator": [], - "commit": [], - "ticket": [] - }, - "access_users": { - "admin": [ - "ryanlerch" - ], - "collaborator": [], - "commit": [], - "owner": [ - "t0xic0der" - ], - "ticket": [] - }, - "close_status": [ - "Complete", - "Baseless" - ], - "custom_keys": [], - "date_created": "1697168063", - "date_modified": "1744795940", - "description": "The source namespace for the Pagure Exporter project to run tests against", - "full_url": "https://pagure.io/protop2g-test-srce", - "fullname": "protop2g-test-srce", - "id": 17042, - "milestones": { - "Milestone AAAA": { - "active": true, - "date": "1765497600" - }, - "Milestone BBBB": { - "active": false, - "date": "1765497600" - }, - "Milestone CCCC": { - "active": true, - "date": "1765497600" - }, - "Milestone DDDD": { - "active": false, - "date": "1765497600" - } - }, - "name": "protop2g-test-srce", - "namespace": null, - "parent": null, - "priorities": { - "": "", - "1": "Common", - "2": "Uncommon", - "3": "Rare", - "4": "Epic", - "5": "Mythic" - }, - "tags": [ - "srce", - "test", - "gridhead", - "protop2g" - ], - "url_path": "protop2g-test-srce", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - "remote_git": null, - "repo_from": { - "access_groups": { - "admin": [], - "collaborator": [], - "commit": [], - "ticket": [] - }, - "access_users": { - "admin": [ - "ryanlerch" - ], - "collaborator": [], - "commit": [], - "owner": [ - "t0xic0der" - ], - "ticket": [] - }, - "close_status": [ - "Complete", - "Baseless" - ], - "custom_keys": [], - "date_created": "1697168063", - "date_modified": "1744795940", - "description": "The source namespace for the Pagure Exporter project to run tests against", - "full_url": "https://pagure.io/protop2g-test-srce", - "fullname": "protop2g-test-srce", - "id": 17042, - "milestones": { - "Milestone AAAA": { - "active": true, - "date": "1765497600" - }, - "Milestone BBBB": { - "active": false, - "date": "1765497600" - }, - "Milestone CCCC": { - "active": true, - "date": "1765497600" - }, - "Milestone DDDD": { - "active": false, - "date": "1765497600" - } - }, - "name": "protop2g-test-srce", - "namespace": null, - "parent": null, - "priorities": { - "": "", - "1": "Common", - "2": "Uncommon", - "3": "Rare", - "4": "Epic", - "5": "Mythic" - }, - "tags": [ - "srce", - "test", - "gridhead", - "protop2g" - ], - "url_path": "protop2g-test-srce", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - "status": "Open", - "tags": [ - "bbbb" - ], - "threshold_reached": null, - "title": "Change the branch identity to `test-bbbb` in the README.md file", - "uid": "9cab89d6bb8c499e8fcb47926f1f5806", - "updated_on": "1746595552", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } -} diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F7 b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F7 deleted file mode 100644 index 51c269273c..0000000000 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F7 +++ /dev/null @@ -1,234 +0,0 @@ -HTTP/2 200 -date: Wed, 23 Jul 2025 06:20:00 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 5458 -content-security-policy: default-src 'self';script-src 'self' 'nonce-Bq1C3s4EngIGuBgtUcYdmK2M8'; style-src 'self' 'nonce-Bq1C3s4EngIGuBgtUcYdmK2M8'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiZjUwNDcwNWQ4Y2UxZTRjODRlNjQxYTA0NzVlNDA5NGQwNzI4YTY1NyJ9.G2IQkA.KtxZfzau2wOwMTyfG_xNBHTMHSI; Expires=Sat, 23-Aug-2025 06:20:00 GMT; Secure; HttpOnly; Path=/ -content-type: application/json - -{ - "assignee": null, - "branch": "main", - "branch_from": "test-cccc", - "cached_merge_status": "FFORWARD", - "closed_at": "1746428043", - "closed_by": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - }, - "comments": [ - { - "comment": "**Metadata Update from @t0xic0der**:\n- Pull-request tagged with: cccc", - "commit": null, - "date_created": "1746427513", - "edited_on": null, - "editor": null, - "filename": null, - "id": 219088, - "line": null, - "notification": true, - "parent": null, - "reactions": {}, - "tree": null, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "Pull-Request has been closed by t0xic0der", - "commit": null, - "date_created": "1746428043", - "edited_on": null, - "editor": null, - "filename": null, - "id": 219090, - "line": null, - "notification": true, - "parent": null, - "reactions": {}, - "tree": null, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - } - ], - "commit_start": "f1246e331cade9341b9e4f311b7a134f99893d21", - "commit_stop": "f1246e331cade9341b9e4f311b7a134f99893d21", - "date_created": "1746427506", - "full_url": "https://pagure.io/protop2g-test-srce/pull-request/7", - "id": 7, - "initial_comment": "Signed-off-by: Akashdeep Dhar ", - "last_updated": "1746428043", - "project": { - "access_groups": { - "admin": [], - "collaborator": [], - "commit": [], - "ticket": [] - }, - "access_users": { - "admin": [ - "ryanlerch" - ], - "collaborator": [], - "commit": [], - "owner": [ - "t0xic0der" - ], - "ticket": [] - }, - "close_status": [ - "Complete", - "Baseless" - ], - "custom_keys": [], - "date_created": "1697168063", - "date_modified": "1744795940", - "description": "The source namespace for the Pagure Exporter project to run tests against", - "full_url": "https://pagure.io/protop2g-test-srce", - "fullname": "protop2g-test-srce", - "id": 17042, - "milestones": { - "Milestone AAAA": { - "active": true, - "date": "1765497600" - }, - "Milestone BBBB": { - "active": false, - "date": "1765497600" - }, - "Milestone CCCC": { - "active": true, - "date": "1765497600" - }, - "Milestone DDDD": { - "active": false, - "date": "1765497600" - } - }, - "name": "protop2g-test-srce", - "namespace": null, - "parent": null, - "priorities": { - "": "", - "1": "Common", - "2": "Uncommon", - "3": "Rare", - "4": "Epic", - "5": "Mythic" - }, - "tags": [ - "srce", - "test", - "gridhead", - "protop2g" - ], - "url_path": "protop2g-test-srce", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - "remote_git": null, - "repo_from": { - "access_groups": { - "admin": [], - "collaborator": [], - "commit": [], - "ticket": [] - }, - "access_users": { - "admin": [ - "ryanlerch" - ], - "collaborator": [], - "commit": [], - "owner": [ - "t0xic0der" - ], - "ticket": [] - }, - "close_status": [ - "Complete", - "Baseless" - ], - "custom_keys": [], - "date_created": "1697168063", - "date_modified": "1744795940", - "description": "The source namespace for the Pagure Exporter project to run tests against", - "full_url": "https://pagure.io/protop2g-test-srce", - "fullname": "protop2g-test-srce", - "id": 17042, - "milestones": { - "Milestone AAAA": { - "active": true, - "date": "1765497600" - }, - "Milestone BBBB": { - "active": false, - "date": "1765497600" - }, - "Milestone CCCC": { - "active": true, - "date": "1765497600" - }, - "Milestone DDDD": { - "active": false, - "date": "1765497600" - } - }, - "name": "protop2g-test-srce", - "namespace": null, - "parent": null, - "priorities": { - "": "", - "1": "Common", - "2": "Uncommon", - "3": "Rare", - "4": "Epic", - "5": "Mythic" - }, - "tags": [ - "srce", - "test", - "gridhead", - "protop2g" - ], - "url_path": "protop2g-test-srce", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - "status": "Closed", - "tags": [ - "cccc" - ], - "threshold_reached": null, - "title": "Change the branch identity to `test-cccc` in the README.md file", - "uid": "f696feab56b84557b4d4a8a4462420ee", - "updated_on": "1746428043", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } -} diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F8 b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F8 deleted file mode 100644 index 45ae72d6e8..0000000000 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F8 +++ /dev/null @@ -1,234 +0,0 @@ -HTTP/2 200 -date: Wed, 23 Jul 2025 06:20:17 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 5458 -content-security-policy: default-src 'self';script-src 'self' 'nonce-OxOLryXyFpTZ0hyi7t17U5IG0'; style-src 'self' 'nonce-OxOLryXyFpTZ0hyi7t17U5IG0'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiM2I3NWQwYzBhY2YxMjhmYTU0YmU5NzEzYzcyNjNjZTQ4NjFlNDE5ZCJ9.G2IQoQ.Ds29JFMXbO3q2kBPxmfx2kQ7YjA; Expires=Sat, 23-Aug-2025 06:20:17 GMT; Secure; HttpOnly; Path=/ -content-type: application/json - -{ - "assignee": null, - "branch": "main", - "branch_from": "test-dddd", - "cached_merge_status": "FFORWARD", - "closed_at": "1746428053", - "closed_by": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - }, - "comments": [ - { - "comment": "**Metadata Update from @t0xic0der**:\n- Pull-request tagged with: dddd", - "commit": null, - "date_created": "1746427540", - "edited_on": null, - "editor": null, - "filename": null, - "id": 219089, - "line": null, - "notification": true, - "parent": null, - "reactions": {}, - "tree": null, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "Pull-Request has been closed by t0xic0der", - "commit": null, - "date_created": "1746428053", - "edited_on": null, - "editor": null, - "filename": null, - "id": 219091, - "line": null, - "notification": true, - "parent": null, - "reactions": {}, - "tree": null, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - } - ], - "commit_start": "0bc8b0c38e0790e9ef5c8d512a00b9c4dd048160", - "commit_stop": "0bc8b0c38e0790e9ef5c8d512a00b9c4dd048160", - "date_created": "1746427532", - "full_url": "https://pagure.io/protop2g-test-srce/pull-request/8", - "id": 8, - "initial_comment": "Signed-off-by: Akashdeep Dhar ", - "last_updated": "1746428053", - "project": { - "access_groups": { - "admin": [], - "collaborator": [], - "commit": [], - "ticket": [] - }, - "access_users": { - "admin": [ - "ryanlerch" - ], - "collaborator": [], - "commit": [], - "owner": [ - "t0xic0der" - ], - "ticket": [] - }, - "close_status": [ - "Complete", - "Baseless" - ], - "custom_keys": [], - "date_created": "1697168063", - "date_modified": "1744795940", - "description": "The source namespace for the Pagure Exporter project to run tests against", - "full_url": "https://pagure.io/protop2g-test-srce", - "fullname": "protop2g-test-srce", - "id": 17042, - "milestones": { - "Milestone AAAA": { - "active": true, - "date": "1765497600" - }, - "Milestone BBBB": { - "active": false, - "date": "1765497600" - }, - "Milestone CCCC": { - "active": true, - "date": "1765497600" - }, - "Milestone DDDD": { - "active": false, - "date": "1765497600" - } - }, - "name": "protop2g-test-srce", - "namespace": null, - "parent": null, - "priorities": { - "": "", - "1": "Common", - "2": "Uncommon", - "3": "Rare", - "4": "Epic", - "5": "Mythic" - }, - "tags": [ - "srce", - "test", - "gridhead", - "protop2g" - ], - "url_path": "protop2g-test-srce", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - "remote_git": null, - "repo_from": { - "access_groups": { - "admin": [], - "collaborator": [], - "commit": [], - "ticket": [] - }, - "access_users": { - "admin": [ - "ryanlerch" - ], - "collaborator": [], - "commit": [], - "owner": [ - "t0xic0der" - ], - "ticket": [] - }, - "close_status": [ - "Complete", - "Baseless" - ], - "custom_keys": [], - "date_created": "1697168063", - "date_modified": "1744795940", - "description": "The source namespace for the Pagure Exporter project to run tests against", - "full_url": "https://pagure.io/protop2g-test-srce", - "fullname": "protop2g-test-srce", - "id": 17042, - "milestones": { - "Milestone AAAA": { - "active": true, - "date": "1765497600" - }, - "Milestone BBBB": { - "active": false, - "date": "1765497600" - }, - "Milestone CCCC": { - "active": true, - "date": "1765497600" - }, - "Milestone DDDD": { - "active": false, - "date": "1765497600" - } - }, - "name": "protop2g-test-srce", - "namespace": null, - "parent": null, - "priorities": { - "": "", - "1": "Common", - "2": "Uncommon", - "3": "Rare", - "4": "Epic", - "5": "Mythic" - }, - "tags": [ - "srce", - "test", - "gridhead", - "protop2g" - ], - "url_path": "protop2g-test-srce", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - "status": "Closed", - "tags": [ - "dddd" - ], - "threshold_reached": null, - "title": "Change the branch identity to `test-dddd` in the README.md file", - "uid": "493b294044fd48e18f424210c919d8de", - "updated_on": "1746428053", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } -} diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F9 b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F9 deleted file mode 100644 index 2e19157948..0000000000 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-request%2F9 +++ /dev/null @@ -1,239 +0,0 @@ -HTTP/2 200 -date: Wed, 23 Jul 2025 06:20:51 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 5628 -content-security-policy: default-src 'self';script-src 'self' 'nonce-RVreTe5AdtWf0rvyk7mxX40mb'; style-src 'self' 'nonce-RVreTe5AdtWf0rvyk7mxX40mb'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiM2MyYzdlY2E0MDYzNWRmZjRhMDc2MGE0OTg2MjNhMTU4MWNhZDg4OSJ9.G2IQww.VZpiXbZftgigHkiS15g8DF6iQSY; Expires=Sat, 23-Aug-2025 06:20:51 GMT; Secure; HttpOnly; Path=/ -content-type: application/json - -{ - "assignee": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - }, - "branch": "main", - "branch_from": "test-eeee", - "cached_merge_status": "unknown", - "closed_at": "1747635243", - "closed_by": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - }, - "comments": [ - { - "comment": "**Metadata Update from @t0xic0der**:\n- Pull-request tagged with: eeee\n- Request assigned", - "commit": null, - "date_created": "1747635200", - "edited_on": null, - "editor": null, - "filename": null, - "id": 219622, - "line": null, - "notification": true, - "parent": null, - "reactions": {}, - "tree": null, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "Pull-Request has been merged by t0xic0der", - "commit": null, - "date_created": "1747635243", - "edited_on": null, - "editor": null, - "filename": null, - "id": 219624, - "line": null, - "notification": true, - "parent": null, - "reactions": {}, - "tree": null, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - } - ], - "commit_start": "01b420e2964928a15f790f9b7c1a0053e7b5f0a5", - "commit_stop": "01b420e2964928a15f790f9b7c1a0053e7b5f0a5", - "date_created": "1747635161", - "full_url": "https://pagure.io/protop2g-test-srce/pull-request/9", - "id": 9, - "initial_comment": "Signed-off-by: Akashdeep Dhar ", - "last_updated": "1747635243", - "project": { - "access_groups": { - "admin": [], - "collaborator": [], - "commit": [], - "ticket": [] - }, - "access_users": { - "admin": [ - "ryanlerch" - ], - "collaborator": [], - "commit": [], - "owner": [ - "t0xic0der" - ], - "ticket": [] - }, - "close_status": [ - "Complete", - "Baseless" - ], - "custom_keys": [], - "date_created": "1697168063", - "date_modified": "1744795940", - "description": "The source namespace for the Pagure Exporter project to run tests against", - "full_url": "https://pagure.io/protop2g-test-srce", - "fullname": "protop2g-test-srce", - "id": 17042, - "milestones": { - "Milestone AAAA": { - "active": true, - "date": "1765497600" - }, - "Milestone BBBB": { - "active": false, - "date": "1765497600" - }, - "Milestone CCCC": { - "active": true, - "date": "1765497600" - }, - "Milestone DDDD": { - "active": false, - "date": "1765497600" - } - }, - "name": "protop2g-test-srce", - "namespace": null, - "parent": null, - "priorities": { - "": "", - "1": "Common", - "2": "Uncommon", - "3": "Rare", - "4": "Epic", - "5": "Mythic" - }, - "tags": [ - "srce", - "test", - "gridhead", - "protop2g" - ], - "url_path": "protop2g-test-srce", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - "remote_git": null, - "repo_from": { - "access_groups": { - "admin": [], - "collaborator": [], - "commit": [], - "ticket": [] - }, - "access_users": { - "admin": [ - "ryanlerch" - ], - "collaborator": [], - "commit": [], - "owner": [ - "t0xic0der" - ], - "ticket": [] - }, - "close_status": [ - "Complete", - "Baseless" - ], - "custom_keys": [], - "date_created": "1697168063", - "date_modified": "1744795940", - "description": "The source namespace for the Pagure Exporter project to run tests against", - "full_url": "https://pagure.io/protop2g-test-srce", - "fullname": "protop2g-test-srce", - "id": 17042, - "milestones": { - "Milestone AAAA": { - "active": true, - "date": "1765497600" - }, - "Milestone BBBB": { - "active": false, - "date": "1765497600" - }, - "Milestone CCCC": { - "active": true, - "date": "1765497600" - }, - "Milestone DDDD": { - "active": false, - "date": "1765497600" - } - }, - "name": "protop2g-test-srce", - "namespace": null, - "parent": null, - "priorities": { - "": "", - "1": "Common", - "2": "Uncommon", - "3": "Rare", - "4": "Epic", - "5": "Mythic" - }, - "tags": [ - "srce", - "test", - "gridhead", - "protop2g" - ], - "url_path": "protop2g-test-srce", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - "status": "Merged", - "tags": [ - "eeee" - ], - "threshold_reached": null, - "title": "Change the branch identity to `test-eeee` in the README.md file", - "uid": "f2ad806e430a40bd8ee5894484338df4", - "updated_on": "1747635243", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } -} diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-requests b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-requests deleted file mode 100644 index 15b69e8f03..0000000000 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-requests +++ /dev/null @@ -1,507 +0,0 @@ -HTTP/2 200 -date: Wed, 23 Jul 2025 06:18:47 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 14090 -content-security-policy: default-src 'self';script-src 'self' 'nonce-t1H8BCX7kXOBmXS0wHPpBrAhK'; style-src 'self' 'nonce-t1H8BCX7kXOBmXS0wHPpBrAhK'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiODAwYWYyZGI3MjZlMzA2ZTdmNTdlMmIwNGVkNmU3YTBmNDYwZDUyMyJ9.G2IQRw.EDXBH36zsKcHKDETH_g7miO_r_w; Expires=Sat, 23-Aug-2025 06:18:47 GMT; Secure; HttpOnly; Path=/ -content-type: application/json - -{ - "args": { - "assignee": null, - "author": null, - "page": 1, - "per_page": 20, - "status": true, - "tags": [] - }, - "pagination": { - "first": "https://pagure.io/api/0/protop2g-test-srce/pull-requests?per_page=20&page=1", - "last": "https://pagure.io/api/0/protop2g-test-srce/pull-requests?per_page=20&page=1", - "next": null, - "page": 1, - "pages": 1, - "per_page": 20, - "prev": null - }, - "requests": [ - { - "assignee": null, - "branch": "main", - "branch_from": "test-bbbb", - "cached_merge_status": "CONFLICTS", - "closed_at": null, - "closed_by": null, - "comments": [ - { - "comment": "**Metadata Update from @t0xic0der**:\n- Pull-request tagged with: bbbb", - "commit": null, - "date_created": "1746427480", - "edited_on": null, - "editor": null, - "filename": null, - "id": 219087, - "line": null, - "notification": true, - "parent": null, - "reactions": {}, - "tree": null, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "This is the first comment under this pull request.", - "commit": null, - "date_created": "1746595539", - "edited_on": null, - "editor": null, - "filename": null, - "id": 219192, - "line": null, - "notification": false, - "parent": null, - "reactions": {}, - "tree": null, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "This is the second comment under this pull request.", - "commit": null, - "date_created": "1746595552", - "edited_on": null, - "editor": null, - "filename": null, - "id": 219193, - "line": null, - "notification": false, - "parent": null, - "reactions": {}, - "tree": null, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - } - ], - "commit_start": "2d40761dc53e6fa060ac49d88e1452c6751d4b1c", - "commit_stop": "2d40761dc53e6fa060ac49d88e1452c6751d4b1c", - "date_created": "1746427470", - "full_url": "https://pagure.io/protop2g-test-srce/pull-request/6", - "id": 6, - "initial_comment": "Signed-off-by: Akashdeep Dhar ", - "last_updated": "1747643450", - "project": { - "access_groups": { - "admin": [], - "collaborator": [], - "commit": [], - "ticket": [] - }, - "access_users": { - "admin": [ - "ryanlerch" - ], - "collaborator": [], - "commit": [], - "owner": [ - "t0xic0der" - ], - "ticket": [] - }, - "close_status": [ - "Complete", - "Baseless" - ], - "custom_keys": [], - "date_created": "1697168063", - "date_modified": "1744795940", - "description": "The source namespace for the Pagure Exporter project to run tests against", - "full_url": "https://pagure.io/protop2g-test-srce", - "fullname": "protop2g-test-srce", - "id": 17042, - "milestones": { - "Milestone AAAA": { - "active": true, - "date": "1765497600" - }, - "Milestone BBBB": { - "active": false, - "date": "1765497600" - }, - "Milestone CCCC": { - "active": true, - "date": "1765497600" - }, - "Milestone DDDD": { - "active": false, - "date": "1765497600" - } - }, - "name": "protop2g-test-srce", - "namespace": null, - "parent": null, - "priorities": { - "": "", - "1": "Common", - "2": "Uncommon", - "3": "Rare", - "4": "Epic", - "5": "Mythic" - }, - "tags": [ - "srce", - "test", - "gridhead", - "protop2g" - ], - "url_path": "protop2g-test-srce", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - "remote_git": null, - "repo_from": { - "access_groups": { - "admin": [], - "collaborator": [], - "commit": [], - "ticket": [] - }, - "access_users": { - "admin": [ - "ryanlerch" - ], - "collaborator": [], - "commit": [], - "owner": [ - "t0xic0der" - ], - "ticket": [] - }, - "close_status": [ - "Complete", - "Baseless" - ], - "custom_keys": [], - "date_created": "1697168063", - "date_modified": "1744795940", - "description": "The source namespace for the Pagure Exporter project to run tests against", - "full_url": "https://pagure.io/protop2g-test-srce", - "fullname": "protop2g-test-srce", - "id": 17042, - "milestones": { - "Milestone AAAA": { - "active": true, - "date": "1765497600" - }, - "Milestone BBBB": { - "active": false, - "date": "1765497600" - }, - "Milestone CCCC": { - "active": true, - "date": "1765497600" - }, - "Milestone DDDD": { - "active": false, - "date": "1765497600" - } - }, - "name": "protop2g-test-srce", - "namespace": null, - "parent": null, - "priorities": { - "": "", - "1": "Common", - "2": "Uncommon", - "3": "Rare", - "4": "Epic", - "5": "Mythic" - }, - "tags": [ - "srce", - "test", - "gridhead", - "protop2g" - ], - "url_path": "protop2g-test-srce", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - "status": "Open", - "tags": [ - "bbbb" - ], - "threshold_reached": null, - "title": "Change the branch identity to `test-bbbb` in the README.md file", - "uid": "9cab89d6bb8c499e8fcb47926f1f5806", - "updated_on": "1746595552", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "assignee": null, - "branch": "main", - "branch_from": "test-aaaa", - "cached_merge_status": "CONFLICTS", - "closed_at": null, - "closed_by": null, - "comments": [ - { - "comment": "**Metadata Update from @t0xic0der**:\n- Pull-request tagged with: aaaa", - "commit": null, - "date_created": "1746427453", - "edited_on": null, - "editor": null, - "filename": null, - "id": 219086, - "line": null, - "notification": true, - "parent": null, - "reactions": {}, - "tree": null, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "This is the first comment under this pull request.", - "commit": null, - "date_created": "1746595521", - "edited_on": null, - "editor": null, - "filename": null, - "id": 219190, - "line": null, - "notification": false, - "parent": null, - "reactions": {}, - "tree": null, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - { - "comment": "This is the second comment under this pull request.", - "commit": null, - "date_created": "1746595529", - "edited_on": null, - "editor": null, - "filename": null, - "id": 219191, - "line": null, - "notification": false, - "parent": null, - "reactions": {}, - "tree": null, - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - } - ], - "commit_start": "b55e5c91d2572d60a8d7e71b3d3003e523127bd4", - "commit_stop": "b55e5c91d2572d60a8d7e71b3d3003e523127bd4", - "date_created": "1746427437", - "full_url": "https://pagure.io/protop2g-test-srce/pull-request/5", - "id": 5, - "initial_comment": "Signed-off-by: Akashdeep Dhar ", - "last_updated": "1747636185", - "project": { - "access_groups": { - "admin": [], - "collaborator": [], - "commit": [], - "ticket": [] - }, - "access_users": { - "admin": [ - "ryanlerch" - ], - "collaborator": [], - "commit": [], - "owner": [ - "t0xic0der" - ], - "ticket": [] - }, - "close_status": [ - "Complete", - "Baseless" - ], - "custom_keys": [], - "date_created": "1697168063", - "date_modified": "1744795940", - "description": "The source namespace for the Pagure Exporter project to run tests against", - "full_url": "https://pagure.io/protop2g-test-srce", - "fullname": "protop2g-test-srce", - "id": 17042, - "milestones": { - "Milestone AAAA": { - "active": true, - "date": "1765497600" - }, - "Milestone BBBB": { - "active": false, - "date": "1765497600" - }, - "Milestone CCCC": { - "active": true, - "date": "1765497600" - }, - "Milestone DDDD": { - "active": false, - "date": "1765497600" - } - }, - "name": "protop2g-test-srce", - "namespace": null, - "parent": null, - "priorities": { - "": "", - "1": "Common", - "2": "Uncommon", - "3": "Rare", - "4": "Epic", - "5": "Mythic" - }, - "tags": [ - "srce", - "test", - "gridhead", - "protop2g" - ], - "url_path": "protop2g-test-srce", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - "remote_git": null, - "repo_from": { - "access_groups": { - "admin": [], - "collaborator": [], - "commit": [], - "ticket": [] - }, - "access_users": { - "admin": [ - "ryanlerch" - ], - "collaborator": [], - "commit": [], - "owner": [ - "t0xic0der" - ], - "ticket": [] - }, - "close_status": [ - "Complete", - "Baseless" - ], - "custom_keys": [], - "date_created": "1697168063", - "date_modified": "1744795940", - "description": "The source namespace for the Pagure Exporter project to run tests against", - "full_url": "https://pagure.io/protop2g-test-srce", - "fullname": "protop2g-test-srce", - "id": 17042, - "milestones": { - "Milestone AAAA": { - "active": true, - "date": "1765497600" - }, - "Milestone BBBB": { - "active": false, - "date": "1765497600" - }, - "Milestone CCCC": { - "active": true, - "date": "1765497600" - }, - "Milestone DDDD": { - "active": false, - "date": "1765497600" - } - }, - "name": "protop2g-test-srce", - "namespace": null, - "parent": null, - "priorities": { - "": "", - "1": "Common", - "2": "Uncommon", - "3": "Rare", - "4": "Epic", - "5": "Mythic" - }, - "tags": [ - "srce", - "test", - "gridhead", - "protop2g" - ], - "url_path": "protop2g-test-srce", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - }, - "status": "Open", - "tags": [ - "aaaa" - ], - "threshold_reached": null, - "title": "Change the branch identity to `test-aaaa` in the README.md file", - "uid": "f9e737c5ccc1434e9798cfd49d192538", - "updated_on": "1746595529", - "user": { - "full_url": "https://pagure.io/user/t0xic0der", - "fullname": "Akashdeep Dhar", - "name": "t0xic0der", - "url_path": "user/t0xic0der" - } - } - ], - "total_requests": 2 -} diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-requests%3Fpage=1&per_page=20&status=all b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-requests%3Fpage=1&per_page=20&status=all new file mode 100644 index 0000000000..f9127f0899 --- /dev/null +++ b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Fpull-requests%3Fpage=1&per_page=20&status=all @@ -0,0 +1,1418 @@ +Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiMGIxOTQwMmQ5ZGRhMjk4NDZhM2VkNTFhMWI0MzZjNWQ4MTZmNTczYSJ9.G4-gtQ.NMS0gvCElG-a6Nm6IwwBJi3TSUM; Expires=Fri, 26-Sep-2025 19:47:01 GMT; Secure; HttpOnly; Path=/ +Content-Type: application/json +X-Xss-Protection: 1; mode=block +X-Content-Type-Options: nosniff +X-Frame-Options: ALLOW-FROM https://pagure.io/ +Strict-Transport-Security: max-age=31536000; includeSubDomains; preload +Referrer-Policy: same-origin +Content-Length: 40500 +Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-wa5O4laHUSWMEwIK4wwBWPPTY'; style-src 'self' 'nonce-wa5O4laHUSWMEwIK4wwBWPPTY'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; + +{ + "args": { + "assignee": null, + "author": null, + "page": 1, + "per_page": 20, + "status": "all", + "tags": [] + }, + "pagination": { + "first": "https://pagure.io/api/0/protop2g-test-srce/pull-requests?per_page=20&status=all&page=1", + "last": "https://pagure.io/api/0/protop2g-test-srce/pull-requests?per_page=20&status=all&page=1", + "next": null, + "page": 1, + "pages": 1, + "per_page": 20, + "prev": null + }, + "requests": [ + { + "assignee": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + }, + "branch": "main", + "branch_from": "test-ffff", + "cached_merge_status": "unknown", + "closed_at": "1747635431", + "closed_by": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + }, + "comments": [ + { + "comment": "**Metadata Update from @t0xic0der**:\n- Pull-request tagged with: ffff\n- Request assigned", + "commit": null, + "date_created": "1747635211", + "edited_on": null, + "editor": null, + "filename": null, + "id": 219623, + "line": null, + "notification": true, + "parent": null, + "reactions": {}, + "tree": null, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "rebased onto 01b420e2964928a15f790f9b7c1a0053e7b5f0a5", + "commit": null, + "date_created": "1747635389", + "edited_on": null, + "editor": null, + "filename": null, + "id": 219625, + "line": null, + "notification": true, + "parent": null, + "reactions": {}, + "tree": null, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "Pull-Request has been merged by t0xic0der", + "commit": null, + "date_created": "1747635431", + "edited_on": null, + "editor": null, + "filename": null, + "id": 219626, + "line": null, + "notification": true, + "parent": null, + "reactions": {}, + "tree": null, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + } + ], + "commit_start": "1a6ccc212aa958a0fe76155c2907c889969a7224", + "commit_stop": "1a6ccc212aa958a0fe76155c2907c889969a7224", + "date_created": "1747635165", + "full_url": "https://pagure.io/protop2g-test-srce/pull-request/10", + "id": 10, + "initial_comment": "Signed-off-by: Akashdeep Dhar ", + "last_updated": "1747635431", + "project": { + "access_groups": { + "admin": [], + "collaborator": [], + "commit": [], + "ticket": [] + }, + "access_users": { + "admin": [ + "ryanlerch" + ], + "collaborator": [], + "commit": [], + "owner": [ + "t0xic0der" + ], + "ticket": [] + }, + "close_status": [ + "Complete", + "Baseless" + ], + "custom_keys": [], + "date_created": "1697168063", + "date_modified": "1744795940", + "description": "The source namespace for the Pagure Exporter project to run tests against", + "full_url": "https://pagure.io/protop2g-test-srce", + "fullname": "protop2g-test-srce", + "id": 17042, + "milestones": { + "Milestone AAAA": { + "active": true, + "date": "1765497600" + }, + "Milestone BBBB": { + "active": false, + "date": "1765497600" + }, + "Milestone CCCC": { + "active": true, + "date": "1765497600" + }, + "Milestone DDDD": { + "active": false, + "date": "1765497600" + } + }, + "name": "protop2g-test-srce", + "namespace": null, + "parent": null, + "priorities": { + "": "", + "1": "Common", + "2": "Uncommon", + "3": "Rare", + "4": "Epic", + "5": "Mythic" + }, + "tags": [ + "srce", + "test", + "gridhead", + "protop2g" + ], + "url_path": "protop2g-test-srce", + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + "remote_git": null, + "repo_from": { + "access_groups": { + "admin": [], + "collaborator": [], + "commit": [], + "ticket": [] + }, + "access_users": { + "admin": [ + "ryanlerch" + ], + "collaborator": [], + "commit": [], + "owner": [ + "t0xic0der" + ], + "ticket": [] + }, + "close_status": [ + "Complete", + "Baseless" + ], + "custom_keys": [], + "date_created": "1697168063", + "date_modified": "1744795940", + "description": "The source namespace for the Pagure Exporter project to run tests against", + "full_url": "https://pagure.io/protop2g-test-srce", + "fullname": "protop2g-test-srce", + "id": 17042, + "milestones": { + "Milestone AAAA": { + "active": true, + "date": "1765497600" + }, + "Milestone BBBB": { + "active": false, + "date": "1765497600" + }, + "Milestone CCCC": { + "active": true, + "date": "1765497600" + }, + "Milestone DDDD": { + "active": false, + "date": "1765497600" + } + }, + "name": "protop2g-test-srce", + "namespace": null, + "parent": null, + "priorities": { + "": "", + "1": "Common", + "2": "Uncommon", + "3": "Rare", + "4": "Epic", + "5": "Mythic" + }, + "tags": [ + "srce", + "test", + "gridhead", + "protop2g" + ], + "url_path": "protop2g-test-srce", + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + "status": "Merged", + "tags": [ + "ffff" + ], + "threshold_reached": null, + "title": "Change the branch identity to `test-ffff` in the README.md file", + "uid": "d3b7100abf8b4b02aa220d899e063295", + "updated_on": "1747635431", + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "assignee": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + }, + "branch": "main", + "branch_from": "test-eeee", + "cached_merge_status": "unknown", + "closed_at": "1747635243", + "closed_by": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + }, + "comments": [ + { + "comment": "**Metadata Update from @t0xic0der**:\n- Pull-request tagged with: eeee\n- Request assigned", + "commit": null, + "date_created": "1747635200", + "edited_on": null, + "editor": null, + "filename": null, + "id": 219622, + "line": null, + "notification": true, + "parent": null, + "reactions": {}, + "tree": null, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "Pull-Request has been merged by t0xic0der", + "commit": null, + "date_created": "1747635243", + "edited_on": null, + "editor": null, + "filename": null, + "id": 219624, + "line": null, + "notification": true, + "parent": null, + "reactions": {}, + "tree": null, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + } + ], + "commit_start": "01b420e2964928a15f790f9b7c1a0053e7b5f0a5", + "commit_stop": "01b420e2964928a15f790f9b7c1a0053e7b5f0a5", + "date_created": "1747635161", + "full_url": "https://pagure.io/protop2g-test-srce/pull-request/9", + "id": 9, + "initial_comment": "Signed-off-by: Akashdeep Dhar ", + "last_updated": "1747635243", + "project": { + "access_groups": { + "admin": [], + "collaborator": [], + "commit": [], + "ticket": [] + }, + "access_users": { + "admin": [ + "ryanlerch" + ], + "collaborator": [], + "commit": [], + "owner": [ + "t0xic0der" + ], + "ticket": [] + }, + "close_status": [ + "Complete", + "Baseless" + ], + "custom_keys": [], + "date_created": "1697168063", + "date_modified": "1744795940", + "description": "The source namespace for the Pagure Exporter project to run tests against", + "full_url": "https://pagure.io/protop2g-test-srce", + "fullname": "protop2g-test-srce", + "id": 17042, + "milestones": { + "Milestone AAAA": { + "active": true, + "date": "1765497600" + }, + "Milestone BBBB": { + "active": false, + "date": "1765497600" + }, + "Milestone CCCC": { + "active": true, + "date": "1765497600" + }, + "Milestone DDDD": { + "active": false, + "date": "1765497600" + } + }, + "name": "protop2g-test-srce", + "namespace": null, + "parent": null, + "priorities": { + "": "", + "1": "Common", + "2": "Uncommon", + "3": "Rare", + "4": "Epic", + "5": "Mythic" + }, + "tags": [ + "srce", + "test", + "gridhead", + "protop2g" + ], + "url_path": "protop2g-test-srce", + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + "remote_git": null, + "repo_from": { + "access_groups": { + "admin": [], + "collaborator": [], + "commit": [], + "ticket": [] + }, + "access_users": { + "admin": [ + "ryanlerch" + ], + "collaborator": [], + "commit": [], + "owner": [ + "t0xic0der" + ], + "ticket": [] + }, + "close_status": [ + "Complete", + "Baseless" + ], + "custom_keys": [], + "date_created": "1697168063", + "date_modified": "1744795940", + "description": "The source namespace for the Pagure Exporter project to run tests against", + "full_url": "https://pagure.io/protop2g-test-srce", + "fullname": "protop2g-test-srce", + "id": 17042, + "milestones": { + "Milestone AAAA": { + "active": true, + "date": "1765497600" + }, + "Milestone BBBB": { + "active": false, + "date": "1765497600" + }, + "Milestone CCCC": { + "active": true, + "date": "1765497600" + }, + "Milestone DDDD": { + "active": false, + "date": "1765497600" + } + }, + "name": "protop2g-test-srce", + "namespace": null, + "parent": null, + "priorities": { + "": "", + "1": "Common", + "2": "Uncommon", + "3": "Rare", + "4": "Epic", + "5": "Mythic" + }, + "tags": [ + "srce", + "test", + "gridhead", + "protop2g" + ], + "url_path": "protop2g-test-srce", + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + "status": "Merged", + "tags": [ + "eeee" + ], + "threshold_reached": null, + "title": "Change the branch identity to `test-eeee` in the README.md file", + "uid": "f2ad806e430a40bd8ee5894484338df4", + "updated_on": "1747635243", + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "assignee": null, + "branch": "main", + "branch_from": "test-dddd", + "cached_merge_status": "FFORWARD", + "closed_at": "1746428053", + "closed_by": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + }, + "comments": [ + { + "comment": "**Metadata Update from @t0xic0der**:\n- Pull-request tagged with: dddd", + "commit": null, + "date_created": "1746427540", + "edited_on": null, + "editor": null, + "filename": null, + "id": 219089, + "line": null, + "notification": true, + "parent": null, + "reactions": {}, + "tree": null, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "Pull-Request has been closed by t0xic0der", + "commit": null, + "date_created": "1746428053", + "edited_on": null, + "editor": null, + "filename": null, + "id": 219091, + "line": null, + "notification": true, + "parent": null, + "reactions": {}, + "tree": null, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + } + ], + "commit_start": "0bc8b0c38e0790e9ef5c8d512a00b9c4dd048160", + "commit_stop": "0bc8b0c38e0790e9ef5c8d512a00b9c4dd048160", + "date_created": "1746427532", + "full_url": "https://pagure.io/protop2g-test-srce/pull-request/8", + "id": 8, + "initial_comment": "Signed-off-by: Akashdeep Dhar ", + "last_updated": "1746428053", + "project": { + "access_groups": { + "admin": [], + "collaborator": [], + "commit": [], + "ticket": [] + }, + "access_users": { + "admin": [ + "ryanlerch" + ], + "collaborator": [], + "commit": [], + "owner": [ + "t0xic0der" + ], + "ticket": [] + }, + "close_status": [ + "Complete", + "Baseless" + ], + "custom_keys": [], + "date_created": "1697168063", + "date_modified": "1744795940", + "description": "The source namespace for the Pagure Exporter project to run tests against", + "full_url": "https://pagure.io/protop2g-test-srce", + "fullname": "protop2g-test-srce", + "id": 17042, + "milestones": { + "Milestone AAAA": { + "active": true, + "date": "1765497600" + }, + "Milestone BBBB": { + "active": false, + "date": "1765497600" + }, + "Milestone CCCC": { + "active": true, + "date": "1765497600" + }, + "Milestone DDDD": { + "active": false, + "date": "1765497600" + } + }, + "name": "protop2g-test-srce", + "namespace": null, + "parent": null, + "priorities": { + "": "", + "1": "Common", + "2": "Uncommon", + "3": "Rare", + "4": "Epic", + "5": "Mythic" + }, + "tags": [ + "srce", + "test", + "gridhead", + "protop2g" + ], + "url_path": "protop2g-test-srce", + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + "remote_git": null, + "repo_from": { + "access_groups": { + "admin": [], + "collaborator": [], + "commit": [], + "ticket": [] + }, + "access_users": { + "admin": [ + "ryanlerch" + ], + "collaborator": [], + "commit": [], + "owner": [ + "t0xic0der" + ], + "ticket": [] + }, + "close_status": [ + "Complete", + "Baseless" + ], + "custom_keys": [], + "date_created": "1697168063", + "date_modified": "1744795940", + "description": "The source namespace for the Pagure Exporter project to run tests against", + "full_url": "https://pagure.io/protop2g-test-srce", + "fullname": "protop2g-test-srce", + "id": 17042, + "milestones": { + "Milestone AAAA": { + "active": true, + "date": "1765497600" + }, + "Milestone BBBB": { + "active": false, + "date": "1765497600" + }, + "Milestone CCCC": { + "active": true, + "date": "1765497600" + }, + "Milestone DDDD": { + "active": false, + "date": "1765497600" + } + }, + "name": "protop2g-test-srce", + "namespace": null, + "parent": null, + "priorities": { + "": "", + "1": "Common", + "2": "Uncommon", + "3": "Rare", + "4": "Epic", + "5": "Mythic" + }, + "tags": [ + "srce", + "test", + "gridhead", + "protop2g" + ], + "url_path": "protop2g-test-srce", + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + "status": "Closed", + "tags": [ + "dddd" + ], + "threshold_reached": null, + "title": "Change the branch identity to `test-dddd` in the README.md file", + "uid": "493b294044fd48e18f424210c919d8de", + "updated_on": "1746428053", + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "assignee": null, + "branch": "main", + "branch_from": "test-cccc", + "cached_merge_status": "FFORWARD", + "closed_at": "1746428043", + "closed_by": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + }, + "comments": [ + { + "comment": "**Metadata Update from @t0xic0der**:\n- Pull-request tagged with: cccc", + "commit": null, + "date_created": "1746427513", + "edited_on": null, + "editor": null, + "filename": null, + "id": 219088, + "line": null, + "notification": true, + "parent": null, + "reactions": {}, + "tree": null, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "Pull-Request has been closed by t0xic0der", + "commit": null, + "date_created": "1746428043", + "edited_on": null, + "editor": null, + "filename": null, + "id": 219090, + "line": null, + "notification": true, + "parent": null, + "reactions": {}, + "tree": null, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + } + ], + "commit_start": "f1246e331cade9341b9e4f311b7a134f99893d21", + "commit_stop": "f1246e331cade9341b9e4f311b7a134f99893d21", + "date_created": "1746427506", + "full_url": "https://pagure.io/protop2g-test-srce/pull-request/7", + "id": 7, + "initial_comment": "Signed-off-by: Akashdeep Dhar ", + "last_updated": "1746428043", + "project": { + "access_groups": { + "admin": [], + "collaborator": [], + "commit": [], + "ticket": [] + }, + "access_users": { + "admin": [ + "ryanlerch" + ], + "collaborator": [], + "commit": [], + "owner": [ + "t0xic0der" + ], + "ticket": [] + }, + "close_status": [ + "Complete", + "Baseless" + ], + "custom_keys": [], + "date_created": "1697168063", + "date_modified": "1744795940", + "description": "The source namespace for the Pagure Exporter project to run tests against", + "full_url": "https://pagure.io/protop2g-test-srce", + "fullname": "protop2g-test-srce", + "id": 17042, + "milestones": { + "Milestone AAAA": { + "active": true, + "date": "1765497600" + }, + "Milestone BBBB": { + "active": false, + "date": "1765497600" + }, + "Milestone CCCC": { + "active": true, + "date": "1765497600" + }, + "Milestone DDDD": { + "active": false, + "date": "1765497600" + } + }, + "name": "protop2g-test-srce", + "namespace": null, + "parent": null, + "priorities": { + "": "", + "1": "Common", + "2": "Uncommon", + "3": "Rare", + "4": "Epic", + "5": "Mythic" + }, + "tags": [ + "srce", + "test", + "gridhead", + "protop2g" + ], + "url_path": "protop2g-test-srce", + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + "remote_git": null, + "repo_from": { + "access_groups": { + "admin": [], + "collaborator": [], + "commit": [], + "ticket": [] + }, + "access_users": { + "admin": [ + "ryanlerch" + ], + "collaborator": [], + "commit": [], + "owner": [ + "t0xic0der" + ], + "ticket": [] + }, + "close_status": [ + "Complete", + "Baseless" + ], + "custom_keys": [], + "date_created": "1697168063", + "date_modified": "1744795940", + "description": "The source namespace for the Pagure Exporter project to run tests against", + "full_url": "https://pagure.io/protop2g-test-srce", + "fullname": "protop2g-test-srce", + "id": 17042, + "milestones": { + "Milestone AAAA": { + "active": true, + "date": "1765497600" + }, + "Milestone BBBB": { + "active": false, + "date": "1765497600" + }, + "Milestone CCCC": { + "active": true, + "date": "1765497600" + }, + "Milestone DDDD": { + "active": false, + "date": "1765497600" + } + }, + "name": "protop2g-test-srce", + "namespace": null, + "parent": null, + "priorities": { + "": "", + "1": "Common", + "2": "Uncommon", + "3": "Rare", + "4": "Epic", + "5": "Mythic" + }, + "tags": [ + "srce", + "test", + "gridhead", + "protop2g" + ], + "url_path": "protop2g-test-srce", + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + "status": "Closed", + "tags": [ + "cccc" + ], + "threshold_reached": null, + "title": "Change the branch identity to `test-cccc` in the README.md file", + "uid": "f696feab56b84557b4d4a8a4462420ee", + "updated_on": "1746428043", + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "assignee": null, + "branch": "main", + "branch_from": "test-bbbb", + "cached_merge_status": "CONFLICTS", + "closed_at": null, + "closed_by": null, + "comments": [ + { + "comment": "**Metadata Update from @t0xic0der**:\n- Pull-request tagged with: bbbb", + "commit": null, + "date_created": "1746427480", + "edited_on": null, + "editor": null, + "filename": null, + "id": 219087, + "line": null, + "notification": true, + "parent": null, + "reactions": {}, + "tree": null, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "This is the first comment under this pull request.", + "commit": null, + "date_created": "1746595539", + "edited_on": null, + "editor": null, + "filename": null, + "id": 219192, + "line": null, + "notification": false, + "parent": null, + "reactions": {}, + "tree": null, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "This is the second comment under this pull request.", + "commit": null, + "date_created": "1746595552", + "edited_on": null, + "editor": null, + "filename": null, + "id": 219193, + "line": null, + "notification": false, + "parent": null, + "reactions": {}, + "tree": null, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + } + ], + "commit_start": "2d40761dc53e6fa060ac49d88e1452c6751d4b1c", + "commit_stop": "2d40761dc53e6fa060ac49d88e1452c6751d4b1c", + "date_created": "1746427470", + "full_url": "https://pagure.io/protop2g-test-srce/pull-request/6", + "id": 6, + "initial_comment": "Signed-off-by: Akashdeep Dhar ", + "last_updated": "1747643450", + "project": { + "access_groups": { + "admin": [], + "collaborator": [], + "commit": [], + "ticket": [] + }, + "access_users": { + "admin": [ + "ryanlerch" + ], + "collaborator": [], + "commit": [], + "owner": [ + "t0xic0der" + ], + "ticket": [] + }, + "close_status": [ + "Complete", + "Baseless" + ], + "custom_keys": [], + "date_created": "1697168063", + "date_modified": "1744795940", + "description": "The source namespace for the Pagure Exporter project to run tests against", + "full_url": "https://pagure.io/protop2g-test-srce", + "fullname": "protop2g-test-srce", + "id": 17042, + "milestones": { + "Milestone AAAA": { + "active": true, + "date": "1765497600" + }, + "Milestone BBBB": { + "active": false, + "date": "1765497600" + }, + "Milestone CCCC": { + "active": true, + "date": "1765497600" + }, + "Milestone DDDD": { + "active": false, + "date": "1765497600" + } + }, + "name": "protop2g-test-srce", + "namespace": null, + "parent": null, + "priorities": { + "": "", + "1": "Common", + "2": "Uncommon", + "3": "Rare", + "4": "Epic", + "5": "Mythic" + }, + "tags": [ + "srce", + "test", + "gridhead", + "protop2g" + ], + "url_path": "protop2g-test-srce", + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + "remote_git": null, + "repo_from": { + "access_groups": { + "admin": [], + "collaborator": [], + "commit": [], + "ticket": [] + }, + "access_users": { + "admin": [ + "ryanlerch" + ], + "collaborator": [], + "commit": [], + "owner": [ + "t0xic0der" + ], + "ticket": [] + }, + "close_status": [ + "Complete", + "Baseless" + ], + "custom_keys": [], + "date_created": "1697168063", + "date_modified": "1744795940", + "description": "The source namespace for the Pagure Exporter project to run tests against", + "full_url": "https://pagure.io/protop2g-test-srce", + "fullname": "protop2g-test-srce", + "id": 17042, + "milestones": { + "Milestone AAAA": { + "active": true, + "date": "1765497600" + }, + "Milestone BBBB": { + "active": false, + "date": "1765497600" + }, + "Milestone CCCC": { + "active": true, + "date": "1765497600" + }, + "Milestone DDDD": { + "active": false, + "date": "1765497600" + } + }, + "name": "protop2g-test-srce", + "namespace": null, + "parent": null, + "priorities": { + "": "", + "1": "Common", + "2": "Uncommon", + "3": "Rare", + "4": "Epic", + "5": "Mythic" + }, + "tags": [ + "srce", + "test", + "gridhead", + "protop2g" + ], + "url_path": "protop2g-test-srce", + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + "status": "Open", + "tags": [ + "bbbb" + ], + "threshold_reached": null, + "title": "Change the branch identity to `test-bbbb` in the README.md file", + "uid": "9cab89d6bb8c499e8fcb47926f1f5806", + "updated_on": "1746595552", + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "assignee": null, + "branch": "main", + "branch_from": "test-aaaa", + "cached_merge_status": "CONFLICTS", + "closed_at": null, + "closed_by": null, + "comments": [ + { + "comment": "**Metadata Update from @t0xic0der**:\n- Pull-request tagged with: aaaa", + "commit": null, + "date_created": "1746427453", + "edited_on": null, + "editor": null, + "filename": null, + "id": 219086, + "line": null, + "notification": true, + "parent": null, + "reactions": {}, + "tree": null, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "This is the first comment under this pull request.", + "commit": null, + "date_created": "1746595521", + "edited_on": null, + "editor": null, + "filename": null, + "id": 219190, + "line": null, + "notification": false, + "parent": null, + "reactions": {}, + "tree": null, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + { + "comment": "This is the second comment under this pull request.", + "commit": null, + "date_created": "1746595529", + "edited_on": null, + "editor": null, + "filename": null, + "id": 219191, + "line": null, + "notification": false, + "parent": null, + "reactions": {}, + "tree": null, + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + } + ], + "commit_start": "b55e5c91d2572d60a8d7e71b3d3003e523127bd4", + "commit_stop": "b55e5c91d2572d60a8d7e71b3d3003e523127bd4", + "date_created": "1746427437", + "full_url": "https://pagure.io/protop2g-test-srce/pull-request/5", + "id": 5, + "initial_comment": "Signed-off-by: Akashdeep Dhar ", + "last_updated": "1747636185", + "project": { + "access_groups": { + "admin": [], + "collaborator": [], + "commit": [], + "ticket": [] + }, + "access_users": { + "admin": [ + "ryanlerch" + ], + "collaborator": [], + "commit": [], + "owner": [ + "t0xic0der" + ], + "ticket": [] + }, + "close_status": [ + "Complete", + "Baseless" + ], + "custom_keys": [], + "date_created": "1697168063", + "date_modified": "1744795940", + "description": "The source namespace for the Pagure Exporter project to run tests against", + "full_url": "https://pagure.io/protop2g-test-srce", + "fullname": "protop2g-test-srce", + "id": 17042, + "milestones": { + "Milestone AAAA": { + "active": true, + "date": "1765497600" + }, + "Milestone BBBB": { + "active": false, + "date": "1765497600" + }, + "Milestone CCCC": { + "active": true, + "date": "1765497600" + }, + "Milestone DDDD": { + "active": false, + "date": "1765497600" + } + }, + "name": "protop2g-test-srce", + "namespace": null, + "parent": null, + "priorities": { + "": "", + "1": "Common", + "2": "Uncommon", + "3": "Rare", + "4": "Epic", + "5": "Mythic" + }, + "tags": [ + "srce", + "test", + "gridhead", + "protop2g" + ], + "url_path": "protop2g-test-srce", + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + "remote_git": null, + "repo_from": { + "access_groups": { + "admin": [], + "collaborator": [], + "commit": [], + "ticket": [] + }, + "access_users": { + "admin": [ + "ryanlerch" + ], + "collaborator": [], + "commit": [], + "owner": [ + "t0xic0der" + ], + "ticket": [] + }, + "close_status": [ + "Complete", + "Baseless" + ], + "custom_keys": [], + "date_created": "1697168063", + "date_modified": "1744795940", + "description": "The source namespace for the Pagure Exporter project to run tests against", + "full_url": "https://pagure.io/protop2g-test-srce", + "fullname": "protop2g-test-srce", + "id": 17042, + "milestones": { + "Milestone AAAA": { + "active": true, + "date": "1765497600" + }, + "Milestone BBBB": { + "active": false, + "date": "1765497600" + }, + "Milestone CCCC": { + "active": true, + "date": "1765497600" + }, + "Milestone DDDD": { + "active": false, + "date": "1765497600" + } + }, + "name": "protop2g-test-srce", + "namespace": null, + "parent": null, + "priorities": { + "": "", + "1": "Common", + "2": "Uncommon", + "3": "Rare", + "4": "Epic", + "5": "Mythic" + }, + "tags": [ + "srce", + "test", + "gridhead", + "protop2g" + ], + "url_path": "protop2g-test-srce", + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + }, + "status": "Open", + "tags": [ + "aaaa" + ], + "threshold_reached": null, + "title": "Change the branch identity to `test-aaaa` in the README.md file", + "uid": "f9e737c5ccc1434e9798cfd49d192538", + "updated_on": "1746595529", + "user": { + "full_url": "https://pagure.io/user/t0xic0der", + "fullname": "Akashdeep Dhar", + "name": "t0xic0der", + "url_path": "user/t0xic0der" + } + } + ], + "total_requests": 6 +} diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Faaaa b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Faaaa index d0f24e646e..416eb8be84 100644 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Faaaa +++ b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Faaaa @@ -1,15 +1,12 @@ -HTTP/2 200 -date: Wed, 23 Jul 2025 05:34:39 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 77 -content-security-policy: default-src 'self';script-src 'self' 'nonce-gI8Srx27RgY20Zqw5vVkWVORV'; style-src 'self' 'nonce-gI8Srx27RgY20Zqw5vVkWVORV'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiZmJhYTlmMTAzYzYxMWE5NmZiZDNkZjE1ZmRiZGQzYTA5YTQ1YTM2YyJ9.G2IF7w.CLP1edDfZSoJcXjoUNt40swcBV8; Expires=Sat, 23-Aug-2025 05:34:39 GMT; Secure; HttpOnly; Path=/ -content-type: application/json +X-Xss-Protection: 1; mode=block +Referrer-Policy: same-origin +X-Frame-Options: ALLOW-FROM https://pagure.io/ +Content-Length: 77 +Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-NY1utFEeOZi2ktclBSK9yPBbQ'; style-src 'self' 'nonce-NY1utFEeOZi2ktclBSK9yPBbQ'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; +Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiNDUzNjY2Zjg4OGI5YThiNjU4N2Y3YzU1ZTk4ZTEwZGZhMGZiM2Q1MSJ9.G4-gsw.MW8WhWH9mQd10iDTu49EExAjtOU; Expires=Fri, 26-Sep-2025 19:46:59 GMT; Secure; HttpOnly; Path=/ +X-Content-Type-Options: nosniff +Strict-Transport-Security: max-age=31536000; includeSubDomains; preload +Content-Type: application/json { "tag": "aaaa", diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fbbbb b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fbbbb index a859096f25..b0bea5052f 100644 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fbbbb +++ b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fbbbb @@ -1,15 +1,12 @@ -HTTP/2 200 -date: Wed, 23 Jul 2025 05:34:50 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 77 -content-security-policy: default-src 'self';script-src 'self' 'nonce-wgQpgRvwBbyoY9WWTv55wb8Dd'; style-src 'self' 'nonce-wgQpgRvwBbyoY9WWTv55wb8Dd'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiZWU4ZDUxYzY4NmUzMzM4ODg4YmRmMjQwYmU3ODVhOTA4MzQ4N2Q2NiJ9.G2IF-g.nG1k1zU4b9Eo9WFGCas8R9a5-Vg; Expires=Sat, 23-Aug-2025 05:34:50 GMT; Secure; HttpOnly; Path=/ -content-type: application/json +X-Xss-Protection: 1; mode=block +Referrer-Policy: same-origin +Content-Length: 77 +Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-3WQfyrKHlOVMS6hbVxdWffV0z'; style-src 'self' 'nonce-3WQfyrKHlOVMS6hbVxdWffV0z'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; +Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiYzM2NjVjMjRkYjU5Nzk2NzBiZjRlMmY4NWNmYTIwMGU3NWFjNTg2MiJ9.G4-gsw.wmhIp0DsAhRYagA9qZFYM5jWWt0; Expires=Fri, 26-Sep-2025 19:46:59 GMT; Secure; HttpOnly; Path=/ +Content-Type: application/json +X-Content-Type-Options: nosniff +X-Frame-Options: ALLOW-FROM https://pagure.io/ +Strict-Transport-Security: max-age=31536000; includeSubDomains; preload { "tag": "bbbb", diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fcccc b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fcccc index c4fdc9aa46..378d374b36 100644 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fcccc +++ b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fcccc @@ -1,15 +1,12 @@ -HTTP/2 200 -date: Wed, 23 Jul 2025 05:35:02 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 77 -content-security-policy: default-src 'self';script-src 'self' 'nonce-kAxTKES1vWlzLCIScejGQ5JpX'; style-src 'self' 'nonce-kAxTKES1vWlzLCIScejGQ5JpX'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiYjhhM2YxNjJhZDYwYWU5NzE4NmQ4NDBkMzJlOWNkYmYxN2Y2NjBmMyJ9.G2IGBg.oA7d9DJHW4_ilpbiVkbveF5dM3Q; Expires=Sat, 23-Aug-2025 05:35:02 GMT; Secure; HttpOnly; Path=/ -content-type: application/json +Content-Length: 77 +Content-Type: application/json +X-Xss-Protection: 1; mode=block +Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-n8CH3n7QkxYS4ITojGCPv0Qaf'; style-src 'self' 'nonce-n8CH3n7QkxYS4ITojGCPv0Qaf'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; +Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiMDQyNDhlM2I3NDMzNWU3MDNkOWQ4MDk5M2FhNmYzZTk1N2M3NWFiNiJ9.G4-gsw.fIL0G11hmPPmHfKgqa3UGbhc3Wg; Expires=Fri, 26-Sep-2025 19:46:59 GMT; Secure; HttpOnly; Path=/ +X-Content-Type-Options: nosniff +Referrer-Policy: same-origin +X-Frame-Options: ALLOW-FROM https://pagure.io/ +Strict-Transport-Security: max-age=31536000; includeSubDomains; preload { "tag": "cccc", diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fdddd b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fdddd index db9ad09a74..fa6d75ff1d 100644 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fdddd +++ b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fdddd @@ -1,15 +1,12 @@ -HTTP/2 200 -date: Wed, 23 Jul 2025 05:36:23 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 77 -content-security-policy: default-src 'self';script-src 'self' 'nonce-rzXQsxeaBjeye4rVcEn3aSWKa'; style-src 'self' 'nonce-rzXQsxeaBjeye4rVcEn3aSWKa'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiY2VhZjRhOTlkZWUxZDcxODg2NWIyN2JhZGY4ZjUyMjcxZTdkZGU0MyJ9.G2IGVw.JCK3tXfD0aOgDdIAMv5MlFkl-SY; Expires=Sat, 23-Aug-2025 05:36:23 GMT; Secure; HttpOnly; Path=/ -content-type: application/json +Strict-Transport-Security: max-age=31536000; includeSubDomains; preload +Content-Length: 77 +Content-Type: application/json +X-Xss-Protection: 1; mode=block +X-Content-Type-Options: nosniff +X-Frame-Options: ALLOW-FROM https://pagure.io/ +Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-Paip3h7855Wqz66JatzO28HOo'; style-src 'self' 'nonce-Paip3h7855Wqz66JatzO28HOo'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; +Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiYjIxMzk4ZjQwMDM3NjdmMWY0MjI5YTExYTVlNDQwODlhYWJhNTgyOSJ9.G4-gsw.cpd52huyCk-zDHjOrMBhHmL5STo; Expires=Fri, 26-Sep-2025 19:46:59 GMT; Secure; HttpOnly; Path=/ +Referrer-Policy: same-origin { "tag": "dddd", diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Feeee b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Feeee index eac0faf464..2f4045095b 100644 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Feeee +++ b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Feeee @@ -1,15 +1,12 @@ -HTTP/2 200 -date: Wed, 23 Jul 2025 05:36:34 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 77 -content-security-policy: default-src 'self';script-src 'self' 'nonce-gs07ooad3wPkkzZKAQDHDTrMl'; style-src 'self' 'nonce-gs07ooad3wPkkzZKAQDHDTrMl'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiOGEyNDUwYzk5MDY2ZjJhZGQyNDhlZmZmM2QxN2UxZTM0ODI2NWFhZiJ9.G2IGYg.hM6ZKEPDXtOvTWlSPeQBLiZjCO4; Expires=Sat, 23-Aug-2025 05:36:34 GMT; Secure; HttpOnly; Path=/ -content-type: application/json +X-Xss-Protection: 1; mode=block +X-Content-Type-Options: nosniff +Referrer-Policy: same-origin +X-Frame-Options: ALLOW-FROM https://pagure.io/ +Content-Length: 77 +Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-IeZeJPDSNyxAmSQ2Pe27r2Pkh'; style-src 'self' 'nonce-IeZeJPDSNyxAmSQ2Pe27r2Pkh'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; +Strict-Transport-Security: max-age=31536000; includeSubDomains; preload +Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiNWQ1NzQ3Yzg5ZDlkZGI2ZTVhNzUyYTk4YzAyMGFiYjg2Mzg1ZWFiYiJ9.G4-gsw.4o-K9_mwm_kGFNG-SVoQTu-nCGI; Expires=Fri, 26-Sep-2025 19:46:59 GMT; Secure; HttpOnly; Path=/ +Content-Type: application/json { "tag": "eeee", diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fffff b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fffff index af5935aa46..2261d20aa7 100644 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fffff +++ b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fffff @@ -1,15 +1,12 @@ -HTTP/2 200 -date: Wed, 23 Jul 2025 05:36:48 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 77 -content-security-policy: default-src 'self';script-src 'self' 'nonce-hiIOP1ZdLfgxJERlzriEOATjs'; style-src 'self' 'nonce-hiIOP1ZdLfgxJERlzriEOATjs'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiYWMyNjBhNjE5MjI0OTQ0YTU2Yzc5YjNmNzU3ZTU2MTYzZGQwMGMwNSJ9.G2IGcQ.22KbaZBjPxJkpIoTBIn1UtVzEjI; Expires=Sat, 23-Aug-2025 05:36:49 GMT; Secure; HttpOnly; Path=/ -content-type: application/json +X-Frame-Options: ALLOW-FROM https://pagure.io/ +Content-Length: 77 +Content-Type: application/json +X-Xss-Protection: 1; mode=block +X-Content-Type-Options: nosniff +Referrer-Policy: same-origin +Strict-Transport-Security: max-age=31536000; includeSubDomains; preload +Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-Uha6unaW4OnQWiyBCgumrISPz'; style-src 'self' 'nonce-Uha6unaW4OnQWiyBCgumrISPz'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; +Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiODQzMWM2NjIzMjhlN2RhZjE0Y2JhZDQyZGJmMzEwYTdmMWViYzY5NyJ9.G4-gtA.uJpeS8gZ7_ApSzx9_9YXrVsord8; Expires=Fri, 26-Sep-2025 19:47:00 GMT; Secure; HttpOnly; Path=/ { "tag": "ffff", diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fgggg b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fgggg index 28fd0ef15d..c18309ee1e 100644 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fgggg +++ b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fgggg @@ -1,15 +1,12 @@ -HTTP/2 200 -date: Wed, 23 Jul 2025 05:37:23 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 77 -content-security-policy: default-src 'self';script-src 'self' 'nonce-FYnaELqaJomAM4RnLtKUr7gbE'; style-src 'self' 'nonce-FYnaELqaJomAM4RnLtKUr7gbE'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiOGExMmI2MGZhYTQyYTY5MmQ0MzNkNWFlZTU0YjE4M2NjY2NmYjI3MCJ9.G2IGkw.9-wL70lPAOlpIv8cusGLLA0Np_U; Expires=Sat, 23-Aug-2025 05:37:23 GMT; Secure; HttpOnly; Path=/ -content-type: application/json +X-Frame-Options: ALLOW-FROM https://pagure.io/ +Strict-Transport-Security: max-age=31536000; includeSubDomains; preload +Content-Type: application/json +X-Xss-Protection: 1; mode=block +X-Content-Type-Options: nosniff +Referrer-Policy: same-origin +Content-Length: 77 +Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-osDml6SVKadPzyuwCkKx7Tzp3'; style-src 'self' 'nonce-osDml6SVKadPzyuwCkKx7Tzp3'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; +Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiZjUwMDIxYjVhOWE4ZDA2ZTFiMjlkMzRhM2U1N2U1NGFlZmMwZjE1ZSJ9.G4-gtA.67dL477zv1XhBvSAhCpCBM5Jk8Y; Expires=Fri, 26-Sep-2025 19:47:00 GMT; Secure; HttpOnly; Path=/ { "tag": "gggg", diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fhhhh b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fhhhh new file mode 100644 index 0000000000..92888037b2 --- /dev/null +++ b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftag%2Fhhhh @@ -0,0 +1,15 @@ +Content-Length: 77 +Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-lDad6e2jG7okmGyGV9ITt9k8w'; style-src 'self' 'nonce-lDad6e2jG7okmGyGV9ITt9k8w'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; +Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiYjhkZTg4NzJlYjkzMGM5ODZkOTZlNzYyZTJlMWE1ZWEyODk5MzU3NCJ9.G4-gtA.cWHYAAufMpUOgFp0oG7rpf_2k-0; Expires=Fri, 26-Sep-2025 19:47:00 GMT; Secure; HttpOnly; Path=/ +Content-Type: application/json +X-Xss-Protection: 1; mode=block +X-Content-Type-Options: nosniff +Referrer-Policy: same-origin +X-Frame-Options: ALLOW-FROM https://pagure.io/ +Strict-Transport-Security: max-age=31536000; includeSubDomains; preload + +{ + "tag": "hhhh", + "tag_color": "#0000ff", + "tag_description": "hhhh" +} diff --git a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftags b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftags index 1176b532a4..c648a8f338 100644 --- a/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftags +++ b/services/migrations/testdata/pagure/full_download/unauthorized/GET_%2Fapi%2F0%2Fprotop2g-test-srce%2Ftags @@ -1,26 +1,23 @@ -HTTP/2 200 -date: Wed, 23 Jul 2025 05:16:48 GMT -server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 Python/3.6 -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -referrer-policy: same-origin -x-frame-options: ALLOW-FROM https://pagure.io/ -strict-transport-security: max-age=31536000; includeSubDomains; preload -content-length: 142 -content-security-policy: default-src 'self';script-src 'self' 'nonce-T8LPhGGs1acv00t58vtBtVmwC'; style-src 'self' 'nonce-T8LPhGGs1acv00t58vtBtVmwC'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; -set-cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiYmQ2NTQ1MmFhZWJjZjA0OWIxNTI5MjBjODQyYzUzOGRkYmYyYTkwOSJ9.G2IBwA.pKqOBVDJrtKfyrbJPyuaRfFjnR4; Expires=Sat, 23-Aug-2025 05:16:48 GMT; Secure; HttpOnly; Path=/ -content-type: application/json +X-Content-Type-Options: nosniff +Referrer-Policy: same-origin +Content-Length: 142 +Content-Type: application/json +X-Xss-Protection: 1; mode=block +X-Frame-Options: ALLOW-FROM https://pagure.io/ +Strict-Transport-Security: max-age=31536000; includeSubDomains; preload +Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-Kt2w1Q1kvLm2O7sDAV0XtpAWM'; style-src 'self' 'nonce-Kt2w1Q1kvLm2O7sDAV0XtpAWM'; object-src 'none';base-uri 'self';img-src 'self' https:;connect-src 'self' https://pagure.io:8088;frame-src https://docs.pagure.org;frame-ancestors https://pagure.io; +Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiN2QyN2Y0NDIyM2ViZGJhZWRhMTg3NTc2NGY3MWYzMDVmOTgzNmI5ZSJ9.G4-gsg.Pl5rcBYRhcmWvmmUa6D-05E20KI; Expires=Fri, 26-Sep-2025 19:46:58 GMT; Secure; HttpOnly; Path=/ { "tags": [ - "aaaa", - "bbbb", - "cccc", - "dddd", - "eeee", - "ffff", - "gggg", + "aaaa", + "bbbb", + "cccc", + "dddd", + "eeee", + "ffff", + "gggg", "hhhh" - ], + ], "total_tags": 8 } From 9d8a740c6ad1081e379717898fe2992b1b2a2309 Mon Sep 17 00:00:00 2001 From: Gusted Date: Tue, 26 Aug 2025 21:57:25 +0200 Subject: [PATCH 360/495] fix: use mocked HTTP server for authorized migration Skip it, as the mocked HTTP responses does not look sufficient to run this test. --- services/migrations/pagure_test.go | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/services/migrations/pagure_test.go b/services/migrations/pagure_test.go index c894266d74..22b2eed85e 100644 --- a/services/migrations/pagure_test.go +++ b/services/migrations/pagure_test.go @@ -4,7 +4,6 @@ package migrations import ( - "fmt" "net/url" "os" "strings" @@ -456,25 +455,29 @@ func TestPagureDownloadRepoWithPublicIssues(t *testing.T) { } func TestPagureDownloadRepoWithPrivateIssues(t *testing.T) { + t.Skip("Does not work") // Skip tests if Pagure token is not found cloneUser := os.Getenv("PAGURE_CLONE_USER") clonePassword := os.Getenv("PAGURE_CLONE_PASSWORD") apiUser := os.Getenv("PAGURE_API_USER") apiPassword := os.Getenv("PAGURE_API_TOKEN") - if apiUser == "" || apiPassword == "" { - t.Skip("skipped test because a PAGURE_ variable was not in the environment") - } - - cloneAddr := fmt.Sprintf("https://%s:%s@pagure.io/protop2g-test-srce.git", cloneUser, clonePassword) - u, _ := url.Parse(cloneAddr) fixtPath := "./testdata/pagure/full_download/authorized" server := unittest.NewMockWebServer(t, "https://pagure.io", fixtPath, false) defer server.Close() + serverURL, err := url.Parse(server.URL) + require.NoError(t, err) + + if clonePassword != "" || cloneUser != "" { + serverURL.User = url.UserPassword(cloneUser, clonePassword) + } + serverURL.Path = "protop2g-test-srce.git" + cloneAddr := serverURL.String() + factory := &PagureDownloaderFactory{} downloader, err := factory.New(t.Context(), base.MigrateOptions{ - CloneAddr: u.String(), + CloneAddr: cloneAddr, AuthUsername: apiUser, AuthPassword: apiPassword, AuthToken: apiPassword, From 995dba14ecd4aec46c2620ff369aa18848338e2e Mon Sep 17 00:00:00 2001 From: Ruud van Asseldonk Date: Tue, 26 Aug 2025 22:08:10 +0200 Subject: [PATCH 361/495] feat: search in the `docs` directory for issue and pull request templates (#8863) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For pull request templates, Forgejo currently does not look in the `docs` directory, but [GitHub does](https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/creating-a-pull-request-template-for-your-repository#adding-a-pull-request-template). By making Forgejo also look there, it becomes possible to have the same repository work on both sites, without the need for vendor-specific paths. There was duplication in the list of accepted file paths. On the one hand it’s nice for greppability that they are all spelled out, but it does mean adding 6 variants, I thought it would be more maintainable to deduplicate the Cartesian product. I added one fully spelled out path in the comment to still maintain some greppability. Resolves forgejo/forgejo#8284 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8863 Reviewed-by: Gusted Co-authored-by: Ruud van Asseldonk Co-committed-by: Ruud van Asseldonk --- routers/web/repo/issue.go | 47 ++++++++----------- routers/web/repo/pull.go | 44 ++++++++--------- services/issue/template.go | 4 ++ tests/integration/api_issue_config_test.go | 3 +- tests/integration/api_issue_templates_test.go | 4 +- tests/integration/pull_create_test.go | 2 + 6 files changed, 50 insertions(+), 54 deletions(-) diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index 0373d06ea0..cab508e6c6 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -76,34 +76,27 @@ const ( issueTemplateTitleKey = "IssueTemplateTitle" ) -// IssueTemplateCandidates issue templates -var IssueTemplateCandidates = []string{ - "ISSUE_TEMPLATE.md", - "ISSUE_TEMPLATE.yaml", - "ISSUE_TEMPLATE.yml", - "issue_template.md", - "issue_template.yaml", - "issue_template.yml", - ".forgejo/ISSUE_TEMPLATE.md", - ".forgejo/ISSUE_TEMPLATE.yaml", - ".forgejo/ISSUE_TEMPLATE.yml", - ".forgejo/issue_template.md", - ".forgejo/issue_template.yaml", - ".forgejo/issue_template.yml", - ".gitea/ISSUE_TEMPLATE.md", - ".gitea/ISSUE_TEMPLATE.yaml", - ".gitea/ISSUE_TEMPLATE.yml", - ".gitea/issue_template.md", - ".gitea/issue_template.yaml", - ".gitea/issue_template.yml", - ".github/ISSUE_TEMPLATE.md", - ".github/ISSUE_TEMPLATE.yaml", - ".github/ISSUE_TEMPLATE.yml", - ".github/issue_template.md", - ".github/issue_template.yaml", - ".github/issue_template.yml", +// generateIssueTemplateLocations generates all the file paths where we +// look for an issue template, e.g. ".forgejo/ISSUE_TEMPLATE.md". +func generateIssueTemplateLocations() []string { + var result []string + prefixes := []string{"", ".forgejo/", ".gitea/", ".github/", "docs/"} + filenames := []string{"ISSUE_TEMPLATE", "issue_template"} + extensions := []string{".md", ".yaml", ".yml"} + + for _, prefix := range prefixes { + for _, filename := range filenames { + for _, extension := range extensions { + result = append(result, prefix+filename+extension) + } + } + } + + return result } +var issueTemplateCandidates = generateIssueTemplateLocations() + // MustAllowUserComment checks to make sure if an issue is locked. // If locked and user has permissions to write to the repository, // then the comment is allowed, else it is blocked @@ -1005,7 +998,7 @@ func NewIssue(ctx *context.Context) { ctx.Data["Tags"] = tags _, templateErrs := issue_service.GetTemplatesFromDefaultBranch(ctx.Repo.Repository, ctx.Repo.GitRepo) - templateLoaded, errs := setTemplateIfExists(ctx, issueTemplateKey, IssueTemplateCandidates) + templateLoaded, errs := setTemplateIfExists(ctx, issueTemplateKey, issueTemplateCandidates) for k, v := range errs { templateErrs[k] = v } diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index 18ba2b2a9f..65772086bc 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -66,33 +66,27 @@ const ( pullRequestTemplateKey = "PullRequestTemplate" ) -var pullRequestTemplateCandidates = []string{ - "PULL_REQUEST_TEMPLATE.md", - "PULL_REQUEST_TEMPLATE.yaml", - "PULL_REQUEST_TEMPLATE.yml", - "pull_request_template.md", - "pull_request_template.yaml", - "pull_request_template.yml", - ".forgejo/PULL_REQUEST_TEMPLATE.md", - ".forgejo/PULL_REQUEST_TEMPLATE.yaml", - ".forgejo/PULL_REQUEST_TEMPLATE.yml", - ".forgejo/pull_request_template.md", - ".forgejo/pull_request_template.yaml", - ".forgejo/pull_request_template.yml", - ".gitea/PULL_REQUEST_TEMPLATE.md", - ".gitea/PULL_REQUEST_TEMPLATE.yaml", - ".gitea/PULL_REQUEST_TEMPLATE.yml", - ".gitea/pull_request_template.md", - ".gitea/pull_request_template.yaml", - ".gitea/pull_request_template.yml", - ".github/PULL_REQUEST_TEMPLATE.md", - ".github/PULL_REQUEST_TEMPLATE.yaml", - ".github/PULL_REQUEST_TEMPLATE.yml", - ".github/pull_request_template.md", - ".github/pull_request_template.yaml", - ".github/pull_request_template.yml", +// generatePullRequestTemplateLocations generates all the file paths where we +// look for a pull request template, e.g. ".forgejo/PULL_REQUEST_TEMPLATE.md". +func generatePullRequestTemplateLocations() []string { + var result []string + prefixes := []string{"", ".forgejo/", ".gitea/", ".github/", "docs/"} + filenames := []string{"PULL_REQUEST_TEMPLATE", "pull_request_template"} + extensions := []string{".md", ".yaml", ".yml"} + + for _, prefix := range prefixes { + for _, filename := range filenames { + for _, extension := range extensions { + result = append(result, prefix+filename+extension) + } + } + } + + return result } +var pullRequestTemplateCandidates = generatePullRequestTemplateLocations() + func getRepository(ctx *context.Context, repoID int64) *repo_model.Repository { repo, err := repo_model.GetRepositoryByID(ctx, repoID) if err != nil { diff --git a/services/issue/template.go b/services/issue/template.go index 36ee3a3027..07f59af630 100644 --- a/services/issue/template.go +++ b/services/issue/template.go @@ -31,6 +31,8 @@ var templateDirCandidates = []string{ ".github/issue_template", ".gitlab/ISSUE_TEMPLATE", ".gitlab/issue_template", + "docs/ISSUE_TEMPLATE", + "docs/issue_template", } var templateConfigCandidates = []string{ @@ -40,6 +42,8 @@ var templateConfigCandidates = []string{ ".gitea/issue_template/config", ".github/ISSUE_TEMPLATE/config", ".github/issue_template/config", + "docs/ISSUE_TEMPLATE/config", + "docs/issue_template/config", } func GetDefaultTemplateConfig() api.IssueConfig { diff --git a/tests/integration/api_issue_config_test.go b/tests/integration/api_issue_config_test.go index dd4f95e934..99b2829fbf 100644 --- a/tests/integration/api_issue_config_test.go +++ b/tests/integration/api_issue_config_test.go @@ -133,6 +133,7 @@ func TestAPIRepoIssueConfigPaths(t *testing.T) { ".gitea/issue_template/config", ".github/ISSUE_TEMPLATE/config", ".github/issue_template/config", + "docs/issue_template/config", } for _, candidate := range templateConfigCandidates { @@ -184,7 +185,7 @@ func TestAPIRepoValidateIssueConfig(t *testing.T) { }) t.Run("Invalid", func(t *testing.T) { - dirs := []string{".gitea", ".forgejo"} + dirs := []string{".gitea", ".forgejo", "docs"} for _, dir := range dirs { t.Run(dir, func(t *testing.T) { defer tests.PrintCurrentTest(t)() diff --git a/tests/integration/api_issue_templates_test.go b/tests/integration/api_issue_templates_test.go index 47ba34198a..3d119c1157 100644 --- a/tests/integration/api_issue_templates_test.go +++ b/tests/integration/api_issue_templates_test.go @@ -42,6 +42,7 @@ func TestAPIIssueTemplateList(t *testing.T) { ".gitea/issue_template/test.md", ".github/ISSUE_TEMPLATE/test.md", ".github/issue_template/test.md", + "docs/issue_template/test.md", } for _, template := range templateCandidates { @@ -79,6 +80,7 @@ This is the template!`) ".forgejo/issue_template/test.md", ".gitea/issue_template/test.md", ".github/issue_template/test.md", + "docs/issue_template/test.md", } defer func() { for _, template := range templatePriority { @@ -107,7 +109,7 @@ This is the template!`) // If templates have the same filename and content, but in different // directories, they count as different templates, and all are // considered. - assert.Len(t, issueTemplates, 3) + assert.Len(t, issueTemplates, 4) }) }) } diff --git a/tests/integration/pull_create_test.go b/tests/integration/pull_create_test.go index 8c9bdcdfc6..7af70b4e5c 100644 --- a/tests/integration/pull_create_test.go +++ b/tests/integration/pull_create_test.go @@ -136,6 +136,8 @@ func TestPullCreateWithPullTemplate(t *testing.T) { ".gitea/pull_request_template.md", ".github/PULL_REQUEST_TEMPLATE.md", ".github/pull_request_template.md", + "docs/pull_request_template.md", + "docs/PULL_REQUEST_TEMPLATE.md", } createBaseRepo := func(t *testing.T, templateFiles []string, message string) (*repo_model.Repository, func()) { From cd08265406cc9e38b384b256aecdc463d4269664 Mon Sep 17 00:00:00 2001 From: 0ko <0ko@noreply.codeberg.org> Date: Wed, 27 Aug 2025 06:02:56 +0200 Subject: [PATCH 362/495] ui: refactor display of review threads on pr view (#8138) * refactored to untangle comment headers of different styles of comments from each other * fixed misalignments * improved consistency * fixed missing avatar rounding * made reactions aligned with content * fixed text in the "Outdated" label overflowing into the toggle icon Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8138 Reviewed-by: Beowulf --- templates/repo/diff/comment_form.tmpl | 14 +-- .../repo/issue/view_content/conversation.tmpl | 106 +++++++++--------- tests/e2e/pr-review.test.e2e.ts | 2 +- tests/integration/comment_roles_test.go | 69 +++++++----- tests/integration/pull_review_test.go | 6 +- web_src/css/repo.css | 70 +++++++++--- web_src/css/review.css | 22 ++-- web_src/css/themes/theme-forgejo-dark.css | 5 - web_src/css/themes/theme-forgejo-light.css | 5 - 9 files changed, 171 insertions(+), 128 deletions(-) diff --git a/templates/repo/diff/comment_form.tmpl b/templates/repo/diff/comment_form.tmpl index bb29583059..6dcba36c9e 100644 --- a/templates/repo/diff/comment_form.tmpl +++ b/templates/repo/diff/comment_form.tmpl @@ -1,5 +1,5 @@ {{if and $.root.SignedUserID (not $.Repository.IsArchived)}} -
    + {{$.root.CsrfTokenHtml}} @@ -25,22 +25,22 @@
    {{end}} -