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
diff --git a/.forgejo/workflows/build-release.yml b/.forgejo/workflows/build-release.yml
index 3ab63b0589..ba83304275 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..1c63868938 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 }}
@@ -80,7 +80,7 @@ jobs:
label: trigger
- name: upgrade v*.next.forgejo.org
- uses: https://data.forgejo.org/infrastructure/next-digest@v1.1.0
+ uses: https://data.forgejo.org/infrastructure/next-digest@v1.2.0
with:
url: https://placeholder:${{ secrets.TOKEN_NEXT_DIGEST }}@invisible.forgejo.org/infrastructure/next-digest
ref_name: '${{ github.ref_name }}'
diff --git a/.forgejo/workflows/testing-integration.yml b/.forgejo/workflows/testing-integration.yml
index 9e5cfb92ed..bfb5952116 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'
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/go.mod b/go.mod
index bb2be827eb..dc547bccca 100644
--- a/go.mod
+++ b/go.mod
@@ -2,7 +2,7 @@ module forgejo.org
go 1.24
-toolchain go1.24.4
+toolchain go1.24.6
require (
code.forgejo.org/f3/gof3/v3 v3.11.0
@@ -91,7 +91,7 @@ require (
github.com/sergi/go-diff v1.4.0
github.com/stretchr/testify v1.10.0
github.com/syndtr/goleveldb v1.0.0
- github.com/ulikunitz/xz v0.5.12
+ github.com/ulikunitz/xz v0.5.15
github.com/urfave/cli/v3 v3.3.3
github.com/valyala/fastjson v1.6.4
github.com/yohcop/openid-go v1.0.1
diff --git a/go.sum b/go.sum
index 639880e2ce..d1630b622d 100644
--- a/go.sum
+++ b/go.sum
@@ -527,8 +527,8 @@ github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww=
github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0=
github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
-github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc=
-github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
+github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY=
+github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
github.com/urfave/cli/v3 v3.3.3 h1:byCBaVdIXuLPIDm5CYZRVG6NvT7tv1ECqdU4YzlEa3I=
github.com/urfave/cli/v3 v3.3.3/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo=
github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ=
diff --git a/models/actions/artifact.go b/models/actions/artifact.go
index 10cd3868a1..95c4bead8f 100644
--- a/models/actions/artifact.go
+++ b/models/actions/artifact.go
@@ -132,6 +132,13 @@ func (opts FindArtifactsOptions) ToConds() builder.Cond {
return cond
}
+var _ db.FindOptionsOrder = FindArtifactsOptions{}
+
+// ToOrders implements db.FindOptionsOrder, to have a stable order
+func (opts FindArtifactsOptions) ToOrders() string {
+ return "id"
+}
+
// ActionArtifactMeta is the meta data of an artifact
type ActionArtifactMeta struct {
ArtifactName string
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", repoID, timestamp).OrderBy("stopped DESC").Limit(1).Get(&run)
- if err != nil {
- return nil, err
- } else if !has {
- return nil, fmt.Errorf("run before: %w", util.ErrNotExist)
- }
- return &run, nil
+func GetRunBefore(ctx context.Context, _ *ActionRun) (*ActionRun, error) {
+ // TODO return the most recent run related to the run given in argument
+ // see https://codeberg.org/forgejo/user-research/issues/63 for context
+ return nil, nil
}
func GetLatestRunForBranchAndWorkflow(ctx context.Context, repoID int64, branch, workflowFile, event string) (*ActionRun, error) {
diff --git a/models/actions/run_test.go b/models/actions/run_test.go
index 11b03022ff..c9a552a2b2 100644
--- a/models/actions/run_test.go
+++ b/models/actions/run_test.go
@@ -5,92 +5,7 @@ package actions
import (
"testing"
- "time"
-
- "forgejo.org/models/db"
- "forgejo.org/models/unittest"
- "forgejo.org/modules/timeutil"
-
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
)
func TestGetRunBefore(t *testing.T) {
- require.NoError(t, unittest.PrepareTestDatabase())
-
- // this repo is part of the test database requiring loading "repository.yml" in main_test.go
- var repoID int64 = 1
-
- workflowID := "test_workflow"
-
- // third completed run
- time1, err := time.Parse(time.RFC3339, "2024-07-31T15:47:55+08:00")
- require.NoError(t, err)
- timeutil.MockSet(time1)
- run1 := ActionRun{
- ID: 1,
- Index: 1,
- RepoID: repoID,
- Stopped: timeutil.TimeStampNow(),
- WorkflowID: workflowID,
- }
-
- // fourth completed run
- time2, err := time.Parse(time.RFC3339, "2024-08-31T15:47:55+08:00")
- require.NoError(t, err)
- timeutil.MockSet(time2)
- run2 := ActionRun{
- ID: 2,
- Index: 2,
- RepoID: repoID,
- Stopped: timeutil.TimeStampNow(),
- WorkflowID: workflowID,
- }
-
- // second completed run
- time3, err := time.Parse(time.RFC3339, "2024-07-31T15:47:54+08:00")
- require.NoError(t, err)
- timeutil.MockSet(time3)
- run3 := ActionRun{
- ID: 3,
- Index: 3,
- RepoID: repoID,
- Stopped: timeutil.TimeStampNow(),
- WorkflowID: workflowID,
- }
-
- // first completed run
- time4, err := time.Parse(time.RFC3339, "2024-06-30T15:47:54+08:00")
- require.NoError(t, err)
- timeutil.MockSet(time4)
- run4 := ActionRun{
- ID: 4,
- Index: 4,
- RepoID: repoID,
- Stopped: timeutil.TimeStampNow(),
- WorkflowID: workflowID,
- }
- require.NoError(t, db.Insert(db.DefaultContext, &run1))
- runBefore, err := GetRunBefore(db.DefaultContext, repoID, run1.Stopped)
- // there is no run before run1
- require.Error(t, err)
- require.Nil(t, runBefore)
-
- // now there is only run3 before run1
- require.NoError(t, db.Insert(db.DefaultContext, &run3))
- runBefore, err = GetRunBefore(db.DefaultContext, repoID, run1.Stopped)
- require.NoError(t, err)
- assert.Equal(t, run3.ID, runBefore.ID)
-
- // there still is only run3 before run1
- require.NoError(t, db.Insert(db.DefaultContext, &run2))
- runBefore, err = GetRunBefore(db.DefaultContext, repoID, run1.Stopped)
- require.NoError(t, err)
- assert.Equal(t, run3.ID, runBefore.ID)
-
- // run4 is further away from run1
- require.NoError(t, db.Insert(db.DefaultContext, &run4))
- runBefore, err = GetRunBefore(db.DefaultContext, repoID, run1.Stopped)
- require.NoError(t, err)
- assert.Equal(t, run3.ID, runBefore.ID)
}
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/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
+ }))
+ })
}
diff --git a/models/error.go b/models/error.go
index ebaa8a135d..99c8ded766 100644
--- a/models/error.go
+++ b/models/error.go
@@ -121,6 +121,7 @@ type ErrInvalidCloneAddr struct {
IsInvalidPath bool
IsProtocolInvalid bool
IsPermissionDenied bool
+ HasCredentials bool
LocalPath bool
}
@@ -143,6 +144,9 @@ func (err *ErrInvalidCloneAddr) Error() string {
if err.IsURLError {
return fmt.Sprintf("migration/cloning from '%s' is not allowed: the provided url is invalid", err.Host)
}
+ if err.HasCredentials {
+ return fmt.Sprintf("migration/cloning from '%s' is not allowed: the provided url contains credentials", err.Host)
+ }
return fmt.Sprintf("migration/cloning from '%s' is not allowed", err.Host)
}
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/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/fixtures/TestAddTeamReviewRequest/issue.yml b/models/fixtures/TestAddTeamReviewRequest/issue.yml
new file mode 100644
index 0000000000..a1bcf2921f
--- /dev/null
+++ b/models/fixtures/TestAddTeamReviewRequest/issue.yml
@@ -0,0 +1,16 @@
+-
+ id: 23
+ repo_id: 2
+ index: 3
+ poster_id: 2
+ original_author_id: 0
+ name: protected branch pull
+ content: pull request to a protected branch
+ milestone_id: 0
+ priority: 0
+ is_pull: true
+ is_closed: false
+ num_comments: 0
+ created_unix: 1707270422
+ updated_unix: 1707270422
+ is_locked: false
\ No newline at end of file
diff --git a/models/fixtures/TestAddTeamReviewRequest/protected_branch.yml b/models/fixtures/TestAddTeamReviewRequest/protected_branch.yml
new file mode 100644
index 0000000000..93909bd991
--- /dev/null
+++ b/models/fixtures/TestAddTeamReviewRequest/protected_branch.yml
@@ -0,0 +1,28 @@
+- id: 1
+ repo_id: 2
+ branch_name: protected-main
+ can_push: false
+ enable_whitelist: true
+ whitelist_user_i_ds: [1]
+ whitelist_team_i_ds: []
+ enable_merge_whitelist: true
+ whitelist_deploy_keys: false
+ merge_whitelist_user_i_ds: [1]
+ merge_whitelist_team_i_ds: []
+ enable_status_check: false
+ status_check_contexts: []
+ enable_approvals_whitelist: true
+ approvals_whitelist_user_i_ds: []
+ approvals_whitelist_team_i_ds: [1]
+ required_approvals: 1
+ block_on_rejected_reviews: true
+ block_on_official_review_requests: true
+ block_on_outdated_branch: true
+ dismiss_stale_approvals: true
+ ignore_stale_approvals: false
+ require_signed_commits: false
+ protected_file_patterns: ""
+ unprotected_file_patterns: ""
+ apply_to_admins: true
+ created_unix: 1752513073
+ updated_unix: 1752513073
\ No newline at end of file
diff --git a/models/fixtures/TestAddTeamReviewRequest/pull_request.yml b/models/fixtures/TestAddTeamReviewRequest/pull_request.yml
new file mode 100644
index 0000000000..067bb01324
--- /dev/null
+++ b/models/fixtures/TestAddTeamReviewRequest/pull_request.yml
@@ -0,0 +1,12 @@
+-
+ id: 11
+ type: 0 # gitea pull request
+ status: 2 # mergeable
+ issue_id: 23
+ index: 3
+ head_repo_id: 2
+ base_repo_id: 2
+ head_branch: feature/protected-branch-pr
+ base_branch: protected-main
+ merge_base: 4a357436d925b5c974181ff12a994538ddc5a269
+ has_merged: false
\ No newline at end of file
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
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/fixtures/repo_redirect.yml b/models/fixtures/repo_redirect.yml
index 8850c8d780..82d365c600 100644
--- a/models/fixtures/repo_redirect.yml
+++ b/models/fixtures/repo_redirect.yml
@@ -3,3 +3,9 @@
owner_id: 2
lower_name: oldrepo1
redirect_repo_id: 1
+
+-
+ id: 2
+ owner_id: 17
+ lower_name: oldrepo24
+ redirect_repo_id: 24
diff --git a/models/fixtures/user_redirect.yml b/models/fixtures/user_redirect.yml
index f471e94511..2f7a523c0c 100644
--- a/models/fixtures/user_redirect.yml
+++ b/models/fixtures/user_redirect.yml
@@ -3,3 +3,15 @@
lower_name: olduser1
redirect_user_id: 1
created_unix: 1730000000
+
+-
+ id: 2
+ lower_name: oldorg22
+ redirect_user_id: 22
+ created_unix: 1730000000
+
+-
+ id: 3
+ lower_name: oldorg23
+ redirect_user_id: 23
+ created_unix: 1730000000
diff --git a/models/forgejo_migrations/migrate.go b/models/forgejo_migrations/migrate.go
index 737350b019..94469b7371 100644
--- a/models/forgejo_migrations/migrate.go
+++ b/models/forgejo_migrations/migrate.go
@@ -108,7 +108,9 @@ var migrations = []*Migration{
// v33 -> v34
NewMigration("Add `notify-email` column to `action_run` table", AddNotifyEmailToActionRun),
// v34 -> v35
- NewMigration("Add index to `stopped` column in `action_run` table", AddIndexToActionRunStopped),
+ 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/v32.go b/models/forgejo_migrations/v32.go
index bed335ab6b..2460003597 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
}
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/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/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/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/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/issues/review.go b/models/issues/review.go
index 584704d3e8..5370117a81 100644
--- a/models/issues/review.go
+++ b/models/issues/review.go
@@ -781,10 +781,6 @@ func AddTeamReviewRequest(ctx context.Context, issue *Issue, reviewer *organizat
official, err := IsOfficialReviewerTeam(ctx, issue, reviewer)
if err != nil {
return nil, fmt.Errorf("isOfficialReviewerTeam(): %w", err)
- } else if !official {
- if official, err = IsOfficialReviewer(ctx, issue, doer); err != nil {
- return nil, fmt.Errorf("isOfficialReviewer(): %w", err)
- }
}
if review, err = CreateReview(ctx, CreateReviewOptions{
@@ -797,12 +793,6 @@ func AddTeamReviewRequest(ctx context.Context, issue *Issue, reviewer *organizat
return nil, err
}
- if official {
- if _, err := db.Exec(ctx, "UPDATE `review` SET official=? WHERE issue_id=? AND reviewer_team_id=?", false, issue.ID, reviewer.ID); err != nil {
- return nil, err
- }
- }
-
comment, err := CreateComment(ctx, &CreateCommentOptions{
Type: CommentTypeReviewRequest,
Doer: doer,
diff --git a/models/issues/review_test.go b/models/issues/review_test.go
index 33d131c225..6e2f6ddfa8 100644
--- a/models/issues/review_test.go
+++ b/models/issues/review_test.go
@@ -8,6 +8,7 @@ import (
"forgejo.org/models/db"
issues_model "forgejo.org/models/issues"
+ organization_model "forgejo.org/models/organization"
repo_model "forgejo.org/models/repo"
"forgejo.org/models/unittest"
user_model "forgejo.org/models/user"
@@ -319,3 +320,80 @@ func TestAddReviewRequest(t *testing.T) {
require.Error(t, err)
assert.True(t, issues_model.IsErrReviewRequestOnClosedPR(err))
}
+
+func TestAddTeamReviewRequest(t *testing.T) {
+ defer unittest.OverrideFixtures("models/fixtures/TestAddTeamReviewRequest")()
+ require.NoError(t, unittest.PrepareTestDatabase())
+
+ setupForProtectedBranch := func() (*issues_model.Issue, *user_model.User) {
+ // From override models/fixtures/TestAddTeamReviewRequest/issue.yml; issue #23 is a PR into a protected branch
+ issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 23})
+ require.NoError(t, issue.LoadRepo(db.DefaultContext))
+ doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4})
+ return issue, doer
+ }
+
+ t.Run("Protected branch, not official team", func(t *testing.T) {
+ issue, doer := setupForProtectedBranch()
+ // Team 2 is not part of the whitelist for this protected branch
+ team := unittest.AssertExistsAndLoadBean(t, &organization_model.Team{ID: 2})
+
+ comment, err := issues_model.AddTeamReviewRequest(db.DefaultContext, issue, team, doer)
+ require.NoError(t, err)
+ require.NotNil(t, comment)
+
+ review, err := issues_model.GetTeamReviewerByIssueIDAndTeamID(db.DefaultContext, issue.ID, team.ID)
+ require.NoError(t, err)
+ require.NotNil(t, review)
+ assert.Equal(t, issues_model.ReviewTypeRequest, review.Type)
+ assert.Equal(t, team.ID, review.ReviewerTeamID)
+ // This review request should not be marked official because it is not a request for a team in the branch
+ // protection rule's whitelist...
+ assert.False(t, review.Official)
+ })
+
+ t.Run("Protected branch, official team", func(t *testing.T) {
+ issue, doer := setupForProtectedBranch()
+ // Team 1 is part of the whitelist for this protected branch
+ team := unittest.AssertExistsAndLoadBean(t, &organization_model.Team{ID: 1})
+
+ comment, err := issues_model.AddTeamReviewRequest(db.DefaultContext, issue, team, doer)
+ require.NoError(t, err)
+ require.NotNil(t, comment)
+
+ review, err := issues_model.GetTeamReviewerByIssueIDAndTeamID(db.DefaultContext, issue.ID, team.ID)
+ require.NoError(t, err)
+ require.NotNil(t, review)
+ assert.Equal(t, issues_model.ReviewTypeRequest, review.Type)
+ assert.Equal(t, team.ID, review.ReviewerTeamID)
+ // Expected to be considered official because team 1 is in the review whitelist for this protected branch
+ assert.True(t, review.Official)
+ })
+
+ t.Run("Unprotected branch, official team", func(t *testing.T) {
+ // Working on a PR into a branch that is not protected, issue #2
+ issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2})
+ require.NoError(t, issue.LoadRepo(db.DefaultContext))
+ doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
+ // team is a team that has write perms against the repo
+ team := unittest.AssertExistsAndLoadBean(t, &organization_model.Team{ID: 1})
+
+ comment, err := issues_model.AddTeamReviewRequest(db.DefaultContext, issue, team, doer)
+ require.NoError(t, err)
+ require.NotNil(t, comment)
+
+ review, err := issues_model.GetTeamReviewerByIssueIDAndTeamID(db.DefaultContext, issue.ID, team.ID)
+ require.NoError(t, err)
+ require.NotNil(t, review)
+ assert.Equal(t, issues_model.ReviewTypeRequest, review.Type)
+ assert.Equal(t, team.ID, review.ReviewerTeamID)
+ // Will not be marked as official because PR #2 there's no branch protection rule that enables whitelist
+ // approvals (verifying logic in `IsOfficialReviewerTeam` indirectly)
+ assert.False(t, review.Official)
+
+ // Adding the same team review request again should be a noop
+ comment, err = issues_model.AddTeamReviewRequest(db.DefaultContext, issue, team, doer)
+ require.NoError(t, err)
+ require.Nil(t, comment)
+ })
+}
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"`
}
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/models/repo/redirect.go b/models/repo/redirect.go
index 9c44a255d0..e5239a3684 100644
--- a/models/repo/redirect.go
+++ b/models/repo/redirect.go
@@ -14,8 +14,9 @@ import (
// ErrRedirectNotExist represents a "RedirectNotExist" kind of error.
type ErrRedirectNotExist struct {
- OwnerID int64
- RepoName string
+ OwnerID int64
+ RepoName string
+ MissingPermission bool
}
// IsErrRedirectNotExist check if an error is an ErrRepoRedirectNotExist.
@@ -49,8 +50,8 @@ func init() {
db.RegisterModel(new(Redirect))
}
-// LookupRedirect look up if a repository has a redirect name
-func LookupRedirect(ctx context.Context, ownerID int64, repoName string) (int64, error) {
+// GetRedirect returns the redirect for a given pair of ownerID and repository name.
+func GetRedirect(ctx context.Context, ownerID int64, repoName string) (int64, error) {
repoName = strings.ToLower(repoName)
redirect := &Redirect{OwnerID: ownerID, LowerName: repoName}
if has, err := db.GetEngine(ctx).Get(redirect); err != nil {
diff --git a/models/repo/redirect_test.go b/models/repo/redirect_test.go
index d84cbbed54..2f2210588f 100644
--- a/models/repo/redirect_test.go
+++ b/models/repo/redirect_test.go
@@ -10,21 +10,9 @@ import (
repo_model "forgejo.org/models/repo"
"forgejo.org/models/unittest"
- "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
-func TestLookupRedirect(t *testing.T) {
- require.NoError(t, unittest.PrepareTestDatabase())
-
- repoID, err := repo_model.LookupRedirect(db.DefaultContext, 2, "oldrepo1")
- require.NoError(t, err)
- assert.EqualValues(t, 1, repoID)
-
- _, err = repo_model.LookupRedirect(db.DefaultContext, unittest.NonexistentID, "doesnotexist")
- assert.True(t, repo_model.IsErrRedirectNotExist(err))
-}
-
func TestNewRedirect(t *testing.T) {
// redirect to a completely new name
require.NoError(t, unittest.PrepareTestDatabase())
diff --git a/models/repo/repo_unit.go b/models/repo/repo_unit.go
index c11ad70627..aa6f2fa0ae 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:
@@ -333,5 +336,8 @@ func getUnitsByRepoID(ctx context.Context, repoID int64) (units []*RepoUnit, err
// UpdateRepoUnit updates the provided repo unit
func UpdateRepoUnit(ctx context.Context, unit *RepoUnit) error {
_, err := db.GetEngine(ctx).ID(unit.ID).Update(unit)
- return err
+ if err != nil {
+ return fmt.Errorf("UpdateRepoUnit: %v", err)
+ }
+ return nil
}
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/models/unittest/mock_http.go b/models/unittest/mock_http.go
index 6064e07e9b..c2c12e55ee 100644
--- a/models/unittest/mock_http.go
+++ b/models/unittest/mock_http.go
@@ -41,6 +41,10 @@ func NewMockWebServer(t *testing.T, liveServerBaseURL, testDataDir string, liveM
log.Info("Mock HTTP Server: got request for path %s", r.URL.Path)
// TODO check request method (support POST?)
fixturePath := fmt.Sprintf("%s/%s_%s", testDataDir, r.Method, url.PathEscape(path))
+ if strings.Contains(path, "test_repo.git") {
+ // We got a git clone request against our mock server
+ fixturePath = fmt.Sprintf("%s/%s", testDataDir, strings.TrimLeft(r.URL.Path, "/"))
+ }
if liveMode {
liveURL := fmt.Sprintf("%s%s", liveServerBaseURL, path)
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/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/openid.go b/models/user/openid.go
index 96b00255a3..b4d4f175b2 100644
--- a/models/user/openid.go
+++ b/models/user/openid.go
@@ -40,8 +40,8 @@ func GetUserOpenIDs(ctx context.Context, uid int64) ([]*UserOpenID, error) {
return openids, nil
}
-// isOpenIDUsed returns true if the openid has been used.
-func isOpenIDUsed(ctx context.Context, uri string) (bool, error) {
+// IsOpenIDUsed returns true if the openid has been used.
+func IsOpenIDUsed(ctx context.Context, uri string) (bool, error) {
if len(uri) == 0 {
return true, nil
}
@@ -71,7 +71,7 @@ func (err ErrOpenIDAlreadyUsed) Unwrap() error {
// AddUserOpenID adds an pre-verified/normalized OpenID URI to given user.
// NOTE: make sure openid.URI is normalized already
func AddUserOpenID(ctx context.Context, openid *UserOpenID) error {
- used, err := isOpenIDUsed(ctx, openid.URI)
+ used, err := IsOpenIDUsed(ctx, openid.URI)
if err != nil {
return err
} else if used {
diff --git a/models/user/redirect.go b/models/user/redirect.go
index 75876f17d2..bcb421d4a1 100644
--- a/models/user/redirect.go
+++ b/models/user/redirect.go
@@ -21,7 +21,8 @@ import (
// ErrUserRedirectNotExist represents a "UserRedirectNotExist" kind of error.
type ErrUserRedirectNotExist struct {
- Name string
+ Name string
+ MissingPermission bool
}
// IsErrUserRedirectNotExist check if an error is an ErrUserRedirectNotExist.
@@ -81,15 +82,6 @@ func GetUserRedirect(ctx context.Context, userName string) (*Redirect, error) {
return redirect, nil
}
-// LookupUserRedirect look up userID if a user has a redirect name
-func LookupUserRedirect(ctx context.Context, userName string) (int64, error) {
- redirect, err := GetUserRedirect(ctx, userName)
- if err != nil {
- return 0, err
- }
- return redirect.RedirectUserID, nil
-}
-
// NewUserRedirect create a new user redirect
func NewUserRedirect(ctx context.Context, ID int64, oldUserName, newUserName string) error {
oldUserName = strings.ToLower(oldUserName)
diff --git a/models/user/redirect_test.go b/models/user/redirect_test.go
deleted file mode 100644
index c598fb045f..0000000000
--- a/models/user/redirect_test.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2020 The Gitea Authors. All rights reserved.
-// SPDX-License-Identifier: MIT
-
-package user_test
-
-import (
- "testing"
-
- "forgejo.org/models/db"
- "forgejo.org/models/unittest"
- user_model "forgejo.org/models/user"
-
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-func TestLookupUserRedirect(t *testing.T) {
- require.NoError(t, unittest.PrepareTestDatabase())
-
- userID, err := user_model.LookupUserRedirect(db.DefaultContext, "olduser1")
- require.NoError(t, err)
- assert.EqualValues(t, 1, userID)
-
- _, err = user_model.LookupUserRedirect(db.DefaultContext, "doesnotexist")
- assert.True(t, user_model.IsErrUserRedirectNotExist(err))
-}
diff --git a/models/user/user.go b/models/user/user.go
index eedd1db80e..bfd7e6063f 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)
}
}
@@ -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
}
@@ -1161,8 +1163,8 @@ func GetUserByEmail(ctx context.Context, email string) (*User, error) {
email = strings.ToLower(email)
// Otherwise, check in alternative list for activated email addresses
- emailAddress := &EmailAddress{LowerEmail: email, IsActivated: true}
- has, err := db.GetEngine(ctx).Get(emailAddress)
+ emailAddress := &EmailAddress{}
+ has, err := db.GetEngine(ctx).Where("lower_email = ? AND is_activated = ?", email, true).Get(emailAddress)
if err != nil {
return nil, err
}
diff --git a/models/user/user_test.go b/models/user/user_test.go
index fd9d05653f..288a45105b 100644
--- a/models/user/user_test.go
+++ b/models/user/user_test.go
@@ -835,3 +835,25 @@ func TestPronounsPrivacy(t *testing.T) {
assert.Equal(t, "any", user.GetPronouns(true))
})
}
+
+func TestGetUserByEmail(t *testing.T) {
+ require.NoError(t, unittest.PrepareTestDatabase())
+
+ t.Run("Normal", func(t *testing.T) {
+ u, err := user_model.GetUserByEmail(t.Context(), "user2@example.com")
+ require.NoError(t, err)
+ assert.EqualValues(t, 2, u.ID)
+ })
+
+ t.Run("Not activated", func(t *testing.T) {
+ u, err := user_model.GetUserByEmail(t.Context(), "user11@example.com")
+ require.ErrorIs(t, err, user_model.ErrUserNotExist{Name: "user11@example.com"})
+ assert.Nil(t, u)
+ })
+
+ t.Run("Not primary", func(t *testing.T) {
+ u, err := user_model.GetUserByEmail(t.Context(), "user1-3@example.com")
+ require.NoError(t, err)
+ assert.EqualValues(t, 1, u.ID)
+ })
+}
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)
+}
diff --git a/modules/git/parse.go b/modules/git/parse.go
index 6bc32057a7..c7b84d7198 100644
--- a/modules/git/parse.go
+++ b/modules/git/parse.go
@@ -10,8 +10,6 @@ import (
"io"
"strconv"
"strings"
-
- "forgejo.org/modules/log"
)
// ParseTreeEntries parses the output of a `git ls-tree -l` command.
@@ -55,19 +53,9 @@ func parseTreeEntries(data []byte, ptree *Tree) ([]*TreeEntry, error) {
entry.sized = true
}
- switch string(entryMode) {
- case "100644":
- entry.entryMode = EntryModeBlob
- case "100755":
- entry.entryMode = EntryModeExec
- case "120000":
- 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
- entry.entryMode = EntryModeTree
- default:
- return nil, fmt.Errorf("unknown type: %v", string(entryMode))
+ entry.entryMode, err = parseMode(string(entryMode))
+ if err != nil {
+ return nil, err
}
entry.ID, err = NewIDFromString(string(entryObjectID))
@@ -108,23 +96,10 @@ loop:
sz -= int64(count)
entry := new(TreeEntry)
entry.ptree = ptree
-
- switch string(mode) {
- case "100644":
- entry.entryMode = EntryModeBlob
- case "100755":
- entry.entryMode = EntryModeExec
- case "120000":
- 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
- entry.entryMode = EntryModeTree
- default:
- log.Debug("Unknown mode: %v", string(mode))
- return nil, fmt.Errorf("unknown mode: %v", string(mode))
+ entry.entryMode, err = parseMode(string(mode))
+ if err != nil {
+ return nil, err
}
-
entry.ID = objectFormat.MustID(sha)
entry.name = string(fname)
entries = append(entries, entry)
@@ -135,3 +110,31 @@ loop:
return entries, nil
}
+
+// Parse the file mode, we cannot hardcode the modes that we expect for
+// a variety of reasons (that is not known to us) the permissions bits
+// of files can vary, usually the result because of tooling that uses Git in
+// a funny way. So we have to parse the mode as a integer and do bit tricks.
+func parseMode(modeStr string) (EntryMode, error) {
+ mode, err := strconv.ParseUint(modeStr, 8, 64)
+ if err != nil {
+ return 0, fmt.Errorf("cannot parse mode: %v", err)
+ }
+
+ switch mode & 0o170000 {
+ case 0o040000:
+ return EntryModeTree, nil
+ case 0o120000:
+ return EntryModeSymlink, nil
+ case 0o160000:
+ return EntryModeCommit, nil
+ case 0o100000:
+ // Check for the permission bit on the owner.
+ if mode&0o100 == 0o100 {
+ return EntryModeExec, nil
+ }
+ return EntryModeBlob, nil
+ }
+
+ return 0, fmt.Errorf("unknown mode: %o", mode)
+}
diff --git a/modules/git/parse_test.go b/modules/git/parse_test.go
index 03f359f6c1..502adab4da 100644
--- a/modules/git/parse_test.go
+++ b/modules/git/parse_test.go
@@ -101,3 +101,38 @@ func TestParseTreeEntriesInvalid(t *testing.T) {
require.Error(t, err)
assert.Empty(t, entries)
}
+
+func TestParseMode(t *testing.T) {
+ ok := func(t *testing.T, mode string, entry EntryMode) {
+ t.Helper()
+ actualEntry, err := parseMode(mode)
+ require.NoError(t, err)
+ assert.Equal(t, entry, actualEntry)
+ }
+
+ fail := func(t *testing.T, mode string) {
+ t.Helper()
+ entry, err := parseMode(mode)
+ require.Error(t, err)
+ assert.Zero(t, entry)
+ }
+
+ ok(t, "100644", EntryModeBlob)
+ ok(t, "100755", EntryModeExec)
+ ok(t, "100754", EntryModeExec)
+ ok(t, "100700", EntryModeExec)
+ ok(t, "100744", EntryModeExec)
+ ok(t, "120000", EntryModeSymlink)
+ ok(t, "120644", EntryModeSymlink)
+ ok(t, "160000", EntryModeCommit)
+ ok(t, "160644", EntryModeCommit)
+ ok(t, "040000", EntryModeTree)
+ ok(t, "040755", EntryModeTree)
+ ok(t, "040775", EntryModeTree)
+ ok(t, "040754", EntryModeTree)
+
+ fail(t, "not-a-number")
+ fail(t, "000000")
+ fail(t, "400000")
+ fail(t, "111111")
+}
diff --git a/modules/git/repo.go b/modules/git/repo.go
index 23e9337615..4f2b05bca5 100644
--- a/modules/git/repo.go
+++ b/modules/git/repo.go
@@ -18,6 +18,7 @@ import (
"strings"
"time"
+ "forgejo.org/modules/log"
"forgejo.org/modules/proxy"
"forgejo.org/modules/setting"
"forgejo.org/modules/util"
@@ -160,24 +161,89 @@ func CloneWithArgs(ctx context.Context, args TrustedCmdArgs, from, to string, op
if len(opts.Branch) > 0 {
cmd.AddArguments("-b").AddDynamicArguments(opts.Branch)
}
- cmd.AddDashesAndList(from, to)
- if strings.Contains(from, "://") && strings.Contains(from, "@") {
- cmd.SetDescription(fmt.Sprintf("clone branch %s from %s to %s (shared: %t, mirror: %t, depth: %d)", opts.Branch, util.SanitizeCredentialURLs(from), to, opts.Shared, opts.Mirror, opts.Depth))
- } else {
- cmd.SetDescription(fmt.Sprintf("clone branch %s from %s to %s (shared: %t, mirror: %t, depth: %d)", opts.Branch, from, to, opts.Shared, opts.Mirror, opts.Depth))
+ envs := os.Environ()
+ parsedFromURL, err := url.Parse(from)
+ if err == nil {
+ envs = proxy.EnvWithProxy(parsedFromURL)
}
+ fromURL := from
+ sanitizedFrom := from
+
+ // If the clone URL has credentials, sanitize it and store the credentials in
+ // a temporary file that git will access.
+ if strings.Contains(from, "://") && strings.Contains(from, "@") {
+ sanitizedFrom = util.SanitizeCredentialURLs(from)
+ if parsedFromURL != nil {
+ if pwd, has := parsedFromURL.User.Password(); has {
+ parsedFromURL.User = url.User(parsedFromURL.User.Username())
+ fromURL = parsedFromURL.String()
+
+ credentialsFile, err := os.CreateTemp(os.TempDir(), "forgejo-clone-credentials")
+ if err != nil {
+ return err
+ }
+ credentialsPath := credentialsFile.Name()
+
+ defer func() {
+ _ = credentialsFile.Close()
+ if err := util.Remove(credentialsPath); err != nil {
+ log.Warn("Unable to remove temporary file %q: %v", credentialsPath, err)
+ }
+ }()
+
+ // Make it read-write.
+ if err := credentialsFile.Chmod(0o600); err != nil {
+ return err
+ }
+
+ // Write the password.
+ if _, err := fmt.Fprint(credentialsFile, pwd); err != nil {
+ return err
+ }
+
+ askpassFile, err := os.CreateTemp(os.TempDir(), "forgejo-askpass")
+ if err != nil {
+ return err
+ }
+ askpassPath := askpassFile.Name()
+
+ defer func() {
+ _ = askpassFile.Close()
+ if err := util.Remove(askpassPath); err != nil {
+ log.Warn("Unable to remove temporary file %q: %v", askpassPath, err)
+ }
+ }()
+
+ // Make it executable.
+ if err := askpassFile.Chmod(0o700); err != nil {
+ return err
+ }
+
+ // Write the password script.
+ if _, err := fmt.Fprintf(askpassFile, "exec cat %s", credentialsPath); err != nil {
+ return err
+ }
+
+ // Close it, so that Git can use it and no busy errors arise.
+ _ = askpassFile.Close()
+ _ = credentialsFile.Close()
+
+ // Use environments to specify that git should ask for credentials, this
+ // takes precedences over anything else https://git-scm.com/docs/gitcredentials#_requesting_credentials.
+ envs = append(envs, "GIT_ASKPASS="+askpassPath)
+ }
+ }
+ }
+
+ cmd.SetDescription(fmt.Sprintf("clone branch %s from %s to %s (shared: %t, mirror: %t, depth: %d)", opts.Branch, sanitizedFrom, to, opts.Shared, opts.Mirror, opts.Depth))
+ cmd.AddDashesAndList(fromURL, to)
+
if opts.Timeout <= 0 {
opts.Timeout = -1
}
- envs := os.Environ()
- u, err := url.Parse(from)
- if err == nil {
- envs = proxy.EnvWithProxy(u)
- }
-
stderr := new(bytes.Buffer)
if err = cmd.Run(&RunOpts{
Timeout: opts.Timeout,
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/modules/git/repo_test.go b/modules/git/repo_test.go
index c3971b2a5f..b07fc3732d 100644
--- a/modules/git/repo_test.go
+++ b/modules/git/repo_test.go
@@ -4,7 +4,15 @@
package git
import (
+ "bytes"
+ "encoding/base64"
+ "io/fs"
+ "net/http"
+ "net/http/httptest"
+ "net/url"
+ "os"
"path/filepath"
+ "strings"
"testing"
"github.com/stretchr/testify/assert"
@@ -54,3 +62,80 @@ func TestRepoGetDivergingCommits(t *testing.T) {
Behind: 2,
}, do)
}
+
+func TestCloneCredentials(t *testing.T) {
+ calledWithoutPassword := false
+ askpassFile := ""
+ credentialsFile := ""
+
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+ if req.URL.Path != "/info/refs" {
+ return
+ }
+
+ // Get basic authorization.
+ auth, ok := strings.CutPrefix(req.Header.Get("Authorization"), "Basic ")
+ if !ok {
+ w.Header().Set("WWW-Authenticate", `Basic realm="Forgejo"`)
+ http.Error(w, "require credentials", http.StatusUnauthorized)
+ return
+ }
+
+ rawAuth, err := base64.StdEncoding.DecodeString(auth)
+ require.NoError(t, err)
+
+ user, password, ok := bytes.Cut(rawAuth, []byte{':'})
+ assert.True(t, ok)
+
+ // First time around Git tries without password (that's specified in the clone URL).
+ // It demonstrates it doesn't immediately uses askpass.
+ if len(password) == 0 {
+ assert.EqualValues(t, "oauth2", user)
+ calledWithoutPassword = true
+
+ w.Header().Set("WWW-Authenticate", `Basic realm="Forgejo"`)
+ http.Error(w, "require credentials", http.StatusUnauthorized)
+ return
+ }
+
+ assert.EqualValues(t, "oauth2", user)
+ assert.EqualValues(t, "some_token", password)
+
+ tmpDir := os.TempDir()
+
+ // Verify that the askpass implementation was used.
+ files, err := fs.Glob(os.DirFS(tmpDir), "forgejo-askpass*")
+ require.NoError(t, err)
+ for _, fileName := range files {
+ fileContent, err := os.ReadFile(filepath.Join(tmpDir, fileName))
+ require.NoError(t, err)
+
+ credentialsPath, ok := bytes.CutPrefix(fileContent, []byte(`exec cat `))
+ assert.True(t, ok)
+
+ fileContent, err = os.ReadFile(string(credentialsPath))
+ require.NoError(t, err)
+ assert.EqualValues(t, "some_token", fileContent)
+
+ askpassFile = filepath.Join(tmpDir, fileName)
+ credentialsFile = string(credentialsPath)
+ }
+ }))
+
+ serverURL, err := url.Parse(server.URL)
+ require.NoError(t, err)
+
+ serverURL.User = url.UserPassword("oauth2", "some_token")
+
+ require.NoError(t, Clone(t.Context(), serverURL.String(), t.TempDir(), CloneRepoOptions{}))
+
+ assert.True(t, calledWithoutPassword)
+ assert.NotEmpty(t, askpassFile)
+ assert.NotEmpty(t, credentialsFile)
+
+ // Check that the helper files are gone.
+ _, err = os.Stat(askpassFile)
+ require.ErrorIs(t, err, fs.ErrNotExist)
+ _, err = os.Stat(credentialsFile)
+ require.ErrorIs(t, err, fs.ErrNotExist)
+}
diff --git a/modules/indexer/code/search.go b/modules/indexer/code/search.go
index adf51a76d7..499b9117c4 100644
--- a/modules/indexer/code/search.go
+++ b/modules/indexer/code/search.go
@@ -97,7 +97,7 @@ func HighlightSearchResultCode(filename string, lineNums []int, highlightRanges
conv := hcd.ConvertToPlaceholders(string(hl))
convLines := strings.Split(conv, "\n")
- // each highlightRange is of the form [line number, start pos, end pos]
+ // each highlightRange is of the form [line number, start byte offset, end byte offset]
for _, highlightRange := range highlightRanges {
ln, start, end := highlightRange[0], highlightRange[1], highlightRange[2]
line := convLines[ln]
@@ -105,15 +105,18 @@ func HighlightSearchResultCode(filename string, lineNums []int, highlightRanges
continue
}
+ sr := strings.NewReader(line)
sb := strings.Builder{}
count := -1
isOpen := false
- for _, r := range line {
+ for r, size, err := sr.ReadRune(); err == nil; r, size, err = sr.ReadRune() {
if token, ok := hcd.PlaceholderTokenMap[r];
// token was not found
- !ok ||
- // token was marked as used
- token == "" ||
+ !ok {
+ count += size
+ } else if
+ // token was marked as used
+ token == "" ||
// the token is not an valid html tag emitted by chroma
!(len(token) > 6 && (token[0:5] == "= end:
// if tag is not open, no need to close
if !isOpen {
break
}
sb.WriteRune(endTag)
isOpen = false
- case start:
+ case count >= start:
// if tag is open, do not open again
if isOpen {
break
@@ -161,7 +164,7 @@ func HighlightSearchResultCode(filename string, lineNums []int, highlightRanges
highlightedLines := strings.Split(hcd.Recover(conv), "\n")
// The lineNums outputted by highlight.Code might not match the original lineNums, because "highlight" removes the last `\n`
lines := make([]ResultLine, min(len(highlightedLines), len(lineNums)))
- for i := 0; i < len(lines); i++ {
+ for i := range len(lines) {
lines[i].Num = lineNums[i]
lines[i].FormattedContent = template.HTML(highlightedLines[i])
}
diff --git a/modules/indexer/code/search_test.go b/modules/indexer/code/search_test.go
new file mode 100644
index 0000000000..e542b38c24
--- /dev/null
+++ b/modules/indexer/code/search_test.go
@@ -0,0 +1,122 @@
+// Copyright 2025 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package code
+
+import (
+ "html/template"
+ "strings"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestHighlightSearchResultCode(t *testing.T) {
+ opts := []struct {
+ Title string
+ File string
+ Lines []int
+ Range [][3]int
+ Code string
+ Result []template.HTML
+ }{
+ {
+ Title: "One Match Text",
+ File: "test.txt",
+ Range: [][3]int{{1, 5, 9}},
+ Code: "First Line\nMark this only\nThe End",
+ Result: []template.HTML{
+ "First Line",
+ "Mark this only",
+ "The End",
+ },
+ },
+ {
+ Title: "Two Match Text",
+ File: "test.txt",
+ Range: [][3]int{
+ {1, 5, 9},
+ {2, 5, 9},
+ },
+ Code: "First Line\nMark this only\nMark this too\nThe End",
+ Result: []template.HTML{
+ "First Line",
+ "Mark this only",
+ "Mark this too",
+ "The End",
+ },
+ },
+ {
+ Title: "Unicode Before",
+ File: "test.txt",
+ Range: [][3]int{{1, 10, 14}},
+ Code: "First Line\nMark 👉 this only\nThe End",
+ Result: []template.HTML{
+ "First Line",
+ "Mark 👉 this only",
+ "The End",
+ },
+ },
+ {
+ Title: "Unicode Between",
+ File: "test.txt",
+ Range: [][3]int{{1, 5, 14}},
+ Code: "First Line\nMark this 😊 only\nThe End",
+ Result: []template.HTML{
+ "First Line",
+ "Mark this 😊 only",
+ "The End",
+ },
+ },
+ {
+ Title: "Unicode Before And Between",
+ File: "test.txt",
+ Range: [][3]int{{1, 10, 19}},
+ Code: "First Line\nMark 👉 this 😊 only\nThe End",
+ Result: []template.HTML{
+ "First Line",
+ "Mark 👉 this 😊 only",
+ "The End",
+ },
+ },
+ {
+ Title: "Golang",
+ File: "test.go",
+ Range: [][3]int{{1, 14, 23}},
+ Code: "func main() {\n\tfmt.Println(\"mark this\")\n}",
+ Result: []template.HTML{
+ "func main() {",
+ "\tfmt.Println("mark this")",
+ "}",
+ },
+ },
+ {
+ Title: "Golang Unicode",
+ File: "test.go",
+ Range: [][3]int{{1, 14, 28}},
+ Code: "func main() {\n\tfmt.Println(\"mark this 😊\")\n}",
+ Result: []template.HTML{
+ "func main() {",
+ "\tfmt.Println("mark this 😊")",
+ "}",
+ },
+ },
+ }
+ for _, o := range opts {
+ t.Run(o.Title, func(t *testing.T) {
+ lines := []int{}
+ for i := range strings.Count(strings.TrimSuffix(o.Code, "\n"), "\n") + 1 {
+ lines = append(lines, i+1)
+ }
+ res := HighlightSearchResultCode(o.File, lines, o.Range, o.Code)
+ assert.Len(t, res, len(o.Result))
+ assert.Len(t, res, len(lines))
+
+ for i, r := range res {
+ require.Equal(t, lines[i], r.Num)
+ require.Equal(t, o.Result[i], r.FormattedContent)
+ }
+ })
+ }
+}
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",
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(
"",
- ``)
+ ``)
test(
"[["+title+"|"+url+"]]",
@@ -115,7 +115,7 @@ func TestRender_Images(t *testing.T) {
test(
"",
- ``)
+ ``)
test(
"[["+title+"|"+url+"]]",
@@ -412,8 +412,8 @@ func TestRenderSiblingImages_Issue12925(t *testing.T) {
testcase := `

`
- expected := `
+ expected := `
`
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
-
-
-
-
+
+
+
+
https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
@@ -872,10 +872,10 @@ space
88fc37a3c0...12fc37a3c0 (hash)
diff --git a/modules/util/shellquote_test.go b/modules/util/shellquote_test.go
index 969998c592..6c1b778a08 100644
--- a/modules/util/shellquote_test.go
+++ b/modules/util/shellquote_test.go
@@ -3,7 +3,11 @@
package util
-import "testing"
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
func TestShellEscape(t *testing.T) {
tests := []struct {
@@ -79,13 +83,23 @@ func TestShellEscape(t *testing.T) {
"Single quotes don't need to escape except for '...",
"~//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 = Ñега
@@ -749,7 +872,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 +896,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`
@@ -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
@@ -1205,7 +1328,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 +1353,11 @@ issues.dependency.title = ЗавиÑимоÑти
issues.dependency.issue_no_dependencies = ÐÑма зададени завиÑимоÑти.
issues.dependency.pr_close_blocked = ТрÑбва да затворите вÑички задачи, блокиращи тази заÑвка за Ñливане, преди да можете да Ñ Ñлеете.
issues.dependency.pr_close_blocks = Тази заÑвка за Ñливане блокира затварÑнето на Ñледните задачи
-issues.ref_issue_from = `Ñпомена тази задача %[4]s %[2]s`
-issues.commit_ref_at = `Ñпомена тази задача в подаване %[2]s`
+issues.ref_issue_from = `Ñпомена тази задача %[3]s %[1]s`
+issues.commit_ref_at = `Ñпомена тази задача в подаване %s`
issues.add_ref_at = `добави препратка %s %s`
pulls.merged_info_text = Клонът %s вече може да бъде изтрит.
-pulls.commit_ref_at = `Ñпомена тази заÑвка за Ñливане в подаване %[2]s`
+pulls.commit_ref_at = `Ñпомена тази заÑвка за Ñливане в подаване %s`
issues.change_ref_at = `промени препратката от alt
+ click/enter
, за да изключите етикети`
+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 9448dd8e7e..7e74f42b41 100644
--- a/options/locale/locale_cs-CZ.ini
+++ b/options/locale/locale_cs-CZ.ini
@@ -13,7 +13,7 @@ link_account=Propojit úÄet
register=Registrace
version=Verze
powered_by=Běžà na %s
-page=Strana
+page=Stránka
template=Å ablona
language=Jazyk
notifications=OznámenÃ
@@ -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Ã.
@@ -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
@@ -1091,6 +1091,8 @@ regenerate_token = Resetovat
access_token_regeneration = Znovu vygenerovat pÅ™Ãstupový token
access_token_regeneration_desc = OpÄ›tovným vygenerovánÃm tokenu znemožnÃte pÅ™Ãstup k vaÅ¡emu úÄtu aplikacÃm, které jej použÃvajÃ. Tato akce je nevratná. Chcete pokraÄovat?
+ssh_token_help_ssh_agent = nebo, pokud použÃváte agenta SSH (s nastavenou promÄ›nnou SSH_AUTH_SOCK):
+
[repo]
new_repo_helper=Repozitář obsahuje vÅ¡echny soubory projektu, vÄetnÄ› historie revizÃ. Už jej hostujete jinde? Migrovat repozitář.
owner=VlastnÃk
@@ -1556,7 +1558,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
@@ -1579,7 +1581,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
@@ -1633,13 +1635,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 +1655,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`
@@ -1763,7 +1765,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 +1815,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
@@ -1966,8 +1968,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 +2760,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é
@@ -3058,7 +3060,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]
@@ -3991,7 +3993,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_da.ini b/options/locale/locale_da.ini
index ea22f49e77..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,15 +1517,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 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 %[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 %[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.
issues.author.tooltip.pr = Denne bruger er forfatteren af denne pull-anmodning.
issues.role.owner = Ejer
@@ -1564,8 +1561,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`
@@ -1582,7 +1579,7 @@ issues.change_ref_at = `ændret reference fra 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
@@ -1911,10 +1908,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
@@ -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 829912b3cc..5b4b1d3408 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.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
@@ -1598,8 +1600,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 überprüft
issues.filter_sort=Sortieren
issues.filter_sort.latest=Neueste
issues.filter_sort.oldest=Älteste
@@ -1621,8 +1623,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
@@ -1651,13 +1653,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=`auf dieses Issue verwiesen %[3]s %[1]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`
@@ -1673,12 +1675,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 +1811,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 überprüft
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=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
@@ -1833,7 +1835,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 +1849,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 +1858,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 +1869,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 +1907,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 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:
@@ -1919,14 +1921,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
@@ -1962,8 +1964,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.
@@ -2202,7 +2204,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 +2263,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 +2329,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 +2376,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 +2469,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=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
@@ -2489,10 +2491,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 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
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 +2541,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 +2582,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 +2606,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 +2658,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 +2668,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,8 +2768,8 @@ 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.
-pulls.commit_ref_at = `hat sich auf diesen Pull-Request von einem Commit %[2]s bezogen`
+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.
pulls.cmd_instruction_merge_title = Zusammenführen
@@ -2782,7 +2784,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 +2797,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 +2826,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 +2875,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 +2885,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 +2904,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 ü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
@@ -2922,7 +2924,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
@@ -3061,8 +3063,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
@@ -3116,7 +3118,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 +3161,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 +3337,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 +3345,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 +3397,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 +3528,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 +3652,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 +3767,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 +3783,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 +3815,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 +3894,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_el-GR.ini b/options/locale/locale_el-GR.ini
index 29085aebf1..41c55beb11 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 = ΣυνεισφÎÏοντες
@@ -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_en-US.ini b/options/locale/locale_en-US.ini
index 5fd2ebd163..cb35fbecdf 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -895,6 +895,7 @@ ssh_invalid_token_signature = The provided SSH key, signature or token do not ma
ssh_token_required = You must provide a signature for the below token
ssh_token = Token
ssh_token_help = You can generate a signature using:
+ssh_token_help_ssh_agent = or, if you're using an SSH agent (with the SSH_AUTH_SOCK variable set):
ssh_token_signature = Armored SSH signature
key_signature_ssh_placeholder = Begins with "-----BEGIN SSH SIGNATURE-----"
verify_ssh_key_success = SSH key "%s" has been verified.
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 f912409cc9..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
@@ -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:
@@ -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..7fcbc05bbb 100644
--- a/options/locale/locale_et.ini
+++ b/options/locale/locale_et.ini
@@ -1,67 +1,67 @@
[common]
tracked_time_summary = Kokkuvõte jälgitavast ajast, mis põhineb probleemide nimekirja filtritel
-your_settings = Seaded
+your_settings = Seadistused
home = Avaleht
-dashboard = Armatuurlaud
-explore = Uurige
-help = Abi
+dashboard = Töölaud
+explore = Uuri
+help = Abiteave
logo = Logo
sign_in = Logi sisse
-sign_in_with_provider = Logi sisse koos %s
+sign_in_with_provider = Logi sisse kasutajakontoga: %s
sign_in_or = või
-sign_out = Registreeru välja
+sign_out = Logi välja
sign_up = Registreeru
-link_account = Lingi konto
+link_account = Lingi väline kasutajakonto
register = Registreeru
version = Versioon
page = Lehekülg
template = Mall
language = Keel
-notifications = Teated
+notifications = Teavitused
active_stopwatch = Aktiivne aja jälgimine
create_new = Loo…
-user_profile_and_more = Profiil ja seaded…
+user_profile_and_more = Profiil ja seadistused…
signed_in_as = Sisselogitud kui
-enable_javascript = See veebileht nõuab JavaScripti.
+enable_javascript = See veebileht eeldab JavaScripti kasutamise lubamist.
toc = Sisukord
licenses = Litsentsid
username = Kasutajanimi
-webauthn_error_unable_to_process = Server ei saanud teie taotlust töödelda.
-webauthn_error_duplicated = Turvalisuse võti ei ole selle taotluse puhul lubatud. Palun veenduge, et võti ei ole juba registreeritud.
+webauthn_error_unable_to_process = Server ei saanud sinu päringut töödelda.
+webauthn_error_duplicated = Turvavõti ei ole selle päringu puhul lubatud. Palun veendu, et võti ei ole juba registreeritud.
return_to_forgejo = Tagasi Forgejo'sse
-toggle_menu = Lülitage menüü
-more_items = Rohkem esemeid
+toggle_menu = Lülita menüü sisse/välja
+more_items = Rohkem objekte
email = E-posti aadress
-password = Parool
-access_token = Juurdepääsutähis
-re_type = Kinnita parool
+password = Salasõna
+access_token = Tunnusluba
+re_type = Kinnita salasõna
twofa = Kahefaktoriline autentimine
twofa_scratch = Kahefaktoriline kriipsukood
-passcode = Passkood
-webauthn_insert_key = Sisestage oma turvavõti
-webauthn_sign_in = Vajutage turvavõtme nuppu. Kui teie turvavõtmel ei ole nuppu, sisestage see uuesti.
-webauthn_press_button = Palun vajutage turvavõtme nuppu…
-webauthn_use_twofa = Kasutage oma telefonist kahefaktorilist koodi
-webauthn_error = Teie turvavõti ei saanud lugeda.
-webauthn_unsupported_browser = Teie brauser ei toeta praegu WebAuthn.
-webauthn_error_unknown = Tekkis tundmatu viga. Palun proovige uuesti.
-webauthn_error_insecure = WebAuthn toetab ainult turvalisi ühendusi. HTTP kaudu testimiseks võite kasutada päritolu "localhost" või "127.0.0.1"
-webauthn_error_empty = Sellele võtmele tuleb määrata nimi.
-webauthn_error_timeout = Ajakatkestus saavutati enne võtme lugemist. Palun laadige see lehekülg uuesti ja proovige uuesti.
+passcode = Salakood
+webauthn_insert_key = Sisesta oma turvavõti
+webauthn_sign_in = Vajuta turvavõtme nuppu. Kui sinu turvavõtmel ei ole nuppu, sisesta see uuesti.
+webauthn_press_button = Palun vajuta turvavõtme nuppu…
+webauthn_use_twofa = Sisesta oma telefonist kahefaktorilise autentimise kood
+webauthn_error = Sinu turvavõtit ei saanud lugeda.
+webauthn_unsupported_browser = Sinu veebibrauser ei toeta praegu WebAuthn-liidestust.
+webauthn_error_unknown = Tekkis tundmatu viga. Palun proovi uuesti.
+webauthn_error_insecure = WebAuthn toetab ainult turvalisi ühendusi. HTTP kaudu testimiseks võid kasutada lähteaadressina „localhost“ või „127.0.0.1“
+webauthn_error_empty = Palun lisa sellele võtmele täisnimi.
+webauthn_error_timeout = Päring aegus enne võtme lugemist. Palun laadi see lehekülg uuesti ja proovi uuesti.
repository = Hoidla
organization = Organisatsioon
-new_fork = Uus hoidla haru
+new_fork = Uus lähekoodihoidla haru
new_project = Uus projekt
new_project_column = Uus veerg
-admin_panel = Saidi administreerimine
-settings = Seaded
+admin_panel = Saidi haldus
+settings = Seadistused
your_profile = Profiil
your_starred = Tähistatud tärniga
-new_repo.title = Uus hoidla
-new_migrate.title = Uus sisseränne
+new_repo.title = Uus lähtekoodi hoidla
+new_migrate.title = Uus kolimine
new_org.title = Uus organisatsioon
-new_repo.link = Uus hoidla
-new_migrate.link = Uus sisseränne
+new_repo.link = Uus lähtekoodi hoidla
+new_migrate.link = Uus kolimine
new_org.link = Uus organisatsioon
all = Kõik
sources = Allikad
@@ -69,10 +69,10 @@ mirror = Peegelpilt
mirrors = Peegelpildid
forks = Harud
activities = Tegevused
-pull_requests = Tõmbepäringud
-issues = Probleemid
+pull_requests = Päringud koodi mestimiseks
+issues = Veahaldus
milestones = Verstapostid
-ok = OK
+ok = Sobib
cancel = Tühista
retry = Proovi uuesti
rerun = Käivita uuesti
@@ -81,120 +81,139 @@ add = Lisa
add_all = Lisa kõik
remove = Eemalda
remove_all = Eemalda kõik
-remove_label_str = Eemalda ühik "%s"
-edit = Redigeeri
+remove_label_str = Eemalda „%s“ objekt
+edit = Muuda
view = Vaata
-test = Test
-enabled = Võimaldatud
-disabled = Välja lülitatud
-locked = Lukkus
+test = Testi
+enabled = Kasutusel
+disabled = Pole kasutusel
+locked = Lukustatud
copy = Kopeeri
-copy_url = Kopeeri URL
-copy_hash = Kooperi hash
+copy_url = Kopeeri võrguaadress
+copy_hash = Kopeeri räsi
copy_content = Kopeeri sisu
copy_branch = Kopeeri haru nimi
copy_success = Kopeeritud!
-copy_error = Kopeerimine ebaõnnestus
+copy_error = Kopeerimine ei õnnestunud
copy_type_unsupported = Seda failitüüpi ei saa kopeerida
write = Kirjuta
preview = Eelvaade
-loading = Laadimine…
+loading = Laadin…
error = Viga
-error404 = Lehekülge, millele te üritate jõuda, kas ei ole olemas või teil ei ole õigust seda vaadata.
+error404 = Lehekülge, millele sa üritad jõuda, kas ei ole olemas, ta on eemaldatud või sul ei ole õigust seda vaadata.
error413 = Sa oled oma kvoodi ammendanud.
go_back = Mine tagasi
-invalid_data = Kehtetud andmed: %v
+invalid_data = Vigased andmed: %v
never = Mitte kunagi
unknown = Teadmata
-rss_feed = RSS infovoog
-confirm_delete_artifact = Kas oled kindel et soovite artefakti "%s" kustutada?
-pin =
+rss_feed = RSS-voog
+confirm_delete_artifact = Kas oled kindel et soovid „%s“ artefakti kustutada?
+pin =Tõsta esile
artifacts = Artefaktid
archived = Arhiveeritud
-concept_system_global = Ülemaailmne
+concept_system_global = Üldine
concept_user_individual = Individuaalne
-concept_code_repository = Hoidla
+concept_code_repository = Lähtekoodi hoidla
concept_user_organization = Organisatsioon
-show_timestamps = Näita ajatemplid
-show_log_seconds = Näita sekundit
-download_logs = Logide allalaadimine
+show_timestamps = Näita ajatempleid
+show_log_seconds = Näita sekundeid
+download_logs = Laadi logid alla
name = Nimi
value = Väärtus
filter = Filter
-filter.clear = Tühjendage filtrid
+filter.clear = Tühjenda filtrid
filter.is_archived = Arhiveeritud
-filter.not_archived = Mitte arhiveeritud
-filter.is_fork = Harud
-filter.not_fork = Mitte harud
-filter.is_mirror = Peegelpiltid
-filter.not_mirror = Mitte peegelpiltid
+filter.not_archived = Arhiveerimata
+filter.is_fork = Koodiharud
+filter.not_fork = Pole koodiharud
+filter.is_mirror = Peegelpildid
+filter.not_mirror = Pole peegelpilte
filter.is_template = Mallid
-filter.not_template = Mitte Mallid
+filter.not_template = Pole mallid
filter.public = Avalik
filter.private = Privaatne
rerun_all = Käivita uuesti kõik tööd
new_mirror = Uus peegelpilt
copy_generic = Kopeeri lõikelauale
-confirm_delete_selected = Kinnitage et kustutada kõik valitud elemendid?
-show_full_screen = Näita täisekraanil
+confirm_delete_selected = Kas kinnitad kõikide valitud objektide kustutamise?
+show_full_screen = Näita täisekraanivaates
+
+powered_by = Siin on kasutusel %s
+captcha = Robotilõks
+copy_path = Kopeeri asukoht
+unpin = Lõpeta esiletõstmine
[search]
-search = Otsi...
+search = Otsi…
fuzzy = Hägus
-fuzzy_tooltip = Lisage tulemused mis vastavad ka otsingu terminile
+fuzzy_tooltip = Lisa tulemused mis lähedalt vastavad otsingusõnale
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...
+exact_tooltip = Sisaldab ainult tulemusi, mis vastavad täpsele otsingusõnale
+repo_kind = Otsi lähtekoodihoidlad…
+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...
-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...
+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
+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…
[aria]
navbar = Navigatsiooniriba
-footer.software = Selle tarkvara kohta
+footer.software = Teave selle tarkvara kohta
footer.links = Lingid
+footer = Jalus
+
[heatmap]
-number_of_contributions_in_the_last_12_months = %s panused viimase 12 kuu jooksul
-contributions_zero = Panused ei ole
+number_of_contributions_in_the_last_12_months = %s kaastööd viimase 12 kuu jooksul
+contributions_zero = Kaastöid ei ole
contributions_format = {contributions} {day} {month}, {year}
-contributions_few = panused
+contributions_few = kaastööd
less = Vähem
more = Rohkem
-contributions_one = panus
+contributions_one = kaastöö
[editor]
buttons.heading.tooltip = Lisa pealkiri
-buttons.italic.tooltip = Lisa kursiivne tekst
-buttons.quote.tooltip = Tsitaadi tekst
+buttons.italic.tooltip = Lisa kaldkirjas tekst
+buttons.quote.tooltip = Tsiteeri teksti
buttons.code.tooltip = Lisa kood
buttons.link.tooltip = Lisa link
buttons.list.ordered.tooltip = Lisa nummerdatud nimekiri
buttons.list.unordered.tooltip = Lisa nimekiri
buttons.list.task.tooltip = Lisa ülesannete nimekiri
-buttons.ref.tooltip = Viide probleemile või tõmbepäringule
-buttons.switch_to_legacy.tooltip = Kasutage selle asemel pärandredaktorit
-buttons.enable_monospace_font = Võimalda püsisammkiri
-buttons.disable_monospace_font = Lülita välja püsisammkiri
-buttons.indent.tooltip = Pesa esemed ühe taseme võrra
-buttons.bold.tooltip = Lisa rasvane tekst
-buttons.mention.tooltip = Mainige kasutajat või meeskonda
+buttons.ref.tooltip = Viide probleemile või mestimispäringule
+buttons.switch_to_legacy.tooltip = Selle asemel kasuta pärandredaktorit
+buttons.enable_monospace_font = Kasuta püsisammkirja
+buttons.disable_monospace_font = Lülita püsisammkiri välja
+buttons.indent.tooltip = Liiguta objekte ühe taseme võrra
+buttons.bold.tooltip = Lisa paks tekst
+buttons.mention.tooltip = Maini kasutajat või tiimi
+
+buttons.unindent.tooltip = Võta tagasi objektide liigutamine ühe taseme võrra
+buttons.new_table.tooltip = Lisa tabel
+table_modal.header = Lisa tabel
+table_modal.placeholder.header = Päis
+table_modal.placeholder.content = Sisu
+table_modal.label.rows = Read
+table_modal.label.columns = Veerud
+link_modal.header = Lisa link
+link_modal.url = Võrguaadress
+link_modal.description = Kirjeldus
+link_modal.paste_reminder = Soovitus: kui link on uba lõikelaual olemas, siis võis ta otse lisada ja link luuakse automaatselt.
[filter]
string.asc = A - Z
@@ -205,114 +224,179 @@ occurred = Tekkis viga
invalid_csrf = Halb taotlus: vigane CSRF token
not_found = Sihtmärki ei leitud.
network_error = Võrguviga
-server_internal = Sisemine serveri viga
-report_message = Kui usute et tegemist on Forgejo veaga siis otsige probleeme Codebergist või avage vajadusel uus probleem.
+server_internal = Serveri sisemine viga
+report_message = Kui usud, et tegemist on Forgejo veaga, siis otsige sarnaseid vigu Codebergist või vajadusel koosta uus veakirjeldus.
[startpage]
-app_desc = Valutu, isehostitatud Git'i teenus
+app_desc = Muretu Git'i teenus sinu omas serveris
install = Lihtne paigaldada
platform = Platvormiülene
-platform_desc = Forgejo on kinnitust leidnud et töötab nii libre operatsioonisüsteemides nagu Linux ja FreeBSD, kui ka erinevatel protsessorarhitektuuridel. Valige see mis teile meeldib!
+platform_desc = On kinnitust leidnud, et Forgejo töötab nii avatud operatsioonisüsteemides nagu Linux ja FreeBSD, kui ka erinevatel protsessorarhitektuuridel. Vali see mis sulle meeldib!
lightweight = Kergekaaluline
-lightweight_desc = Forgejo on väikeste miinimumnõuetega ja seda saab kasutada odaval Raspberry Pi'l. Säästa oma masina energiat!
+lightweight_desc = Forgejo on väikeste miinimumnõuetega ja seda saad kasutada odaval Raspberry Pi'l. Säästa oma masina energiat!
license = Avatud lähtekood
-install_desc = Lihtsalt käivitage oma platvormi binaarsüsteem, tarnige see koos Dockeriga, või saada see pakendatud.
-license_desc = Mine võta Forgejo! Liitu meiega andes oma panuse et muuta see projekt veelgi paremaks. Ärge häbenege olla kaasaaitaja!
+install_desc = Lihtsalt käivita rakenduse fail oma platvormil, pane ta tööle Dockeriga või laadi ta pakendatuna.
+license_desc = Laadi Forgejo alla! Liitu meiega andes oma panuse, et muuta see projekt veelgi paremaks. Ära pelga osalemist!
[install]
install = Paigaldamine
title = Esialgne konfiguratsioon
-docker_helper = Kui käivitate Forgejo't Dockeri sees, lugege dokumentatsiooni enne seadete muutmine.
-require_db_desc = Forgejo vajab MySQL, PostgreSQL, SQLite3 või TiDB (MySQL protokoll).
-db_title = Andmebaasi seaded
+docker_helper = Kui käivitad Forgejo't Dockeris, loe enne seadistuste muutmist dokumentatsiooni.
+require_db_desc = Forgejo vajab tööks ühte järgnevast andmebaasidest: MySQL, PostgreSQL, SQLite3 või TiDB (MySQL protokoll).
+db_title = Andmebaasi seadistused
db_type = Andmebaasi tüüp
-host = Vastuvõtja
+host = Server
user = Kasutajanimi
-password = Parool
+password = Salasõna
db_name = Andmebaasi nimi
-db_schema = Skeem
-db_schema_helper = Jäta tühjaks andmebaasi vaikimisi ("avalik").
+db_schema = Andmeskeem
+db_schema_helper = Vaikimisi valiku kasutamiseks jäta tühjaks („public“).
ssl_mode = SSL
-path = Tee
-sqlite_helper = SQLite3 andmebaasi failitee.
Sisestage absoluutne tee, kui käivitate Forgejo't teenusena.
-reinstall_error = Sa üritad installeerida olemasolevasse Forgejo andmebaasi
-reinstall_confirm_message = Olemasoleva Forgejo andmebaasi uuesti paigaldamine võib põhjustada mitmeid probleeme. Enamasti peaksite Forgejo käivitamiseks kasutama olemasolevat "app.ini". Kui te teate, mida teete, kinnitage järgmist:
-reinstall_confirm_check_1 = Andmed, mis on krüpteeritud SECRET_KEY'ga app.ini's, võivad kaduda: kasutajad ei pruugi saada 2FA/OTP-ga sisse logima ja peegelpiltid ei pruugi õigesti toimida. Selle kasti märkimisega kinnitate, et praegune app.ini fail sisaldab õiget SECRET_KEY'd.
-reinstall_confirm_check_3 = Te kinnitate, et olete täiesti kindel, et see Forgejo töötab õiges app.ini asukohas ja et olete kindel, et peate uuesti installima. Te kinnitate, et tunnistate ülaltoodud riske.
-err_empty_db_path = SQLite3 andmebaasi tee ei saa olla tühi.
-no_admin_and_disable_registration = Kasutajate iseregistreerimist ei saa keelata ilma administraatori kontot loomata.
-err_empty_admin_password = Administraatori parool ei saa olla tühi.
-err_empty_admin_email = Administraatori e-posti aadress ei saa olla tühi.
-err_admin_name_is_reserved = Administraatori kasutajanimi on kehtetu, kasutajanimi on reserveeritud
-err_admin_name_pattern_not_allowed = Administraatori kasutajanimi on kehtetu, kasutajanimi vastab reserveeritud mustrile
-err_admin_name_is_invalid = Administraatori kasutajanimi on kehtetu
-general_title = Üldised seaded
-app_name = Instantsi pealkiri
-app_name_helper = Sisestage siia oma instantsi nimi. See kuvatakse igal leheküljel.
-app_slogan = Instantse loosung
-repo_path = Hoidla juurte tee
-lfs_path = Git LFS'i juurte tee
-lfs_path_helper = Failid jälgitatud Git LFS'ist salvestatakse sellesse kaustale. Jätke tühjaks et välja lülitada.
+path = Asukoht
+sqlite_helper = SQLite3 andmebaasi aukoht.
Kui käivitad Forgejo'd teenusena, siis sisesta absoluutne asukoht.
+reinstall_error = Sa üritad paigaldada olemasolevasse Forgejo andmebaasi
+reinstall_confirm_message = Olemasoleva Forgejo andmebaasi uuesti paigaldamine võib põhjustada mitmeid probleeme. Enamasti peaksid Forgejo käivitamiseks kasutama olemasolevat „app.ini“. Kui te tead, mida teed, kinnita järgmist:
+reinstall_confirm_check_1 = Andmed, mis on krüpteeritud SECRET_KEY'ga app.ini's, võivad kaduda: kasutajad ei pruugi saada sisselogimisel kaasutada 2FA/OTP võimalusi ja peegelpildid ei pruugi õigesti toimida. Selle kasti märkimisega kinnitad, et praegune app.ini fail sisaldab õiget SECRET_KEY'd.
+reinstall_confirm_check_3 = Sa kinnitad, et oled täiesti kindel, et see Forgejo töötab õiges app.ini asukohas ja et oled kindel, et pead uuesti paigaldama. Sa kinnitad, et oled teadlik ülaltoodud riskidest.
+err_empty_db_path = SQLite3 andmebaasi asukoht ei saa olla tühi.
+no_admin_and_disable_registration = Kasutajate iseregistreerimist ei saa keelata ilma peakasutaja kontot loomata.
+err_empty_admin_password = Peakasutaja salasõna ei saa olla tühi.
+err_empty_admin_email = Peakasutaja e-posti aadress ei saa olla tühi.
+err_admin_name_is_reserved = Peakasutaja kasutajanimi on vigane, kasutajanimi on reserveeritud
+err_admin_name_pattern_not_allowed = Peakasutaja kasutajanimi on vigane, kasutajanimi vastab reserveeritud mustrile
+err_admin_name_is_invalid = Peakasutaja kasutajanimi on vigane
+general_title = Üldised seadistused
+app_name = Serveri nimi või pealkiri
+app_name_helper = Sisestage siia oma serveri või teenuse nimi. See kuvatakse igal leheküljel.
+app_slogan = Serveri tunnuslause
+repo_path = Hoidla juurkausta asukoht
+lfs_path = Git LFS'i juurkausta asukoht
+lfs_path_helper = Git LFS'ist jälgitud failid salvestatakse siia kausta. Kui jätad tühjaks, siis pole see võimalus kasutusel.
run_user = Kasutaja kellena käivitada
-run_user_helper = Operatsioonisüsteemi kasutajanimi, mille all Forgejo töötab. Pange tähele, et sellel kasutajal peab olema juurdepääs hoidlate juurte teele.
+run_user_helper = Operatsioonisüsteemi kasutajanimi, kellena Forgejo töötab. Pane tähele, et sellel kasutajal peab olema juurdepääs hoidlate juurkaustale.
domain = Serveri domeen
-domain_helper = Serveri domeen või hostiaadress.
+domain_helper = Serveri domeen või hosti aadress.
ssh_port = SSH-serveri port
-ssh_port_helper = Pordi number, mida SSH-server kasutab. Jätke tühjaks et välja lülitada SSH-serveri.
-http_port = HTTP-kuulamise port
+ssh_port_helper = Pordi number, mida SSH-server kasutab. SSH-serveri väljalülitamiseks jäta tühjaks.
+http_port = Serveri HTTP port
http_port_helper = Pordi number, mida Forgejo veebiserver kasutab.
-app_url = Baasi URL
-app_url_helper = Baasaadress HTTP(S) kloonimise URL-ide ja e-posti teadete jaoks.
-log_root_path = Logi tee
-log_root_path_helper = Logifailid kirjutatakse sellesse kaustale.
-optional_title = Vabatahtlikud seaded
-email_title = E-posti seaded
-smtp_addr = SMTP vastuvõtja
+app_url = Juur-võrguaadress
+app_url_helper = Lähteaadress HTTP(S) kloonimise võrguaadresside ja e-posti teadete jaoks.
+log_root_path = Logi asukoht
+log_root_path_helper = Logifailid kirjutatakse siia kausta.
+optional_title = Täiendavad seadistused
+email_title = E-posti seadistused
+smtp_addr = SMTP server
smtp_port = SMTP port
smtp_from = Saada e-kirjad nagu
-smtp_from_invalid = "Saada e-kirjad nagu" aadress on kehtetu
-smtp_from_helper = E-posti aadress, mida Forgejo kasutab. Sisestage tavaline e-posti aadress või kasutage formaati "Nimi" .
+smtp_from_invalid = „Saada e-kirjad nagu“ aadress on vigane
+smtp_from_helper = E-posti aadress, mida Forgejo kasutab. Sisesta tavaline e-posti aadress või kasutage vormingut "Nimi" .
mailer_user = SMTP kasutajanimi
-mailer_password = SMTP parool
-register_confirm = Registreerimiseks on vaja e-posti kinnitust
-mail_notify = Lubage e-posti teated
-server_service_title = Serveri ja kolmanda osapoole teenuste seaded
-offline_mode = Lülita sisse lokaalse režiimi
-disable_gravatar = Lülita välja Gravatar
-federated_avatar_lookup = Lülita sisse föderaalsed avatarid
-federated_avatar_lookup.description = Otsige avatare kasutades Libravatar'i.
+mailer_password = SMTP salasõna
+register_confirm = Registreerimiseks on vaja e-posti kinnitamist
+mail_notify = Kasuta teavitamist e-posti teel
+server_service_title = Serveri ja kolmanda osapoole teenuste seadistused
+offline_mode = Lülita sisse lokaalne režiim
+disable_gravatar = Lülita Gravatar välja
+federated_avatar_lookup = Kaasuta födereeritud tunnuspilte
+federated_avatar_lookup.description = Otsi tunnuspilte Libravatari teenusest.
disable_registration = Lülita välja iseregistreerimine
allow_only_external_registration = Luba registreerimine ainult väliste teenuste kaudu
allow_only_external_registration.description = Kasutajad saavad uusi kontosid luua ainult seadistatud väliste teenuste abil.
-openid_signin = Lülita sisse OpenID sisselogimise
-openid_signin.description = Luba kasutajatel OpenID kaudu sisse logida.
-openid_signup = Lülita sisse OpenID iseregistreerimine
-enable_captcha = Lülita sisse registreerimise CAPTCHA
-enable_captcha.description = Nõudke kasutajatelt CAPTCHA läbimist kontode loomiseks.
-require_sign_in_view = Nõua sisselogimist et vaadata instantsi sisu
-default_keep_email_private = Peida e-posti aadressid vaikimisi
-default_keep_email_private.description = Lülita sisse uute kasutajate e-posti aadressi varjamine vaikimisi, et see teave ei lekiks kohe pärast registreerimist.
-default_allow_create_organization = Lubada organisatsioonide loomine vaikimisi
-default_enable_timetracking = Aja jälgimise sisselülitamine vaikimisi
-default_enable_timetracking.description = Lubage uute repositooriumide jaoks vaikimisi aja jälgimise funktsiooni kasutamine.
-admin_title = Administraatori konto seaded
-admin_setting.description = Administraatori konto loomine on vabatahtlik. Esimesest registreeritud kasutajast saab automaatselt administraator.
-admin_name = Administraatori kasutajanimi
-admin_password = Parool
-confirm_password = Parooli kinnitamine
+openid_signin = Kasuta OpenID abil sisselogimist
+openid_signin.description = Luba kasutajatel OpenID abil sisse logida.
+openid_signup = Kasuta OpenID abil iseregistreerimist
+enable_captcha = Kasuta registreerimisel robotilõksu
+enable_captcha.description = Eelda, et kasutajad lahendavad registreerimisel robotilõksu ülesande.
+require_sign_in_view = Serveri sisu vaatamiseks eelda sisselogimist
+default_keep_email_private = Vaikimisi peida e-posti aadressid
+default_keep_email_private.description = Lülita sisse uute kasutajate e-posti aadresside vaikimisi varjamine - see väldib vastava teabe lekkimist kohe pärast registreerimist.
+default_allow_create_organization = Vaikimisi luba organisatsioonide loomine
+default_enable_timetracking = Vaikimisi lülita sisse aja jälgimine
+default_enable_timetracking.description = Vaikimisi luba uute lähtekoodihoidlate jaoks aja jälgimise funktsiooni kasutamise.
+admin_title = Peakasutaja konto seaded
+admin_setting.description = Peakasutaja konto loomine on vabatahtlik. Esimesest registreeritud kasutajast saab automaatselt peakasutaja.
+admin_name = Peakasutaja kasutajanimi
+admin_password = Salasõna
+confirm_password = Kinnita salasõna
admin_email = E-posti aadress
-config_location_hint = Need konfiguratsioonivalikud salvestatakse sees:
+config_location_hint = Need konfiguratsioonivalikud salvestatakse siin:
install_btn_confirm = Paigalda Forgejo
-test_git_failed = Ei saanud testida käsku "git": %v
-invalid_db_setting = Andmebaasi seaded on vigased: %v
-invalid_db_table = Andmebaasi tabel "%s" on vigane: %v
+test_git_failed = Ei saanud testida käsku „git“: %v
+invalid_db_setting = Andmebaasi seadistused on vigased: %v
+invalid_db_table = Andmebaasi tabel „%s“ on vigane: %v
allow_dots_in_usernames = Luba kasutajatel kasutada oma kasutajanimedes punkte. Ei mõjuta olemasolevaid kontosid.
-default_allow_create_organization.description = Lubage uutel kasutajatel vaikimisi luua organisatsioone. Kui see valik on välja lülitatud, peab administraator andma uutele kasutajatele organisatsioonide loomise loa.
-disable_gravatar.description = Lülita välja Gravatari või muude kolmandate osapoolte avatariallikate kasutamine. Kasutajate avatarite jaoks kasutatakse vaikimisi pilte, kui nad ei lae oma avatari üles.
-openid_signup.description = Luba kasutajatel luua kontosid OpenID kaudu, kui iseregistreerimine on sisse lülitatud.
-require_sign_in_view.description = Piirake sisule juurdepääsu sisselogitud kasutajatele. Külalised saavad külastada ainult autentimislehti.
-reinstall_confirm_check_2 = Hoidlad ja seadeid võib olla vaja uuesti sünkroniseerida. Selle kasti märkimisega kinnitate, et sünkroniseerite hoidlate ja authorized_keys'i faili konksud käsitsi uuesti. Te kinnitate, et tagate, et hoidlate ja peegelpilti seaded on õiged.
-app_slogan_helper = Sisestage siia oma loosung. Jätke tühjaks, et välja lülitada.
-repo_path_helper = Kauged Git-hoidlad salvestatakse sellesse kaustale.
-sqlite3_not_available = See Forgejo versioon ei toeta SQLite3. Palun laadige alla ametlik binaarversioon %s (mitte "gobuild"i versioon).
-offline_mode.description = Lülitage kolmandate osapoolte sisu edastamise võrgud välja ja teenindage kõiki ressursse lokaalselt.
\ No newline at end of file
+default_allow_create_organization.description = Luba uutel kasutajatel vaikimisi luua organisatsioone. Kui see valik on välja lülitatud, peab peakasutaja andma uutele kasutajatele organisatsioonide loomise loa.
+disable_gravatar.description = Lülita välja Gravatari või muude kolmandate osapoolte tunnuspiltide allikate kasutamine. Kasutajate tunnuspiltidena kasutatakse vaikimisi pilte, kui nad enda oma ei laadi üles.
+openid_signup.description = Kui iseregistreerimine on kasutusel, luba kasutajatel luua kontosid OpenID abil.
+require_sign_in_view.description = Piira juurdepääsu vaid sisselogitud kasutajatega. Külalised saavad külastada ainult autentimislehti.
+reinstall_confirm_check_2 = Hoidlad ja seadistused võivad uuesti vajada sünkroniseerimist. Selle kasti märkimisega kinnitad, et sünkroniseerid hoidlate ja authorized_keys'i faili haagid käsitsi uuesti. Sa kinnitad, et tagad, et hoidlate ja peegelpiltide seadistused on õiged.
+app_slogan_helper = Sisesta siia oma serveri tunnuslause. Kui jätad tühjaks, siis pole tunnuslause kasutusel.
+repo_path_helper = Kaugseadmete Git-hoidlad salvestatakse siia kausta.
+sqlite3_not_available = See Forgejo versioon ei toeta SQLite3 andmebaasi. Palun laadi alla ametlik binaarversioon %s (mitte „gobuild“-versioon).
+offline_mode.description = Lülitage kolmandate osapoolte sisuedastusvõrgud välja ja jaga kõiki ressursse kohalikust serverist.
+password_algorithm = Salasõna räsialgoritm
+invalid_password_algorithm = Vigane salasõna räsialgoritm
+
+[auth]
+forgot_password_title = Ununenud salasõna
+forgot_password = Kas salasõna ununes?
+must_change_password = Muuda oma salasõna
+allow_password_change = Eelda, et kasutajad muudavad oma salasõna (soovitatav)
+
+[mail]
+password_change.subject = Sinu salasõna on muutunud
+password_change.text_1 = Sinu kasutajakonto salasõna on just muutunud.
+totp_disabled.text_1 = Lisaautentimine ehk ajapõhise salasõna (TOTP) kasutamine on sinu kasutajakontol just välja lülitatud.
+
+[form]
+Password = Salasõna
+Retype = Korda salasõna
+password_not_match = Salasõnad ei klapi.
+username_password_incorrect = Kassutajanimi või salasõna pole õige.
+
+[settings]
+update_password = Muuda salasõna
+old_password = Senine salasõna
+new_password = Uus salasõna
+retype_new_password = Korda uut salasõna
+password_incorrect = Senine salasõna pole õige.
+change_password_success = Sina salasõna on nüüd muudetud. Edaspidi kasuta sisselogimiseks seda uut salasõna.
+
+[repo]
+mirror_interval_invalid = Peegelpildi välp pole korrektne.
+mirror_public_key = Avalik SSH-võti
+mirror_use_ssh.text = Kasuta SSH-autentimist
+mirror_sync = sünkroonis
+mirror_sync_on_commit = Sünkrooni sissekannete tegemisel
+mirror_address = Klooni võrguaadressilt
+mirror_password_placeholder = (Muutmata)
+mirror_password_blank_placeholder = (Seadistamata)
+mirror_password_help = Salvestatud salasõna kustutamiseks muuda kasutajanime.
+commits.search_branch = See haru
+commits.search_all = Kõik harud
+commits.author = Autor
+commits.message = Sõnum
+commits.browse_further = Sirvi edasi
+commits.renamed_from = Nimi muudetud, vana nimi oli „%s“
+commits.date = Kuupäev
+commits.older = Vanemad
+commits.newer = Uuemad
+commitstatus.error = Viga
+commitstatus.failure = Tõrge
+commitstatus.pending = Ootel
+commitstatus.success = Valmis
+ext_issues = Välised vead
+projects = Projektid
+
+[admin]
+users.password_helper = Kui sa ei taha salasõna muuta, siis jäta väli tühjaks.
+auths.bind_password = Seo salasõna
+config.reset_password_code_lives = Taastekoodi aegumine
+
+[actions]
+variables = Muutujad
+variables.management = Halda muutujaid
+variables.creation = Lisa muutuja
+variables.none = Muutujaid veel pole.
+variables.deletion = Eemalda muutuja
\ No newline at end of file
diff --git a/options/locale/locale_fa-IR.ini b/options/locale/locale_fa-IR.ini
index 804b48b2b2..f8199da658 100644
--- a/options/locale/locale_fa-IR.ini
+++ b/options/locale/locale_fa-IR.ini
@@ -301,7 +301,7 @@ federated_avatar_lookup=ÙØ¹Ø§Ù„ سازی آواتار مشترک
federated_avatar_lookup.description=پیدا کردن آواتار با Ø§Ø³ØªÙØ§Ø¯Ù‡ از Libravatar.
disable_registration=ØºÛŒØ±ÙØ¹Ø§Ù„‌کردن خود ثبت نامی
disable_registration.description=ØºÛŒØ±ÙØ¹Ø§Ù„ کردن ثبت نام کاربر. تنها مدیر ها قادر خواهند بود ØØ³Ø§Ø¨ کاربری جدید اضاÙÙ‡ کنند.
-allow_only_external_registration.description=اجازه ثبت نام Ùقط از طریق خدمات خارجی
+allow_only_external_registration.description=اجازه ثبت نام Ùقط از طریق خدمات خارجی.
openid_signin=ÙØ¹Ø§Ù„سازی ورود با OpenID
openid_signin.description=ÙØ¹Ø§Ù„سازی ورود کاربر با OpenID.
openid_signup=ÙØ¹Ø§Ù„سازی ثبت نام با OpenID
@@ -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=ÙØ¹Ø§Ù„ شده
@@ -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`
@@ -2762,27 +2762,27 @@ directory = پوشه
[search]
type_tooltip = جستجو گونه
-search = جستجو...
+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 cff940a05a..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.
@@ -1293,9 +1303,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 +2195,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 +2209,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
@@ -2255,14 +2265,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.
@@ -2381,7 +2391,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..c28e90c87a 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.
@@ -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
@@ -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
@@ -1034,6 +1034,8 @@ regenerate_token = I-regenerate
access_token_regeneration_desc = Ang pag-regenerate ng token ay babawiin ang access sa iyong account para sa mga application na gumagamit nito. Hindi ito mababawi. Magpatuloy?
regenerate_token_success = Na-generate muli ang token. Ang mga application na gumagamit nito ay hindi na maa-access ang iyong account at dapat ma-update gamit ang bagong token.
+ssh_token_help_ssh_agent = o, kung gumagamit ka ng SSH agent (na nakatakda ang variable na SSH_AUTH_SOCK):
+
[repo]
template_description = Ang mga template na repositoryo ay pinapayagan ang mga gumagamit na mag-generate ng mga bagong repositoryo na may magkatulad na istraktura ng direktoryo, mga file, at opsyonal na mga setting.
clone_helper = Kailangan ng tulong sa pagpili? Bisitahin ang Tulong.
@@ -1071,7 +1073,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 +1166,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 +1185,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 +1207,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 +1473,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 +1502,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 +1629,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 +1709,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 +1773,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 +1789,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 +1817,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 +1830,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 +1838,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 +2017,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 +2112,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 +2139,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 +2256,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 +2292,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 +2364,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 +2734,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 +2748,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 +2782,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 +3208,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 +3453,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..ef70b05713 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
@@ -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
@@ -1091,6 +1091,8 @@ keep_pronouns_private.description = Cela masquera votre pronoms aux visiteurs qu
storage_overview = Vue d'ensemble du stockage
quota = Quota
+ssh_token_help_ssh_agent = ou, si vous utilisez un agent SSH (avec la variable SSH_AUTH_SOCK affectée) :
+
[repo]
new_repo_helper=Un dépôt contient tous les fichiers d’un projet, ainsi que l’historique de leurs modifications. Vous avez déjà ça ailleurs ? Migrez-le ici..
owner=Propriétaire
@@ -1579,7 +1581,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
@@ -1653,13 +1655,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 +1969,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 +2764,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 +3060,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
@@ -4091,4 +4093,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 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 d2d960b627..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
@@ -1219,11 +1219,11 @@ issues.close_comment_issue = Dún le trácht
issues.reopen_issue = Athoscail
issues.reopen_comment_issue = Athoscail le trácht
issues.create_comment = Trácht
-issues.closed_at = `dhún an cheist seo %[2]s`
-issues.reopened_at = `athoscail an t-eagrán seo %[2]s`
-issues.commit_ref_at = `rinne tagairt don cheist seo ó ghealltanas %[2]s`
-issues.ref_issue_from = `rinne dagairt don cheist seo %[4]s %[2]s`
-issues.ref_pull_from = `rinne dagairt don iarratas tarraingthe seo %[4]s %[ 2]s`
+issues.closed_at = `dhún an cheist seo %s`
+issues.reopened_at = `athoscail an t-eagrán seo %s`
+issues.commit_ref_at = `rinne tagairt don cheist seo ó ghealltanas %s`
+issues.ref_issue_from = `rinne dagairt don cheist seo %[3]s %[1]s`
+issues.ref_pull_from = `rinne dagairt don iarratas tarraingthe seo %[3]s %[1]s`
issues.ref_closed_from = `dhún an cheist seo %[4]s %[2]s`
issues.ref_reopened_from = `d'athoscail an eagrán seo %[4]s %[2]s`
issues.ref_from = `ó %[1]s`
@@ -1456,8 +1456,8 @@ pulls.update_branch_success = Bhà nuashonrú brainse rathúil
pulls.update_not_allowed = Nà cheadaÃtear duit brainse a nuashonrú
pulls.outdated_with_base_branch = Tá an brainse seo as dáta leis an mbunbhrainse
pulls.close = Dún Iarratas Tarraing
-pulls.closed_at = `dhún an t-iarratas tarraingthe seo %[2]s`
-pulls.reopened_at = `athoscail an t-iarratas tarraingthe seo %[2]s`
+pulls.closed_at = `dhún an t-iarratas tarraingthe seo %s`
+pulls.reopened_at = `athoscail an t-iarratas tarraingthe seo %s`
pulls.cmd_instruction_checkout_title = Seiceáil
pulls.cmd_instruction_checkout_desc = Ó stór tionscadail, seiceáil brainse nua agus déan tástáil ar na hathruithe.
pulls.cmd_instruction_merge_title = Cumaisc
diff --git a/options/locale/locale_gl.ini b/options/locale/locale_gl.ini
index 3854b375af..b5c8222bbc 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
@@ -229,6 +229,9 @@ license = Código aberto
lightweight_desc = Forgejo precisa duns requerimentos mÃnimos e pode funcionar nunha Raspberry Pi barata. Aforra enerxÃa na túa máquina!
lightweight = Lixeiro
+platform_desc = Forgejo funciona en sistemas operativos libres como Linux e FreeBSD, como tamén en diferentes arquitecturas CPU. Escolle a túa prefereida!
+license_desc = Vai a Forgejo! Únete e colabora para facer este proxecto incluso mellor. Non teñas vergoña en convertirte en colaboradora!
+
[error]
occurred = Ocorreu un erro
missing_csrf = Solicitude incorrecta: non hai ningún token CSRF presente
@@ -296,6 +299,18 @@ domain = Dominio do servidor
ssh_port = Porto do servidor SSH
require_db_desc = Forgejo precisa MySQL, PostgreSQL, SQLite3 ou TiDB (protocolo MySQL).
+docker_helper = Se Forgejo está correndo dentro de Docker, por favor le a documentación antes de cambiar algunha configuración.
+host = Servidor
+lfs_path_helper = Os arquivos trackeados por Git LFS gárdanse neste directorio. Deixao en branco para deshabilitar.
+run_user_helper = O usuario do sistema operativo que executa Forgejo. Ten en conta que este usuario debe poder acceder á raÃz do repositorio.
+domain_helper = Dominio ou enderezo do servidor.
+ssh_port_helper = Número do porto que se usa para o servidor SSH. Déixao en branco para deshabilitar o servidor SSH.
+smtp_from_helper = Enderezo email que usa Forgejo. Podes poñer simplemente un email ou usar o formato "Nome" .
+register_confirm = Esixir a confirmación do email para rexistrarse
+mail_notify = Permitir notificacións por email
+server_service_title = Configuración do servidor e de servizos de terceiros
+offline_mode = Habilitar o modo local
+
[repo]
sync_fork.branch_behind_few = Esta rama ten %d achegas por detrás de %s
sync_fork.button = Sincronizar
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_hi.ini b/options/locale/locale_hi.ini
index 2f75c8d13e..9279f35b59 100644
--- a/options/locale/locale_hi.ini
+++ b/options/locale/locale_hi.ini
@@ -39,4 +39,170 @@ organization = संगठन
mirror = छवि
settings = सेटिंगà¥à¤¸
your_settings = आपकी सेटिंगà¥à¤¸
-return_to_forgejo = फ़ोरà¥à¤œà¥‡à¤—ो पे वापस जाà¤à¤‚
\ No newline at end of file
+return_to_forgejo = फ़ोरà¥à¤œà¥‡à¤—ो पे वापस जाà¤à¤‚
+toggle_menu = चालू-बंद करें
+access_token = à¤à¤•à¥à¤¸à¥‡à¤¸ टोकन
+webauthn_insert_key = अपनी सिकà¥à¤¯à¥‹à¤°à¤¿à¤Ÿà¥€ की डालें
+webauthn_sign_in = सिकà¥à¤¯à¥‹à¤°à¤¿à¤Ÿà¥€ की का बटन दबाà¤à¤‚, नहीं है तो फिर से पà¥à¤²à¤— करें।
+webauthn_press_button = अपनी सिकà¥à¤¯à¥‹à¤°à¤¿à¤Ÿà¥€ की पर बटन दबाà¤à¤‚…
+webauthn_use_twofa = अपने फ़ोन से दो फैकà¥à¤Ÿà¤° कोड लाà¤à¤‚
+webauthn_error = सिकà¥à¤¯à¥‹à¤°à¤¿à¤Ÿà¥€ की रीड नहीं हो पा रही।
+webauthn_unsupported_browser = आपका बà¥à¤°à¤¾à¤‰à¥›à¤° वेबौथ सपोरà¥à¤Ÿ नहीं करता।
+webauthn_error_unknown = कोई अंजान à¤à¤°à¤° हà¥à¤ˆ, फिर से कोशिश करें।
+webauthn_error_insecure = वेबौथ पर सिरà¥à¤« सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ कनेकà¥à¤¶à¤¨ हो. HTTP टेसà¥à¤Ÿ के लिठओरिजिन “लोकलहोसà¥à¤Ÿâ€ या “127.0.0.1â€
+webauthn_error_unable_to_process = सरà¥à¤µà¤° आपकी रिकà¥à¤µà¥‡à¤¸à¥à¤Ÿ पà¥à¤°à¥‹à¤¸à¥‡à¤¸ नहीं कर पाया।
+webauthn_error_duplicated = सिकà¥à¤¯à¥‹à¤°à¤¿à¤Ÿà¥€ की इस रिकà¥à¤µà¥‡à¤¸à¥à¤Ÿ के लिठनहीं है। कृपया देखें की पहले से रजिसà¥à¤Ÿà¤°à¥à¤¡ तो नहीं।
+webauthn_error_empty = कृपया इस चाà¤à¥€ का नाम रखें।
+webauthn_error_timeout = आपकी की पà¥à¤¨à¥‡ से पहले टाइमआउट हो गया। पृषà¥à¤Ÿ रीलोड करें और फिर कोशिश करें।
+new_mirror = नया मिरर
+new_fork = नयी रिपॉजिटरी फोरà¥à¤•
+new_project = नया पà¥à¤°à¥‹à¤œà¥‡à¤•à¥à¤Ÿ
+new_project_column = नया सà¥à¤¤à¤®à¥à¤
+admin_panel = वेबसाइट पà¥à¤°à¤¬à¤‚धन
+your_profile = पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤²
+your_starred = सीतारित
+new_repo.title = नई रिपॉजिटरी
+new_migrate.title = नया पà¥à¤°à¤µà¤¾à¤¸à¤¨
+new_org.title = नई संसà¥à¤¥à¤¾
+new_repo.link = नई रिपॉजिटरी
+new_migrate.link = नया पà¥à¤°à¤µà¤¾à¤¸à¤¨
+new_org.link = नई संसà¥à¤¥à¤¾
+all = सब
+sources = सà¥à¤°à¥‹à¤¤
+mirrors = मिरà¥à¤°à¥‹à¤°à¥à¤¸
+collaborative = सहयोगी
+forks = फोरà¥à¤•à¥à¤¸
+activities = गतिविधियाà¤
+pull_requests = पà¥à¤²à¥à¤² करें
+issues = इशà¥à¤¯à¥‚ज
+milestones = महतà¥à¤µà¤ªà¥‚रà¥à¤£
+ok = ओके
+cancel = रदà¥à¤¦ करें
+retry = फिर से करें
+rerun = फिर से
+rerun_all = फिर से सारे काम करें
+save = सेव करें
+add = जोड़ें
+add_all = सब जोड़ें
+remove = हटाà¤à¤‚
+remove_all = सारा हटाà¤à¤‚
+remove_label_str = हटाà¤à¤‚ आइटम “%sâ€
+edit = संपादित करना
+view = देखें
+test = टेसà¥à¤Ÿ
+enabled = सकà¥à¤·à¤® किया गया
+disabled = असकà¥à¤·à¤® किया गया
+locked = लॉकà¥à¤¡
+copy = कॉपी
+copy_generic = कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ पर कॉपी करें
+copy_url = URL कॉपी करें
+copy_hash = कॉपी हैश
+copy_path = राह कॉपी करें
+copy_content = विषय-वसà¥à¤¤à¥ कॉपी करें
+copy_branch = शाखा नाम कॉपी करें
+copy_success = कॉपी हो गया!
+copy_error = कॉपी नहीं हà¥à¤†
+copy_type_unsupported = इस तरह की फाइल कॉपी नहीं होगी
+write = लिखें
+preview = पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•न
+loading = लोड हो रहा…
+error = तà¥à¤°à¥à¤Ÿà¤¿
+error404 = जो पृषà¥à¤Ÿ आप देखना चाहते हैं या तो है ही नहीं , हटा दिया गया या आप देखने को अधिकृत नहीं की देख पाà¤à¤‚।
+error413 = आपका कोटा ख़तम हो गया।
+go_back = वापस जाà¤à¤‚
+invalid_data = डाटा मानà¥à¤¯ नहीं: %v
+never = कà¤à¥€ नहीं
+unknown = अनजान
+rss_feed = RSS फीड
+pin = पिन
+unpin = पिन हटाà¤à¤‚
+artifacts = पà¥à¤°à¤¾à¤µà¤¶à¥‡à¤·
+confirm_delete_artifact = कà¥à¤¯à¤¾ आप ये पà¥à¤°à¤¾à¤µà¤¶à¥‡à¤· हटाना चाहते हैं "%s" ?
+archived = संगà¥à¤°à¤¹à¥€à¤¤
+concept_system_global = वैशà¥à¤µà¤¿à¤•
+concept_user_individual = à¤à¤•ल
+concept_code_repository = रिपॉजिटरी
+concept_user_organization = संसà¥à¤¥à¤¾
+show_timestamps = समय-मोहर दिखाà¤à¤‚
+show_log_seconds = सेकंड दिखाà¤à¤‚
+show_full_screen = पूरी सà¥à¤•à¥à¤°à¥€à¤¨ पे दिखाà¤à¤‚
+download_logs = लॉग डाउनलोड करें
+confirm_delete_selected = ये सारे डिलीट कर दें?
+name = नाम
+value = मूलà¥à¤¯
+filter = फ़िलà¥à¤Ÿà¤°
+filter.clear = फ़िलà¥à¤Ÿà¤° हटाà¤à¤‚
+filter.is_archived = संगृहीत
+filter.not_archived = संगृहीत नहीं
+filter.is_fork = फोरà¥à¤•à¥à¤¸
+filter.not_fork = फोरà¥à¤•à¥à¤¸ नहीं
+filter.is_mirror = मिरà¥à¤°à¥‹à¤°à¥à¤¸
+filter.not_mirror = मिरà¥à¤°à¥‹à¤°à¥à¤¸ नहीं
+filter.is_template = टेमà¥à¤ªà¤²à¥‡à¤Ÿà¥à¤¸
+filter.not_template = टेमà¥à¤ªà¤²à¥‡à¤Ÿà¥à¤¸ नहीं
+filter.public = सारà¥à¤µà¤œà¤¨à¤¿à¤•
+filter.private = निजी
+
+[search]
+search = ढूंढें…
+type_tooltip = ढूंà¥à¤¨à¥‡ का जैसे
+fuzzy = फ़ज़à¥à¥›à¥€
+fuzzy_tooltip = जो उपाय ढूंढे गठटरà¥à¤® से जà¥à¥œà¥‡ हैं à¤à¥€ दिखाà¤à¤‚
+union = केंदà¥à¤°
+union_tooltip = वो उपाय à¤à¥€ दिखाà¤à¤‚ जो जगह छोà¥à¥‡ कीवरà¥à¤¡à¥à¤¸ से मिलते हैं
+exact = à¤à¤•दम
+exact_tooltip = सिरà¥à¤« वो रिजलà¥à¤Ÿ दिखाà¤à¤‚ जो à¤à¤•दम सरà¥à¤š टरà¥à¤® से मिलते हैं
+regexp = रेगà¤à¤•à¥à¤¸à¤ªà¥
+regexp_tooltip = वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ करें सरà¥à¤š टरà¥à¤® की वà¥à¤¯à¤¾à¤µà¤¹à¤¾à¤°à¤¿à¤• तरीके से
+repo_kind = रेपो ढूंढें…
+user_kind = यूजर ढूंढें…
+org_kind = संसà¥à¤¥à¤¾ ढूंढें…
+team_kind = टीम ढूंढें…
+code_kind = कोड ढूंढें…
+code_search_unavailable = कोड ढूंà¥à¤¨à¤¾ अà¤à¥€ नहीं हो सकता। कृपया à¤à¤¡à¤®à¤¿à¤¨à¤¿à¤¸à¥à¤Ÿà¥à¤°à¥‡à¤Ÿà¤° से बात करें।
+package_kind = पैकेजेस ढूंढें…
+project_kind = पà¥à¤°à¥‹à¤œà¥‡à¤•à¥à¤Ÿà¥à¤¸ ढूंढें…
+branch_kind = शाखा ढूंढें…
+commit_kind = कमिटà¥à¤¸ ढूढें…
+runner_kind = रनरà¥à¤¸ ढूंढें…
+no_results = मिलता उपाय नहीं है।
+issue_kind = इशà¥à¤¯à¥‚ज ढूंढें…
+pull_kind = पà¥à¤²à¥à¤¸ ढूंढें…
+keyword_search_unavailable = कीवरà¥à¤¡ से ढूंà¥à¤¨à¤¾ अà¤à¥€ नहीं हो सकता। कृपया à¤à¤¡à¤®à¤¿à¤¨à¤¿à¤¸à¥à¤Ÿà¥à¤°à¥‡à¤Ÿà¤° से बात करें।
+
+[aria]
+navbar = संचालन बार
+footer = फà¥à¤Ÿà¤°
+footer.software = इस सॉफà¥à¤Ÿà¤µà¥‡à¤¯à¤° के बारे में
+footer.links = संयोजक
+
+[heatmap]
+number_of_contributions_in_the_last_12_months = %s योगदान पिछले 12 महीनो में
+contributions_zero = कोई योगदान नहीं
+contributions_format = {योगदान} आज {दिन} {महीना} {साल}
+contributions_one = योगदान
+contributions_few = योगदानों
+less = कम
+more = ज़à¥à¤¯à¤¾à¤¦à¤¾
+
+[editor]
+buttons.heading.tooltip = शीरà¥à¤·à¤• जोड़ें
+buttons.bold.tooltip = बोलà¥à¤¡ लेख जोड़ें
+buttons.italic.tooltip = इटैलिक लेख जोड़ें
+buttons.quote.tooltip = पाठजोड़ें
+buttons.code.tooltip = कोड जोड़ें
+buttons.link.tooltip = संयोजक जोड़ें
+buttons.list.unordered.tooltip = बà¥à¤²à¥‡à¤Ÿ लिसà¥à¤Ÿ जोड़ें
+buttons.list.ordered.tooltip = अंकित लिसà¥à¤Ÿ जोड़ें
+buttons.list.task.tooltip = कारà¥à¤¯à¥‹à¤‚ की सूचि जोड़ें
+buttons.mention.tooltip = यूजर या टीम को ज़ाहिर करें
+buttons.ref.tooltip = इशू या पà¥à¤²à¥à¤² निवेदन ज़ाहिर करें
+buttons.switch_to_legacy.tooltip = पà¥à¤°à¤¾à¤¨à¤¾ à¤à¤¡à¤¿à¤Ÿà¤° इसà¥à¤¤à¥‡à¤®à¤¾à¤² करें
+buttons.enable_monospace_font = à¤à¤•समान रिकà¥à¤¤à¤¿ फ़ॉनà¥à¤Ÿ चालू करें
+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 = विषयवसà¥à¤¤à¥
\ No newline at end of file
diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini
index 411bad835a..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
@@ -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
@@ -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 673d1464b1..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
@@ -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.
@@ -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 9b1d56fed9..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
@@ -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..50405ed756 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]
@@ -421,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
@@ -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]
@@ -735,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
@@ -796,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
@@ -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
@@ -3872,30 +4014,31 @@ 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
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..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=オーナー
@@ -1610,13 +1612,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 +1925,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 +2723,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 = フラグを更新
@@ -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_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..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=활성화ë¨
@@ -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 = 프로ì 트 ì—†ìŒ
@@ -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_lv-LV.ini b/options/locale/locale_lv-LV.ini
index 789871f3c3..647a306e4a 100644
--- a/options/locale/locale_lv-LV.ini
+++ b/options/locale/locale_lv-LV.ini
@@ -1090,6 +1090,8 @@ access_token_regeneration = Izveidot piekļuves pilnvaru no jauna
regenerate_token_success = Pilnvara tika izveidota no jauna. LietotnÄ“m, kas to izmanto, vairs nav piekļuve kontam, un tajÄs ir jÄizmanto jaunÄ pilnvara.
access_token_regeneration_desc = Pilnvaras izveidoÅ¡ana no jauna atsauks piekļuvi kontam lietotnÄ“m, kuras to izmanto. DarbÄ«ba ir neatgriezeniska. TurpinÄt?
+ssh_token_help_ssh_agent = vai, ja izmanto SSH aģentu (ar iestatītu mainīgo SSH_AUTH_SOCK):
+
[repo]
new_repo_helper=GlabÄtava satur visas projekta datnes, tajÄ skaitÄ izmaiņu vÄ“sturi. Jau tiek izmantota kaut kur citur? PÄrcelt glabÄtavu.
owner=Īpašnieks
@@ -1577,7 +1579,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
@@ -1651,13 +1653,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 +1966,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 +2828,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_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_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 57985942ed..2bcd2c5cf7 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
@@ -888,6 +888,8 @@ regenerate_token = Neei maken
access_token_regeneration_desc = Wenn du een Teken neei maakst, verlesen Anwennens, wat ’t bruken, Togang to dienem Konto. Dat kann nich torüggnohmen worden. Wiedermaken?
regenerate_token_success = Dat Teken is neei maakt worden. Anwennens, wat ’t bruken, hebben keenen Togang to dienem Konto mehr un mutten mit de nejen Teken verneeit worden.
+ssh_token_help_ssh_agent = of, wenn du eenen SSH-Agenten bruukst (un de SSH_AUTH_SOCK-Variaabel sett is):
+
[repo]
rss.must_be_on_branch = Du muttst up eenem Twieg wesen, um eenen RSS-Schuuv to hebben.
admin.manage_flags = Flaggen verwalten
@@ -1347,7 +1349,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 +1436,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 +1479,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.
@@ -1552,7 +1554,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.
@@ -1740,8 +1742,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 +1773,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..f53ec2ad7c 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.
@@ -1093,6 +1093,8 @@ regenerate_token = Opnieuw genereren
regenerate_token_success = De token is opnieuw gegenereerd. Toepassingen die het gebruiken, hebben niet langer toegang tot uw account en moeten worden bijgewerkt om de nieuwe token te gebruiken.
access_token_regeneration_desc = Als u een token opnieuw genereert, wordt de toegang tot uw account ingetrokken voor toepassingen die de token gebruiken. Dit kan niet ongedaan worden gemaakt. Doorgaan?
+ssh_token_help_ssh_agent = of, als u een SSH-agent gebruikt (met de variabele SSH_AUTH_SOCK ingesteld):
+
[repo]
owner=Eigenaar
owner_helper=Sommige organisaties kunnen niet worden weergegeven in de dropdown vanwege een limiet op het maximale aantal repositories.
@@ -1495,7 +1497,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,13 +1556,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 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`
+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 +1817,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 +2629,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
@@ -2915,6 +2917,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_pl-PL.ini b/options/locale/locale_pl-PL.ini
index 86a333a886..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.
@@ -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.
@@ -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_pt-BR.ini b/options/locale/locale_pt-BR.ini
index 26bdd35420..4ce186c44e 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
@@ -1092,6 +1092,8 @@ regenerate_token_success = O token foi regenerado. Aplicações que usam este to
access_token_regeneration = Regenerar token de acesso
access_token_regeneration_desc = Regenerar um token de acesso irá revogar o acesso a essa conta para as aplicações que estiverem utilizando este token. Isto não pode ser desfeito. Continuar?
+ssh_token_help_ssh_agent = ou, se você estiver usando um agente SSH (com a variável SSH_AUTH_SOCK definida):
+
[repo]
owner=Proprietário
owner_helper=Algumas organizações podem não aparecer no menu devido a um limite de contagem dos repositórios.
@@ -1278,7 +1280,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
@@ -1568,7 +1570,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 +1644,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`
@@ -1934,7 +1936,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
@@ -1942,8 +1944,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 +2721,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
@@ -2803,7 +2805,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 +2819,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.
@@ -2920,6 +2922,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 +3059,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
@@ -3899,7 +3902,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
@@ -3908,12 +3911,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 7f36d164b3..40f9f45945 100644
--- a/options/locale/locale_pt-PT.ini
+++ b/options/locale/locale_pt-PT.ini
@@ -1060,11 +1060,11 @@ 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, 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
@@ -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.
@@ -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_ro.ini b/options/locale/locale_ro.ini
index 305c34d013..ec4bcbdf13 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ă
@@ -18,7 +15,7 @@ concept_user_organization = Organizație
logo = Logo
help = Ajutor
sign_up = ÃŽnregistrare
-link_account = Conectare cont
+link_account = Conectați conturi
register = ÃŽnregistrare
template = Șablon
language = Limbă
@@ -91,7 +88,7 @@ remove_label_str = Șterge elementul "%s"
save = Salvează
remove = Șterge
copy_path = Copiază cale
-error404 = Pagina pe care încerci să o vizitezi fie nu există sau nu ești autorizat să o vezi.
+error404 = Pagina pe care încercați să o vizitați fie nu există, a fost ștearsă sau nu sunteți autorizat să o puteți vedea.
filter.not_archived = Nearhivat
activities = Activități
confirm_delete_selected = Ștergi toate elementele selectate?
@@ -104,9 +101,49 @@ home = Acasă
dashboard = Panou de Control
version = Versiune
powered_by = Susținut de %s
-active_stopwatch = Monitorizor de timp activ
+active_stopwatch = Contor timp activ
more_items = Mai multe elemente
+tracked_time_summary = Rezumat al timpului monitorizat, bazat pe filtrele listei de probleme
+signed_in_as = Conectat ca
+toggle_menu = Afișează sau ascunde meniul
+twofa_scratch = Cod de rezervă pentru autentificare prin doi factori
+passcode = Cod de acces
+repository = Repozitoriu
+new_fork = Bifurcație de repozitoriu nouă
+new_project_column = Coloană nouă
+new_repo.title = Repozitoriu nou
+new_repo.link = Repozitoriu nou
+all = Tot
+collaborative = Colaborativ
+forks = Bifurcații
+pull_requests = Cereri de extragere
+issues = Probleme
+milestones = Etape
+rerun = Reporniți
+rerun_all = Reporniți toate joburile
+add_all = Adaugă toate
+remove_all = Șterge toate
+copy_branch = Copiați numele ramurii
+write = Scrieți
+error413 = V-ați epuizat cota.
+invalid_data = Date invalide: %v
+pin = Fixați
+unpin = Desprindeți
+concept_code_repository = Repozitoriu
+show_timestamps = Afișați marcajele temporale
+show_full_screen = Afișați pe tot ecranul
+download_logs = Descărcați jurnalele
+value = Valoare
+filter.is_fork = Bifurcații
+filter.not_fork = Nu sunt bifurcații
+filter.is_mirror = Copii identice
+filter.not_mirror = Nu sunt copii identice
+filter.is_template = Șabloane
+filter.not_template = Nu sunt șabloane
+filter.public = Publice
+filter.private = Private
+
[editor]
table_modal.header = Adaugă tabel
table_modal.placeholder.content = Conținut
@@ -122,6 +159,20 @@ buttons.code.tooltip = Adaugă cod
buttons.quote.tooltip = Citează text
buttons.link.tooltip = Adaugă un link
+buttons.heading.tooltip = Adăugați titlu
+buttons.list.unordered.tooltip = Adăugați o listă
+buttons.list.task.tooltip = Adăugați o listă de sarcini
+buttons.ref.tooltip = Faceți o referire la o problemă sau o cerere de extragere
+buttons.switch_to_legacy.tooltip = Folosiți în schimb editorul vechi
+buttons.enable_monospace_font = Activați fontul monospațiat
+buttons.disable_monospace_font = Dezactivați fontul monospațiat
+buttons.indent.tooltip = Indentați obiectele cu un nivel
+buttons.unindent.tooltip = Nu mai indentați obiectele cu un nivel
+link_modal.header = Adăugați un link
+link_modal.url = URL
+link_modal.description = Descriere
+link_modal.paste_reminder = Indiciu: Cu un URL salvat în clipboard, puteți lipi direct în editor pentru a crea un link.
+
[filter]
string.asc = A - Z
string.desc = Z - A
@@ -130,10 +181,16 @@ string.desc = Z - A
server_internal = Eroare internă a serverului
network_error = Eroare de rețea
+occurred = A apărut o eroare
+report_message = Dacă credeți că aceasta este o problemă cu Forgejo, vă rugăm să căutați probleme pe Codeberg sau să deschideți o nouă problemă dacă este necesar.
+not_found = Obiectul nu a putut fi găsit.
+
[startpage]
install = Ușor de instalat
license = Sursă deschisă
+app_desc = Un serviciu Git fără probleme, auto-găzduit
+
[install]
require_db_desc = Forgejo are nevoie de MySQL, PostgreSQL, SQLite3 sau TiDB (protocol MySQL).
db_title = Setări bază de date
@@ -223,16 +280,33 @@ 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 = Căutați utilizatori…
+team_kind = Căutați echipe…
+code_kind = Căutați cod…
+project_kind = Căutați proiecte…
+package_kind = Căutați pachete…
+org_kind = Căutați 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.
+search = Căutați…
+type_tooltip = Tipul căutării
+fuzzy = Aproximată
+fuzzy_tooltip = Includeți rezultate care sunt asemănătoare termenului de căutare
+union = Cuvinte cheie
+union_tooltip = Includeți rezultate care sunt asemănătoare cuvintelor cheie separate prin spațiu
+exact = Exactă
+exact_tooltip = Includeți doar rezultate care se potrivesc exact termenului de căutare
+regexp = Expresie regulată
+regexp_tooltip = Interpretați termenul de căutare ca o expresie regulată
+repo_kind = Căutați repozitorii…
+branch_kind = Căutați ramuri…
+commit_kind = Căutați comiteri…
+runner_kind = Căutați executori…
+issue_kind = Căutați probleme…
+pull_kind = Căutați cereri de extragere…
+
[aria]
navbar = Bară de navigare
footer = Subsol
diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini
index 9158329978..e231cf6e6f 100644
--- a/options/locale/locale_ru-RU.ini
+++ b/options/locale/locale_ru-RU.ini
@@ -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 = Ðе указаны
@@ -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 = МеÑÑ‚Ð¾Ð¸Ð¼ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ Ñкрыты от пользователей, не имеющих учётных запиÑей на Ñервере.
@@ -1092,6 +1092,8 @@ access_token_regeneration_desc = Будет Ñоздан новый токен,
regenerate_token_success = Токен был заменён. ПриложениÑ, иÑпользующие его, более не имеют доÑтупа к Ñтой учётной запиÑи и должны получить новый токен.
access_token_regeneration = Замена токена доÑтупа
+ssh_token_help_ssh_agent = или, еÑли вы иÑпользуете SSH-агент, (Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ переменной SSH_AUTH_SOCK):
+
[repo]
owner=Владелец
owner_helper=Ðекоторые организации могут не отображатьÑÑ Ð² раÑкрывающемÑÑ ÑпиÑке из-за макÑимального Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтва репозиториев.
@@ -1563,7 +1565,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 +1639,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`
@@ -1917,13 +1919,13 @@ pulls.merge_commit_id=ИД коммита ÑлиÑниÑ
pulls.require_signed_wont_sign=Ð”Ð°Ð½Ð½Ð°Ñ Ð²ÐµÑ‚Ð²ÑŒ ожидает подпиÑанные коммиты, однако ÑлиÑние не будет подпиÑано
pulls.invalid_merge_option=Ðтот параметр ÑлиÑÐ½Ð¸Ñ Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ð´Ð»Ñ Ñтого запроÑа на ÑлиÑние.
-pulls.merge_conflict=СлиÑние не удалоÑÑŒ: произошел конфликт во Ð²Ñ€ÐµÐ¼Ñ ÑлиÑниÑ. Совет: попробуйте другую Ñтратегию
+pulls.merge_conflict=СлиÑние не удалоÑÑŒ: при ÑлиÑнии произошел конфликт. Попробуйте другую Ñтратегию
pulls.merge_conflict_summary=Сообщение об ошибке
-pulls.rebase_conflict=СлиÑние не удалоÑÑŒ: произошел конфликт во Ð²Ñ€ÐµÐ¼Ñ ÑлиÑниÑ: %[1]s. Совет: попробуйте другую Ñтратегию
+pulls.rebase_conflict=СлиÑние не удалоÑÑŒ: при перебазировании коммита произошел конфликт: %[1]s. Попробуйте другую Ñтратегию
pulls.rebase_conflict_summary=Сообщение об ошибке
-pulls.unrelated_histories=СлиÑние не удалоÑÑŒ: у иÑточника и цели ÑлиÑÐ½Ð¸Ñ Ð½ÐµÑ‚ общей иÑтории. Совет: попробуйте другую Ñтратегию
-pulls.merge_out_of_date=СлиÑние не удалоÑÑŒ: при Ñоздании ÑлиÑÐ½Ð¸Ñ Ð±Ð°Ð·Ð° данных была обновлена. ПодÑказка: попробуйте ещё раз.
-pulls.head_out_of_date=СлиÑние не удалоÑÑŒ: во Ð²Ñ€ÐµÐ¼Ñ ÑлиÑÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ð²Ð½Ð¾Ð¹ коммит был обновлён. Попробуйте ещё раз.
+pulls.unrelated_histories=СлиÑние не удалоÑÑŒ: иÑточник и Ñ†ÐµÐ»ÐµÐ²Ð°Ñ Ð²ÐµÑ‚Ð²ÑŒ нет имеют общую иÑторию. Попробуйте другую Ñтратегию
+pulls.merge_out_of_date=СлиÑние не удалоÑÑŒ: при выполнении ÑлиÑÐ½Ð¸Ñ Ð±Ð°Ð·Ð° данных была обновлена. Попробуйте Ñнова.
+pulls.head_out_of_date=СлиÑние не удалоÑÑŒ: при ÑлиÑнии был изменён головной коммит. Попробуйте Ñнова.
pulls.push_rejected=Отправка была отклонена. Проверьте Git-хуки Ñтого репозиториÑ.
pulls.push_rejected_summary=ÐŸÐ¾Ð»Ð½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð° отклонениÑ
pulls.push_rejected_no_message=Отправка была отклонена и удалённый Ñервер не указал причину. Проверьте Git-хуки Ñтого репозиториÑ
@@ -1943,8 +1945,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=Слейте Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ отправьте их обратно.
@@ -2754,7 +2756,7 @@ settings.wiki_rename_branch_main_desc = Переименовать внутре
settings.wiki_branch_rename_success = Ðазвание ветви вики Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ ÑƒÑпешно нормализовано.
ambiguous_runes_description = `Ðтот файл Ñодержит Ñимволы Юникода, которые легко Ñпутать Ñ Ð¿Ð¾Ñ…Ð¾Ð¶Ð¸Ð¼Ð¸. ЕÑли так и должно быть, можете Ñпокойно игнорировать Ñто предупреждение. Отобразить Ñимволы можно кнопкой ÐкранированиÑ.`
editor.invalid_commit_mail = ÐÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð° Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð°.
-pulls.has_merged = СлиÑние не удалоÑÑŒ: Ð·Ð°Ð¿Ñ€Ð¾Ñ ÑƒÐ¶Ðµ был Ñлит, изменение целевой ветви или повторное ÑлиÑние невозможно.
+pulls.has_merged = Ðе удалоÑÑŒ: ÑлиÑние уже выполнено – изменение целевой ветви или повторное ÑлиÑние невозможно.
settings.enter_repo_name = Введите Ð¸Ð¼Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð° и название Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ ÐºÐ°Ðº указано:
signing.wont_sign.error = Ðе удалоÑÑŒ проверить возможноÑть подпиÑать коммит.
signing.wont_sign.nokey = Сервер не предоÑтавлÑет ключ Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñи коммита.
@@ -2772,7 +2774,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..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=සක්රිය
@@ -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_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_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..b914f93fe0 100644
--- a/options/locale/locale_sv-SE.ini
+++ b/options/locale/locale_sv-SE.ini
@@ -205,15 +205,23 @@ link_modal.url = Url
link_modal.description = Beskrivning
link_modal.header = Lägg till en länk
+buttons.enable_monospace_font = Aktivera jämnbrett typsnitt
+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.
+
[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
install=Lätt att installera
@@ -334,6 +342,8 @@ 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
password_holder=Lösenord
@@ -918,7 +928,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
@@ -1157,13 +1167,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`
@@ -2324,17 +2334,17 @@ 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...
-runner_kind = Sök exekutorer...
-branch_kind = Sök grenar...
-commit_kind = Sök commiter...
-project_kind = Sök projekt...
+code_kind = Sök kod…
+package_kind = Sök paket…
+runner_kind = Sök exekutorer…
+branch_kind = Sök grenar…
+commit_kind = Sök commiter…
+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...
+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 4f51ddcc7e..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ç
@@ -1594,13 +1609,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 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`
+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`
@@ -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
@@ -1907,8 +1922,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.
@@ -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 2e536c3d1a..7980e70255 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=Увійшов Ñк
@@ -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 = ПерезапуÑтити вÑÑ– завданнÑ
@@ -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,13 +195,13 @@ 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.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 = ВміÑÑ‚
@@ -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
@@ -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 = ÐедійÑний варіант алгоритму Ñ…ÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ–Ð²
+allow_dots_in_usernames = Дозволити викориÑÑ‚Ð°Ð½Ð½Ñ ÐºÑ€Ð°Ð¿ÐºÐ¸ в іменах кориÑтувачів. Ðе впливає на облікові запиÑи, що вже Ñ–Ñнують.
+invalid_password_algorithm = ÐедійÑний алгоритм Ñ…ÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ–Ð²
enable_update_checker_helper_forgejo = ÐаÑвніÑть нових верÑій Forgejo періодично перевірÑтиметьÑÑ Ñ‡ÐµÑ€ÐµÐ· перевірку запиÑу TXT DNS на release.forgejo.org.
[home]
@@ -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 зірка
@@ -414,7 +414,7 @@ confirmation_mail_sent_prompt=Ðовий лиÑÑ‚ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð±
must_change_password=Оновіть Ñвій пароль
allow_password_change=Вимагати в кориÑтувача змінити пароль (рекомендуєтьÑÑ)
reset_password_mail_sent_prompt=ЛиÑÑ‚ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð±ÑƒÐ»Ð¾ надіÑлано %s. Щоб завершити Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу, перевірте вхідні й перейдіть за наведеним поÑиланнÑм (на це маєте %s).
-active_your_account=Ðктивувати обліковий запиÑ
+active_your_account=ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу
account_activated=Обліковий Ð·Ð°Ð¿Ð¸Ñ Ð°ÐºÑ‚Ð¸Ð²Ð¾Ð²Ð°Ð½Ð¾
prohibit_login=Обліковий Ð·Ð°Ð¿Ð¸Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾
resent_limit_prompt=Вибачте, ви вже запроÑили активацію по електронній пошті нещодавно. Будь лаÑка, зачекайте 3 хвилини, а потім Ñпробуйте ще раз.
@@ -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 = Потрібен обліковий запиÑ? ЗареєÑтруйтеÑÑ Ð·Ð°Ñ€Ð°Ð·.
@@ -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 = Ð”Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача не вÑтановлено пароль.
@@ -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 = Цей кориÑтувач не зможе взаємодіÑти з репозиторіÑми, влаÑником Ñких Ñ” ви, а також із задачами та коментарÑми, Ñкі ви Ñтворили.
@@ -734,7 +734,7 @@ applications=Додатки
orgs=Організації
repos=Репозиторії
delete=Видалити обліковий запиÑ
-twofa=Двофакторна Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ (TOTP)
+twofa=Двофакторна Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ (TOTP)
account_link=Прив'Ñзані облікові запиÑи
organization=Організації
@@ -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,9 +893,9 @@ 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=Створити нову програму OAuth2
create_oauth2_application_button=Створити програму
oauth2_application_name=Ðазва програми
save_application=Зберегти
@@ -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=Зв'Ñзаний обліковий Ð·Ð°Ð¿Ð¸Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð¾.
@@ -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 = КориÑтувач_ку уÑпішно розблоковано.
@@ -1077,6 +1077,11 @@ regenerate_token = Згенерувати знову
access_token_regeneration = Згенерувати новий токен доÑтупу
quota.sizes.assets.all = РеÑурÑи
+access_token_regeneration_desc = Ð ÐµÐ³ÐµÐ½ÐµÑ€Ð°Ñ†Ñ–Ñ Ñ‚Ð¾ÐºÐµÐ½Ð° ÑкаÑує доÑтуп програм, Ñкі викориÑтовують цей токен, до вашого облікового запиÑу. Це незворотна діÑ. Продовжити?
+regenerate_token_success = Токен згенеровано наново. Програми, Ñкі його викориÑтовують, більше не мають доÑтупу до вашого облікового запиÑу; ви повинні відновити доÑтуп за допомогою нового токена.
+
+ssh_token_help_ssh_agent = або, Ñкщо ви викориÑтовуєте агент SSH (із вÑтановленою змінною SSH_AUTH_SOCK):
+
[repo]
owner=ВлаÑник
owner_helper=ДеÑкі організації можуть не відображатиÑÑ Ñƒ випадаючому ÑпиÑку через макÑимальну кількіÑть репозиторііїв.
@@ -1090,7 +1095,7 @@ template_description=Шаблонні репозиторії дозволÑÑŽÑ‚
visibility=ВидиміÑть
visibility_description=Тільки влаÑник або члени організації Ñкі мають віповідні права, зможуть побачити.
visibility_helper_forced=ÐдмініÑтратор вашого Ñайту налаштував параметри: вÑÑ– нові репозиторії будуть приватними.
-visibility_fork_helper=(Ці зміни вплинуть на вÑÑ– форки.)
+visibility_fork_helper=(Буде змінено видиміÑть уÑÑ–Ñ… форків.)
clone_helper=Потрібна допомога у клонуванні? Відвідайте Ñторінку Допомога.
fork_repo=Створити форк репозиторію
fork_from=Форк з
@@ -1143,7 +1148,7 @@ forks=Форки
reactions_more=додати %d більше
unit_disabled=ÐдмініÑтратор Ñайту вимкнув цей розділ репозиторію.
language_other=Інші
-adopt_search=Введіть ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувач_ки Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ неприйнÑтих репозиторіїв… (залиште порожнім, щоб знайти вÑÑ–)
+adopt_search=Уведіть ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувач_ки Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ неприйнÑтих репозиторіїв… (залиште порожнім, щоб знайти вÑÑ–)
adopt_preexisting_label=ПрийнÑті файли
adopt_preexisting=ПрийнÑти вже Ñ–Ñнуючі файли
adopt_preexisting_content=Створити репозиторій з %s
@@ -1155,9 +1160,9 @@ delete_preexisting_success=Видалено неприйнÑті файли в %
blame_prior=ПереглÑнути анотацію, що передує цій зміні
-transfer.accept=Дозволити транÑфер
+transfer.accept=ПрийнÑти передачу
transfer.accept_desc=`ПереміÑтити до "%s"`
-transfer.reject=Відхилити транÑфер
+transfer.reject=Відхилити передачу
transfer.reject_desc=`СкаÑувати Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð´Ð¾ "%s"`
desc.private=Приватний
@@ -1168,7 +1173,7 @@ desc.archived=Ðрхівний
template.items=Елементи шаблону
template.git_content=ВміÑÑ‚ Git (типова гілка)
-template.git_hooks=Перехоплювачі Git
+template.git_hooks=Git-хуки
template.webhooks=Webhook'и
template.topics=Теми
template.avatar=Ðватар
@@ -1198,7 +1203,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=Вам не дозволено імпортувати локальні репозиторії.
@@ -1276,7 +1281,7 @@ file_raw=Ðеформатований
file_history=ІÑторіÑ
file_view_source=ПереглÑнути вихідний код
file_view_rendered=ПереглÑнути відрендерено
-file_view_raw=ПереглÑд Raw
+file_view_raw=ПереглÑнути неформатований
file_permalink=ПоÑтійне поÑиланнÑ
file_too_large=Цей файл завеликий щоб бути показаним.
@@ -1285,7 +1290,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 +1407,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=Прибрати виконавців
@@ -1447,7 +1452,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 +1501,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`
@@ -1547,9 +1552,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=- Інші кориÑтувачі не можуть додавати нові коментарі до цієї задачі.
@@ -1699,15 +1704,15 @@ 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 запит на зміну
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=Увімкніть параметри Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð² налаштуваннÑÑ… Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ Ð°Ð±Ð¾ злийте запити на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð²Ñ€ÑƒÑ‡Ð½Ñƒ.
@@ -1725,7 +1730,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 було оновлено, поки відбувалоÑÑ Ð¾Ð±'єднаннÑ. Підказка: Ñпробуйте знову.
@@ -1743,8 +1748,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`
@@ -1799,7 +1804,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=Період:
@@ -1815,7 +1820,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 кориÑтувачами
@@ -1837,14 +1842,14 @@ 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 випуÑк
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,17 +1891,17 @@ settings.collaboration.read=Читати
settings.collaboration.owner=ВлаÑник
settings.collaboration.undefined=Ðе визначено
settings.hooks=Веб-хуки
-settings.githooks=Git хуки
-settings.basic_settings=Базові налаштуваннÑ
+settings.githooks=Git-хуки
+settings.basic_settings=ОÑновні налаштуваннÑ
settings.mirror_settings=ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð·ÐµÑ€ÐºÐ°Ð»Ð°
settings.mirror_settings.mirrored_repository=Віддзеркалений репозиторій
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 дзеркало
+settings.mirror_settings.push_mirror.add=Додати push-дзеркало
settings.sync_mirror=Синхронізувати зараз
settings.site=Веб-Ñайт
@@ -1909,27 +1914,27 @@ 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=Увімкнути Ð°Ð²Ñ‚Ð¾Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ€ÑƒÑ‡Ð½Ð¾Ð³Ð¾ Ð·Ð»Ð¸Ñ‚Ñ‚Ñ (Примітка: у деÑких оÑобливий випадках можуть виникнуть помилки)
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=Ðовий влаÑник вже має репозиторій з такою назвою. Будь лаÑка, виберіть інше ім'Ñ.
@@ -1955,7 +1960,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=Параметри перевірки підпиÑу
@@ -2030,7 +2035,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=ВлаÑні події…
@@ -2055,12 +2060,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=Запит про Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¾ або ÑкаÑовано.
@@ -2075,7 +2080,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 +2159,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 +2268,7 @@ release.detail=Деталі релізу
release.tags=Теги
release.new_release=Ðовий випуÑк
release.draft=Чернетка
-release.prerelease=Пре-реліз
+release.prerelease=Попередній випуÑк
release.stable=Стабільний
release.compare=ПорівнÑти
release.edit=Редагувати
@@ -2275,15 +2280,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=Тег видалено.
@@ -2333,7 +2338,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 = Ðвтор
@@ -2341,7 +2346,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 = (коментар)
@@ -2429,7 +2434,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
@@ -2446,7 +2451,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 = Заголовок Ñторінки
@@ -2485,7 +2490,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
@@ -2512,7 +2517,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
@@ -2528,9 +2533,9 @@ 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 = Розархівувати репозиторій
+settings.unarchive.button = Розархівувати
object_format = Формат об'єкта
settings.archive.mirrors_unavailable = Дзеркала недоÑтупні в архівованих репозиторіÑÑ….
pulls.sign_in_require = Увійдіть, щоб Ñтворити новий запит на злиттÑ.
@@ -2541,8 +2546,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-ключ
@@ -2552,7 +2557,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 = Прапорці Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ Ð·Ð°Ð¼Ñ–Ð½ÐµÐ½Ð¾
@@ -2670,6 +2675,191 @@ 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
+
+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», оÑкільки у репозиторії вже Ñ” тег із такою назвою.
+
+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 = Ігнорувати заÑтарілі ÑхваленнÑ
+
+transfer.no_permission_to_accept = У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” дозволу прийнÑти цю передачу.
+transfer.no_permission_to_reject = У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” дозволу відхилити цю передачу.
+editor.revert = Вивернути %s на:
+commit.revert = Вивернути
+commit.revert-header = Вивернути: %s
+commit.revert-content = Оберіть гілку, на Ñку вивернути:
+issues.choose.ignore_invalid_templates = ÐедійÑні шаблони проігноровано
+issues.choose.invalid_templates = Знайдено %v недійÑних шаблонів
+issues.dependency.issue_batch_close_blocked = Ðеможливо виконати пакетне Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð²Ð¸Ð±Ñ€Ð°Ð½Ð¸Ñ… задач, оÑкільки задача #%d має відкриті залежноÑті
+issues.review.pending.tooltip = Цей коментар наразі невидимий Ð´Ð»Ñ Ñ–Ð½ÑˆÐ¸Ñ… кориÑтувачів. Щоб надіÑлати коментарі у черзі, виберіть «%s» → «%s/%s/%s» у верхній чаÑтині Ñторінки.
+pulls.cmd_instruction_checkout_title = ÐŸÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð³Ñ–Ð»Ð¾Ðº
+pulls.cmd_instruction_checkout_desc = З репозиторію вашого проєкту переключітьÑÑ Ð½Ð° нову гілку Ñ– протеÑтуйте зміни.
+pulls.cmd_instruction_merge_warning = Увага: в цьому репозиторії не ввімкнено «ÐÐ²Ñ‚Ð¾Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ€ÑƒÑ‡Ð½Ð¾Ð³Ð¾ об'єднаннÑ», тож позначити цей запит Ñк об'єднаний вручну вам доведетьÑÑ ÑамоÑтійно.
+settings.transfer_abort_success = Передачу репозиторію %s уÑпішно ÑкаÑовано.
+topic.format_prompt = Теми повинні починатиÑÑ Ð· літери або цифри, можуть міÑтити дефіÑи («-») Ñ– крапки («.») Ñ– мати довжину до 35 Ñимволів. Дозволено викориÑÑ‚Ð°Ð½Ð½Ñ Ð»Ð¸ÑˆÐµ малих літер.
+
+editor.invalid_commit_mail = ÐедійÑна пошта Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñƒ.
+editor.push_out_of_date = Схоже, дані Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²ÐºÐ¸ заÑтаріли.
+editor.commit_email = Пошта автора
+issues.filter_type.reviewed_by_you = Перевірено вами
+issues.label_exclusive = ЕкÑклюзивний
+issues.label_archive = Ðрхівна мітка
+issues.label_archive_tooltip = Ðрхівовані мітки за замовчуваннÑм виключаютьÑÑ Ð· пропозицій під Ñ‡Ð°Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ за міткою.
+issues.cancel_tracking_history = `ÑкаÑовує відÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу %s`
+settings.webhook.delivery.success = Подію додано до черги доÑтавки. Може знадобитиÑÑ ÐºÑ–Ð»ÑŒÐºÐ° Ñекунд, перш ніж вона з'ÑвитьÑÑ Ð² Ñ–Ñторії доÑтавки.
+settings.protect_status_check_matched = Збіг
+settings.protected_branch_required_rule_name = Ðеобхідна назва правила
+
[graphs]
contributors.what = внеÑки
component_loading_info = Це може зайнÑти деÑкий чаÑ…
@@ -2799,6 +2989,14 @@ teams.write_access = ЗапиÑ
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 = Індивідуальний доÑтуп
+teams.general_access_helper = Дозволи учаÑників будуть визначатиÑÑ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾ до наведеної нижче таблиці дозволів.
+
[admin]
dashboard=Панель управліннÑ
users=Облікові запиÑи кориÑтувачів
@@ -2847,7 +3045,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 таблицю
@@ -2872,16 +3070,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=Створити обліковий запиÑ
@@ -2905,12 +3103,12 @@ users.update_profile_success=Обліковий Ð·Ð°Ð¿Ð¸Ñ ÐºÐ¾Ñ€Ð¸Ñтувач
users.edit_account=Редагувати обліковий запиÑ
users.max_repo_creation=МакÑимальна кількіÑть репозиторіїв
users.max_repo_creation_desc=(Введіть -1, щоб викориÑтовувати глобальний ліміт за замовчуваннÑм.)
-users.is_activated=Обліковий Ð·Ð°Ð¿Ð¸Ñ ÐºÐ¾Ñ€Ð¸Ñтувача увімкнено
-users.prohibit_login=Вимкнути вхід
+users.is_activated=Ðктивований обліковий запиÑ
+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.is_restricted=Обмежений обліковий запиÑ
+users.allow_git_hook=Може Ñтворювати Git-хуки
+users.allow_git_hook_tooltip=Git-хуки виконуютьÑÑ Ð²Ñ–Ð´ імені кориÑтувача ОС, від Ñкого запущено Forgejo, Ñ– мають той Ñамий рівень доÑтупу до хоÑта. Таким чином, кориÑтувачі зі Ñпеціальними правами Git-хуків можуть отримати доÑтуп Ñ– змінювати вÑÑ– репозиторії Forgejo, а також базу даних Forgejo. Вони також здатні отримати права адмініÑтратора Forgejo.
users.allow_import_local=Може імпортувати локальні репозиторії
users.allow_create_organization=Може Ñтворювати організації
users.update_profile=Оновити обліковий запиÑ
@@ -2990,16 +3188,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=Розмір Ñторінки
@@ -3051,20 +3249,20 @@ 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»
-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.twitter=Перейдіть на %s, Ñтворіть програму Ñ– переконайтеÑÑ, що ввімкнено опцію «Дозволити викориÑÑ‚Ð°Ð½Ð½Ñ Ñ†Ñ–Ñ”Ñ— програми Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ через Twitter»
+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=Видалити джерело автентифікації
@@ -3089,8 +3287,8 @@ config.git_version=ВерÑÑ–Ñ Git
config.repo_root_path=ШлÑÑ… до ÐºÐ¾Ñ€ÐµÐ½Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–ÑŽ
config.lfs_root_path=Кореневий шлÑÑ… LFS
config.log_file_root_path=ШлÑÑ… до лог файлу
-config.script_type=Тип Ñкрипта
-config.reverse_auth_user=Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ— на reverse proxy
+config.script_type=Тип Ñкрипту
+config.reverse_auth_user=КориÑтувач Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ— на зворотному прокÑÑ–
config.ssh_config=ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ SSH
config.ssh_enabled=Увімкнено
@@ -3135,10 +3333,10 @@ 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=Увімкнути залежноÑті задачі за замовчуваннÑм
+config.default_enable_dependencies=Увімкнути залежноÑті задач за замовчуваннÑм
config.webhook_config=ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð²ÐµÐ±Ñ…ÑƒÐºÑ–Ð²
config.queue_length=Довжина черги
@@ -3163,13 +3361,13 @@ 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=Провайдер ÑеÑÑ–Ñ—
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
@@ -3184,16 +3382,16 @@ 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=Вимкнено
-config.access_log_mode=Режим доÑтупу до журналу
+config.access_log_mode=Режим Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ñтупу
config.xorm_log_sql=Журнал SQL
@@ -3228,10 +3426,10 @@ 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.inverse_selection=Інвертувати виділене
+notices.deselect_all=СкаÑувати вибір
+notices.inverse_selection=Інвертувати вибір
notices.delete_selected=Видалити вибране
notices.delete_all=Видалити вÑÑ– cповіщеннÑ
notices.type=Тип
@@ -3250,13 +3448,13 @@ 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 = ОчиÑтити непридатні пакунки
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 = Ви не можете видалити Ñебе
@@ -3276,8 +3474,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 відбуваютьÑÑ Ð¿ÐµÐ²Ð½Ñ– події. Вказані тут вебхуки Ñпрацьовуватимуть Ð´Ð»Ñ Ð²ÑÑ–Ñ… репозиторіїв ÑиÑтеми, тож врахуйте вÑÑ– ймовірні наÑлідки Ð´Ð»Ñ ÑˆÐ²Ð¸Ð´ÐºÐ¾Ð´Ñ–Ñ—. Докладніше — в поÑібнику з вебхуків.
@@ -3305,8 +3503,48 @@ dashboard.cron.cancelled = Cron: %[1]s ÑкаÑовано: %[3]s
defaulthooks.desc = Вебхуки автоматично Ñповіщають HTTP-Ñервер POST-запитами, коли в Forgejo відбуваютьÑÑ Ð¿ÐµÐ²Ð½Ñ– події. Вказані тут вебхуки Ñ” типовими Ñ– будуть Ñкопійовані до вÑÑ–Ñ… нових репозиторіїв. Докладніше — в поÑібнику з вебхуків.
assets = РеÑурÑи коду
auths.invalid_openIdConnectAutoDiscoveryURL = Ðеправильна URL-адреÑа автоматичного виÑÐ²Ð»ÐµÐ½Ð½Ñ (повинна бути дійÑна URL-адреÑа, що починаєтьÑÑ Ð· http:// або https://)
+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 = Завантажити діагноÑтичний звіт
+
+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
+
+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.
+
+dashboard.delete_old_system_notices = Видалити вÑÑ– Ñтарі ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ ÑиÑтеми з бази даних
+dashboard.rebuild_issue_indexer = Перебудувати індекÑатор задач
+users.purge = ПовніÑтю видалити кориÑтувач_ку
+users.details = Дані кориÑтувача
+auths.login_source_exist = Джерело автентифікації «%s» вже Ñ–Ñнує.
+
+users.local_import.description = Дозволити імпорт репозиторіїв з локальної файлової ÑиÑтеми Ñервера. Це може Ñтановити загрозу безпеці.
+auths.attribute_avatar = Ðтрибут аватара
+auths.map_group_to_team = ЗіÑтавити групи LDAP з командами організації (залиште поле порожнім, щоб пропуÑтити)
+auths.oauth2_required_claim_name = Ðеобхідна назва заÑвки
+auths.oauth2_required_claim_name_helper = Вкажіть назву, щоб обмежити вхід з цього джерела кориÑтувачами із заÑвкою з такою назвою
+auths.oauth2_required_claim_value = Ðеобхідне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð°Ñвки
+auths.oauth2_required_claim_value_helper = Вкажіть значеннÑ, щоб обмежити вхід з цього джерела кориÑтувачами із заÑвкою з такими назвою Ñ– значеннÑм
+auths.oauth2_group_claim_name = Ðазва заÑвки, що надає назви груп Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ джерела. (Ðеобов'Ñзково)
+auths.oauth2_admin_group = Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð³Ñ€ÑƒÐ¿Ð¾Ð²Ð¾Ñ— заÑвки Ð´Ð»Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтраторів. (Ðеобов'Ñзково — потрібна назва заÑвки вище)
+auths.oauth2_restricted_group = Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð³Ñ€ÑƒÐ¿Ð¾Ð²Ð¾Ñ— заÑвки Ð´Ð»Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð¸Ñ… кориÑтувачів. (Ðеобов'Ñзково — потрібна назва заÑвки вище)
+auths.oauth2_map_group_to_team = ЗіÑтавити заÑвлені групи з командами організації. (Ðеобов'Ñзково — потрібна назва заÑвки вище)
+auths.tips.oauth2.general.tip = При реєÑтрації нової програми OAuth2 URL-адреÑа зворотного виклику/переÑпрÑÐ¼ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð° бути:
+
[action]
create_repo=Ñтворив(ла) репозиторій %s
rename_repo=репозиторій перейменовано з %[1]s
на %[3]s
@@ -3409,7 +3647,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 = Група
@@ -3524,7 +3762,43 @@ 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 пакунків.
+
+arch.pacman.repo.multi = %s має одну й ту Ñаму верÑÑ–ÑŽ в різних диÑтрибутивах.
+maven.install2 = ЗапуÑтити з командного Ñ€Ñдка:
+maven.download = Щоб завантажити залежніÑть, запуÑтіть із командного Ñ€Ñдка:
+npm.dependencies.bundle = Пакетні залежноÑті
+npm.dependencies.peer = Однорангові залежноÑті
+owner.settings.cleanuprules.pattern_full_match = ЗаÑтоÑувати шаблон до повної назви пакунка
+
+alpine.registry.key = Завантажте відкритий RSA-ключ реєÑтру в папку /etc/apk/keys/
Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ підпиÑу індекÑу:
+rpm.distros.redhat = у диÑтрибутивах на оÑнові RedHat
+rpm.distros.suse = у диÑтрибутивах на оÑнові SUSE
+owner.settings.cargo.title = Ð†Ð½Ð´ÐµÐºÑ Ñ€ÐµÑ”Ñтру Cargo
+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 = Перебудувати індекÑ
+owner.settings.cargo.rebuild.description = ÐŸÐµÑ€ÐµÐ±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ðµ бути кориÑним, Ñкщо Ñ–Ð½Ð´ÐµÐºÑ Ð½Ðµ Ñинхронізовано зі збереженими пакунками Cargo.
+owner.settings.cargo.rebuild.error = Ðе вдалоÑÑ Ð¿ÐµÑ€ÐµÐ±ÑƒÐ´ÑƒÐ²Ð°Ñ‚Ð¸ Ñ–Ð½Ð´ÐµÐºÑ Cargo: %v
+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.none = Правило очиÑтки не відповідає жодному пакунку.
+owner.settings.cleanuprules.success.update = Правило очиÑтки оновлено.
+owner.settings.cleanuprules.success.delete = Правило очиÑтки видалено.
+
+rubygems.required.ruby = Ðеобхідна верÑÑ–Ñ Ruby
+rubygems.required.rubygems = Ðеобхідна верÑÑ–Ñ RubyGem
+
+pypi.requires = Ðеобхідний Python
[secrets]
deletion = Видалити Ñекрет
@@ -3578,7 +3852,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 = Стан
@@ -3632,6 +3906,13 @@ runners.status.idle = ПроÑтоює
+runs.invalid_workflow_helper = ÐедійÑний файл конфігурації робочого потоку. Будь лаÑка, перевірте файл конфігурації: %s
+runs.no_job_without_needs = Робочий потік повинен міÑтити принаймні одне Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð±ÐµÐ· залежноÑтей.
+runs.no_job = Робочий потік повинен міÑтити принаймні одне завданнÑ
+workflow.dispatch.use_from = ВикориÑтати робочий потік із
+
+workflow.dispatch.trigger_found = Цей робочий потік Ñпрацьовує на події workflow_dispatch .
+
[projects]
type-3.display_name = Проєкт організації
type-2.display_name = Проєкт репозиторію
@@ -3640,7 +3921,7 @@ deleted.display_name = Видалений проєкт
[git.filemode]
symbolic_link=Символічне поÑиланнÑ
-directory = Тека
+directory = Каталог
submodule = Підмодуль
normal_file = Звичайний файл
executable_file = Виконуваний файл
@@ -3697,6 +3978,11 @@ issues.read = Читати: дивитиÑÑŒ Ñ– Ñтворювати за
wiki.read = Читати: переглÑдати вбудовану вікі та Ñ—Ñ— Ñ–Ñторію.
actions.write = ПиÑати: вручну запуÑкати, перезапуÑкати, ÑкаÑовувати або Ñхвалювати конвеєри CI/CD в очікуванні.
+projects.write = ПиÑати: Ñтворювати проєкти Ñ– Ñтовпчики та редагувати Ñ—Ñ….
+
+ext_issues = ДоÑтуп до поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° зовнішню ÑиÑтему відÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð°Ð´Ð°Ñ‡. ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ–Ð² відбуваєтьÑÑ Ð¿Ð¾Ð·Ð° Ñайтом.
+ext_wiki = ДоÑтуп до поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° зовнішню вікі. ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ–Ð² відбуваєтьÑÑ Ð¿Ð¾Ð·Ð° Ñайтом.
+
[munits.data]
pib = ПіБ
eib = ЕіБ
diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini
index acdd4c0ced..af0db76a8e 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=派生
@@ -171,7 +171,7 @@ copy_path = å¤åˆ¶è·¯å¾„
[aria]
navbar=导航æ
footer=页脚
-footer.software=关于软件
+footer.software=关于æ¤è½¯ä»¶
footer.links=链接
[heatmap]
@@ -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 = é…é¢
@@ -1091,6 +1091,8 @@ regenerate_token = 釿–°ç”Ÿæˆ
access_token_regeneration = 釿–°ç”Ÿæˆè®¿é—®ä»¤ç‰Œ
access_token_regeneration_desc = 釿–°ç”Ÿæˆä»¤ç‰Œå°†æ’¤é”€ä½¿ç”¨è¯¥ä»¤ç‰Œçš„应用程åºå¯¹æ‚¨çš„è´¦å·çš„访问æƒé™ã€‚æ¤æ“ä½œæ— æ³•æ’¤é”€ã€‚ç»§ç»ï¼Ÿ
+ssh_token_help_ssh_agent = 或者,如果您使用的是 SSH 代ç†ï¼ˆå·²è®¾ç½® SSH_AUTH_SOCK å˜é‡ï¼‰ï¼š
+
[repo]
new_repo_helper=代ç 仓库包å«äº†æ‰€æœ‰çš„项目文件,包括版本历å²è®°å½•。已ç»åœ¨å…¶ä»–地方托管了?è¿ç§»ä»“库。
owner=拥有者
@@ -1581,7 +1583,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 +1657,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 +1971,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 +2772,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 +2924,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 +3060,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..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 = 已超出
@@ -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_ar.json b/options/locale_next/locale_ar.json
index 3d87c7ee95..1574d3eb7c 100644
--- a/options/locale_next/locale_ar.json
+++ b/options/locale_next/locale_ar.json
@@ -3,5 +3,72 @@
"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": "Ù…ØØªÙˆÙ‰ غير مشروع",
+ "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 0967ef424b..c8ff00bd87 100644
--- a/options/locale_next/locale_be.json
+++ b/options/locale_next/locale_be.json
@@ -1 +1,8 @@
-{}
+{
+ "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_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 97a8536d4f..67b875b72b 100644
--- a/options/locale_next/locale_cs-CZ.json
+++ b/options/locale_next/locale_cs-CZ.json
@@ -35,9 +35,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",
+ "one": "před %d rokem",
"few": "Před %d lety",
- "other": "Před %d lety"
+ "other": "před %d lety"
},
"relativetime.1day": "vÄera",
"relativetime.2days": "před dvěma dny",
@@ -48,30 +48,30 @@
"relativetime.1year": "minulý rok",
"relativetime.2years": "před dvěma lety",
"relativetime.weeks": {
- "one": "Před %d týdnem",
+ "one": "před %d týdnem",
"few": "Před %d týdny",
- "other": "Před %d týdny"
+ "other": "před %d týdny"
},
"relativetime.days": {
- "one": "Před %d dnem",
+ "one": "před %d dnem",
"few": "Před %d dny",
- "other": "Před %d dny"
+ "other": "před %d dny"
},
"relativetime.mins": {
- "one": "Před %d minutou",
+ "one": "před %d minutou",
"few": "Před %d minutami",
- "other": "Před %d minutami"
+ "other": "před %d minutami"
},
"relativetime.hours": {
- "one": "Před %d hodinou",
+ "one": "před %d hodinou",
"few": "Před %d hodinami",
- "other": "Před %d hodinami"
+ "other": "před %d hodinami"
},
"relativetime.now": "nynÃ",
"relativetime.months": {
- "one": "PÅ™ed %d mÄ›sÃcem",
+ "one": "pÅ™ed %d mÄ›sÃcem",
"few": "PÅ™ed %d mÄ›sÃci",
- "other": "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Ä›.",
@@ -105,5 +105,12 @@
"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",
+ "mail.actions.run_info_sha": "Revize: %[1]s",
+ "repo.pulls.already_merged": "SlouÄenà selhalo: tato žádost již byla slouÄena."
}
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 94ab12f180..df8d8833dc 100644
--- a/options/locale_next/locale_de-DE.json
+++ b/options/locale_next/locale_de-DE.json
@@ -91,11 +91,18 @@
"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"
+ "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",
+ "mail.actions.run_info_sha": "Commit: %[1]s",
+ "repo.pulls.already_merged": "Zusammenführung fehlgeschlagen. Der Pull-Request wurde bereits zusammengeführt."
}
diff --git a/options/locale_next/locale_en-US.json b/options/locale_next/locale_en-US.json
index b1c98e4551..c92d9e9521 100644
--- a/options/locale_next/locale_en-US.json
+++ b/options/locale_next/locale_en-US.json
@@ -44,6 +44,7 @@
"relativetime.2months": "two months ago",
"relativetime.1year": "last year",
"relativetime.2years": "two years ago",
+ "repo.pulls.already_merged": "Merge failed: This pull request has already been merged.",
"repo.pulls.merged_title_desc": {
"one": "merged %[1]d commit from %[2]s
into %[3]s
%[4]s",
"other": "merged %[1]d commits from %[2]s
into %[3]s
%[4]s"
@@ -53,6 +54,7 @@
"other": "wants to merge %[1]d commits from %[2]s
into %[3]s
"
},
"repo.form.cannot_create": "All spaces in which you can create repositories have reached the limit of repositories.",
+ "migrate.form.error.url_credentials": "The URL contains contains credentials, put them in the username and password fields respectively",
"repo.issue_indexer.title": "Issue Indexer",
"search.milestone_kind": "Search milestones…",
"incorrect_root_url": "This Forgejo instance is configured to be served on \"%s\". You are currently viewing Forgejo through a different URL, which may cause parts of the application to break. The canonical URL is controlled by Forgejo admins via the ROOT_URL setting in the app.ini.",
@@ -92,7 +94,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/options/locale_next/locale_es-ES.json b/options/locale_next/locale_es-ES.json
index 37edef9211..323072c7e4 100644
--- a/options/locale_next/locale_es-ES.json
+++ b/options/locale_next/locale_es-ES.json
@@ -30,5 +30,37 @@
"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",
+ "home.welcome.activity_hint": "Aún no hay nada en tu feed. Tus acciones y la actividad en los repositorios a los que sigues se mostrarán aquÃ.",
+ "stars.list.none": "Nadie le ha dado una estrella a este repo.",
+ "watch.list.none": "Nadie está observando este repo.",
+ "followers.incoming.list.self.none": "Nadie está siguiendo tu perfil.",
+ "followers.incoming.list.none": "Nadie está siguiendo a este usuario.",
+ "followers.outgoing.list.self.none": "No estás siguiendo a nadie.",
+ "followers.outgoing.list.none": "%s ya no me está siguiendo.",
+ "relativetime.1day": "ayer",
+ "relativetime.1week": "la semana pasada",
+ "relativetime.2weeks": "hace dos semanas",
+ "relativetime.1month": "el mes pasado",
+ "relativetime.2months": "hace dos meses",
+ "relativetime.1year": "el año pasado",
+ "relativetime.2years": "hace dos años",
+ "repo.form.cannot_create": "Todos los espacios en los que puedes crear repositorios llegaron al lÃmite de repositorios.",
+ "incorrect_root_url": "Esta instancia de Forgejo está configurada para servirse en \"%s\". Estás viendo Forgejo a través de una URL distinta, lo que puede hacer que se rompan partes de la aplicación. La URL canónica la controlan los administdadores xd Forgejo a través del ajuste ROOT_URL en app.ini.",
+ "alert.asset_load_failed": "Error al cargar recursos desde {path}. Por favor, asegúrage de que se puede acceder a los recursos.",
+ "alert.range_error": " debe ser un número entre %[1]s y %[2]s.",
+ "install.invalid_lfs_path": "Imposible crear la raÃz LFS en la ruta indicada: %[1]s",
+ "profile.actions.tooltip": "Mas acciones",
+ "profile.edit.link": "Editar perfil",
+ "feed.atom.link": "Feed Atom",
+ "keys.ssh.link": "Claves SSH",
+ "keys.gpg.link": "Claves GPG",
+ "admin.config.moderation_config": "Configuración de moderación",
+ "moderation.report_abuse": "Reportar abuso",
+ "moderation.report_content": "Reportar contenido",
+ "moderation.report_abuse_form.header": "Reportar a uso a un administrador",
+ "moderation.report_abuse_form.invalid": "Argumentos inválidos",
+ "moderation.report_abuse_form.already_reported": "Ya has reportado este contenido",
+ "moderation.abuse_category": "CategorÃa"
}
diff --git a/options/locale_next/locale_et.json b/options/locale_next/locale_et.json
index a10447fa98..a1581dec0a 100644
--- a/options/locale_next/locale_et.json
+++ b/options/locale_next/locale_et.json
@@ -1,3 +1,34 @@
{
- "search.milestone_kind": "Otsi verstapostid..."
+ "search.milestone_kind": "Otsi verstaposte…",
+ "home.welcome.no_activity": "Hetkel on siin tühjus",
+ "home.welcome.activity_hint": "Sinu uudisvoos ei leidu veel mitte midagi. Kui toimetad midagi sinu jälgitavates lähtekoodihoidlates, siis sinu tegevused ja aktiivsus on siin näha.",
+ "home.explore_repos": "Uuri lähtekoodi hoidlaid",
+ "home.explore_users": "Otsi kasutajaid",
+ "home.explore_orgs": "Tutvu organisatsioonidega",
+ "stars.list.none": "Keegi pole seda koodihoidlat veel tähekeega märgistanud.",
+ "watch.list.none": "Keegi pole seda koodihoidlat veel jälgima asunud.",
+ "followers.incoming.list.self.none": "Mitte keegi ei jälgi sinu kasutajaprofiili.",
+ "followers.incoming.list.none": "Mitte keegi ei jälgi seda kasutajat.",
+ "followers.outgoing.list.self.none": "Sina ei jälgi mitte kedagi.",
+ "followers.outgoing.list.none": "%s ei jälgi mitte kedagi.",
+ "relativetime.now": "praegu",
+ "relativetime.future": "tulevikus",
+ "relativetime.1day": "eile",
+ "relativetime.2days": "kaks päeva tagasi",
+ "relativetime.1week": "eelmisel nädalal",
+ "relativetime.2weeks": "kaks nädalat tagasi",
+ "relativetime.1month": "eelmisel kuul",
+ "relativetime.2months": "kaks kuud tagasi",
+ "relativetime.1year": "eelmisel aastal",
+ "relativetime.2years": "kaks aastat tagasi",
+ "themes.names.forgejo-auto": "Forgejo (süsteemi kujundus)",
+ "themes.names.forgejo-light": "Forgejo hele kujundus",
+ "themes.names.forgejo-dark": "Forgejo tume kujundus",
+ "error.not_found.title": "Lehte ei leidu",
+ "alert.range_error": " peab olema number %[1]s ja %[2]s vahel.",
+ "profile.edit.link": "Muuda profiili",
+ "feed.atom.link": "Atom-uudisvoog",
+ "keys.ssh.link": "SSH võtmed",
+ "keys.gpg.link": "GPG võtmed",
+ "meta.last_line": "Tänud, et oled Forgejo'd tõlkinud! Work hard and put in the effort, and love will come. (Tee tööd ja näe vaeva, siis tuleb armastus - A. H. Tammsaare)"
}
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_fil.json b/options/locale_next/locale_fil.json
index 1f1e535dad..f2d24e445b 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": "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",
@@ -33,19 +33,19 @@
"relativetime.now": "ngayon",
"relativetime.mins": {
"one": "%d minuto ang nakalipas",
- "other": "%d minuto ang nakalipas"
+ "other": "%d (na) minuto ang nakalipas"
},
"relativetime.days": {
"one": "%d araw ang nakalipas",
- "other": "%d araw ang nakalipas"
+ "other": "%d (na) araw ang nakalipas"
},
"relativetime.weeks": {
"one": "%d linggo ang nakalipas",
- "other": "%d linggo ang nakalipas"
+ "other": "%d (na) linggo ang nakalipas"
},
"relativetime.years": {
"one": "%d taon ang nakalipas",
- "other": "%d taon ang nakalipas"
+ "other": "%d (na) taon ang nakalipas"
},
"relativetime.2days": "2 araw ang nakalipas",
"relativetime.2weeks": "2 linggo ang nakalipas",
@@ -56,11 +56,11 @@
"relativetime.1day": "kahapon",
"relativetime.hours": {
"one": "%d oras ang nakalipas",
- "other": "%d oras ang nakalipas"
+ "other": "%d (na) oras ang nakalipas"
},
"relativetime.months": {
"one": "%d buwan ang nakalipas",
- "other": "%d buwan ang nakalipas"
+ "other": "%d (na) buwan ang nakalipas"
},
"discussion.locked": "Naka-kandado ang pag-uusap na ito. Nilimitahan ang pagkomento sa mga tagatulong.",
"relativetime.1month": "nakaraang buwan",
@@ -94,5 +94,15 @@
"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",
+ "mail.actions.run_info_sha": "Commit: %[1]s",
+ "repo.pulls.already_merged": "Nabigo ang pagsasama: Naisama na ang hiling sa paghila na ito."
}
diff --git a/options/locale_next/locale_fr-FR.json b/options/locale_next/locale_fr-FR.json
index a9035f0848..1fc9bfa4af 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…",
@@ -103,5 +103,12 @@
"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.",
+ "profile.actions.tooltip": "Plus d'actions",
+ "profile.edit.link": "Éditer le profil",
+ "keys.ssh.link": "Clé SSH",
+ "keys.gpg.link": "Clés GPG",
+ "repo.diff.commit.next-short": "Suiv.",
+ "repo.diff.commit.previous-short": "Préc.",
+ "mail.actions.run_info_sha": "Commit: %[1]s"
}
diff --git a/options/locale_next/locale_hi.json b/options/locale_next/locale_hi.json
index 0967ef424b..bf87940be2 100644
--- a/options/locale_next/locale_hi.json
+++ b/options/locale_next/locale_hi.json
@@ -1 +1,59 @@
-{}
+{
+ "home.welcome.no_activity": "गतिविधि नहीं",
+ "home.welcome.activity_hint": "आपकी फीड में अà¤à¥€ कà¥à¤› à¤à¥€ नहीं है। आपके कारà¥à¤¯ और रिपॉजिटरी यहाठदिखेंगे।",
+ "home.explore_repos": "रिपॉजिटरी निहारें",
+ "home.explore_users": "उसेरà¥à¤¸ देखें",
+ "home.explore_orgs": "संसà¥à¤¥à¤¾à¤à¤‚ देखें",
+ "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": "इस फॉरगेजो इंसà¥à¤Ÿà¥ˆà¤‚स को %d सरà¥à¤µà¤° पे कॉनà¥à¥žà¤¿à¤—र किया गया है। आप फॉरगेजो को किसी अनà¥à¤¯ 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": " à¤à¤• अंक %d और %d के बीच में",
+ "install.invalid_lfs_path": "LFS रà¥à¤Ÿ नहीं बना पाया इस path पर",
+ "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_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": "गैर कानूनी कंटेंट",
+ "moderation.abuse_category.other_violations": "पà¥à¤²à¥‡à¤Ÿà¤«à¤¾à¤°à¥à¤® का कोई रूल तोडा हैं",
+ "moderation.report_remarks": "टिपà¥à¤ªà¤£à¥€",
+ "moderation.report_remarks.placeholder": "कà¥à¤› डिटेलà¥à¤¸ बताओ जिस बारे में रिपोरà¥à¤Ÿ कर रहे हो",
+ "moderation.submit_report": "रिपोरà¥à¤Ÿ सबमिट करो",
+ "moderation.reporting_failed": "नयी रिपोरà¥à¤Ÿ सबमिट नहीं हो सकती",
+ "moderation.reported_thank_you": "रिपोरà¥à¤Ÿ के लिठशà¥à¤•à¥à¤°à¤¿à¤¯à¤¾à¥¤ à¤à¤¡à¤®à¤¿à¤¨ को बताया गया है",
+ "avatar.constraints_hint": "कसà¥à¤Ÿà¤® अवतार का फ़ाइल आकार 200 किलोबाइट से अधिक नहीं होना चाहिठऔर 125x125 पिकà¥à¤¸à¥‡à¤² से बड़ा नहीं होना चाहिà¤",
+ "meta.last_line": "तीतर के दो पीछे तीतर तीतर के दो आगे तीतर बोलो कितने तीतर ?"
+}
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_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_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 f71cfa227d..30d789751a 100644
--- a/options/locale_next/locale_lv-LV.json
+++ b/options/locale_next/locale_lv-LV.json
@@ -105,5 +105,12 @@
"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",
+ "mail.actions.run_info_sha": "Iesūtījums: %[1]s",
+ "repo.pulls.already_merged": "ApvienoÅ¡ana neizdevÄs: Å¡is izmaiņu pieprasÄ«jums jau ir iekļauts."
}
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_nds.json b/options/locale_next/locale_nds.json
index 9a3884a87f..25fb212496 100644
--- a/options/locale_next/locale_nds.json
+++ b/options/locale_next/locale_nds.json
@@ -97,5 +97,12 @@
"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",
+ "mail.actions.run_info_sha": "Kommitteren: %[1]s",
+ "repo.pulls.already_merged": "Tosamenföhren fehlslagen: Deeser Haalvörslag is al tosamenföhrt worden."
}
diff --git a/options/locale_next/locale_nl-NL.json b/options/locale_next/locale_nl-NL.json
index 4f109825aa..064c34c3cf 100644
--- a/options/locale_next/locale_nl-NL.json
+++ b/options/locale_next/locale_nl-NL.json
@@ -92,5 +92,17 @@
"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",
+ "mail.actions.run_info_sha": "Commit: %[1]s",
+ "repo.pulls.already_merged": "Samenvoegen mislukt: deze pull request is al samengevoegd."
}
diff --git a/options/locale_next/locale_pl-PL.json b/options/locale_next/locale_pl-PL.json
index 8f9eea2302..cc056c0b1e 100644
--- a/options/locale_next/locale_pl-PL.json
+++ b/options/locale_next/locale_pl-PL.json
@@ -2,5 +2,18 @@
"repo.pulls.merged_title_desc": "scala %[1]d commity/ów z %[2]s
do %[3]s
%[4]s",
"repo.pulls.title_desc": "chce scalić %[1]d commity/ów z %[2]s
do %[3]s
",
"search.milestone_kind": "Wyszukaj kamienie milowe...",
- "incorrect_root_url": "Ta instancja Forgejo jest skonfigurowana do korzystania z \"%s\". Obecnie oglądasz Forgejo za pomocą innego URL, co może powodować błędne działanie tej aplikacji. URL kanoniczny jest kontrolowany przez administratorów Forgejo za pomocą ROOT_URL w app.ini."
+ "incorrect_root_url": "Ta instancja Forgejo jest skonfigurowana do korzystania z \"%s\". Obecnie oglądasz Forgejo za pomocą innego URL, co może powodować błędne działanie tej aplikacji. URL kanoniczny jest kontrolowany przez administratorów Forgejo za pomocą ROOT_URL w app.ini.",
+ "home.welcome.no_activity": "Brak aktywności",
+ "home.welcome.activity_hint": "Na razie nie ma nic w twoich aktualnościach. Pojawią się tutaj twoje działania oraz wydarzenia z repozytoriów, które obserwujesz.",
+ "home.explore_repos": "Eksploruj repozytoria",
+ "home.explore_users": "Eksploruj użytkowników",
+ "home.explore_orgs": "Eksploruj organizacje",
+ "stars.list.none": "Nikt nie dał gwiazdki temu repozytorium.",
+ "watch.list.none": "Nikt nie obserwuje tego repozytorium.",
+ "followers.incoming.list.self.none": "Nikt nie obserwuje twojego profilu.",
+ "followers.incoming.list.none": "Nikt nie obserwuje tego użytkownika.",
+ "followers.outgoing.list.self.none": "Nie obserwujesz nikogo.",
+ "followers.outgoing.list.none": "%s nie obserwuje nikogo.",
+ "relativetime.now": "teraz",
+ "relativetime.future": "w przyszłości"
}
diff --git a/options/locale_next/locale_pt-BR.json b/options/locale_next/locale_pt-BR.json
index 92e140878e..0d42dd7e4b 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",
@@ -103,5 +103,14 @@
"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.actions.tooltip": "Mais Actions",
+ "profile.edit.link": "Editar perfil",
+ "feed.atom.link": "Feed Atom",
+ "keys.ssh.link": "Chaves SSH",
+ "keys.gpg.link": "Chaves GPG",
+ "mail.actions.run_info_sha": "Commit: %[1]s",
+ "repo.pulls.already_merged": "Mescla falhou: Este pull request já foi mesclado."
}
diff --git a/options/locale_next/locale_pt-PT.json b/options/locale_next/locale_pt-PT.json
index 78e6dc4493..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",
@@ -103,5 +103,13 @@
"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.",
+ "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 8992cc6abd..d2a2fb5965 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)",
@@ -104,6 +104,13 @@
"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": "Изменить профиль",
+ "mail.actions.run_info_sha": "Коммит: %[1]s",
+ "repo.pulls.already_merged": "СлиÑние не удалоÑÑŒ: ÑлиÑние уже выполнено."
}
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 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"
}
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 c3bcf5397c..fa653980da 100644
--- a/options/locale_next/locale_uk-UA.json
+++ b/options/locale_next/locale_uk-UA.json
@@ -105,5 +105,12 @@
"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": "Більше дій",
+ "mail.actions.run_info_sha": "Коміт: %[1]s",
+ "repo.pulls.already_merged": "Ðе вдалоÑÑ Ð¾Ð±'єднати: цей запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð²Ð¶Ðµ об'єднано."
}
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 e7c1bad81e..12ffcf041b 100644
--- a/options/locale_next/locale_zh-CN.json
+++ b/options/locale_next/locale_zh-CN.json
@@ -71,5 +71,14 @@
"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": "编辑个人资料",
+ "mail.actions.run_info_sha": "æäº¤ï¼š%[1]s",
+ "repo.pulls.already_merged": "åˆå¹¶å¤±è´¥ï¼šæ¤åˆå¹¶è¯·æ±‚已被åˆå¹¶ã€‚"
}
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": "惡æ„程å¼"
}
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": "上一個"
}
diff --git a/package-lock.json b/package-lock.json
index 9de06a8055..5a70ac46b6 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.10.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.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"
@@ -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.10.0",
+ "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.10.0.tgz",
+ "integrity": "sha512-oQsFzPBy9xlpnGxUqLbVY8pvknLlsNIJ0NWwi8SUJjhbP1IT0E0o1lfhU4iYV3ubpy+xkzkaOyDUQMn06vQElQ==",
"license": "MIT",
"dependencies": {
"@braintree/sanitize-url": "^7.0.4",
"@iconify/utils": "^2.1.33",
- "@mermaid-js/parser": "^0.4.0",
+ "@mermaid-js/parser": "^0.6.2",
"@types/d3": "^7.4.3",
"cytoscape": "^3.29.3",
"cytoscape-cose-bilkent": "^4.1.0",
@@ -10578,11 +10578,11 @@
"d3-sankey": "^0.12.3",
"dagre-d3-es": "7.0.11",
"dayjs": "^1.11.13",
- "dompurify": "^3.2.4",
- "katex": "^0.16.9",
+ "dompurify": "^3.2.5",
+ "katex": "^0.16.22",
"khroma": "^2.1.0",
"lodash-es": "^4.17.21",
- "marked": "^15.0.7",
+ "marked": "^16.0.0",
"roughjs": "^4.6.6",
"stylis": "^4.3.6",
"ts-dedent": "^2.2.0",
@@ -10590,21 +10590,21 @@
}
},
"node_modules/mermaid/node_modules/dayjs": {
- "version": "1.11.13",
- "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
- "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
+ "version": "1.11.18",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz",
+ "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==",
"license": "MIT"
},
"node_modules/mermaid/node_modules/marked": {
- "version": "15.0.12",
- "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz",
- "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==",
+ "version": "16.2.1",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-16.2.1.tgz",
+ "integrity": "sha512-r3UrXED9lMlHF97jJByry90cwrZBBvZmjG1L68oYfuPMW+uDTnuMbyJDymCWwbTE+f+3LhpNDKfpR3a3saFyjA==",
"license": "MIT",
"bin": {
"marked": "bin/marked.js"
},
"engines": {
- "node": ">= 18"
+ "node": ">= 20"
}
},
"node_modules/micromark": {
diff --git a/package.json b/package.json
index f7df1b3f38..7a238fbfb2 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.10.0",
"mini-css-extract-plugin": "2.9.2",
"minimatch": "10.0.3",
"monaco-editor": "0.52.2",
diff --git a/routers/api/packages/api.go b/routers/api/packages/api.go
index 79e61cf352..721f96b768 100644
--- a/routers/api/packages/api.go
+++ b/routers/api/packages/api.go
@@ -117,7 +117,7 @@ func verifyAuth(r *web.Route, authMethods []auth.Method) {
var err error
ctx.Doer, err = authGroup.Verify(ctx.Req, ctx.Resp, ctx, ctx.Session)
if err != nil {
- log.Error("Failed to verify user: %v", err)
+ log.Info("Failed to verify user: %v", err)
ctx.Error(http.StatusUnauthorized, "authGroup.Verify")
return
}
@@ -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/routers/api/packages/container/container.go b/routers/api/packages/container/container.go
index 191a4aa455..9a7fd03aa8 100644
--- a/routers/api/packages/container/container.go
+++ b/routers/api/packages/container/container.go
@@ -399,12 +399,7 @@ func EndUploadBlob(ctx *context.Context) {
}
return
}
- doClose := true
- defer func() {
- if doClose {
- uploader.Close()
- }
- }()
+ defer uploader.Close()
if ctx.Req.Body != nil {
if err := uploader.Append(ctx, ctx.Req.Body); err != nil {
@@ -437,11 +432,10 @@ func EndUploadBlob(ctx *context.Context) {
return
}
- if err := uploader.Close(); err != nil {
- apiError(ctx, http.StatusInternalServerError, err)
- return
- }
- doClose = false
+ // 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()
if err := container_service.RemoveBlobUploadByID(ctx, uploader.ID); err != nil {
apiError(ctx, http.StatusInternalServerError, err)
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 = ""
diff --git a/routers/api/shared/middleware.go b/routers/api/shared/middleware.go
index 7d537f1ef9..b57fabac0e 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 Forgejo v13.0.0. 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/admin/user.go b/routers/api/v1/admin/user.go
index 8aa67b3b0a..6741f5bfc0 100644
--- a/routers/api/v1/admin/user.go
+++ b/routers/api/v1/admin/user.go
@@ -149,7 +149,7 @@ func CreateUser(ctx *context.APIContext) {
return
}
- if !validation.IsEmailDomainAllowed(u.Email) {
+ if _, ok := validation.IsEmailDomainAllowed(u.Email); !ok {
ctx.Resp.Header().Add("X-Gitea-Warning", fmt.Sprintf("the domain of user email %s conflicts with EMAIL_DOMAIN_ALLOWLIST or EMAIL_DOMAIN_BLOCKLIST", u.Email))
}
@@ -235,7 +235,7 @@ func EditUser(ctx *context.APIContext) {
return
}
- if !validation.IsEmailDomainAllowed(*form.Email) {
+ if _, ok := validation.IsEmailDomainAllowed(*form.Email); !ok {
ctx.Resp.Header().Add("X-Gitea-Warning", fmt.Sprintf("the domain of user email %s conflicts with EMAIL_DOMAIN_ALLOWLIST or EMAIL_DOMAIN_BLOCKLIST", *form.Email))
}
}
diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go
index bf08bdd249..1e6aa98ce5 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
@@ -57,6 +69,7 @@ package v1
import (
"fmt"
"net/http"
+ "slices"
"strings"
actions_model "forgejo.org/models/actions"
@@ -88,6 +101,7 @@ import (
"forgejo.org/services/auth"
"forgejo.org/services/context"
"forgejo.org/services/forms"
+ redirect_service "forgejo.org/services/redirect"
_ "forgejo.org/routers/api/v1/swagger" // for swagger generation
@@ -141,12 +155,12 @@ func repoAssignment() func(ctx *context.APIContext) {
owner, err = user_model.GetUserByName(ctx, userName)
if err != nil {
if user_model.IsErrUserNotExist(err) {
- if redirectUserID, err := user_model.LookupUserRedirect(ctx, userName); err == nil {
+ if redirectUserID, err := redirect_service.LookupUserRedirect(ctx, ctx.Doer, userName); err == nil {
context.RedirectToUser(ctx.Base, userName, redirectUserID)
} else if user_model.IsErrUserRedirectNotExist(err) {
ctx.NotFound("GetUserByName", err)
} else {
- ctx.Error(http.StatusInternalServerError, "LookupUserRedirect", err)
+ ctx.Error(http.StatusInternalServerError, "LookupRedirect", err)
}
} else {
ctx.Error(http.StatusInternalServerError, "GetUserByName", err)
@@ -161,7 +175,7 @@ func repoAssignment() func(ctx *context.APIContext) {
repo, err := repo_model.GetRepositoryByName(ctx, owner.ID, repoName)
if err != nil {
if repo_model.IsErrRepoNotExist(err) {
- redirectRepoID, err := repo_model.LookupRedirect(ctx, owner.ID, repoName)
+ redirectRepoID, err := redirect_service.LookupRepoRedirect(ctx, ctx.Doer, owner.ID, repoName)
if err == nil {
context.RedirectToRepo(ctx.Base, redirectRepoID)
} else if repo_model.IsErrRedirectNotExist(err) {
@@ -402,8 +416,11 @@ func reqBasicOrRevProxyAuth() func(ctx *context.APIContext) {
if ctx.IsSigned && setting.Service.EnableReverseProxyAuthAPI && ctx.Data["AuthedMethod"].(string) == auth.ReverseProxyMethodName {
return
}
- if !ctx.IsBasicAuth {
- ctx.Error(http.StatusUnauthorized, "reqBasicAuth", "auth required")
+
+ // Require basic authorization method to be used and that basic
+ // authorization used password login to verify the user.
+ if passwordLogin, ok := ctx.Data["IsPasswordLogin"].(bool); !ok || !passwordLogin {
+ ctx.Error(http.StatusUnauthorized, "reqBasicAuth", "auth method not allowed")
return
}
}
@@ -452,6 +469,12 @@ func reqAdmin() func(ctx *context.APIContext) {
// reqRepoWriter user should have a permission to write to a repo, or be a site admin
func reqRepoWriter(unitTypes ...unit.Type) func(ctx *context.APIContext) {
return func(ctx *context.APIContext) {
+ if !slices.ContainsFunc(unitTypes, func(unitType unit.Type) bool {
+ return ctx.Repo.Repository.UnitEnabled(ctx, unitType)
+ }) {
+ ctx.NotFound()
+ return
+ }
if !ctx.IsUserRepoWriter(unitTypes) && !ctx.IsUserRepoAdmin() && !ctx.IsUserSiteAdmin() {
ctx.Error(http.StatusForbidden, "reqRepoWriter", "user should have a permission to write to a repo")
return
@@ -471,6 +494,10 @@ func reqRepoBranchWriter(ctx *context.APIContext) {
// reqRepoReader user should have specific read permission or be a repo admin or a site admin
func reqRepoReader(unitType unit.Type) func(ctx *context.APIContext) {
return func(ctx *context.APIContext) {
+ if !ctx.Repo.Repository.UnitEnabled(ctx, unitType) {
+ ctx.NotFound()
+ return
+ }
if !ctx.Repo.CanRead(unitType) && !ctx.IsUserRepoAdmin() && !ctx.IsUserSiteAdmin() {
ctx.Error(http.StatusForbidden, "reqRepoReader", "user should have specific read permission or be a repo admin or a site admin")
return
@@ -626,13 +653,13 @@ func orgAssignment(args ...bool) func(ctx *context.APIContext) {
ctx.Org.Organization, err = organization.GetOrgByName(ctx, ctx.Params(":org"))
if err != nil {
if organization.IsErrOrgNotExist(err) {
- redirectUserID, err := user_model.LookupUserRedirect(ctx, ctx.Params(":org"))
+ redirectUserID, err := redirect_service.LookupUserRedirect(ctx, ctx.Doer, ctx.Params(":org"))
if err == nil {
context.RedirectToUser(ctx.Base, ctx.Params(":org"), redirectUserID)
} else if user_model.IsErrUserRedirectNotExist(err) {
ctx.NotFound("GetOrgByName", err)
} else {
- ctx.Error(http.StatusInternalServerError, "LookupUserRedirect", err)
+ ctx.Error(http.StatusInternalServerError, "LookupRedirect", err)
}
} else {
ctx.Error(http.StatusInternalServerError, "GetOrgByName", err)
@@ -728,6 +755,26 @@ func mustEnableIssuesOrPulls(ctx *context.APIContext) {
}
}
+func mustEnableLocalIssuesIfIsIssue(ctx *context.APIContext) {
+ if ctx.Repo.Repository.UnitEnabled(ctx, unit.TypeIssues) {
+ return
+ }
+
+ issue, err := issues_model.GetIssueByIndex(ctx, ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
+ if err != nil {
+ if issues_model.IsErrIssueNotExist(err) {
+ ctx.NotFound()
+ } else {
+ ctx.Error(http.StatusInternalServerError, "GetIssueByIndex", err)
+ }
+ return
+ }
+ if !issue.IsPull {
+ ctx.NotFound()
+ return
+ }
+}
+
func mustEnableWiki(ctx *context.APIContext) {
if !(ctx.Repo.CanRead(unit.TypeWiki)) {
ctx.NotFound()
@@ -1407,7 +1454,7 @@ func Routes() *web.Route {
m.Group("/comments", func() {
m.Combo("").Get(repo.ListIssueComments).
Post(reqToken(), mustNotBeArchived, bind(api.CreateIssueCommentOption{}), repo.CreateIssueComment)
- m.Combo("/{id}", reqToken()).Patch(bind(api.EditIssueCommentOption{}), repo.EditIssueCommentDeprecated).
+ m.Combo("/{id}", reqToken(), commentAssignment(":id")).Patch(bind(api.EditIssueCommentOption{}), repo.EditIssueCommentDeprecated).
Delete(repo.DeleteIssueCommentDeprecated)
})
m.Get("/timeline", repo.ListIssueCommentsAndTimeline)
@@ -1464,7 +1511,7 @@ func Routes() *web.Route {
Delete(reqToken(), reqAdmin(), repo.UnpinIssue)
m.Patch("/{position}", reqToken(), reqAdmin(), repo.MoveIssuePin)
})
- })
+ }, mustEnableLocalIssuesIfIsIssue)
}, mustEnableIssuesOrPulls)
m.Group("/labels", func() {
m.Combo("").Get(repo.ListLabels).
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/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/routers/api/v1/repo/migrate.go b/routers/api/v1/repo/migrate.go
index a848a950db..e58545c2f6 100644
--- a/routers/api/v1/repo/migrate.go
+++ b/routers/api/v1/repo/migrate.go
@@ -283,6 +283,8 @@ func handleRemoteAddrError(ctx *context.APIContext, err error) {
}
case addrErr.IsInvalidPath:
ctx.Error(http.StatusUnprocessableEntity, "", "Invalid local path, it does not exist or not a directory.")
+ case addrErr.HasCredentials:
+ ctx.Error(http.StatusUnprocessableEntity, "", "The URL contains credentials.")
default:
ctx.Error(http.StatusInternalServerError, "ParseRemoteAddr", "Unknown error type (ErrInvalidCloneAddr): "+err.Error())
}
diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go
index bc48c6acb7..8412b4a95b 100644
--- a/routers/api/v1/repo/mirror.go
+++ b/routers/api/v1/repo/mirror.go
@@ -441,6 +441,8 @@ func HandleRemoteAddressError(ctx *context.APIContext, err error) {
ctx.Error(http.StatusBadRequest, "CreatePushMirror", "Invalid Url ")
case addrErr.IsPermissionDenied:
ctx.Error(http.StatusUnauthorized, "CreatePushMirror", "Permission denied")
+ case addrErr.HasCredentials:
+ ctx.Error(http.StatusBadRequest, "CreatePushMirror", "The URL contains credentials")
default:
ctx.Error(http.StatusBadRequest, "CreatePushMirror", "Unknown error")
}
diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go
index c9dda124de..d978d24e8b 100644
--- a/routers/api/v1/repo/pull.go
+++ b/routers/api/v1/repo/pull.go
@@ -1016,6 +1016,9 @@ func MergePullRequest(ctx *context.APIContext) {
} else if models.IsErrMergeUnrelatedHistories(err) {
conflictError := err.(models.ErrMergeUnrelatedHistories)
ctx.JSON(http.StatusConflict, conflictError)
+ } else if models.IsErrPullRequestHasMerged(err) {
+ conflictError := err.(models.ErrPullRequestHasMerged)
+ ctx.JSON(http.StatusConflict, conflictError)
} else if git.IsErrPushOutOfDate(err) {
ctx.Error(http.StatusConflict, "Merge", "merge push out of date")
} else if models.IsErrSHADoesNotMatch(err) {
@@ -1125,7 +1128,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 +1136,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 +1202,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/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
}
}
diff --git a/routers/api/v1/user/helper.go b/routers/api/v1/user/helper.go
index fe0943091f..1de4d72161 100644
--- a/routers/api/v1/user/helper.go
+++ b/routers/api/v1/user/helper.go
@@ -8,6 +8,7 @@ import (
user_model "forgejo.org/models/user"
"forgejo.org/services/context"
+ redirect_service "forgejo.org/services/redirect"
)
// GetUserByParamsName get user by name
@@ -16,7 +17,7 @@ func GetUserByParamsName(ctx *context.APIContext, name string) *user_model.User
user, err := user_model.GetUserByName(ctx, username)
if err != nil {
if user_model.IsErrUserNotExist(err) {
- if redirectUserID, err2 := user_model.LookupUserRedirect(ctx, username); err2 == nil {
+ if redirectUserID, err2 := redirect_service.LookupUserRedirect(ctx, ctx.Doer, username); err2 == nil {
context.RedirectToUser(ctx.Base, username, redirectUserID)
} else {
ctx.NotFound("GetUserByName", err)
diff --git a/routers/web/admin/users.go b/routers/web/admin/users.go
index 964326291e..c4727177ba 100644
--- a/routers/web/admin/users.go
+++ b/routers/web/admin/users.go
@@ -201,7 +201,7 @@ func NewUserPost(ctx *context.Context) {
return
}
- if !validation.IsEmailDomainAllowed(u.Email) {
+ if _, ok := validation.IsEmailDomainAllowed(u.Email); !ok {
ctx.Flash.Warning(ctx.Tr("form.email_domain_is_not_allowed", u.Email))
}
@@ -421,7 +421,7 @@ func EditUserPost(ctx *context.Context) {
}
return
}
- if !validation.IsEmailDomainAllowed(form.Email) {
+ if _, ok := validation.IsEmailDomainAllowed(form.Email); !ok {
ctx.Flash.Warning(ctx.Tr("form.email_domain_is_not_allowed", form.Email))
}
}
diff --git a/routers/web/auth/2fa.go b/routers/web/auth/2fa.go
index ff769ffd5d..6f2f8239f1 100644
--- a/routers/web/auth/2fa.go
+++ b/routers/web/auth/2fa.go
@@ -81,6 +81,14 @@ func TwoFactorPost(ctx *context.Context) {
}
}
+ // Handle OpenID linking to user.
+ if oid, ok := ctx.Session.Get("twofaOpenID").(string); ok {
+ if err := user_model.AddUserOpenID(ctx, &user_model.UserOpenID{UID: u.ID, URI: oid}); err != nil {
+ ctx.ServerError("AddUserOpenID", err)
+ return
+ }
+ }
+
twofa.LastUsedPasscode = form.Passcode
if err = auth.UpdateTwoFactor(ctx, twofa); err != nil {
ctx.ServerError("UserSignIn", err)
@@ -146,6 +154,14 @@ func TwoFactorScratchPost(ctx *context.Context) {
return
}
+ // Handle OpenID linking to user.
+ if oid, ok := ctx.Session.Get("twofaOpenID").(string); ok {
+ if err := user_model.AddUserOpenID(ctx, &user_model.UserOpenID{UID: u.ID, URI: oid}); err != nil {
+ ctx.ServerError("AddUserOpenID", err)
+ return
+ }
+ }
+
handleSignInFull(ctx, u, remember, false)
if ctx.Written() {
return
diff --git a/routers/web/auth/auth.go b/routers/web/auth/auth.go
index dbb6665398..3b4e62c429 100644
--- a/routers/web/auth/auth.go
+++ b/routers/web/auth/auth.go
@@ -310,6 +310,7 @@ func handleSignInFull(ctx *context.Context, u *user_model.User, remember, obeyRe
"openid_determined_username",
"twofaUid",
"twofaRemember",
+ "twofaOpenID",
"linkAccount",
}, map[string]any{
"uid": u.ID,
@@ -452,7 +453,10 @@ func SignUpPost(ctx *context.Context) {
return
}
- if !form.IsEmailDomainAllowed() {
+ if emailValid, ok := form.IsEmailDomainAllowed(); !emailValid {
+ ctx.RenderWithErr(ctx.Tr("form.email_invalid"), tplSignUp, form)
+ return
+ } else if !ok {
ctx.RenderWithErr(ctx.Tr("auth.email_domain_blacklisted"), tplSignUp, &form)
return
}
diff --git a/routers/web/auth/linkaccount.go b/routers/web/auth/linkaccount.go
index 2bba614d8c..c1fc6ebb69 100644
--- a/routers/web/auth/linkaccount.go
+++ b/routers/web/auth/linkaccount.go
@@ -244,7 +244,10 @@ func LinkAccountPostRegister(ctx *context.Context) {
}
}
- if !form.IsEmailDomainAllowed() {
+ if emailValid, ok := form.IsEmailDomainAllowed(); !emailValid {
+ ctx.RenderWithErr(ctx.Tr("form.email_invalid"), tplSignUp, form)
+ return
+ } else if !ok {
ctx.RenderWithErr(ctx.Tr("auth.email_domain_blacklisted"), tplLinkAccount, &form)
return
}
diff --git a/routers/web/auth/oauth.go b/routers/web/auth/oauth.go
index e8e5d2c54b..1b75004623 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/routers/web/auth/openid.go b/routers/web/auth/openid.go
index fcb2155953..1d7bdcd1ce 100644
--- a/routers/web/auth/openid.go
+++ b/routers/web/auth/openid.go
@@ -9,6 +9,7 @@ import (
"net/http"
"net/url"
+ auth_model "forgejo.org/models/auth"
user_model "forgejo.org/models/user"
"forgejo.org/modules/auth/openid"
"forgejo.org/modules/base"
@@ -253,6 +254,7 @@ func ConnectOpenID(ctx *context.Context) {
// ConnectOpenIDPost handles submission of a form to connect an OpenID URI to an existing account
func ConnectOpenIDPost(ctx *context.Context) {
form := web.GetForm(ctx).(*forms.ConnectOpenIDForm)
+ remember, _ := ctx.Session.Get("openid_signin_remember").(bool)
oid, _ := ctx.Session.Get("openid_verified_uri").(string)
if oid == "" {
ctx.Redirect(setting.AppSubURL + "/user/login/openid")
@@ -264,28 +266,63 @@ func ConnectOpenIDPost(ctx *context.Context) {
ctx.Data["EnableOpenIDSignUp"] = setting.Service.EnableOpenIDSignUp
ctx.Data["OpenID"] = oid
- u, _, err := auth.UserSignIn(ctx, form.UserName, form.Password)
+ u, source, err := auth.UserSignIn(ctx, form.UserName, form.Password)
if err != nil {
handleSignInError(ctx, form.UserName, &form, tplConnectOID, "ConnectOpenIDPost", err)
return
}
- // add OpenID for the user
- userOID := &user_model.UserOpenID{UID: u.ID, URI: oid}
- if err = user_model.AddUserOpenID(ctx, userOID); err != nil {
- if user_model.IsErrOpenIDAlreadyUsed(err) {
- ctx.RenderWithErr(ctx.Tr("form.openid_been_used", oid), tplConnectOID, &form)
- return
- }
- ctx.ServerError("AddUserOpenID", err)
+ // Check if OID is already in use.
+ if used, err := user_model.IsOpenIDUsed(ctx, oid); err != nil {
+ ctx.ServerError("IsOpenIDUsed", err)
+ return
+ } else if used {
+ ctx.RenderWithErr(ctx.Tr("form.openid_been_used", oid), tplConnectOID, &form)
return
}
- ctx.Flash.Success(ctx.Tr("settings.add_openid_success"))
+ // Check if 2FA needs to be done.
+ has2FA, err := auth_model.HasTwoFactorByUID(ctx, u.ID)
+ if err != nil {
+ ctx.ServerError("HasTwoFactorByUID", err)
+ return
+ }
+ if skipper, ok := source.Cfg.(auth.LocalTwoFASkipper); !has2FA || (ok && skipper.IsSkipLocalTwoFA()) {
+ // Link this OID to the user.
+ if err := user_model.AddUserOpenID(ctx, &user_model.UserOpenID{UID: u.ID, URI: oid}); err != nil {
+ ctx.ServerError("AddUserOpenID", err)
+ return
+ }
- remember, _ := ctx.Session.Get("openid_signin_remember").(bool)
- log.Trace("Session stored openid-remember: %t", remember)
- handleSignIn(ctx, u, remember)
+ ctx.Flash.Success(ctx.Tr("settings.add_openid_success"))
+ handleSignIn(ctx, u, remember)
+ return
+ }
+
+ // Check if the user has webauthn registration.
+ hasWebAuthnTwofa, err := auth_model.HasWebAuthnRegistrationsByUID(ctx, u.ID)
+ if err != nil {
+ ctx.ServerError("HasWebAuthnRegistrationsByUID", err)
+ return
+ }
+
+ if err := updateSession(ctx, nil, map[string]any{
+ "twofaUid": u.ID,
+ "twofaRemember": remember,
+ "twofaOpenID": oid,
+ }); err != nil {
+ ctx.ServerError("Unable to update session", err)
+ return
+ }
+
+ // If we have WebAuthn, redirect there first.
+ if hasWebAuthnTwofa {
+ ctx.Redirect(setting.AppSubURL + "/user/webauthn")
+ return
+ }
+
+ // Fallback to TOTP.
+ ctx.Redirect(setting.AppSubURL + "/user/two_factor")
}
// RegisterOpenID shows a form to create a new user authenticated via an OpenID URI
diff --git a/routers/web/auth/webauthn.go b/routers/web/auth/webauthn.go
index 3da6199b6e..35bc1e8bf5 100644
--- a/routers/web/auth/webauthn.go
+++ b/routers/web/auth/webauthn.go
@@ -166,6 +166,14 @@ func WebAuthnLoginAssertionPost(ctx *context.Context) {
}
}
+ // Handle OpenID linking to user.
+ if oid, ok := ctx.Session.Get("twofaOpenID").(string); ok {
+ if err := user_model.AddUserOpenID(ctx, &user_model.UserOpenID{UID: user.ID, URI: oid}); err != nil {
+ ctx.ServerError("AddUserOpenID", err)
+ return
+ }
+ }
+
remember := ctx.Session.Get("twofaRemember").(bool)
redirect := handleSignInFull(ctx, user, remember, false)
if redirect == "" {
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/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/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/routers/web/repo/compare.go b/routers/web/repo/compare.go
index de2e29ab9f..e3020c92d2 100644
--- a/routers/web/repo/compare.go
+++ b/routers/web/repo/compare.go
@@ -933,25 +933,29 @@ func ExcerptBlob(ctx *context.Context) {
ctx.Error(http.StatusInternalServerError, "getExcerptLines")
return
}
- if idxRight > lastRight {
+
+ // After the "up" or "down" expansion, check if there's any remaining content in the diff and add a line that will
+ // be rendered into a new expander at either the top, or bottom.
+ lineSection := &gitdiff.DiffLine{
+ Type: gitdiff.DiffLineSection,
+ SectionInfo: &gitdiff.DiffLineSectionInfo{
+ Path: filePath,
+ LastLeftIdx: lastLeft,
+ LastRightIdx: lastRight,
+ LeftIdx: idxLeft,
+ RightIdx: idxRight,
+ LeftHunkSize: leftHunkSize,
+ RightHunkSize: rightHunkSize,
+ },
+ }
+ if lineSection.GetExpandDirection() != gitdiff.DiffLineExpandNone {
lineText := " "
if rightHunkSize > 0 || leftHunkSize > 0 {
lineText = fmt.Sprintf("@@ -%d,%d +%d,%d @@\n", idxLeft, leftHunkSize, idxRight, rightHunkSize)
}
lineText = html.EscapeString(lineText)
- lineSection := &gitdiff.DiffLine{
- Type: gitdiff.DiffLineSection,
- Content: lineText,
- SectionInfo: &gitdiff.DiffLineSectionInfo{
- Path: filePath,
- LastLeftIdx: lastLeft,
- LastRightIdx: lastRight,
- LeftIdx: idxLeft,
- RightIdx: idxRight,
- LeftHunkSize: leftHunkSize,
- RightHunkSize: rightHunkSize,
- },
- }
+ lineSection.Content = lineText
+
switch direction {
case "up":
section.Lines = append([]*gitdiff.DiffLine{lineSection}, section.Lines...)
diff --git a/routers/web/repo/githttp.go b/routers/web/repo/githttp.go
index 650b1d88f4..aac251dc3d 100644
--- a/routers/web/repo/githttp.go
+++ b/routers/web/repo/githttp.go
@@ -31,6 +31,7 @@ import (
"forgejo.org/modules/structs"
"forgejo.org/modules/util"
"forgejo.org/services/context"
+ redirect_service "forgejo.org/services/redirect"
repo_service "forgejo.org/services/repository"
"github.com/go-chi/cors"
@@ -111,7 +112,7 @@ func httpBase(ctx *context.Context) *serviceHandler {
return nil
}
- if redirectRepoID, err := repo_model.LookupRedirect(ctx, owner.ID, reponame); err == nil {
+ if redirectRepoID, err := redirect_service.LookupRepoRedirect(ctx, ctx.Doer, owner.ID, reponame); err == nil {
context.RedirectToRepo(ctx.Base, redirectRepoID)
return nil
}
diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go
index 5e228507c0..ef4589c8e6 100644
--- a/routers/web/repo/issue.go
+++ b/routers/web/repo/issue.go
@@ -3592,9 +3592,9 @@ func GetIssueAttachments(ctx *context.Context) {
if ctx.Written() {
return
}
- attachments := make([]*api.Attachment, len(issue.Attachments))
+ attachments := make([]*api.WebAttachment, len(issue.Attachments))
for i := 0; i < len(issue.Attachments); i++ {
- attachments[i] = convert.ToAttachment(ctx.Repo.Repository, issue.Attachments[i])
+ attachments[i] = convert.ToWebAttachment(ctx.Repo.Repository, issue.Attachments[i])
}
ctx.JSON(http.StatusOK, attachments)
}
@@ -3627,13 +3627,13 @@ func GetCommentAttachments(ctx *context.Context) {
return
}
- attachments := make([]*api.Attachment, 0)
if err := comment.LoadAttachments(ctx); err != nil {
ctx.ServerError("LoadAttachments", err)
return
}
+ attachments := make([]*api.WebAttachment, len(comment.Attachments))
for i := 0; i < len(comment.Attachments); i++ {
- attachments = append(attachments, convert.ToAttachment(ctx.Repo.Repository, comment.Attachments[i]))
+ attachments[i] = convert.ToWebAttachment(ctx.Repo.Repository, comment.Attachments[i])
}
ctx.JSON(http.StatusOK, attachments)
}
diff --git a/routers/web/repo/migrate.go b/routers/web/repo/migrate.go
index 86d2461e94..3a5cf30dbe 100644
--- a/routers/web/repo/migrate.go
+++ b/routers/web/repo/migrate.go
@@ -138,6 +138,8 @@ func handleMigrateRemoteAddrError(ctx *context.Context, err error, tpl base.TplN
}
case addrErr.IsInvalidPath:
ctx.RenderWithErr(ctx.Tr("repo.migrate.invalid_local_path"), tpl, form)
+ case addrErr.HasCredentials:
+ ctx.RenderWithErr(ctx.Tr("migrate.form.error.url_credentials"), tpl, form)
default:
log.Error("Error whilst updating url: %v", err)
ctx.RenderWithErr(ctx.Tr("form.url_error", "unknown"), tpl, form)
diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go
index fd18646211..87a7d2d5cd 100644
--- a/routers/web/repo/pull.go
+++ b/routers/web/repo/pull.go
@@ -360,7 +360,7 @@ func getPullInfo(ctx *context.Context) (issue *issues_model.Issue, ok bool) {
ctx.Data["Issue"] = issue
if !issue.IsPull {
- ctx.NotFound("ViewPullCommits", nil)
+ ctx.Redirect(issue.Link())
return nil, false
}
@@ -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 {
@@ -1438,6 +1445,10 @@ func MergePullRequest(ctx *context.Context) {
log.Debug("MergeUnrelatedHistories error: %v", err)
ctx.Flash.Error(ctx.Tr("repo.pulls.unrelated_histories"))
ctx.JSONRedirect(issue.Link())
+ } else if models.IsErrPullRequestHasMerged(err) {
+ log.Debug("MergePullRequestHasMerged error: %v", err)
+ ctx.Flash.Error(ctx.Tr("repo.pulls.already_merged"))
+ ctx.JSONRedirect(issue.Link())
} else if git.IsErrPushOutOfDate(err) {
log.Debug("MergePushOutOfDate error: %v", err)
ctx.Flash.Error(ctx.Tr("repo.pulls.merge_out_of_date"))
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/repo/setting/setting.go b/routers/web/repo/setting/setting.go
index 6f35e19880..518ddc1b77 100644
--- a/routers/web/repo/setting/setting.go
+++ b/routers/web/repo/setting/setting.go
@@ -542,7 +542,13 @@ func SettingsPost(ctx *context.Context) {
mirror_service.AddPullMirrorToQueue(repo.ID)
- ctx.Flash.Info(ctx.Tr("repo.settings.pull_mirror_sync_in_progress", repo.OriginalURL))
+ sanitizedOriginalURL, err := util.SanitizeURL(repo.OriginalURL)
+ if err != nil {
+ ctx.ServerError("SanitizeURL", err)
+ return
+ }
+
+ ctx.Flash.Info(ctx.Tr("repo.settings.pull_mirror_sync_in_progress", sanitizedOriginalURL))
ctx.Redirect(repo.Link() + "/settings")
case "push-mirror-sync":
@@ -1091,6 +1097,8 @@ func handleSettingRemoteAddrError(ctx *context.Context, err error, form *forms.R
}
case addrErr.IsInvalidPath:
ctx.RenderWithErr(ctx.Tr("repo.migrate.invalid_local_path"), tplSettingsOptions, form)
+ case addrErr.HasCredentials:
+ ctx.RenderWithErr(ctx.Tr("migrate.form.error.url_credentials"), tplSettingsOptions, form)
default:
ctx.ServerError("Unknown error", err)
}
diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go
index bb3e1388a8..91a8661097 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/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/routers/web/web.go b/routers/web/web.go
index 4b39f22f7d..4dff09c846 100644
--- a/routers/web/web.go
+++ b/routers/web/web.go
@@ -117,7 +117,7 @@ func webAuth(authMethod auth_service.Method) func(*context.Context) {
return func(ctx *context.Context) {
ar, err := common.AuthShared(ctx.Base, ctx.Session, authMethod)
if err != nil {
- log.Error("Failed to verify user: %v", err)
+ log.Info("Failed to verify user: %v", err)
ctx.Error(http.StatusUnauthorized, ctx.Locale.TrString("auth.unauthorized_credentials", "https://codeberg.org/forgejo/forgejo/issues/2809"))
return
}
@@ -177,7 +177,8 @@ func verifyAuthWithOptions(options *common.VerifyOptions) func(ctx *context.Cont
return
}
- if !options.SignOutRequired && !options.DisableCSRF && ctx.Req.Method == "POST" {
+ safeMethod := ctx.Req.Method == "GET" || ctx.Req.Method == "HEAD" || ctx.Req.Method == "OPTIONS"
+ if !options.SignOutRequired && !options.DisableCSRF && !safeMethod {
ctx.Csrf.Validate(ctx)
if ctx.Written() {
return
diff --git a/routers/web/webfinger.go b/routers/web/webfinger.go
index be3c2925fe..7636fd2d0c 100644
--- a/routers/web/webfinger.go
+++ b/routers/web/webfinger.go
@@ -153,7 +153,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/services/actions/TestServiceActions_startTask/action_schedule.yml b/services/actions/TestServiceActions_startTask/action_schedule.yml
new file mode 100644
index 0000000000..d0e7234475
--- /dev/null
+++ b/services/actions/TestServiceActions_startTask/action_schedule.yml
@@ -0,0 +1,41 @@
+# A corrupted cron spec with a valid schedule workflow
+-
+ id: 1
+ title: schedule_title1
+ specs:
+ - '* * * * *'
+ repo_id: 4
+ owner_id: 2
+ workflow_id: 'workflow1.yml'
+ trigger_user_id: 2
+ ref: main
+ commit_sha: shashasha
+ event: "schedule"
+ event_payload: "fakepayload"
+ content: |
+ jobs:
+ job2:
+ runs-on: ubuntu-latest
+ steps:
+ - run: true
+
+# A valid cron spec with a corrupted schedule workflow
+-
+ id: 2
+ title: schedule_title2
+ specs:
+ - '* * * * *'
+ repo_id: 4
+ owner_id: 2
+ workflow_id: 'workflow2.yml'
+ trigger_user_id: 2
+ ref: main
+ commit_sha: shashasha
+ event: "schedule"
+ event_payload: "fakepayload"
+ content: |
+ jobs:
+ job2: { invalid yaml
+ runs-on: ubuntu-latest
+ steps:
+ - run: true
diff --git a/services/actions/TestServiceActions_startTask/action_schedule_spec.yml b/services/actions/TestServiceActions_startTask/action_schedule_spec.yml
new file mode 100644
index 0000000000..7bcc78f010
--- /dev/null
+++ b/services/actions/TestServiceActions_startTask/action_schedule_spec.yml
@@ -0,0 +1,15 @@
+# A corrupted cron spec with a valid schedule workflow
+-
+ id: 1
+ repo_id: 4
+ schedule_id: 1
+ next: 1
+ spec: 'corrupted * *'
+
+# A valid cron spec with a corrupted schedule workflow
+-
+ id: 2
+ repo_id: 4
+ schedule_id: 2
+ next: 1
+ spec: '* * * * *'
diff --git a/services/actions/job_parser.go b/services/actions/job_parser.go
new file mode 100644
index 0000000000..f55edcddad
--- /dev/null
+++ b/services/actions/job_parser.go
@@ -0,0 +1,31 @@
+// Copyright 2025 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package actions
+
+import (
+ "fmt"
+
+ "github.com/nektos/act/pkg/jobparser"
+)
+
+func jobParser(workflow []byte, options ...jobparser.ParseOption) ([]*jobparser.SingleWorkflow, error) {
+ singleWorkflows, err := jobparser.Parse(workflow, options...)
+ if err != nil {
+ return nil, err
+ }
+ nameToSingleWorkflows := make(map[string][]*jobparser.SingleWorkflow, len(singleWorkflows))
+ duplicates := make(map[string]int, len(singleWorkflows))
+ for _, singleWorkflow := range singleWorkflows {
+ id, job := singleWorkflow.Job()
+ nameToSingleWorkflows[job.Name] = append(nameToSingleWorkflows[job.Name], singleWorkflow)
+ if len(nameToSingleWorkflows[job.Name]) > 1 {
+ duplicates[job.Name]++
+ job.Name = fmt.Sprintf("%s-%d", job.Name, duplicates[job.Name])
+ if err := singleWorkflow.SetJob(id, job); err != nil {
+ return nil, err
+ }
+ }
+ }
+ return singleWorkflows, nil
+}
diff --git a/services/actions/job_parser_test.go b/services/actions/job_parser_test.go
new file mode 100644
index 0000000000..9c1361d74e
--- /dev/null
+++ b/services/actions/job_parser_test.go
@@ -0,0 +1,212 @@
+// Copyright 2025 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package actions
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestServiceActions_jobParser(t *testing.T) {
+ for _, testCase := range []struct {
+ name string
+ workflow string
+ singleWorkflows []string
+ }{
+ {
+ name: "OneJobNoDuplicate",
+ workflow: `
+jobs:
+ job1:
+ runs-on: docker
+ steps:
+ - run: echo OK
+`,
+ singleWorkflows: []string{
+ `jobs:
+ job1:
+ name: job1
+ runs-on: docker
+ steps:
+ - run: echo OK
+`,
+ },
+ },
+ {
+ name: "MatrixTwoJobsWithSameJobName",
+ workflow: `
+name: test
+jobs:
+ job1:
+ name: shadowdefaultmatrixgeneratednames
+ strategy:
+ matrix:
+ version: [1.17, 1.19]
+ runs-on: docker
+ steps:
+ - run: echo OK
+`,
+ singleWorkflows: []string{
+ `name: test
+jobs:
+ job1:
+ name: shadowdefaultmatrixgeneratednames
+ runs-on: docker
+ steps:
+ - run: echo OK
+ strategy:
+ matrix:
+ version:
+ - 1.17
+`,
+ `name: test
+jobs:
+ job1:
+ name: shadowdefaultmatrixgeneratednames-1
+ runs-on: docker
+ steps:
+ - run: echo OK
+ strategy:
+ matrix:
+ version:
+ - 1.19
+`,
+ },
+ },
+ {
+ name: "MatrixTwoJobsWithMatrixGeneratedNames",
+ workflow: `
+name: test
+jobs:
+ job1:
+ strategy:
+ matrix:
+ version: [1.17, 1.19]
+ runs-on: docker
+ steps:
+ - run: echo OK
+`,
+ singleWorkflows: []string{
+ `name: test
+jobs:
+ job1:
+ name: job1 (1.17)
+ runs-on: docker
+ steps:
+ - run: echo OK
+ strategy:
+ matrix:
+ version:
+ - 1.17
+`,
+ `name: test
+jobs:
+ job1:
+ name: job1 (1.19)
+ runs-on: docker
+ steps:
+ - run: echo OK
+ strategy:
+ matrix:
+ version:
+ - 1.19
+`,
+ },
+ },
+ {
+ name: "MatrixTwoJobsWithDistinctInterpolatedNames",
+ workflow: `
+name: test
+jobs:
+ job1:
+ name: myname-${{ matrix.version }}
+ strategy:
+ matrix:
+ version: [1.17, 1.19]
+ runs-on: docker
+ steps:
+ - run: echo OK
+`,
+ singleWorkflows: []string{
+ `name: test
+jobs:
+ job1:
+ name: myname-1.17
+ runs-on: docker
+ steps:
+ - run: echo OK
+ strategy:
+ matrix:
+ version:
+ - 1.17
+`,
+ `name: test
+jobs:
+ job1:
+ name: myname-1.19
+ runs-on: docker
+ steps:
+ - run: echo OK
+ strategy:
+ matrix:
+ version:
+ - 1.19
+`,
+ },
+ },
+ {
+ name: "MatrixTwoJobsWithIdenticalInterpolatedNames",
+ workflow: `
+name: test
+jobs:
+ job1:
+ name: myname-${{ matrix.typo }}
+ strategy:
+ matrix:
+ version: [1.17, 1.19]
+ runs-on: docker
+ steps:
+ - run: echo OK
+`,
+ singleWorkflows: []string{
+ `name: test
+jobs:
+ job1:
+ name: myname-
+ runs-on: docker
+ steps:
+ - run: echo OK
+ strategy:
+ matrix:
+ version:
+ - 1.17
+`,
+ `name: test
+jobs:
+ job1:
+ name: myname--1
+ runs-on: docker
+ steps:
+ - run: echo OK
+ strategy:
+ matrix:
+ version:
+ - 1.19
+`,
+ },
+ },
+ } {
+ t.Run(testCase.name, func(t *testing.T) {
+ sw, err := jobParser([]byte(testCase.workflow))
+ require.NoError(t, err)
+ for i, sw := range sw {
+ actual, err := sw.Marshal()
+ require.NoError(t, err)
+ assert.Equal(t, testCase.singleWorkflows[i], string(actual))
+ }
+ })
+ }
+}
diff --git a/services/actions/notifier.go b/services/actions/notifier.go
index f1e9a6d7e9..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
}
@@ -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/services/actions/notifier_helper.go b/services/actions/notifier_helper.go
index e240c996b5..7dd449eda5 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()
@@ -372,7 +378,7 @@ func handleWorkflows(
continue
}
- jobs, err := jobparser.Parse(dwf.Content, jobparser.WithVars(vars))
+ jobs, err := jobParser(dwf.Content, jobparser.WithVars(vars))
if err != nil {
run.Status = actions_model.StatusFailure
log.Info("jobparser.Parse: invalid workflow, setting job status to failed: %v", err)
diff --git a/services/actions/notifier_helper_test.go b/services/actions/notifier_helper_test.go
index 9166dc3b95..fabc783bd0 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"
+ "github.com/nektos/act/pkg/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)
+}
diff --git a/services/actions/schedule_tasks.go b/services/actions/schedule_tasks.go
index cf8b29ead7..ec38f5eb8a 100644
--- a/services/actions/schedule_tasks.go
+++ b/services/actions/schedule_tasks.go
@@ -20,6 +20,7 @@ import (
"github.com/nektos/act/pkg/jobparser"
act_model "github.com/nektos/act/pkg/model"
+ "github.com/robfig/cron/v3"
"xorm.io/builder"
)
@@ -83,20 +84,33 @@ func startTasks(ctx context.Context) error {
}
return fmt.Errorf("GetUnit: %w", err)
}
- if cfg.ActionsConfig().IsWorkflowDisabled(row.Schedule.WorkflowID) {
+ actionConfig := cfg.ActionsConfig()
+ if actionConfig.IsWorkflowDisabled(row.Schedule.WorkflowID) {
continue
}
- if err := CreateScheduleTask(ctx, row.Schedule); err != nil {
- log.Error("CreateScheduleTask: %v", err)
- return err
+ createAndSchedule := func(row *actions_model.ActionScheduleSpec) (cron.Schedule, error) {
+ if err := CreateScheduleTask(ctx, row.Schedule); err != nil {
+ return nil, fmt.Errorf("CreateScheduleTask: %v", err)
+ }
+
+ // Parse the spec
+ schedule, err := row.Parse()
+ if err != nil {
+ return nil, fmt.Errorf("Parse(Spec=%v): %v", row.Spec, err)
+ }
+ return schedule, nil
}
- // Parse the spec
- schedule, err := row.Parse()
+ schedule, err := createAndSchedule(row)
if err != nil {
- log.Error("Parse: %v", err)
- return err
+ log.Error("RepoID=%v WorkflowID=%v: %v", row.Schedule.RepoID, row.Schedule.WorkflowID, err)
+ actionConfig.DisableWorkflow(row.Schedule.WorkflowID)
+ if err := repo_model.UpdateRepoUnit(ctx, cfg); err != nil {
+ log.Error("RepoID=%v WorkflowID=%v: CreateScheduleTask: %v", row.Schedule.RepoID, row.Schedule.WorkflowID, err)
+ return err
+ }
+ continue
}
// Update the spec's next run time and previous run time
@@ -153,7 +167,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(cron.Content, jobparser.WithVars(vars))
if err != nil {
return err
}
diff --git a/services/actions/schedule_tasks_test.go b/services/actions/schedule_tasks_test.go
index 7073985252..31ed5ec813 100644
--- a/services/actions/schedule_tasks_test.go
+++ b/services/actions/schedule_tasks_test.go
@@ -7,7 +7,9 @@ import (
"testing"
actions_model "forgejo.org/models/actions"
+ "forgejo.org/models/db"
repo_model "forgejo.org/models/repo"
+ "forgejo.org/models/unit"
"forgejo.org/models/unittest"
webhook_module "forgejo.org/modules/webhook"
@@ -15,6 +17,58 @@ import (
"github.com/stretchr/testify/require"
)
+func TestServiceActions_startTask(t *testing.T) {
+ defer unittest.OverrideFixtures("services/actions/TestServiceActions_startTask")()
+ require.NoError(t, unittest.PrepareTestDatabase())
+
+ // Load fixtures that are corrupted and create one valid scheduled workflow
+ repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4})
+
+ workflowID := "some.yml"
+ schedules := []*actions_model.ActionSchedule{
+ {
+ Title: "scheduletitle1",
+ RepoID: repo.ID,
+ OwnerID: repo.OwnerID,
+ WorkflowID: workflowID,
+ TriggerUserID: repo.OwnerID,
+ Ref: "branch",
+ CommitSHA: "fakeSHA",
+ Event: webhook_module.HookEventSchedule,
+ EventPayload: "fakepayload",
+ Specs: []string{"* * * * *"},
+ Content: []byte(
+ `
+jobs:
+ job2:
+ runs-on: ubuntu-latest
+ steps:
+ - run: true
+`),
+ },
+ }
+
+ require.Equal(t, 2, unittest.GetCount(t, actions_model.ActionScheduleSpec{}))
+ require.NoError(t, actions_model.CreateScheduleTask(t.Context(), schedules))
+ require.Equal(t, 3, unittest.GetCount(t, actions_model.ActionScheduleSpec{}))
+ _, err := db.GetEngine(db.DefaultContext).Exec("UPDATE `action_schedule_spec` SET next = 1")
+ require.NoError(t, err)
+
+ // After running startTasks an ActionRun row is created for the valid scheduled workflow
+ require.Empty(t, unittest.GetCount(t, actions_model.ActionRun{WorkflowID: workflowID}))
+ require.NoError(t, startTasks(t.Context()))
+ require.NotEmpty(t, unittest.GetCount(t, actions_model.ActionRun{WorkflowID: workflowID}))
+
+ // The invalid workflows loaded from the fixtures are disabled
+ repo = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4})
+ actionUnit, err := repo.GetUnit(t.Context(), unit.TypeActions)
+ require.NoError(t, err)
+ actionConfig := actionUnit.ActionsConfig()
+ assert.True(t, actionConfig.IsWorkflowDisabled("workflow2.yml"))
+ assert.True(t, actionConfig.IsWorkflowDisabled("workflow1.yml"))
+ assert.False(t, actionConfig.IsWorkflowDisabled("some.yml"))
+}
+
func TestCreateScheduleTask(t *testing.T) {
require.NoError(t, unittest.PrepareTestDatabase())
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2, OwnerID: 2})
diff --git a/services/actions/workflows.go b/services/actions/workflows.go
index fbba3fd667..3a13d90716 100644
--- a/services/actions/workflows.go
+++ b/services/actions/workflows.go
@@ -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(content, jobparser.WithVars(vars))
if err != nil {
return nil, nil, err
}
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/services/auth/auth.go b/services/auth/auth.go
index 85c9296ced..85121b2d7f 100644
--- a/services/auth/auth.go
+++ b/services/auth/auth.go
@@ -77,6 +77,7 @@ func handleSignIn(resp http.ResponseWriter, req *http.Request, sess SessionStore
_ = sess.Delete("openid_determined_username")
_ = sess.Delete("twofaUid")
_ = sess.Delete("twofaRemember")
+ _ = sess.Delete("twofaOpenID")
_ = sess.Delete("webauthnAssertion")
_ = sess.Delete("linkAccount")
err = sess.Set("uid", user.ID)
diff --git a/services/auth/basic.go b/services/auth/basic.go
index f259ad5f69..4ffe712744 100644
--- a/services/auth/basic.go
+++ b/services/auth/basic.go
@@ -151,6 +151,7 @@ func (b *Basic) Verify(req *http.Request, w http.ResponseWriter, store DataStore
log.Trace("Basic Authorization: Logged in user %-v", u)
+ store.GetData()["IsPasswordLogin"] = true
return u, nil
}
diff --git a/services/auth/oauth2.go b/services/auth/oauth2.go
index 093940aa18..fa13c20a7f 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"
@@ -121,11 +122,23 @@ 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 != "" {
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)
+ })
+ }
+}
diff --git a/services/context/org.go b/services/context/org.go
index 3ddc40b6b3..c7d06b9bcc 100644
--- a/services/context/org.go
+++ b/services/context/org.go
@@ -16,6 +16,7 @@ import (
"forgejo.org/modules/markup/markdown"
"forgejo.org/modules/setting"
"forgejo.org/modules/structs"
+ redirect_service "forgejo.org/services/redirect"
)
// Organization contains organization context
@@ -48,13 +49,13 @@ func GetOrganizationByParams(ctx *Context) {
ctx.Org.Organization, err = organization.GetOrgByName(ctx, orgName)
if err != nil {
if organization.IsErrOrgNotExist(err) {
- redirectUserID, err := user_model.LookupUserRedirect(ctx, orgName)
+ redirectUserID, err := redirect_service.LookupUserRedirect(ctx, ctx.Doer, orgName)
if err == nil {
RedirectToUser(ctx.Base, orgName, redirectUserID)
} else if user_model.IsErrUserRedirectNotExist(err) {
ctx.NotFound("GetUserByName", err)
} else {
- ctx.ServerError("LookupUserRedirect", err)
+ ctx.ServerError("LookupRedirect", err)
}
} else {
ctx.ServerError("GetUserByName", err)
diff --git a/services/context/repo.go b/services/context/repo.go
index cce3a5fa70..2a70c0b08b 100644
--- a/services/context/repo.go
+++ b/services/context/repo.go
@@ -35,6 +35,7 @@ import (
"forgejo.org/modules/setting"
"forgejo.org/modules/util"
asymkey_service "forgejo.org/services/asymkey"
+ redirect_service "forgejo.org/services/redirect"
"github.com/editorconfig/editorconfig-core-go/v2"
)
@@ -477,12 +478,12 @@ func RepoAssignment(ctx *Context) context.CancelFunc {
return nil
}
- if redirectUserID, err := user_model.LookupUserRedirect(ctx, userName); err == nil {
+ if redirectUserID, err := redirect_service.LookupUserRedirect(ctx, ctx.Doer, userName); err == nil {
RedirectToUser(ctx.Base, userName, redirectUserID)
} else if user_model.IsErrUserRedirectNotExist(err) {
ctx.NotFound("GetUserByName", nil)
} else {
- ctx.ServerError("LookupUserRedirect", err)
+ ctx.ServerError("LookupRedirect", err)
}
} else {
ctx.ServerError("GetUserByName", err)
@@ -519,7 +520,7 @@ func RepoAssignment(ctx *Context) context.CancelFunc {
repo, err := repo_model.GetRepositoryByName(ctx, owner.ID, repoName)
if err != nil {
if repo_model.IsErrRepoNotExist(err) {
- redirectRepoID, err := repo_model.LookupRedirect(ctx, owner.ID, repoName)
+ redirectRepoID, err := redirect_service.LookupRepoRedirect(ctx, ctx.Doer, owner.ID, repoName)
if err == nil {
RedirectToRepo(ctx.Base, redirectRepoID)
} else if repo_model.IsErrRedirectNotExist(err) {
diff --git a/services/context/user.go b/services/context/user.go
index a82c90d7a6..63260a49aa 100644
--- a/services/context/user.go
+++ b/services/context/user.go
@@ -9,6 +9,7 @@ import (
"strings"
user_model "forgejo.org/models/user"
+ redirect_service "forgejo.org/services/redirect"
)
// UserAssignmentWeb returns a middleware to handle context-user assignment for web routes
@@ -68,12 +69,12 @@ func userAssignment(ctx *Base, doer *user_model.User, errCb func(int, string, an
contextUser, err = user_model.GetUserByName(ctx, username)
if err != nil {
if user_model.IsErrUserNotExist(err) {
- if redirectUserID, err := user_model.LookupUserRedirect(ctx, username); err == nil {
+ if redirectUserID, err := redirect_service.LookupUserRedirect(ctx, doer, username); err == nil {
RedirectToUser(ctx, username, redirectUserID)
} else if user_model.IsErrUserRedirectNotExist(err) {
errCb(http.StatusNotFound, "GetUserByName", err)
} else {
- errCb(http.StatusInternalServerError, "LookupUserRedirect", err)
+ errCb(http.StatusInternalServerError, "LookupRedirect", err)
}
} else {
errCb(http.StatusInternalServerError, "GetUserByName", err)
diff --git a/services/convert/attachment.go b/services/convert/attachment.go
index 6617aac906..74ae7c509c 100644
--- a/services/convert/attachment.go
+++ b/services/convert/attachment.go
@@ -4,6 +4,9 @@
package convert
import (
+ "mime"
+ "path/filepath"
+
repo_model "forgejo.org/models/repo"
api "forgejo.org/modules/structs"
)
@@ -20,9 +23,13 @@ func APIAssetDownloadURL(repo *repo_model.Repository, attach *repo_model.Attachm
return attach.DownloadURL()
}
-// ToAttachment converts models.Attachment to api.Attachment for API usage
-func ToAttachment(repo *repo_model.Repository, a *repo_model.Attachment) *api.Attachment {
- return toAttachment(repo, a, WebAssetDownloadURL)
+// ToWebAttachment converts models.Attachment to api.WebAttachment for API usage
+func ToWebAttachment(repo *repo_model.Repository, a *repo_model.Attachment) *api.WebAttachment {
+ attachment := toAttachment(repo, a, WebAssetDownloadURL)
+ return &api.WebAttachment{
+ Attachment: attachment,
+ MimeType: mime.TypeByExtension(filepath.Ext(attachment.Name)),
+ }
}
// ToAPIAttachment converts models.Attachment to api.Attachment for API usage
diff --git a/services/convert/attachment_test.go b/services/convert/attachment_test.go
new file mode 100644
index 0000000000..d7bf0c1ee7
--- /dev/null
+++ b/services/convert/attachment_test.go
@@ -0,0 +1,56 @@
+// Copyright 2025 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package convert
+
+import (
+ "fmt"
+ "testing"
+ "time"
+
+ repo_model "forgejo.org/models/repo"
+ "forgejo.org/models/unittest"
+ "forgejo.org/modules/setting"
+ api "forgejo.org/modules/structs"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestToWebAttachment(t *testing.T) {
+ require.NoError(t, unittest.PrepareTestDatabase())
+ headRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
+ attachment := &repo_model.Attachment{
+ ID: 10,
+ UUID: "uuidxxx",
+ RepoID: 1,
+ IssueID: 1,
+ ReleaseID: 0,
+ UploaderID: 0,
+ CommentID: 0,
+ Name: "test.png",
+ DownloadCount: 90,
+ Size: 30,
+ NoAutoTime: false,
+ CreatedUnix: 9342,
+ CustomDownloadURL: "",
+ ExternalURL: "",
+ }
+
+ webAttachment := ToWebAttachment(headRepo, attachment)
+
+ assert.NotNil(t, webAttachment)
+ assert.Equal(t, &api.WebAttachment{
+ Attachment: &api.Attachment{
+ ID: 10,
+ Name: "test.png",
+ Created: time.Unix(9342, 0),
+ DownloadCount: 90,
+ Size: 30,
+ UUID: "uuidxxx",
+ DownloadURL: fmt.Sprintf("%sattachments/uuidxxx", setting.AppURL),
+ Type: "attachment",
+ },
+ MimeType: "image/png",
+ }, webAttachment)
+}
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/services/forms/repo_form.go b/services/forms/repo_form.go
index bb81e939b0..3e9ef171a2 100644
--- a/services/forms/repo_form.go
+++ b/services/forms/repo_form.go
@@ -105,6 +105,9 @@ func ParseRemoteAddr(remoteAddr, authUsername, authPassword string) (string, err
if err != nil {
return "", &models.ErrInvalidCloneAddr{IsURLError: true, Host: remoteAddr}
}
+ if u.User != nil {
+ return "", &models.ErrInvalidCloneAddr{Host: remoteAddr, HasCredentials: true}
+ }
if len(authUsername)+len(authPassword) > 0 {
u.User = url.UserPassword(authUsername, authPassword)
}
diff --git a/services/forms/user_form.go b/services/forms/user_form.go
index dfd5b3da9b..8c95139e2c 100644
--- a/services/forms/user_form.go
+++ b/services/forms/user_form.go
@@ -109,7 +109,7 @@ func (f *RegisterForm) Validate(req *http.Request, errs binding.Errors) binding.
// The email is marked as allowed if it matches any of the
// domains in the whitelist or if it doesn't match any of
// domains in the blocklist, if any such list is not empty.
-func (f *RegisterForm) IsEmailDomainAllowed() bool {
+func (f *RegisterForm) IsEmailDomainAllowed() (validEmail, ok bool) {
return validation.IsEmailDomainAllowed(f.Email)
}
diff --git a/services/forms/user_form_test.go b/services/forms/user_form_test.go
index ae08f65f23..4ce63ab552 100644
--- a/services/forms/user_form_test.go
+++ b/services/forms/user_form_test.go
@@ -20,7 +20,9 @@ func TestRegisterForm_IsDomainAllowed_Empty(t *testing.T) {
form := RegisterForm{}
- assert.True(t, form.IsEmailDomainAllowed())
+ emailValid, ok := form.IsEmailDomainAllowed()
+ assert.False(t, emailValid)
+ assert.False(t, ok)
}
func TestRegisterForm_IsDomainAllowed_InvalidEmail(t *testing.T) {
@@ -36,7 +38,8 @@ func TestRegisterForm_IsDomainAllowed_InvalidEmail(t *testing.T) {
for _, v := range tt {
form := RegisterForm{Email: v.email}
- assert.False(t, form.IsEmailDomainAllowed())
+ _, ok := form.IsEmailDomainAllowed()
+ assert.False(t, ok)
}
}
@@ -59,7 +62,8 @@ func TestRegisterForm_IsDomainAllowed_AllowedEmail(t *testing.T) {
for _, v := range tt {
form := RegisterForm{Email: v.email}
- assert.Equal(t, v.valid, form.IsEmailDomainAllowed())
+ _, ok := form.IsEmailDomainAllowed()
+ assert.Equal(t, v.valid, ok)
}
}
@@ -72,7 +76,6 @@ func TestRegisterForm_IsDomainAllowed_BlockedEmail(t *testing.T) {
}{
{"security@gitea.io", false},
{"security@gitea.example", true},
- {"invalid", true},
{"user@my.block", false},
{"user@my.block1", true},
@@ -81,7 +84,8 @@ func TestRegisterForm_IsDomainAllowed_BlockedEmail(t *testing.T) {
for _, v := range tt {
form := RegisterForm{Email: v.email}
- assert.Equal(t, v.valid, form.IsEmailDomainAllowed())
+ _, ok := form.IsEmailDomainAllowed()
+ assert.Equal(t, v.valid, ok)
}
}
diff --git a/services/gitdiff/gitdiff.go b/services/gitdiff/gitdiff.go
index 989f69d4f4..35f8cd3821 100644
--- a/services/gitdiff/gitdiff.go
+++ b/services/gitdiff/gitdiff.go
@@ -85,11 +85,20 @@ type DiffLine struct {
// DiffLineSectionInfo represents diff line section meta data
type DiffLineSectionInfo struct {
- Path string
- LastLeftIdx int
- LastRightIdx int
- LeftIdx int
- RightIdx int
+ Path string
+
+ // Last(Left/Right)Idx do not directly relate to this diff section, but indicate the last line number in the
+ // previous diff section. Set to 0 for the first diff section of a file, and 1 for the first line of code in the
+ // file.
+ LastLeftIdx int
+ LastRightIdx int
+
+ // (Left/Right)Idx are the first line number in this diff section
+ LeftIdx int
+ RightIdx int
+
+ // Number of lines contained within each diff section. In the UI, these fields are set to 0 in cases where a
+ // section is being used as a placeholder at the end of a diff to allow expansion into the remainder of the file.
LeftHunkSize int
RightHunkSize int
}
@@ -157,7 +166,7 @@ func (d *DiffLine) GetExpandDirection() DiffLineExpandDirection {
}
if d.SectionInfo.LastLeftIdx <= 0 && d.SectionInfo.LastRightIdx <= 0 {
return DiffLineExpandUp
- } else if d.SectionInfo.RightIdx-d.SectionInfo.LastRightIdx > BlobExcerptChunkSize && d.SectionInfo.RightHunkSize > 0 {
+ } else if d.SectionInfo.RightIdx-d.SectionInfo.LastRightIdx-1 > BlobExcerptChunkSize && d.SectionInfo.RightHunkSize > 0 {
return DiffLineExpandUpDown
} else if d.SectionInfo.LeftHunkSize <= 0 && d.SectionInfo.RightHunkSize <= 0 {
return DiffLineExpandDown
diff --git a/services/gitdiff/gitdiff_test.go b/services/gitdiff/gitdiff_test.go
index 3d3c8432c4..9354abd656 100644
--- a/services/gitdiff/gitdiff_test.go
+++ b/services/gitdiff/gitdiff_test.go
@@ -715,6 +715,163 @@ func TestGetDiffFull(t *testing.T) {
})
}
+func TestDiffLine_GetExpandDirection(t *testing.T) {
+ tests := []struct {
+ name string
+ diffLine *DiffLine
+ expectedResult DiffLineExpandDirection
+ }{
+ {
+ name: "non-section line - no expansion",
+ diffLine: &DiffLine{
+ Type: DiffLineAdd,
+ SectionInfo: &DiffLineSectionInfo{},
+ },
+ expectedResult: DiffLineExpandNone,
+ },
+ {
+ name: "nil section info - no expansion",
+ diffLine: &DiffLine{
+ Type: DiffLineSection,
+ SectionInfo: nil,
+ },
+ expectedResult: DiffLineExpandNone,
+ },
+ {
+ name: "no lines between",
+ diffLine: &DiffLine{
+ Type: DiffLineSection,
+ SectionInfo: &DiffLineSectionInfo{
+ // Previous section of the diff displayed up to line 530...
+ LastRightIdx: 530,
+ LastLeftIdx: 530,
+ // This section of the diff starts at line 531...
+ RightIdx: 531,
+ LeftIdx: 531,
+ },
+ },
+ // There are zero lines between 530 and 531, so we should have nothing to expand.
+ expectedResult: DiffLineExpandNone,
+ },
+ {
+ name: "first diff section is the start of the file",
+ diffLine: &DiffLine{
+ Type: DiffLineSection,
+ SectionInfo: &DiffLineSectionInfo{
+ // Last[...]Idx is set to zero when it's the first section in the file (and not 1, which would be
+ // the first section -is- the first line of the file).
+ LastRightIdx: 0,
+ LastLeftIdx: 0,
+ // The diff section is showing line 1, the top of th efile.
+ RightIdx: 1,
+ LeftIdx: 1,
+ },
+ },
+ // We're at the top of the file; no expansion.
+ expectedResult: DiffLineExpandNone,
+ },
+ {
+ name: "first diff section doesn't start at the top of the file",
+ diffLine: &DiffLine{
+ Type: DiffLineSection,
+ SectionInfo: &DiffLineSectionInfo{
+ // Last[...]Idx is set to zero when it's the first section in the file (and not 1, which would be
+ // the first section -is- the first line of the file).
+ LastRightIdx: 0,
+ LastLeftIdx: 0,
+ RightIdx: 531,
+ LeftIdx: 531,
+ },
+ },
+ // We're at the top of the diff but there's content above, so can only expand up.
+ expectedResult: DiffLineExpandUp,
+ },
+ {
+ name: "middle of the file with single expansion",
+ diffLine: &DiffLine{
+ Type: DiffLineSection,
+ SectionInfo: &DiffLineSectionInfo{
+ // Previous section ended at ~500...
+ LastRightIdx: 500,
+ LastLeftIdx: 500,
+ // Next section starts one line away...
+ RightIdx: 502,
+ LeftIdx: 502,
+ // The next block has content (> 0)
+ RightHunkSize: 50,
+ LeftHunkSize: 50,
+ },
+ },
+ // Can be expanded in a single direction, displaying the missing line (501).
+ expectedResult: DiffLineExpandSingle,
+ },
+ {
+ name: "middle of the file with multi line expansion",
+ diffLine: &DiffLine{
+ Type: DiffLineSection,
+ SectionInfo: &DiffLineSectionInfo{
+ // Previous section ended at ~500...
+ LastRightIdx: 500,
+ LastLeftIdx: 500,
+ // Lines 501-520 are hidden, exactly 20 lines, matching BlobExcerptChunkSize (20)...
+ RightIdx: 521,
+ LeftIdx: 521,
+ // The next block has content (> 0)
+ RightHunkSize: 50,
+ LeftHunkSize: 50,
+ },
+ },
+ // Can be expanded in a single direction, displaying all the hidden 20 lines.
+ expectedResult: DiffLineExpandSingle,
+ },
+ {
+ name: "middle of the file with multi direction expansion",
+ diffLine: &DiffLine{
+ Type: DiffLineSection,
+ SectionInfo: &DiffLineSectionInfo{
+ // Previous section ended at ~500...
+ LastRightIdx: 500,
+ LastLeftIdx: 500,
+ // Lines 501-521 are hidden, exactly 21 lines, exceeding BlobExcerptChunkSize (20)...
+ RightIdx: 522,
+ LeftIdx: 522,
+ // The next block has content (> 0)
+ RightHunkSize: 50,
+ LeftHunkSize: 50,
+ },
+ },
+ // Now can be expanded down to display from 501-520 (521 remains hidden), or up to display 502-521 (501
+ // remains hidden).
+ expectedResult: DiffLineExpandUpDown,
+ },
+ {
+ name: "end of the diff but still file content to display",
+ diffLine: &DiffLine{
+ Type: DiffLineSection,
+ SectionInfo: &DiffLineSectionInfo{
+ // We had a previous diff section, of any size/location...
+ LastRightIdx: 200,
+ LastLeftIdx: 200,
+ RightIdx: 531,
+ LeftIdx: 531,
+ // Hunk size size 0 is a placeholder value for the end or beginning of a file...
+ RightHunkSize: 0,
+ LeftHunkSize: 0,
+ },
+ },
+ // Combination of conditions says we're at the end of the last diff section, can only expand down.
+ expectedResult: DiffLineExpandDown,
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ result := tt.diffLine.GetExpandDirection()
+ assert.Equal(t, tt.expectedResult, result)
+ })
+ }
+}
+
func TestNoCrashes(t *testing.T) {
type testcase struct {
gitdiff string
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/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/services/mailer/mail_actions.go b/services/mailer/mail_actions.go
index 09763e164e..a99af823b3 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
@@ -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 6a01ea7631..e84441f460 100644
--- a/services/mailer/mail_actions_now_done_test.go
+++ b/services/mailer/mail_actions_now_done_test.go
@@ -54,7 +54,92 @@ 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) {
+ 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) {
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 {
diff --git a/services/migrations/gitbucket.go b/services/migrations/gitbucket.go
index b68fc01083..a9bd2dafb0 100644
--- a/services/migrations/gitbucket.go
+++ b/services/migrations/gitbucket.go
@@ -71,7 +71,7 @@ func (g *GitBucketDownloader) LogString() string {
// NewGitBucketDownloader creates a GitBucket downloader
func NewGitBucketDownloader(ctx context.Context, baseURL, userName, password, token, repoOwner, repoName string) *GitBucketDownloader {
- githubDownloader := NewGithubDownloaderV3(ctx, baseURL, userName, password, token, repoOwner, repoName)
+ githubDownloader := NewGithubDownloaderV3(ctx, baseURL, true, true, userName, password, token, repoOwner, repoName)
// Gitbucket 4.40 uses different internal hard-coded perPage values.
// Issues, PRs, and other major parts use 25. Release page uses 10.
// Some API doesn't support paging yet. Sounds difficult, but using
diff --git a/services/migrations/gitbucket_test.go b/services/migrations/gitbucket_test.go
new file mode 100644
index 0000000000..3cb69d65c9
--- /dev/null
+++ b/services/migrations/gitbucket_test.go
@@ -0,0 +1,24 @@
+// Copyright 2025 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package migrations
+
+import (
+ "os"
+ "testing"
+
+ "forgejo.org/models/unittest"
+
+ "github.com/stretchr/testify/require"
+)
+
+func TestGitbucketDownloaderCreation(t *testing.T) {
+ token := os.Getenv("GITHUB_READ_TOKEN")
+ fixturePath := "./testdata/github/full_download"
+ server := unittest.NewMockWebServer(t, "https://api.github.com", fixturePath, false)
+ defer server.Close()
+
+ downloader := NewGitBucketDownloader(t.Context(), server.URL, "", "", token, "forgejo", "test_repo")
+ err := downloader.RefreshRate()
+ require.NoError(t, err)
+}
diff --git a/services/migrations/gitea_uploader_test.go b/services/migrations/gitea_uploader_test.go
index 85e733cc51..e33d597cdc 100644
--- a/services/migrations/gitea_uploader_test.go
+++ b/services/migrations/gitea_uploader_test.go
@@ -19,7 +19,6 @@ import (
user_model "forgejo.org/models/user"
"forgejo.org/modules/git"
"forgejo.org/modules/gitrepo"
- "forgejo.org/modules/graceful"
"forgejo.org/modules/log"
base "forgejo.org/modules/migration"
"forgejo.org/modules/optional"
@@ -30,6 +29,130 @@ import (
"github.com/stretchr/testify/require"
)
+func TestCommentUpload(t *testing.T) {
+ unittest.PrepareTestEnv(t)
+ user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
+ var (
+ opts = base.MigrateOptions{
+ Issues: true,
+ }
+ repoName = "test_repo"
+ uploader = NewGiteaLocalUploader(t.Context(), user, user.Name, repoName)
+ )
+ defer uploader.Close()
+
+ fixturePath := "./testdata/github/full_download"
+ server := unittest.NewMockWebServer(t, "https://api.github.com", fixturePath, false)
+ defer server.Close()
+
+ // Mock Data
+ repoMock := &base.Repository{
+ Name: repoName,
+ Owner: "forgejo",
+ Description: "Some mock repo",
+ CloneURL: server.URL + "/forgejo/test_repo.git",
+ OriginalURL: server.URL + "/forgejo/test_repo",
+ DefaultBranch: "master",
+ Website: "https://codeberg.org/forgejo/forgejo/",
+ }
+
+ // Create Repo
+ require.NoError(t, uploader.CreateRepo(repoMock, opts))
+
+ repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: user.ID, Name: repoName})
+
+ // Create and Test Issues Uploading
+ issueA := &base.Issue{
+ Title: "First issue",
+ Number: 0,
+ PosterID: 37243484,
+ PosterName: "PatDyn",
+ PosterEmail: "",
+ Content: "Mock Content",
+ Milestone: "Mock Milestone",
+ State: "open",
+ Created: time.Date(2025, 8, 7, 12, 44, 7, 0, time.UTC),
+ Updated: time.Date(2025, 8, 7, 12, 44, 47, 0, time.UTC),
+ Labels: nil,
+ Reactions: nil,
+ Closed: nil,
+ IsLocked: false,
+ Assignees: nil,
+ ForeignIndex: 0,
+ }
+
+ issueB := &base.Issue{
+ Title: "Second Issue",
+ Number: 1,
+ PosterID: 37243484,
+ PosterName: "PatDyn",
+ PosterEmail: "",
+ Content: "Mock Content",
+ Milestone: "Mock Milestone",
+ State: "open",
+ Created: time.Date(2025, 8, 7, 12, 45, 44, 0, time.UTC),
+ Updated: time.Date(2025, 8, 7, 13, 7, 25, 0, time.UTC),
+ Labels: nil,
+ Reactions: nil,
+ Closed: nil,
+ IsLocked: false,
+ Assignees: nil,
+ ForeignIndex: 1,
+ }
+
+ err := uploader.CreateIssues(issueA, issueB)
+ require.NoError(t, err)
+
+ issues, err := issues_model.Issues(db.DefaultContext, &issues_model.IssuesOptions{
+ RepoIDs: []int64{repo.ID},
+ IsPull: optional.Some(false),
+ SortType: "newest",
+ })
+ require.NoError(t, err)
+ assert.Len(t, issues, 2)
+
+ // Create and Test Comment Uploading
+ issueAComment := &base.Comment{
+ IssueIndex: 0,
+ Index: 0,
+ CommentType: "comment",
+ PosterID: 37243484,
+ PosterName: "PatDyn",
+ PosterEmail: "",
+ Created: time.Date(2025, 8, 7, 12, 44, 24, 0, time.UTC),
+ Updated: time.Date(2025, 8, 7, 12, 44, 24, 0, time.UTC),
+ Content: "First Mock Comment",
+ Reactions: nil,
+ Meta: nil,
+ }
+ issueBComment := &base.Comment{
+ IssueIndex: 1,
+ Index: 1,
+ CommentType: "comment",
+ PosterID: 37243484,
+ PosterName: "PatDyn",
+ PosterEmail: "",
+ Created: time.Date(2025, 8, 7, 13, 7, 25, 0, time.UTC),
+ Updated: time.Date(2025, 8, 7, 13, 7, 25, 0, time.UTC),
+ Content: "Second Mock Comment",
+ Reactions: nil,
+ Meta: nil,
+ }
+ require.NoError(t, uploader.CreateComments(issueBComment, issueAComment))
+
+ issues, err = issues_model.Issues(db.DefaultContext, &issues_model.IssuesOptions{
+ RepoIDs: []int64{repo.ID},
+ IsPull: optional.Some(false),
+ SortType: "newest",
+ })
+ require.NoError(t, err)
+ assert.Len(t, issues, 2)
+ require.NoError(t, issues[0].LoadDiscussComments(db.DefaultContext))
+ require.NoError(t, issues[1].LoadDiscussComments(db.DefaultContext))
+ assert.Len(t, issues[0].Comments, 1)
+ assert.Len(t, issues[1].Comments, 1)
+}
+
func TestGiteaUploadRepo(t *testing.T) {
// FIXME: Since no accesskey or user/password will trigger rate limit of github, just skip
t.Skip()
@@ -40,9 +163,9 @@ func TestGiteaUploadRepo(t *testing.T) {
var (
ctx = t.Context()
- downloader = NewGithubDownloaderV3(ctx, "https://github.com", "", "", "", "go-xorm", "builder")
+ downloader = NewGithubDownloaderV3(ctx, "https://github.com", true, true, "", "", "", "go-xorm", "builder")
repoName = "builder-" + time.Now().Format("2006-01-02-15-04-05")
- uploader = NewGiteaLocalUploader(graceful.GetManager().HammerContext(), user, user.Name, repoName)
+ uploader = NewGiteaLocalUploader(t.Context(), user, user.Name, repoName)
)
err := migrateRepository(db.DefaultContext, user, downloader, uploader, base.MigrateOptions{
diff --git a/services/migrations/github.go b/services/migrations/github.go
index 9721c86180..1fe5d2cc8e 100644
--- a/services/migrations/github.go
+++ b/services/migrations/github.go
@@ -57,7 +57,7 @@ func (f *GithubDownloaderV3Factory) New(ctx context.Context, opts base.MigrateOp
log.Trace("Create github downloader BaseURL: %s %s/%s", baseURL, oldOwner, oldName)
- return NewGithubDownloaderV3(ctx, baseURL, opts.AuthUsername, opts.AuthPassword, opts.AuthToken, oldOwner, oldName), nil
+ return NewGithubDownloaderV3(ctx, baseURL, opts.PullRequests, opts.Issues, opts.AuthUsername, opts.AuthPassword, opts.AuthToken, oldOwner, oldName), nil
}
// GitServiceType returns the type of git service
@@ -69,30 +69,34 @@ func (f *GithubDownloaderV3Factory) GitServiceType() structs.GitServiceType {
// from github via APIv3
type GithubDownloaderV3 struct {
base.NullDownloader
- ctx context.Context
- clients []*github.Client
- baseURL string
- repoOwner string
- repoName string
- userName string
- password string
- rates []*github.Rate
- curClientIdx int
- maxPerPage int
- SkipReactions bool
- SkipReviews bool
+ ctx context.Context
+ clients []*github.Client
+ baseURL string
+ repoOwner string
+ repoName string
+ userName string
+ password string
+ getPullRequests bool
+ getIssues bool
+ rates []*github.Rate
+ curClientIdx int
+ maxPerPage int
+ SkipReactions bool
+ SkipReviews bool
}
// NewGithubDownloaderV3 creates a github Downloader via github v3 API
-func NewGithubDownloaderV3(ctx context.Context, baseURL, userName, password, token, repoOwner, repoName string) *GithubDownloaderV3 {
+func NewGithubDownloaderV3(ctx context.Context, baseURL string, getPullRequests, getIssues bool, userName, password, token, repoOwner, repoName string) *GithubDownloaderV3 {
downloader := GithubDownloaderV3{
- userName: userName,
- baseURL: baseURL,
- password: password,
- ctx: ctx,
- repoOwner: repoOwner,
- repoName: repoName,
- maxPerPage: 100,
+ userName: userName,
+ baseURL: baseURL,
+ password: password,
+ ctx: ctx,
+ repoOwner: repoOwner,
+ repoName: repoName,
+ maxPerPage: 100,
+ getPullRequests: getPullRequests,
+ getIssues: getIssues,
}
if token != "" {
@@ -364,7 +368,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
@@ -581,6 +586,24 @@ func (g *GithubDownloaderV3) getComments(commentable base.Commentable) ([]*base.
return allComments, nil
}
+func (g *GithubDownloaderV3) filterByHTMLURL(comments []*github.IssueComment, filterBy string) []*github.IssueComment {
+ var result []*github.IssueComment
+ for _, val := range comments {
+ if !strings.Contains(*val.HTMLURL, filterBy) {
+ result = append(result, val)
+ }
+ }
+ return result
+}
+
+func (g *GithubDownloaderV3) filterPRComments(comments []*github.IssueComment) []*github.IssueComment {
+ return g.filterByHTMLURL(comments, "/pull/")
+}
+
+func (g *GithubDownloaderV3) filterIssueComments(comments []*github.IssueComment) []*github.IssueComment {
+ return g.filterByHTMLURL(comments, "/issues/")
+}
+
// GetAllComments returns repository comments according page and perPageSize
func (g *GithubDownloaderV3) GetAllComments(page, perPage int) ([]*base.Comment, bool, error) {
var (
@@ -607,6 +630,12 @@ func (g *GithubDownloaderV3) GetAllComments(page, perPage int) ([]*base.Comment,
}
isEnd := resp.NextPage == 0
+ if g.getIssues && !g.getPullRequests {
+ comments = g.filterPRComments(comments)
+ } else if !g.getIssues && g.getPullRequests {
+ comments = g.filterIssueComments(comments)
+ }
+
log.Trace("Request get comments %d/%d, but in fact get %d, next page is %d", perPage, page, len(comments), resp.NextPage)
g.setRate(&resp.Rate)
for _, comment := range comments {
diff --git a/services/migrations/github_test.go b/services/migrations/github_test.go
index c5e24ebbcd..ef2850d2d2 100644
--- a/services/migrations/github_test.go
+++ b/services/migrations/github_test.go
@@ -12,19 +12,100 @@ import (
"forgejo.org/models/unittest"
base "forgejo.org/modules/migration"
+ "github.com/google/go-github/v64/github"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
+func TestGithubDownloaderFilterComments(t *testing.T) {
+ GithubLimitRateRemaining = 3 // Wait at 3 remaining since we could have 3 CI in //
+
+ token := os.Getenv("GITHUB_READ_TOKEN")
+ fixturePath := "./testdata/github/full_download"
+ server := unittest.NewMockWebServer(t, "https://api.github.com", fixturePath, false)
+ defer server.Close()
+
+ downloader := NewGithubDownloaderV3(t.Context(), server.URL, true, true, "", "", token, "forgejo", "test_repo")
+ err := downloader.RefreshRate()
+ require.NoError(t, err)
+
+ var githubComments []*github.IssueComment
+ issueID := int64(7)
+ iNodeID := "MDEyOklzc3VlQ29tbWVudDE=" // "IssueComment1"
+ iBody := "Hello"
+ iCreated := new(github.Timestamp)
+ iUpdated := new(github.Timestamp)
+ iCreated.Time = time.Date(2025, 1, 1, 12, 0, 0, 0, time.UTC)
+ iUpdated.Time = time.Date(2025, 1, 1, 12, 1, 0, 0, time.UTC)
+ iAssociation := "COLLABORATOR"
+ iURL := "https://api.github.com/repos/forgejo/test_repo/issues/comments/3164032267"
+ iHTMLURL := "https://github.com/forgejo/test_repo/issues/1#issuecomment-3164032267"
+ iIssueURL := "https://api.github.com/repos/forgejo/test_repo/issues/1"
+
+ githubComments = append(githubComments,
+ &github.IssueComment{
+ ID: &issueID,
+ NodeID: &iNodeID,
+ Body: &iBody,
+ Reactions: nil,
+ CreatedAt: iCreated,
+ UpdatedAt: iUpdated,
+ AuthorAssociation: &iAssociation,
+ URL: &iURL,
+ HTMLURL: &iHTMLURL,
+ IssueURL: &iIssueURL,
+ },
+ )
+
+ prID := int64(4)
+ pNodeID := "IC_kwDOPQx9Mc65LHhx"
+ pBody := "Hello"
+ pCreated := new(github.Timestamp)
+ pUpdated := new(github.Timestamp)
+ pCreated.Time = time.Date(2025, 1, 1, 11, 0, 0, 0, time.UTC)
+ pUpdated.Time = time.Date(2025, 1, 1, 11, 1, 0, 0, time.UTC)
+ pAssociation := "COLLABORATOR"
+ pURL := "https://api.github.com/repos/forgejo/test_repo/issues/comments/3164118916"
+ pHTMLURL := "https://github.com/forgejo/test_repo/pull/3#issuecomment-3164118916"
+ pIssueURL := "https://api.github.com/repos/forgejo/test_repo/issues/3"
+
+ githubComments = append(githubComments, &github.IssueComment{
+ ID: &prID,
+ NodeID: &pNodeID,
+ Body: &pBody,
+ Reactions: nil,
+ CreatedAt: pCreated,
+ UpdatedAt: pUpdated,
+ AuthorAssociation: &pAssociation,
+ URL: &pURL,
+ HTMLURL: &pHTMLURL,
+ IssueURL: &pIssueURL,
+ })
+
+ filteredComments := downloader.filterPRComments(githubComments)
+
+ // Check each issue index not being from the PR
+ for _, comment := range filteredComments {
+ assert.NotEqual(t, *comment.ID, prID)
+ }
+
+ filteredComments = downloader.filterIssueComments(githubComments)
+
+ // Check each issue index not being from the issue
+ for _, comment := range filteredComments {
+ assert.NotEqual(t, *comment.ID, issueID)
+ }
+}
+
func TestGitHubDownloadRepo(t *testing.T) {
GithubLimitRateRemaining = 3 // Wait at 3 remaining since we could have 3 CI in //
token := os.Getenv("GITHUB_READ_TOKEN")
fixturePath := "./testdata/github/full_download"
- server := unittest.NewMockWebServer(t, "https://api.github.com", fixturePath, token != "")
+ server := unittest.NewMockWebServer(t, "https://api.github.com", fixturePath, false)
defer server.Close()
- downloader := NewGithubDownloaderV3(t.Context(), server.URL, "", "", token, "go-gitea", "test_repo")
+ downloader := NewGithubDownloaderV3(t.Context(), server.URL, true, true, "", "", token, "forgejo", "test_repo")
err := downloader.RefreshRate()
require.NoError(t, err)
@@ -32,38 +113,44 @@ func TestGitHubDownloadRepo(t *testing.T) {
require.NoError(t, err)
assertRepositoryEqual(t, &base.Repository{
Name: "test_repo",
- Owner: "go-gitea",
- Description: "Test repository for testing migration from github to gitea",
- CloneURL: server.URL + "/go-gitea/test_repo.git",
- OriginalURL: server.URL + "/go-gitea/test_repo",
- DefaultBranch: "master",
+ Owner: "forgejo",
+ Description: "Exclusively used for testing Github->Forgejo migration",
+ CloneURL: server.URL + "/forgejo/test_repo.git",
+ OriginalURL: server.URL + "/forgejo/test_repo",
+ DefaultBranch: "main",
Website: "https://codeberg.org/forgejo/forgejo/",
}, repo)
topics, err := downloader.GetTopics()
require.NoError(t, err)
- assert.Contains(t, topics, "gitea")
+ assert.Contains(t, topics, "forgejo")
milestones, err := downloader.GetMilestones()
require.NoError(t, err)
assertMilestonesEqual(t, []*base.Milestone{
{
Title: "1.0.0",
- Description: "Milestone 1.0.0",
- Deadline: timePtr(time.Date(2019, 11, 11, 8, 0, 0, 0, time.UTC)),
- Created: time.Date(2019, 11, 12, 19, 37, 8, 0, time.UTC),
- Updated: timePtr(time.Date(2019, 11, 12, 21, 56, 17, 0, time.UTC)),
- Closed: timePtr(time.Date(2019, 11, 12, 19, 45, 49, 0, time.UTC)),
+ Description: "Version 1",
+ Created: time.Date(2025, 8, 7, 12, 48, 56, 0, time.UTC),
+ Updated: timePtr(time.Date(2025, time.August, 12, 12, 34, 20, 0, time.UTC)),
+ State: "open",
+ },
+ {
+ Title: "0.9.0",
+ Description: "A milestone",
+ Deadline: timePtr(time.Date(2025, 8, 1, 7, 0, 0, 0, time.UTC)),
+ Created: time.Date(2025, 8, 7, 12, 54, 20, 0, time.UTC),
+ Updated: timePtr(time.Date(2025, 8, 12, 11, 29, 52, 0, time.UTC)),
+ Closed: timePtr(time.Date(2025, 8, 7, 12, 54, 38, 0, time.UTC)),
State: "closed",
},
{
Title: "1.1.0",
- Description: "Milestone 1.1.0",
- Deadline: timePtr(time.Date(2019, 11, 12, 8, 0, 0, 0, time.UTC)),
- Created: time.Date(2019, 11, 12, 19, 37, 25, 0, time.UTC),
- Updated: timePtr(time.Date(2019, 11, 12, 21, 39, 27, 0, time.UTC)),
- Closed: timePtr(time.Date(2019, 11, 12, 19, 45, 46, 0, time.UTC)),
- State: "closed",
+ Description: "We can do that",
+ Deadline: timePtr(time.Date(2025, 8, 31, 7, 0, 0, 0, time.UTC)),
+ Created: time.Date(2025, 8, 7, 12, 50, 58, 0, time.UTC),
+ Updated: timePtr(time.Date(2025, 8, 7, 12, 53, 15, 0, time.UTC)),
+ State: "open",
},
}, milestones)
@@ -117,18 +204,34 @@ func TestGitHubDownloadRepo(t *testing.T) {
},
}, labels)
+ id := int64(280443629)
+ ct := "application/pdf"
+ size := 550175
+ dc := 0
+
releases, err := downloader.GetReleases()
require.NoError(t, err)
assertReleasesEqual(t, []*base.Release{
{
- TagName: "v0.9.99",
- TargetCommitish: "master",
+ TagName: "v1.0",
+ TargetCommitish: "main",
Name: "First Release",
- Body: "A test release",
- Created: time.Date(2019, 11, 9, 16, 49, 21, 0, time.UTC),
- Published: time.Date(2019, 11, 12, 20, 12, 10, 0, time.UTC),
- PublisherID: 1669571,
- PublisherName: "mrsdizzie",
+ Body: "Hi, this is the first release! The asset contains the wireguard whitepaper, amazing read for such a simple protocol.",
+ Created: time.Date(2025, time.August, 7, 13, 2, 19, 0, time.UTC),
+ Published: time.Date(2025, time.August, 7, 13, 7, 49, 0, time.UTC),
+ PublisherID: 25481501,
+ PublisherName: "Gusted",
+ Assets: []*base.ReleaseAsset{
+ {
+ ID: id,
+ Name: "wireguard.pdf",
+ ContentType: &ct,
+ Size: &size,
+ DownloadCount: &dc,
+ Created: time.Date(2025, time.August, 7, 23, 39, 27, 0, time.UTC),
+ Updated: time.Date(2025, time.August, 7, 23, 39, 29, 0, time.UTC),
+ },
+ },
},
}, releases)
@@ -139,85 +242,41 @@ func TestGitHubDownloadRepo(t *testing.T) {
assertIssuesEqual(t, []*base.Issue{
{
Number: 1,
- Title: "Please add an animated gif icon to the merge button",
- Content: "I just want the merge button to hurt my eyes a little. \xF0\x9F\x98\x9D ",
- Milestone: "1.0.0",
- PosterID: 18600385,
- PosterName: "guillep2k",
- State: "closed",
- Created: time.Date(2019, 11, 9, 17, 0, 29, 0, time.UTC),
- Updated: time.Date(2019, 11, 12, 20, 29, 53, 0, time.UTC),
- Labels: []*base.Label{
- {
- Name: "bug",
- Color: "d73a4a",
- Description: "Something isn't working",
- },
- {
- Name: "good first issue",
- Color: "7057ff",
- Description: "Good for newcomers",
- },
- },
- Reactions: []*base.Reaction{
- {
- UserID: 1669571,
- UserName: "mrsdizzie",
- Content: "+1",
- },
- },
- Closed: timePtr(time.Date(2019, 11, 12, 20, 22, 22, 0, time.UTC)),
+ Title: "First issue",
+ Content: "This is an issue.",
+ PosterID: 37243484,
+ PosterName: "PatDyn",
+ State: "open",
+ Created: time.Date(2025, time.August, 7, 12, 44, 7, 0, time.UTC),
+ Updated: time.Date(2025, time.August, 7, 12, 44, 47, 0, time.UTC),
},
{
Number: 2,
- Title: "Test issue",
- Content: "This is test issue 2, do not touch!",
+ Title: "Second Issue",
+ Content: "Mentioning #1 ",
Milestone: "1.1.0",
- PosterID: 1669571,
- PosterName: "mrsdizzie",
- State: "closed",
- Created: time.Date(2019, 11, 12, 21, 0, 6, 0, time.UTC),
- Updated: time.Date(2019, 11, 12, 22, 7, 14, 0, time.UTC),
+ PosterID: 37243484,
+ PosterName: "PatDyn",
+ State: "open",
+ Created: time.Date(2025, 8, 7, 12, 45, 44, 0, time.UTC),
+ Updated: time.Date(2025, 8, 7, 13, 7, 25, 0, time.UTC),
Labels: []*base.Label{
{
Name: "duplicate",
Color: "cfd3d7",
Description: "This issue or pull request already exists",
},
- },
- Reactions: []*base.Reaction{
{
- UserID: 1669571,
- UserName: "mrsdizzie",
- Content: "heart",
+ Name: "good first issue",
+ Color: "7057ff",
+ Description: "Good for newcomers",
},
{
- UserID: 1669571,
- UserName: "mrsdizzie",
- Content: "laugh",
- },
- {
- UserID: 1669571,
- UserName: "mrsdizzie",
- Content: "-1",
- },
- {
- UserID: 1669571,
- UserName: "mrsdizzie",
- Content: "confused",
- },
- {
- UserID: 1669571,
- UserName: "mrsdizzie",
- Content: "hooray",
- },
- {
- UserID: 1669571,
- UserName: "mrsdizzie",
- Content: "+1",
+ Name: "help wanted",
+ Color: "008672",
+ Description: "Extra attention is needed",
},
},
- Closed: timePtr(time.Date(2019, 11, 12, 21, 1, 31, 0, time.UTC)),
},
}, issues)
@@ -227,26 +286,11 @@ func TestGitHubDownloadRepo(t *testing.T) {
assertCommentsEqual(t, []*base.Comment{
{
IssueIndex: 2,
- PosterID: 1669571,
- PosterName: "mrsdizzie",
- Created: time.Date(2019, 11, 12, 21, 0, 13, 0, time.UTC),
- Updated: time.Date(2019, 11, 12, 21, 0, 13, 0, time.UTC),
- Content: "This is a comment",
- Reactions: []*base.Reaction{
- {
- UserID: 1669571,
- UserName: "mrsdizzie",
- Content: "+1",
- },
- },
- },
- {
- IssueIndex: 2,
- PosterID: 1669571,
- PosterName: "mrsdizzie",
- Created: time.Date(2019, 11, 12, 22, 7, 14, 0, time.UTC),
- Updated: time.Date(2019, 11, 12, 22, 7, 14, 0, time.UTC),
- Content: "A second comment",
+ PosterID: 37243484,
+ PosterName: "PatDyn",
+ Created: time.Date(2025, time.August, 7, 13, 7, 25, 0, time.UTC),
+ Updated: time.Date(2025, time.August, 7, 13, 7, 25, 0, time.UTC),
+ Content: "Mentioning #3 \nWith some **bold** *statement*",
Reactions: nil,
},
}, comments)
@@ -257,52 +301,50 @@ func TestGitHubDownloadRepo(t *testing.T) {
assertPullRequestsEqual(t, []*base.PullRequest{
{
Number: 3,
- Title: "Update README.md",
- Content: "add warning to readme",
- Milestone: "1.1.0",
- PosterID: 1669571,
- PosterName: "mrsdizzie",
- State: "closed",
- Created: time.Date(2019, 11, 12, 21, 21, 43, 0, time.UTC),
- Updated: time.Date(2019, 11, 12, 21, 39, 28, 0, time.UTC),
+ Title: "Update readme.md",
+ Content: "Added a feature description",
+ Milestone: "1.0.0",
+ PosterID: 37243484,
+ PosterName: "PatDyn",
+ State: "open",
+ Created: time.Date(2025, time.August, 7, 12, 47, 6, 0, time.UTC),
+ Updated: time.Date(2025, time.August, 12, 13, 16, 49, 0, time.UTC),
Labels: []*base.Label{
{
- Name: "documentation",
- Color: "0075ca",
- Description: "Improvements or additions to documentation",
+ Name: "enhancement",
+ Color: "a2eeef",
+ Description: "New feature or request",
},
},
- PatchURL: server.URL + "/go-gitea/test_repo/pull/3.patch",
+ PatchURL: server.URL + "/forgejo/test_repo/pull/3.patch",
Head: base.PullRequestBranch{
- Ref: "master",
- CloneURL: server.URL + "/mrsdizzie/test_repo.git",
- SHA: "076160cf0b039f13e5eff19619932d181269414b",
+ Ref: "some-feature",
+ CloneURL: server.URL + "/forgejo/test_repo.git",
+ SHA: "c608ab3997349219e1510cdb5ddd1e5e82897dfa",
RepoName: "test_repo",
- OwnerName: "mrsdizzie",
+ OwnerName: "forgejo",
},
Base: base.PullRequestBranch{
- Ref: "master",
- SHA: "72866af952e98d02a73003501836074b286a78f6",
- OwnerName: "go-gitea",
+ Ref: "main",
+ SHA: "442d28a55b842472c95bead51a4c61f209ac1636",
+ OwnerName: "forgejo",
RepoName: "test_repo",
},
- Closed: timePtr(time.Date(2019, 11, 12, 21, 39, 27, 0, time.UTC)),
- Merged: true,
- MergedTime: timePtr(time.Date(2019, 11, 12, 21, 39, 27, 0, time.UTC)),
- MergeCommitSHA: "f32b0a9dfd09a60f616f29158f772cedd89942d2",
- ForeignIndex: 3,
+ ForeignIndex: 3,
},
{
- Number: 4,
- Title: "Test branch",
- Content: "do not merge this PR",
+ Number: 7,
+ Title: "Update readme.md",
+ Content: "Adding some text to the readme",
Milestone: "1.0.0",
- PosterID: 1669571,
- PosterName: "mrsdizzie",
- State: "open",
- Created: time.Date(2019, 11, 12, 21, 54, 18, 0, time.UTC),
- Updated: time.Date(2020, 1, 4, 11, 30, 1, 0, time.UTC),
+ PosterID: 37243484,
+ PosterName: "PatDyn",
+ State: "closed",
+ Created: time.Date(2025, time.August, 7, 13, 1, 36, 0, time.UTC),
+ Updated: time.Date(2025, time.August, 12, 12, 47, 35, 0, time.UTC),
+ Closed: timePtr(time.Date(2025, time.August, 7, 13, 2, 19, 0, time.UTC)),
+ MergedTime: timePtr(time.Date(2025, time.August, 7, 13, 2, 19, 0, time.UTC)),
Labels: []*base.Label{
{
Name: "bug",
@@ -310,35 +352,23 @@ func TestGitHubDownloadRepo(t *testing.T) {
Description: "Something isn't working",
},
},
- PatchURL: server.URL + "/go-gitea/test_repo/pull/4.patch",
+ PatchURL: server.URL + "/forgejo/test_repo/pull/7.patch",
Head: base.PullRequestBranch{
- Ref: "test-branch",
- SHA: "2be9101c543658591222acbee3eb799edfc3853d",
+ Ref: "another-feature",
+ SHA: "5638cb8f3278e467fc1eefcac14d3c0d5d91601f",
RepoName: "test_repo",
- OwnerName: "mrsdizzie",
- CloneURL: server.URL + "/mrsdizzie/test_repo.git",
+ OwnerName: "forgejo",
+ CloneURL: server.URL + "/forgejo/test_repo.git",
},
Base: base.PullRequestBranch{
- Ref: "master",
- SHA: "f32b0a9dfd09a60f616f29158f772cedd89942d2",
- OwnerName: "go-gitea",
+ Ref: "main",
+ SHA: "6dd0c6801ddbb7333787e73e99581279492ff449",
+ OwnerName: "forgejo",
RepoName: "test_repo",
},
- Merged: false,
- MergeCommitSHA: "565d1208f5fffdc1c5ae1a2436491eb9a5e4ebae",
- Reactions: []*base.Reaction{
- {
- UserID: 81045,
- UserName: "lunny",
- Content: "heart",
- },
- {
- UserID: 81045,
- UserName: "lunny",
- Content: "+1",
- },
- },
- ForeignIndex: 4,
+ Merged: true,
+ MergeCommitSHA: "ca43b48ca2c461f9a5cb66500a154b23d07c9f90",
+ ForeignIndex: 7,
},
}, prs)
@@ -346,88 +376,50 @@ func TestGitHubDownloadRepo(t *testing.T) {
require.NoError(t, err)
assertReviewsEqual(t, []*base.Review{
{
- ID: 315859956,
+ ID: 3096999684,
IssueIndex: 3,
- ReviewerID: 42128690,
- ReviewerName: "jolheiser",
- CommitID: "076160cf0b039f13e5eff19619932d181269414b",
- CreatedAt: time.Date(2019, 11, 12, 21, 35, 24, 0, time.UTC),
- State: base.ReviewStateApproved,
- },
- {
- ID: 315860062,
- IssueIndex: 3,
- ReviewerID: 1824502,
- ReviewerName: "zeripath",
- CommitID: "076160cf0b039f13e5eff19619932d181269414b",
- CreatedAt: time.Date(2019, 11, 12, 21, 35, 36, 0, time.UTC),
- State: base.ReviewStateApproved,
- },
- {
- ID: 315861440,
- IssueIndex: 3,
- ReviewerID: 165205,
- ReviewerName: "lafriks",
- CommitID: "076160cf0b039f13e5eff19619932d181269414b",
- CreatedAt: time.Date(2019, 11, 12, 21, 38, 0, 0, time.UTC),
- State: base.ReviewStateApproved,
- },
- }, reviews)
-
- reviews, err = downloader.GetReviews(&base.PullRequest{Number: 4, ForeignIndex: 4})
- require.NoError(t, err)
- assertReviewsEqual(t, []*base.Review{
- {
- ID: 338338740,
- IssueIndex: 4,
- ReviewerID: 81045,
- ReviewerName: "lunny",
- CommitID: "2be9101c543658591222acbee3eb799edfc3853d",
- CreatedAt: time.Date(2020, 1, 4, 5, 33, 18, 0, time.UTC),
- State: base.ReviewStateApproved,
+ ReviewerID: 37243484,
+ ReviewerName: "PatDyn",
+ CommitID: "c608ab3997349219e1510cdb5ddd1e5e82897dfa",
+ CreatedAt: time.Date(2025, 8, 7, 12, 47, 55, 0, time.UTC),
+ State: base.ReviewStateCommented,
Comments: []*base.ReviewComment{
{
- ID: 363017488,
- Content: "This is a good pull request.",
- TreePath: "README.md",
- DiffHunk: "@@ -1,2 +1,4 @@\n # test_repo\n Test repository for testing migration from github to gitea\n+",
- Position: 3,
- CommitID: "2be9101c543658591222acbee3eb799edfc3853d",
- PosterID: 81045,
- CreatedAt: time.Date(2020, 1, 4, 5, 33, 6, 0, time.UTC),
- UpdatedAt: time.Date(2020, 1, 4, 5, 33, 18, 0, time.UTC),
+ ID: 2260216729,
+ InReplyTo: 0,
+ Content: "May want to write more",
+ TreePath: "readme.md",
+ DiffHunk: "@@ -1,3 +1,5 @@\n # Forgejo Test Repo\n \n This repo is used to test migrations\n+\n+Add some feature description.",
+ Position: 5,
+ Line: 0,
+ CommitID: "c608ab3997349219e1510cdb5ddd1e5e82897dfa",
+ PosterID: 37243484,
+ CreatedAt: time.Date(2025, 8, 7, 12, 47, 50, 0, time.UTC),
+ UpdatedAt: time.Date(2025, 8, 7, 12, 47, 55, 0, time.UTC),
},
},
},
{
- ID: 338339651,
- IssueIndex: 4,
- ReviewerID: 81045,
- ReviewerName: "lunny",
- CommitID: "2be9101c543658591222acbee3eb799edfc3853d",
- CreatedAt: time.Date(2020, 1, 4, 6, 7, 6, 0, time.UTC),
- State: base.ReviewStateChangesRequested,
- Content: "Don't add more reviews",
- },
- {
- ID: 338349019,
- IssueIndex: 4,
- ReviewerID: 81045,
- ReviewerName: "lunny",
- CommitID: "2be9101c543658591222acbee3eb799edfc3853d",
- CreatedAt: time.Date(2020, 1, 4, 11, 21, 41, 0, time.UTC),
+ ID: 3097007243,
+ IssueIndex: 3,
+ ReviewerID: 37243484,
+ ReviewerName: "PatDyn",
+ CommitID: "c608ab3997349219e1510cdb5ddd1e5e82897dfa",
+ CreatedAt: time.Date(2025, 8, 7, 12, 49, 36, 0, time.UTC),
State: base.ReviewStateCommented,
Comments: []*base.ReviewComment{
{
- ID: 363029944,
- Content: "test a single comment.",
- TreePath: "LICENSE",
- DiffHunk: "@@ -19,3 +19,5 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n+",
- Position: 4,
- CommitID: "2be9101c543658591222acbee3eb799edfc3853d",
- PosterID: 81045,
- CreatedAt: time.Date(2020, 1, 4, 11, 21, 41, 0, time.UTC),
- UpdatedAt: time.Date(2020, 1, 4, 11, 21, 41, 0, time.UTC),
+ ID: 2260221159,
+ InReplyTo: 0,
+ Content: "Comment",
+ TreePath: "readme.md",
+ DiffHunk: "@@ -1,3 +1,5 @@\n # Forgejo Test Repo\n \n This repo is used to test migrations",
+ Position: 3,
+ Line: 0,
+ CommitID: "c608ab3997349219e1510cdb5ddd1e5e82897dfa",
+ PosterID: 37243484,
+ CreatedAt: time.Date(2025, 8, 7, 12, 49, 36, 0, time.UTC),
+ UpdatedAt: time.Date(2025, 8, 7, 12, 49, 36, 0, time.UTC),
},
},
},
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frate_limit b/services/migrations/testdata/github/full_download/GET_%2Frate_limit
index 74e43a0765..f3a1c10f1d 100644
--- a/services/migrations/testdata/github/full_download/GET_%2Frate_limit
+++ b/services/migrations/testdata/github/full_download/GET_%2Frate_limit
@@ -1,23 +1,24 @@
Cache-Control: no-cache
+X-Ratelimit-Used: 136
+X-Ratelimit-Resource: core
Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-X-Ratelimit-Reset: 1730800941
-Access-Control-Allow-Origin: *
-Content-Type: application/json; charset=utf-8
-X-Oauth-Scopes:
-X-Github-Media-Type: github.v3; format=json
-X-Ratelimit-Remaining: 4899
-X-Xss-Protection: 0
-Content-Security-Policy: default-src 'none'
-X-Accepted-Oauth-Scopes:
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
X-Frame-Options: deny
-X-Content-Type-Options: nosniff
-Vary: Accept-Encoding, Accept, X-Requested-With
-X-Github-Request-Id: C7CC:3118FC:3F6234D:4038C5B:6729E6C0
+Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
+X-Github-Request-Id: E80A:118F3A:208966:1EA2B8:689B4023
X-Github-Api-Version-Selected: 2022-11-28
X-Ratelimit-Limit: 5000
-X-Ratelimit-Used: 101
-X-Ratelimit-Resource: core
+Vary: Accept-Encoding, Accept, X-Requested-With
+Content-Type: application/json; charset=utf-8
+X-Oauth-Scopes: public_repo, repo:status
+X-Accepted-Oauth-Scopes:
+Github-Authentication-Token-Expiration: 2025-09-11 10:37:11 UTC
+X-Ratelimit-Remaining: 4864
+X-Ratelimit-Reset: 1755007969
+Access-Control-Allow-Origin: *
+X-Content-Type-Options: nosniff
+X-Github-Media-Type: github.v3; format=json
+Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
+X-Xss-Protection: 0
+Content-Security-Policy: default-src 'none'
-{"resources":{"core":{"limit":5000,"used":101,"remaining":4899,"reset":1730800941},"search":{"limit":30,"used":0,"remaining":30,"reset":1730799356},"graphql":{"limit":5000,"used":162,"remaining":4838,"reset":1730801064},"integration_manifest":{"limit":5000,"used":0,"remaining":5000,"reset":1730802896},"source_import":{"limit":100,"used":0,"remaining":100,"reset":1730799356},"code_scanning_upload":{"limit":1000,"used":0,"remaining":1000,"reset":1730802896},"actions_runner_registration":{"limit":10000,"used":0,"remaining":10000,"reset":1730802896},"scim":{"limit":15000,"used":0,"remaining":15000,"reset":1730802896},"dependency_snapshots":{"limit":100,"used":0,"remaining":100,"reset":1730799356},"audit_log":{"limit":1750,"used":0,"remaining":1750,"reset":1730802896},"audit_log_streaming":{"limit":15,"used":0,"remaining":15,"reset":1730802896},"code_search":{"limit":10,"used":0,"remaining":10,"reset":1730799356}},"rate":{"limit":5000,"used":101,"remaining":4899,"reset":1730800941}}
\ No newline at end of file
+{"resources":{"core":{"limit":5000,"used":136,"remaining":4864,"reset":1755007969},"search":{"limit":30,"used":0,"remaining":30,"reset":1755005023},"graphql":{"limit":5000,"used":0,"remaining":5000,"reset":1755008563},"integration_manifest":{"limit":5000,"used":0,"remaining":5000,"reset":1755008563},"source_import":{"limit":100,"used":0,"remaining":100,"reset":1755005023},"code_scanning_upload":{"limit":5000,"used":136,"remaining":4864,"reset":1755007969},"code_scanning_autofix":{"limit":10,"used":0,"remaining":10,"reset":1755005023},"actions_runner_registration":{"limit":10000,"used":0,"remaining":10000,"reset":1755008563},"scim":{"limit":15000,"used":0,"remaining":15000,"reset":1755008563},"dependency_snapshots":{"limit":100,"used":0,"remaining":100,"reset":1755005023},"dependency_sbom":{"limit":100,"used":0,"remaining":100,"reset":1755005023},"audit_log":{"limit":1750,"used":0,"remaining":1750,"reset":1755008563},"audit_log_streaming":{"limit":15,"used":0,"remaining":15,"reset":1755008563},"code_search":{"limit":10,"used":0,"remaining":10,"reset":1755005023}},"rate":{"limit":5000,"used":136,"remaining":4864,"reset":1755007969}}
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo
new file mode 100644
index 0000000000..57e87a4775
--- /dev/null
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo
@@ -0,0 +1,26 @@
+X-Ratelimit-Remaining: 4880
+Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
+Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
+Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
+Content-Type: application/json; charset=utf-8
+Etag: W/"86b7478cb9d7f78696810f3292315b35ab47125e71dd2315dfd41626383fc081"
+X-Github-Api-Version-Selected: 2022-11-28
+X-Ratelimit-Resource: core
+Access-Control-Allow-Origin: *
+X-Content-Type-Options: nosniff
+Content-Security-Policy: default-src 'none'
+Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
+X-Accepted-Oauth-Scopes: repo
+Github-Authentication-Token-Expiration: 2025-09-11 10:37:11 UTC
+X-Ratelimit-Reset: 1755007969
+X-Ratelimit-Used: 120
+X-Frame-Options: deny
+Last-Modified: Tue, 12 Aug 2025 11:21:45 GMT
+X-Oauth-Scopes: public_repo, repo:status
+X-Xss-Protection: 0
+X-Github-Request-Id: E80A:118F3A:20561B:1E7279:689B401B
+Cache-Control: private, max-age=60, s-maxage=60
+X-Github-Media-Type: github.v3; param=scarlet-witch-preview; format=json, github.mercy-preview; param=baptiste-preview.nebula-preview; format=json
+X-Ratelimit-Limit: 5000
+
+{"id":1033841924,"node_id":"R_kgDOPZ8tBA","name":"test_repo","full_name":"forgejo/test_repo","private":false,"owner":{"login":"forgejo","id":118922216,"node_id":"O_kgDOBxab6A","avatar_url":"https://avatars.githubusercontent.com/u/118922216?v=4","gravatar_id":"","url":"https://api.github.com/users/forgejo","html_url":"https://github.com/forgejo","followers_url":"https://api.github.com/users/forgejo/followers","following_url":"https://api.github.com/users/forgejo/following{/other_user}","gists_url":"https://api.github.com/users/forgejo/gists{/gist_id}","starred_url":"https://api.github.com/users/forgejo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/forgejo/subscriptions","organizations_url":"https://api.github.com/users/forgejo/orgs","repos_url":"https://api.github.com/users/forgejo/repos","events_url":"https://api.github.com/users/forgejo/events{/privacy}","received_events_url":"https://api.github.com/users/forgejo/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/forgejo/test_repo","description":"Exclusively used for testing Github->Forgejo migration","fork":false,"url":"https://api.github.com/repos/forgejo/test_repo","forks_url":"https://api.github.com/repos/forgejo/test_repo/forks","keys_url":"https://api.github.com/repos/forgejo/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/forgejo/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/forgejo/test_repo/teams","hooks_url":"https://api.github.com/repos/forgejo/test_repo/hooks","issue_events_url":"https://api.github.com/repos/forgejo/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/forgejo/test_repo/events","assignees_url":"https://api.github.com/repos/forgejo/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/forgejo/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/forgejo/test_repo/tags","blobs_url":"https://api.github.com/repos/forgejo/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/forgejo/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/forgejo/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/forgejo/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/forgejo/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/forgejo/test_repo/languages","stargazers_url":"https://api.github.com/repos/forgejo/test_repo/stargazers","contributors_url":"https://api.github.com/repos/forgejo/test_repo/contributors","subscribers_url":"https://api.github.com/repos/forgejo/test_repo/subscribers","subscription_url":"https://api.github.com/repos/forgejo/test_repo/subscription","commits_url":"https://api.github.com/repos/forgejo/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/forgejo/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/forgejo/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/forgejo/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/forgejo/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/forgejo/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/forgejo/test_repo/merges","archive_url":"https://api.github.com/repos/forgejo/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/forgejo/test_repo/downloads","issues_url":"https://api.github.com/repos/forgejo/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/forgejo/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/forgejo/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/forgejo/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/forgejo/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/forgejo/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/forgejo/test_repo/deployments","created_at":"2025-08-07T12:34:21Z","updated_at":"2025-08-12T11:21:45Z","pushed_at":"2025-08-07T13:07:49Z","git_url":"git://github.com/forgejo/test_repo.git","ssh_url":"git@github.com:forgejo/test_repo.git","clone_url":"https://github.com/forgejo/test_repo.git","svn_url":"https://github.com/forgejo/test_repo","homepage":"https://codeberg.org/forgejo/forgejo/","size":6,"stargazers_count":1,"watchers_count":1,"language":null,"has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":1,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":5,"license":{"key":"0bsd","name":"BSD Zero Clause License","spdx_id":"0BSD","url":"https://api.github.com/licenses/0bsd","node_id":"MDc6TGljZW5zZTM1"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":["forgejo"],"visibility":"public","forks":1,"open_issues":5,"watchers":1,"default_branch":"main","permissions":{"admin":true,"maintain":true,"push":true,"triage":true,"pull":true},"temp_clone_token":"","allow_squash_merge":true,"allow_merge_commit":true,"allow_rebase_merge":true,"allow_auto_merge":false,"delete_branch_on_merge":false,"allow_update_branch":false,"use_squash_pr_title_as_default":false,"squash_merge_commit_message":"COMMIT_MESSAGES","squash_merge_commit_title":"COMMIT_OR_PR_TITLE","merge_commit_message":"PR_TITLE","merge_commit_title":"MERGE_MESSAGE","custom_properties":{},"organization":{"login":"forgejo","id":118922216,"node_id":"O_kgDOBxab6A","avatar_url":"https://avatars.githubusercontent.com/u/118922216?v=4","gravatar_id":"","url":"https://api.github.com/users/forgejo","html_url":"https://github.com/forgejo","followers_url":"https://api.github.com/users/forgejo/followers","following_url":"https://api.github.com/users/forgejo/following{/other_user}","gists_url":"https://api.github.com/users/forgejo/gists{/gist_id}","starred_url":"https://api.github.com/users/forgejo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/forgejo/subscriptions","organizations_url":"https://api.github.com/users/forgejo/orgs","repos_url":"https://api.github.com/users/forgejo/repos","events_url":"https://api.github.com/users/forgejo/events{/privacy}","received_events_url":"https://api.github.com/users/forgejo/received_events","type":"Organization","user_view_type":"public","site_admin":false},"security_and_analysis":{"secret_scanning":{"status":"disabled"},"secret_scanning_push_protection":{"status":"disabled"},"dependabot_security_updates":{"status":"disabled"},"secret_scanning_non_provider_patterns":{"status":"disabled"},"secret_scanning_validity_checks":{"status":"disabled"}},"network_count":1,"subscribers_count":0}
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F3%2Freactions%3Fpage=1&per_page=2 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%2F1%2Freactions%3Fpage=1&per_page=2
similarity index 76%
rename from services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F3%2Freactions%3Fpage=1&per_page=2
rename to services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%2F1%2Freactions%3Fpage=1&per_page=2
index a7a105b3e7..2af575abc9 100644
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F3%2Freactions%3Fpage=1&per_page=2
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%2F1%2Freactions%3Fpage=1&per_page=2
@@ -1,25 +1,26 @@
-X-Ratelimit-Used: 88
-X-Ratelimit-Resource: core
-X-Content-Type-Options: nosniff
+X-Github-Api-Version-Selected: 2022-11-28
Content-Security-Policy: default-src 'none'
-X-Github-Request-Id: C7CC:3118FC:3F60B4F:403741E:6729E6BA
Content-Type: application/json; charset=utf-8
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Ratelimit-Reset: 1730800941
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-Cache-Control: private, max-age=60, s-maxage=60
-X-Github-Media-Type: github.v3; param=squirrel-girl-preview
-Access-Control-Allow-Origin: *
+Content-Length: 2
+Etag: "578cfdf865ccd59faa414c655476c87af814e220755c938b9545967521b6f14b"
+X-Ratelimit-Remaining: 4875
Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
+X-Github-Request-Id: E80A:118F3A:20652B:1E80D9:689B401D
+Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
+X-Oauth-Scopes: public_repo, repo:status
+X-Accepted-Oauth-Scopes: repo
+X-Ratelimit-Limit: 5000
+X-Ratelimit-Reset: 1755007969
+Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
X-Frame-Options: deny
+Cache-Control: private, max-age=60, s-maxage=60
+X-Ratelimit-Used: 125
+X-Ratelimit-Resource: core
+Access-Control-Allow-Origin: *
+X-Content-Type-Options: nosniff
X-Xss-Protection: 0
Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-Etag: "f87b0fd59e59458a9a808311324b873c6baf3fde861298a99de9986270dd4d79"
-X-Oauth-Scopes:
-X-Accepted-Oauth-Scopes: repo
-X-Github-Api-Version-Selected: 2022-11-28
-X-Ratelimit-Limit: 5000
-X-Ratelimit-Remaining: 4912
-Content-Length: 2
+Github-Authentication-Token-Expiration: 2025-09-11 10:37:11 UTC
+X-Github-Media-Type: github.v3; param=squirrel-girl-preview
[]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%2F2%2Fcomments%3Fdirection=asc&per_page=100&sort=created b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%2F2%2Fcomments%3Fdirection=asc&per_page=100&sort=created
new file mode 100644
index 0000000000..5a45f886a9
--- /dev/null
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%2F2%2Fcomments%3Fdirection=asc&per_page=100&sort=created
@@ -0,0 +1,25 @@
+X-Content-Type-Options: nosniff
+X-Xss-Protection: 0
+Cache-Control: private, max-age=60, s-maxage=60
+X-Oauth-Scopes: public_repo, repo:status
+X-Github-Media-Type: github.v3; param=squirrel-girl-preview
+X-Ratelimit-Reset: 1755007969
+Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
+Content-Security-Policy: default-src 'none'
+X-Github-Request-Id: E80A:118F3A:206AFD:1E8691:689B401E
+Content-Type: application/json; charset=utf-8
+X-Github-Api-Version-Selected: 2022-11-28
+X-Ratelimit-Remaining: 4873
+X-Ratelimit-Used: 127
+Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
+Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
+Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
+X-Accepted-Oauth-Scopes:
+Github-Authentication-Token-Expiration: 2025-09-11 10:37:11 UTC
+Etag: W/"efada731cc49c5e9612cad9e891f65f645857f94ff3ea109dc80927064a5978c"
+X-Ratelimit-Limit: 5000
+X-Ratelimit-Resource: core
+Access-Control-Allow-Origin: *
+X-Frame-Options: deny
+
+[{"url":"https://api.github.com/repos/forgejo/test_repo/issues/comments/3164123494","html_url":"https://github.com/forgejo/test_repo/issues/2#issuecomment-3164123494","issue_url":"https://api.github.com/repos/forgejo/test_repo/issues/2","id":3164123494,"node_id":"IC_kwDOPZ8tBM68mLFm","user":{"login":"PatDyn","id":37243484,"node_id":"MDQ6VXNlcjM3MjQzNDg0","avatar_url":"https://avatars.githubusercontent.com/u/37243484?v=4","gravatar_id":"","url":"https://api.github.com/users/PatDyn","html_url":"https://github.com/PatDyn","followers_url":"https://api.github.com/users/PatDyn/followers","following_url":"https://api.github.com/users/PatDyn/following{/other_user}","gists_url":"https://api.github.com/users/PatDyn/gists{/gist_id}","starred_url":"https://api.github.com/users/PatDyn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PatDyn/subscriptions","organizations_url":"https://api.github.com/users/PatDyn/orgs","repos_url":"https://api.github.com/users/PatDyn/repos","events_url":"https://api.github.com/users/PatDyn/events{/privacy}","received_events_url":"https://api.github.com/users/PatDyn/received_events","type":"User","user_view_type":"public","site_admin":false},"created_at":"2025-08-07T13:07:25Z","updated_at":"2025-08-07T13:07:25Z","author_association":"COLLABORATOR","body":"Mentioning #3 \nWith some **bold** *statement*","reactions":{"url":"https://api.github.com/repos/forgejo/test_repo/issues/comments/3164123494/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"performed_via_github_app":null}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=1&per_page=2 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=1&per_page=2
new file mode 100644
index 0000000000..ecaafa82e4
--- /dev/null
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=1&per_page=2
@@ -0,0 +1,26 @@
+Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
+X-Frame-Options: deny
+X-Content-Type-Options: nosniff
+X-Accepted-Oauth-Scopes: repo
+X-Ratelimit-Reset: 1755007969
+Access-Control-Allow-Origin: *
+Content-Type: application/json; charset=utf-8
+Content-Length: 2
+Cache-Control: private, max-age=60, s-maxage=60
+Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
+X-Oauth-Scopes: public_repo, repo:status
+Github-Authentication-Token-Expiration: 2025-09-11 10:37:11 UTC
+X-Github-Media-Type: github.v3; param=squirrel-girl-preview
+X-Ratelimit-Limit: 5000
+Etag: "578cfdf865ccd59faa414c655476c87af814e220755c938b9545967521b6f14b"
+X-Ratelimit-Remaining: 4874
+X-Ratelimit-Used: 126
+X-Ratelimit-Resource: core
+X-Xss-Protection: 0
+Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
+Content-Security-Policy: default-src 'none'
+X-Github-Request-Id: E80A:118F3A:206814:1E83B2:689B401E
+X-Github-Api-Version-Selected: 2022-11-28
+Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
+
+[]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%2F3%2Freactions%3Fpage=1&per_page=2 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%2F3%2Freactions%3Fpage=1&per_page=2
new file mode 100644
index 0000000000..a900075c9b
--- /dev/null
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%2F3%2Freactions%3Fpage=1&per_page=2
@@ -0,0 +1,26 @@
+Content-Type: application/json; charset=utf-8
+Content-Length: 2
+Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
+X-Github-Media-Type: github.v3; param=squirrel-girl-preview
+X-Ratelimit-Resource: core
+Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
+X-Github-Request-Id: E80A:118F3A:20758C:1E9080:689B401F
+X-Oauth-Scopes: public_repo, repo:status
+Github-Authentication-Token-Expiration: 2025-09-11 10:37:11 UTC
+X-Ratelimit-Limit: 5000
+X-Ratelimit-Reset: 1755007969
+Access-Control-Allow-Origin: *
+Content-Security-Policy: default-src 'none'
+Cache-Control: private, max-age=60, s-maxage=60
+X-Github-Api-Version-Selected: 2022-11-28
+X-Ratelimit-Remaining: 4870
+X-Ratelimit-Used: 130
+X-Content-Type-Options: nosniff
+X-Xss-Protection: 0
+Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
+Etag: "578cfdf865ccd59faa414c655476c87af814e220755c938b9545967521b6f14b"
+X-Accepted-Oauth-Scopes: repo
+Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
+X-Frame-Options: deny
+
+[]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=4&per_page=2 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%2F3%2Freactions%3Fpage=2&per_page=2
similarity index 61%
rename from services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=4&per_page=2
rename to services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%2F3%2Freactions%3Fpage=2&per_page=2
index f14d4ba904..7d978a2584 100644
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=4&per_page=2
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%2F3%2Freactions%3Fpage=2&per_page=2
@@ -1,26 +1,27 @@
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-X-Oauth-Scopes:
X-Ratelimit-Limit: 5000
-X-Ratelimit-Remaining: 4918
-X-Ratelimit-Reset: 1730800941
Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-X-Content-Type-Options: nosniff
-X-Github-Request-Id: C7CC:3118FC:3F60229:4036AE8:6729E6B8
-Etag: "f87b0fd59e59458a9a808311324b873c6baf3fde861298a99de9986270dd4d79"
-Link: ; rel="prev", ; rel="last", ; rel="first"
-X-Accepted-Oauth-Scopes: repo
-X-Github-Media-Type: github.v3; param=squirrel-girl-preview
-X-Ratelimit-Used: 82
-X-Frame-Options: deny
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-Cache-Control: private, max-age=60, s-maxage=60
-X-Github-Api-Version-Selected: 2022-11-28
-X-Ratelimit-Resource: core
-Access-Control-Allow-Origin: *
X-Xss-Protection: 0
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
+X-Github-Request-Id: F458:8333F:84A571:7C4748:689B3396
Content-Type: application/json; charset=utf-8
Content-Length: 2
+X-Oauth-Scopes: public_repo, repo:status
+X-Accepted-Oauth-Scopes: repo
+X-Ratelimit-Reset: 1755004338
+X-Content-Type-Options: nosniff
+Cache-Control: private, max-age=60, s-maxage=60
+X-Ratelimit-Used: 56
+X-Ratelimit-Resource: core
+Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
+Access-Control-Allow-Origin: *
+X-Frame-Options: deny
+Github-Authentication-Token-Expiration: 2025-09-11 10:37:11 UTC
+X-Github-Media-Type: github.v3; param=squirrel-girl-preview
+X-Ratelimit-Remaining: 4944
+Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
Content-Security-Policy: default-src 'none'
+Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
+Etag: "578cfdf865ccd59faa414c655476c87af814e220755c938b9545967521b6f14b"
+Link: ; rel="prev", ; rel="last", ; rel="first"
+X-Github-Api-Version-Selected: 2022-11-28
[]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%2F7%2Freactions%3Fpage=1&per_page=2 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%2F7%2Freactions%3Fpage=1&per_page=2
new file mode 100644
index 0000000000..694c612697
--- /dev/null
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%2F7%2Freactions%3Fpage=1&per_page=2
@@ -0,0 +1,26 @@
+Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
+X-Accepted-Oauth-Scopes: repo
+Github-Authentication-Token-Expiration: 2025-09-11 10:37:11 UTC
+X-Github-Media-Type: github.v3; param=squirrel-girl-preview
+X-Github-Api-Version-Selected: 2022-11-28
+X-Ratelimit-Resource: core
+Access-Control-Allow-Origin: *
+X-Frame-Options: deny
+Cache-Control: private, max-age=60, s-maxage=60
+Etag: "578cfdf865ccd59faa414c655476c87af814e220755c938b9545967521b6f14b"
+X-Ratelimit-Reset: 1755007969
+X-Xss-Protection: 0
+X-Github-Request-Id: E80A:118F3A:207936:1E936E:689B4020
+X-Oauth-Scopes: public_repo, repo:status
+X-Ratelimit-Remaining: 4869
+Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
+X-Content-Type-Options: nosniff
+Content-Security-Policy: default-src 'none'
+Content-Type: application/json; charset=utf-8
+Content-Length: 2
+X-Ratelimit-Limit: 5000
+X-Ratelimit-Used: 131
+Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
+Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
+
+[]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2Fcomments%2F553138856%2Freactions%3Fpage=1&per_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%2Fcomments%2F3164123494%2Freactions%3Fpage=1&per_page=100
similarity index 76%
rename from services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2Fcomments%2F553138856%2Freactions%3Fpage=1&per_page=100
rename to services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%2Fcomments%2F3164123494%2Freactions%3Fpage=1&per_page=100
index ac446b3586..4ee1c6bc52 100644
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2Fcomments%2F553138856%2Freactions%3Fpage=1&per_page=100
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%2Fcomments%2F3164123494%2Freactions%3Fpage=1&per_page=100
@@ -1,25 +1,26 @@
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-X-Github-Media-Type: github.v3; param=squirrel-girl-preview
-X-Ratelimit-Remaining: 4914
-X-Frame-Options: deny
-X-Xss-Protection: 0
-X-Ratelimit-Reset: 1730800941
-X-Ratelimit-Resource: core
-X-Content-Type-Options: nosniff
-Content-Type: application/json; charset=utf-8
-Etag: "f87b0fd59e59458a9a808311324b873c6baf3fde861298a99de9986270dd4d79"
-X-Accepted-Oauth-Scopes:
-X-Github-Api-Version-Selected: 2022-11-28
-X-Ratelimit-Limit: 5000
-Content-Length: 2
-Access-Control-Allow-Origin: *
Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
Content-Security-Policy: default-src 'none'
-X-Github-Request-Id: C7CC:3118FC:3F60858:4037116:6729E6B9
-Cache-Control: private, max-age=60, s-maxage=60
+Content-Type: application/json; charset=utf-8
+X-Oauth-Scopes: public_repo, repo:status
+X-Ratelimit-Remaining: 4872
+X-Frame-Options: deny
+X-Xss-Protection: 0
Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Oauth-Scopes:
-X-Ratelimit-Used: 86
+X-Github-Media-Type: github.v3; param=squirrel-girl-preview
+X-Github-Api-Version-Selected: 2022-11-28
+X-Ratelimit-Limit: 5000
+X-Ratelimit-Used: 128
+X-Content-Type-Options: nosniff
+Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
+Cache-Control: private, max-age=60, s-maxage=60
+X-Ratelimit-Reset: 1755007969
+X-Ratelimit-Resource: core
Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
+X-Github-Request-Id: E80A:118F3A:206DA5:1E890E:689B401E
+Content-Length: 2
+Etag: "578cfdf865ccd59faa414c655476c87af814e220755c938b9545967521b6f14b"
+X-Accepted-Oauth-Scopes:
+Github-Authentication-Token-Expiration: 2025-09-11 10:37:11 UTC
+Access-Control-Allow-Origin: *
[]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%3Fdirection=asc&page=1&per_page=2&sort=created&state=all b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%3Fdirection=asc&page=1&per_page=2&sort=created&state=all
new file mode 100644
index 0000000000..6e74d44a20
--- /dev/null
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fissues%3Fdirection=asc&page=1&per_page=2&sort=created&state=all
@@ -0,0 +1,26 @@
+Link: ; rel="next"
+X-Github-Api-Version-Selected: 2022-11-28
+X-Ratelimit-Reset: 1755007969
+Access-Control-Allow-Origin: *
+Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
+Github-Authentication-Token-Expiration: 2025-09-11 10:37:11 UTC
+X-Ratelimit-Used: 124
+X-Frame-Options: deny
+X-Xss-Protection: 0
+Content-Security-Policy: default-src 'none'
+X-Github-Request-Id: E80A:118F3A:206102:1E7D47:689B401C
+Etag: W/"cc2f0f6e0b3c82ac10b12bf3ad5d74d62a575371f88fc689a7af78408e34eeb5"
+X-Ratelimit-Limit: 5000
+X-Ratelimit-Remaining: 4876
+Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
+Content-Type: application/json; charset=utf-8
+Cache-Control: private, max-age=60, s-maxage=60
+X-Oauth-Scopes: public_repo, repo:status
+X-Accepted-Oauth-Scopes: repo
+X-Ratelimit-Resource: core
+X-Content-Type-Options: nosniff
+Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
+Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
+X-Github-Media-Type: github.v3; param=squirrel-girl-preview
+
+[{"url":"https://api.github.com/repos/forgejo/test_repo/issues/1","repository_url":"https://api.github.com/repos/forgejo/test_repo","labels_url":"https://api.github.com/repos/forgejo/test_repo/issues/1/labels{/name}","comments_url":"https://api.github.com/repos/forgejo/test_repo/issues/1/comments","events_url":"https://api.github.com/repos/forgejo/test_repo/issues/1/events","html_url":"https://github.com/forgejo/test_repo/issues/1","id":3300365512,"node_id":"I_kwDOPZ8tBM7Et5TI","number":1,"title":"First issue","user":{"login":"PatDyn","id":37243484,"node_id":"MDQ6VXNlcjM3MjQzNDg0","avatar_url":"https://avatars.githubusercontent.com/u/37243484?v=4","gravatar_id":"","url":"https://api.github.com/users/PatDyn","html_url":"https://github.com/PatDyn","followers_url":"https://api.github.com/users/PatDyn/followers","following_url":"https://api.github.com/users/PatDyn/following{/other_user}","gists_url":"https://api.github.com/users/PatDyn/gists{/gist_id}","starred_url":"https://api.github.com/users/PatDyn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PatDyn/subscriptions","organizations_url":"https://api.github.com/users/PatDyn/orgs","repos_url":"https://api.github.com/users/PatDyn/repos","events_url":"https://api.github.com/users/PatDyn/events{/privacy}","received_events_url":"https://api.github.com/users/PatDyn/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2025-08-07T12:44:07Z","updated_at":"2025-08-07T12:44:47Z","closed_at":null,"author_association":"COLLABORATOR","type":null,"active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"body":"This is an issue.","closed_by":null,"reactions":{"url":"https://api.github.com/repos/forgejo/test_repo/issues/1/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/forgejo/test_repo/issues/1/timeline","performed_via_github_app":null,"state_reason":null},{"url":"https://api.github.com/repos/forgejo/test_repo/issues/2","repository_url":"https://api.github.com/repos/forgejo/test_repo","labels_url":"https://api.github.com/repos/forgejo/test_repo/issues/2/labels{/name}","comments_url":"https://api.github.com/repos/forgejo/test_repo/issues/2/comments","events_url":"https://api.github.com/repos/forgejo/test_repo/issues/2/events","html_url":"https://github.com/forgejo/test_repo/issues/2","id":3300370333,"node_id":"I_kwDOPZ8tBM7Et6ed","number":2,"title":"Second Issue","user":{"login":"PatDyn","id":37243484,"node_id":"MDQ6VXNlcjM3MjQzNDg0","avatar_url":"https://avatars.githubusercontent.com/u/37243484?v=4","gravatar_id":"","url":"https://api.github.com/users/PatDyn","html_url":"https://github.com/PatDyn","followers_url":"https://api.github.com/users/PatDyn/followers","following_url":"https://api.github.com/users/PatDyn/following{/other_user}","gists_url":"https://api.github.com/users/PatDyn/gists{/gist_id}","starred_url":"https://api.github.com/users/PatDyn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PatDyn/subscriptions","organizations_url":"https://api.github.com/users/PatDyn/orgs","repos_url":"https://api.github.com/users/PatDyn/repos","events_url":"https://api.github.com/users/PatDyn/events{/privacy}","received_events_url":"https://api.github.com/users/PatDyn/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":9072229377,"node_id":"LA_kwDOPZ8tBM8AAAACHL88AQ","url":"https://api.github.com/repos/forgejo/test_repo/labels/duplicate","name":"duplicate","color":"cfd3d7","default":true,"description":"This issue or pull request already exists"},{"id":9072229408,"node_id":"LA_kwDOPZ8tBM8AAAACHL88IA","url":"https://api.github.com/repos/forgejo/test_repo/labels/good%20first%20issue","name":"good first issue","color":"7057ff","default":true,"description":"Good for newcomers"},{"id":9072229417,"node_id":"LA_kwDOPZ8tBM8AAAACHL88KQ","url":"https://api.github.com/repos/forgejo/test_repo/labels/help%20wanted","name":"help wanted","color":"008672","default":true,"description":"Extra attention is needed"}],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":{"url":"https://api.github.com/repos/forgejo/test_repo/milestones/2","html_url":"https://github.com/forgejo/test_repo/milestone/2","labels_url":"https://api.github.com/repos/forgejo/test_repo/milestones/2/labels","id":13445587,"node_id":"MI_kwDOPZ8tBM4AzSnT","number":2,"title":"1.1.0","description":"We can do that","creator":{"login":"PatDyn","id":37243484,"node_id":"MDQ6VXNlcjM3MjQzNDg0","avatar_url":"https://avatars.githubusercontent.com/u/37243484?v=4","gravatar_id":"","url":"https://api.github.com/users/PatDyn","html_url":"https://github.com/PatDyn","followers_url":"https://api.github.com/users/PatDyn/followers","following_url":"https://api.github.com/users/PatDyn/following{/other_user}","gists_url":"https://api.github.com/users/PatDyn/gists{/gist_id}","starred_url":"https://api.github.com/users/PatDyn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PatDyn/subscriptions","organizations_url":"https://api.github.com/users/PatDyn/orgs","repos_url":"https://api.github.com/users/PatDyn/repos","events_url":"https://api.github.com/users/PatDyn/events{/privacy}","received_events_url":"https://api.github.com/users/PatDyn/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":1,"closed_issues":0,"state":"open","created_at":"2025-08-07T12:50:58Z","updated_at":"2025-08-07T12:53:15Z","due_on":"2025-08-31T07:00:00Z","closed_at":null},"comments":1,"created_at":"2025-08-07T12:45:44Z","updated_at":"2025-08-07T13:07:25Z","closed_at":null,"author_association":"COLLABORATOR","type":null,"active_lock_reason":null,"sub_issues_summary":{"total":0,"completed":0,"percent_completed":0},"body":"Mentioning #1 ","closed_by":null,"reactions":{"url":"https://api.github.com/repos/forgejo/test_repo/issues/2/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/forgejo/test_repo/issues/2/timeline","performed_via_github_app":null,"state_reason":null}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Flabels%3Fpage=1&per_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Flabels%3Fpage=1&per_page=100
new file mode 100644
index 0000000000..ef1aebf7a8
--- /dev/null
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Flabels%3Fpage=1&per_page=100
@@ -0,0 +1,25 @@
+Cache-Control: private, max-age=60, s-maxage=60
+Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
+X-Accepted-Oauth-Scopes: repo
+Github-Authentication-Token-Expiration: 2025-09-11 10:37:11 UTC
+X-Github-Api-Version-Selected: 2022-11-28
+X-Ratelimit-Reset: 1755007969
+X-Xss-Protection: 0
+X-Github-Request-Id: E80A:118F3A:205BDE:1E77C9:689B401C
+Content-Type: application/json; charset=utf-8
+Etag: W/"fc30186df2be93c9dbcbb326f3d0249e5d618f924528d71af1d11941dc37f8b0"
+X-Oauth-Scopes: public_repo, repo:status
+Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
+Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
+Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
+X-Github-Media-Type: github.v3; format=json
+X-Ratelimit-Limit: 5000
+Access-Control-Allow-Origin: *
+X-Frame-Options: deny
+X-Content-Type-Options: nosniff
+X-Ratelimit-Remaining: 4878
+X-Ratelimit-Used: 122
+X-Ratelimit-Resource: core
+Content-Security-Policy: default-src 'none'
+
+[{"id":9072229344,"node_id":"LA_kwDOPZ8tBM8AAAACHL874A","url":"https://api.github.com/repos/forgejo/test_repo/labels/bug","name":"bug","color":"d73a4a","default":true,"description":"Something isn't working"},{"id":9072229361,"node_id":"LA_kwDOPZ8tBM8AAAACHL878Q","url":"https://api.github.com/repos/forgejo/test_repo/labels/documentation","name":"documentation","color":"0075ca","default":true,"description":"Improvements or additions to documentation"},{"id":9072229377,"node_id":"LA_kwDOPZ8tBM8AAAACHL88AQ","url":"https://api.github.com/repos/forgejo/test_repo/labels/duplicate","name":"duplicate","color":"cfd3d7","default":true,"description":"This issue or pull request already exists"},{"id":9072229390,"node_id":"LA_kwDOPZ8tBM8AAAACHL88Dg","url":"https://api.github.com/repos/forgejo/test_repo/labels/enhancement","name":"enhancement","color":"a2eeef","default":true,"description":"New feature or request"},{"id":9072229408,"node_id":"LA_kwDOPZ8tBM8AAAACHL88IA","url":"https://api.github.com/repos/forgejo/test_repo/labels/good%20first%20issue","name":"good first issue","color":"7057ff","default":true,"description":"Good for newcomers"},{"id":9072229417,"node_id":"LA_kwDOPZ8tBM8AAAACHL88KQ","url":"https://api.github.com/repos/forgejo/test_repo/labels/help%20wanted","name":"help wanted","color":"008672","default":true,"description":"Extra attention is needed"},{"id":9072229426,"node_id":"LA_kwDOPZ8tBM8AAAACHL88Mg","url":"https://api.github.com/repos/forgejo/test_repo/labels/invalid","name":"invalid","color":"e4e669","default":true,"description":"This doesn't seem right"},{"id":9072229435,"node_id":"LA_kwDOPZ8tBM8AAAACHL88Ow","url":"https://api.github.com/repos/forgejo/test_repo/labels/question","name":"question","color":"d876e3","default":true,"description":"Further information is requested"},{"id":9072229442,"node_id":"LA_kwDOPZ8tBM8AAAACHL88Qg","url":"https://api.github.com/repos/forgejo/test_repo/labels/wontfix","name":"wontfix","color":"ffffff","default":true,"description":"This will not be worked on"}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fmilestones%3Fpage=1&per_page=100&state=all b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fmilestones%3Fpage=1&per_page=100&state=all
new file mode 100644
index 0000000000..7dba1e4aac
--- /dev/null
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fmilestones%3Fpage=1&per_page=100&state=all
@@ -0,0 +1,25 @@
+Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
+X-Github-Request-Id: E80A:118F3A:205928:1E754F:689B401B
+Etag: W/"39c17013c8c7b0f5abf91f15e52496c38730029baf6f37b5c3f3e40eb9886aab"
+X-Ratelimit-Remaining: 4879
+Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
+X-Xss-Protection: 0
+Content-Type: application/json; charset=utf-8
+Cache-Control: private, max-age=60, s-maxage=60
+X-Ratelimit-Reset: 1755007969
+X-Ratelimit-Used: 121
+X-Ratelimit-Resource: core
+Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
+Github-Authentication-Token-Expiration: 2025-09-11 10:37:11 UTC
+X-Github-Media-Type: github.v3; format=json
+X-Github-Api-Version-Selected: 2022-11-28
+X-Frame-Options: deny
+X-Content-Type-Options: nosniff
+Content-Security-Policy: default-src 'none'
+Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
+X-Oauth-Scopes: public_repo, repo:status
+X-Accepted-Oauth-Scopes: repo
+X-Ratelimit-Limit: 5000
+Access-Control-Allow-Origin: *
+
+[{"url":"https://api.github.com/repos/forgejo/test_repo/milestones/1","html_url":"https://github.com/forgejo/test_repo/milestone/1","labels_url":"https://api.github.com/repos/forgejo/test_repo/milestones/1/labels","id":13445581,"node_id":"MI_kwDOPZ8tBM4AzSnN","number":1,"title":"1.0.0","description":"Version 1","creator":{"login":"PatDyn","id":37243484,"node_id":"MDQ6VXNlcjM3MjQzNDg0","avatar_url":"https://avatars.githubusercontent.com/u/37243484?v=4","gravatar_id":"","url":"https://api.github.com/users/PatDyn","html_url":"https://github.com/PatDyn","followers_url":"https://api.github.com/users/PatDyn/followers","following_url":"https://api.github.com/users/PatDyn/following{/other_user}","gists_url":"https://api.github.com/users/PatDyn/gists{/gist_id}","starred_url":"https://api.github.com/users/PatDyn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PatDyn/subscriptions","organizations_url":"https://api.github.com/users/PatDyn/orgs","repos_url":"https://api.github.com/users/PatDyn/repos","events_url":"https://api.github.com/users/PatDyn/events{/privacy}","received_events_url":"https://api.github.com/users/PatDyn/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":1,"closed_issues":2,"state":"open","created_at":"2025-08-07T12:48:56Z","updated_at":"2025-08-12T12:34:20Z","due_on":null,"closed_at":null},{"url":"https://api.github.com/repos/forgejo/test_repo/milestones/3","html_url":"https://github.com/forgejo/test_repo/milestone/3","labels_url":"https://api.github.com/repos/forgejo/test_repo/milestones/3/labels","id":13445604,"node_id":"MI_kwDOPZ8tBM4AzSnk","number":3,"title":"0.9.0","description":"A milestone","creator":{"login":"PatDyn","id":37243484,"node_id":"MDQ6VXNlcjM3MjQzNDg0","avatar_url":"https://avatars.githubusercontent.com/u/37243484?v=4","gravatar_id":"","url":"https://api.github.com/users/PatDyn","html_url":"https://github.com/PatDyn","followers_url":"https://api.github.com/users/PatDyn/followers","following_url":"https://api.github.com/users/PatDyn/following{/other_user}","gists_url":"https://api.github.com/users/PatDyn/gists{/gist_id}","starred_url":"https://api.github.com/users/PatDyn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PatDyn/subscriptions","organizations_url":"https://api.github.com/users/PatDyn/orgs","repos_url":"https://api.github.com/users/PatDyn/repos","events_url":"https://api.github.com/users/PatDyn/events{/privacy}","received_events_url":"https://api.github.com/users/PatDyn/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":1,"closed_issues":0,"state":"closed","created_at":"2025-08-07T12:54:20Z","updated_at":"2025-08-12T11:29:52Z","due_on":"2025-08-01T07:00:00Z","closed_at":"2025-08-07T12:54:38Z"},{"url":"https://api.github.com/repos/forgejo/test_repo/milestones/2","html_url":"https://github.com/forgejo/test_repo/milestone/2","labels_url":"https://api.github.com/repos/forgejo/test_repo/milestones/2/labels","id":13445587,"node_id":"MI_kwDOPZ8tBM4AzSnT","number":2,"title":"1.1.0","description":"We can do that","creator":{"login":"PatDyn","id":37243484,"node_id":"MDQ6VXNlcjM3MjQzNDg0","avatar_url":"https://avatars.githubusercontent.com/u/37243484?v=4","gravatar_id":"","url":"https://api.github.com/users/PatDyn","html_url":"https://github.com/PatDyn","followers_url":"https://api.github.com/users/PatDyn/followers","following_url":"https://api.github.com/users/PatDyn/following{/other_user}","gists_url":"https://api.github.com/users/PatDyn/gists{/gist_id}","starred_url":"https://api.github.com/users/PatDyn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PatDyn/subscriptions","organizations_url":"https://api.github.com/users/PatDyn/orgs","repos_url":"https://api.github.com/users/PatDyn/repos","events_url":"https://api.github.com/users/PatDyn/events{/privacy}","received_events_url":"https://api.github.com/users/PatDyn/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":1,"closed_issues":0,"state":"open","created_at":"2025-08-07T12:50:58Z","updated_at":"2025-08-07T12:53:15Z","due_on":"2025-08-31T07:00:00Z","closed_at":null}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Frequested_reviewers%3Fper_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2F3%2Frequested_reviewers%3Fper_page=100
similarity index 75%
rename from services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Frequested_reviewers%3Fper_page=100
rename to services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2F3%2Frequested_reviewers%3Fper_page=100
index 1b4481f890..5d382a0ed1 100644
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Frequested_reviewers%3Fper_page=100
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2F3%2Frequested_reviewers%3Fper_page=100
@@ -1,24 +1,25 @@
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-Etag: W/"21730161122bd4f229e886dd4a85b45fa575182d6dcef7aa0016a5d21353c9ab"
-X-Oauth-Scopes:
-X-Github-Media-Type: github.v3; format=json
-Access-Control-Allow-Origin: *
-X-Frame-Options: deny
-X-Content-Type-Options: nosniff
-X-Xss-Protection: 0
-X-Github-Request-Id: C7CC:3118FC:3F6187A:4038171:6729E6BD
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Github-Api-Version-Selected: 2022-11-28
-X-Ratelimit-Limit: 5000
-X-Ratelimit-Resource: core
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-Content-Security-Policy: default-src 'none'
Content-Type: application/json; charset=utf-8
+X-Oauth-Scopes: public_repo, repo:status
+Access-Control-Allow-Origin: *
+Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
+Content-Security-Policy: default-src 'none'
Cache-Control: private, max-age=60, s-maxage=60
X-Accepted-Oauth-Scopes:
-X-Ratelimit-Remaining: 4905
-X-Ratelimit-Reset: 1730800941
-X-Ratelimit-Used: 95
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
+Github-Authentication-Token-Expiration: 2025-09-11 10:37:11 UTC
+X-Github-Api-Version-Selected: 2022-11-28
+X-Ratelimit-Resource: core
+Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
+X-Frame-Options: deny
+X-Content-Type-Options: nosniff
+Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
+X-Github-Media-Type: github.v3; format=json
+X-Ratelimit-Limit: 5000
+X-Ratelimit-Remaining: 4863
+X-Ratelimit-Reset: 1755007969
+X-Ratelimit-Used: 137
+X-Xss-Protection: 0
+Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
+Etag: W/"bf72ef7e37aa7c7a418e89035db9d7f23b969af0705f1e9c7ee692aad6c272f7"
+X-Github-Request-Id: E80A:118F3A:208A8A:1EA3C0:689B4023
{"users":[],"teams":[]}
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2F3%2Freviews%2F3096999684%2Fcomments%3Fper_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2F3%2Freviews%2F3096999684%2Fcomments%3Fper_page=100
new file mode 100644
index 0000000000..51f70d2a81
--- /dev/null
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2F3%2Freviews%2F3096999684%2Fcomments%3Fper_page=100
@@ -0,0 +1,25 @@
+Content-Type: application/json; charset=utf-8
+Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
+Etag: W/"9f6ff2d639a65dc556bded7ae25926c53ac6673582b68d1ebbbe3ecb1c375e3b"
+X-Ratelimit-Limit: 5000
+Access-Control-Allow-Origin: *
+X-Content-Type-Options: nosniff
+X-Xss-Protection: 0
+Content-Security-Policy: default-src 'none'
+X-Oauth-Scopes: public_repo, repo:status
+X-Accepted-Oauth-Scopes:
+Github-Authentication-Token-Expiration: 2025-09-11 10:37:11 UTC
+X-Ratelimit-Remaining: 4867
+X-Ratelimit-Resource: core
+Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
+X-Github-Request-Id: E80A:118F3A:207FBB:1E9958:689B4021
+Cache-Control: private, max-age=60, s-maxage=60
+X-Github-Media-Type: github.v3; format=json
+X-Github-Api-Version-Selected: 2022-11-28
+X-Ratelimit-Reset: 1755007969
+X-Ratelimit-Used: 133
+Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
+Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
+X-Frame-Options: deny
+
+[{"id":2260216729,"node_id":"PRRC_kwDOPZ8tBM6GuCuZ","url":"https://api.github.com/repos/forgejo/test_repo/pulls/comments/2260216729","pull_request_review_id":3096999684,"diff_hunk":"@@ -1,3 +1,5 @@\n # Forgejo Test Repo\n \n This repo is used to test migrations\n+\n+Add some feature description.","path":"readme.md","position":5,"original_position":5,"commit_id":"c608ab3997349219e1510cdb5ddd1e5e82897dfa","user":{"login":"PatDyn","id":37243484,"node_id":"MDQ6VXNlcjM3MjQzNDg0","avatar_url":"https://avatars.githubusercontent.com/u/37243484?v=4","gravatar_id":"","url":"https://api.github.com/users/PatDyn","html_url":"https://github.com/PatDyn","followers_url":"https://api.github.com/users/PatDyn/followers","following_url":"https://api.github.com/users/PatDyn/following{/other_user}","gists_url":"https://api.github.com/users/PatDyn/gists{/gist_id}","starred_url":"https://api.github.com/users/PatDyn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PatDyn/subscriptions","organizations_url":"https://api.github.com/users/PatDyn/orgs","repos_url":"https://api.github.com/users/PatDyn/repos","events_url":"https://api.github.com/users/PatDyn/events{/privacy}","received_events_url":"https://api.github.com/users/PatDyn/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"May want to write more","created_at":"2025-08-07T12:47:50Z","updated_at":"2025-08-07T12:47:55Z","html_url":"https://github.com/forgejo/test_repo/pull/3#discussion_r2260216729","pull_request_url":"https://api.github.com/repos/forgejo/test_repo/pulls/3","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/forgejo/test_repo/pulls/comments/2260216729"},"html":{"href":"https://github.com/forgejo/test_repo/pull/3#discussion_r2260216729"},"pull_request":{"href":"https://api.github.com/repos/forgejo/test_repo/pulls/3"}},"original_commit_id":"c608ab3997349219e1510cdb5ddd1e5e82897dfa","reactions":{"url":"https://api.github.com/repos/forgejo/test_repo/pulls/comments/2260216729/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0}}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2F3%2Freviews%2F3097007243%2Fcomments%3Fper_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2F3%2Freviews%2F3097007243%2Fcomments%3Fper_page=100
new file mode 100644
index 0000000000..cd5fbdaf9d
--- /dev/null
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2F3%2Freviews%2F3097007243%2Fcomments%3Fper_page=100
@@ -0,0 +1,25 @@
+Etag: W/"17a2560299e1dbb8e8b83de09a8a409cd7b735baeebea469a041311a71a948d0"
+X-Accepted-Oauth-Scopes:
+X-Ratelimit-Remaining: 4865
+X-Ratelimit-Resource: core
+Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
+Content-Security-Policy: default-src 'none'
+X-Github-Api-Version-Selected: 2022-11-28
+X-Ratelimit-Used: 135
+Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
+X-Github-Request-Id: E80A:118F3A:20854A:1E9EB1:689B4022
+Content-Type: application/json; charset=utf-8
+Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
+X-Github-Media-Type: github.v3; format=json
+X-Ratelimit-Limit: 5000
+X-Frame-Options: deny
+X-Content-Type-Options: nosniff
+X-Xss-Protection: 0
+X-Oauth-Scopes: public_repo, repo:status
+Github-Authentication-Token-Expiration: 2025-09-11 10:37:11 UTC
+X-Ratelimit-Reset: 1755007969
+Access-Control-Allow-Origin: *
+Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
+Cache-Control: private, max-age=60, s-maxage=60
+
+[{"id":2260221159,"node_id":"PRRC_kwDOPZ8tBM6GuDzn","url":"https://api.github.com/repos/forgejo/test_repo/pulls/comments/2260221159","pull_request_review_id":3097007243,"diff_hunk":"@@ -1,3 +1,5 @@\n # Forgejo Test Repo\n \n This repo is used to test migrations","path":"readme.md","position":3,"original_position":3,"commit_id":"c608ab3997349219e1510cdb5ddd1e5e82897dfa","user":{"login":"PatDyn","id":37243484,"node_id":"MDQ6VXNlcjM3MjQzNDg0","avatar_url":"https://avatars.githubusercontent.com/u/37243484?v=4","gravatar_id":"","url":"https://api.github.com/users/PatDyn","html_url":"https://github.com/PatDyn","followers_url":"https://api.github.com/users/PatDyn/followers","following_url":"https://api.github.com/users/PatDyn/following{/other_user}","gists_url":"https://api.github.com/users/PatDyn/gists{/gist_id}","starred_url":"https://api.github.com/users/PatDyn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PatDyn/subscriptions","organizations_url":"https://api.github.com/users/PatDyn/orgs","repos_url":"https://api.github.com/users/PatDyn/repos","events_url":"https://api.github.com/users/PatDyn/events{/privacy}","received_events_url":"https://api.github.com/users/PatDyn/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"Comment","created_at":"2025-08-07T12:49:36Z","updated_at":"2025-08-07T12:49:36Z","html_url":"https://github.com/forgejo/test_repo/pull/3#discussion_r2260221159","pull_request_url":"https://api.github.com/repos/forgejo/test_repo/pulls/3","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/forgejo/test_repo/pulls/comments/2260221159"},"html":{"href":"https://github.com/forgejo/test_repo/pull/3#discussion_r2260221159"},"pull_request":{"href":"https://api.github.com/repos/forgejo/test_repo/pulls/3"}},"original_commit_id":"c608ab3997349219e1510cdb5ddd1e5e82897dfa","reactions":{"url":"https://api.github.com/repos/forgejo/test_repo/pulls/comments/2260221159/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0}}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2F3%2Freviews%3Fper_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2F3%2Freviews%3Fper_page=100
new file mode 100644
index 0000000000..82970c7a67
--- /dev/null
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2F3%2Freviews%3Fper_page=100
@@ -0,0 +1,25 @@
+Content-Type: application/json; charset=utf-8
+X-Accepted-Oauth-Scopes:
+X-Github-Media-Type: github.v3; format=json
+Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
+X-Content-Type-Options: nosniff
+Content-Security-Policy: default-src 'none'
+Cache-Control: private, max-age=60, s-maxage=60
+Etag: W/"d3281ac301ca94c8125009c335025cae84e5af242cb315bb975afad875b825e2"
+X-Oauth-Scopes: public_repo, repo:status
+Github-Authentication-Token-Expiration: 2025-09-11 10:37:11 UTC
+X-Ratelimit-Remaining: 4868
+Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
+X-Github-Request-Id: E80A:118F3A:207BE7:1E9600:689B4020
+Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
+X-Github-Api-Version-Selected: 2022-11-28
+X-Ratelimit-Limit: 5000
+X-Ratelimit-Reset: 1755007969
+X-Ratelimit-Resource: core
+Access-Control-Allow-Origin: *
+X-Frame-Options: deny
+X-Xss-Protection: 0
+X-Ratelimit-Used: 132
+Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
+
+[{"id":3096999684,"node_id":"PRR_kwDOPZ8tBM64mHcE","user":{"login":"PatDyn","id":37243484,"node_id":"MDQ6VXNlcjM3MjQzNDg0","avatar_url":"https://avatars.githubusercontent.com/u/37243484?u=c4857996d3079f843b3eb2a7dcb347698d817034&v=4","gravatar_id":"","url":"https://api.github.com/users/PatDyn","html_url":"https://github.com/PatDyn","followers_url":"https://api.github.com/users/PatDyn/followers","following_url":"https://api.github.com/users/PatDyn/following{/other_user}","gists_url":"https://api.github.com/users/PatDyn/gists{/gist_id}","starred_url":"https://api.github.com/users/PatDyn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PatDyn/subscriptions","organizations_url":"https://api.github.com/users/PatDyn/orgs","repos_url":"https://api.github.com/users/PatDyn/repos","events_url":"https://api.github.com/users/PatDyn/events{/privacy}","received_events_url":"https://api.github.com/users/PatDyn/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"","state":"COMMENTED","html_url":"https://github.com/forgejo/test_repo/pull/3#pullrequestreview-3096999684","pull_request_url":"https://api.github.com/repos/forgejo/test_repo/pulls/3","author_association":"COLLABORATOR","_links":{"html":{"href":"https://github.com/forgejo/test_repo/pull/3#pullrequestreview-3096999684"},"pull_request":{"href":"https://api.github.com/repos/forgejo/test_repo/pulls/3"}},"submitted_at":"2025-08-07T12:47:55Z","commit_id":"c608ab3997349219e1510cdb5ddd1e5e82897dfa"},{"id":3097007243,"node_id":"PRR_kwDOPZ8tBM64mJSL","user":{"login":"PatDyn","id":37243484,"node_id":"MDQ6VXNlcjM3MjQzNDg0","avatar_url":"https://avatars.githubusercontent.com/u/37243484?u=c4857996d3079f843b3eb2a7dcb347698d817034&v=4","gravatar_id":"","url":"https://api.github.com/users/PatDyn","html_url":"https://github.com/PatDyn","followers_url":"https://api.github.com/users/PatDyn/followers","following_url":"https://api.github.com/users/PatDyn/following{/other_user}","gists_url":"https://api.github.com/users/PatDyn/gists{/gist_id}","starred_url":"https://api.github.com/users/PatDyn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PatDyn/subscriptions","organizations_url":"https://api.github.com/users/PatDyn/orgs","repos_url":"https://api.github.com/users/PatDyn/repos","events_url":"https://api.github.com/users/PatDyn/events{/privacy}","received_events_url":"https://api.github.com/users/PatDyn/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"","state":"COMMENTED","html_url":"https://github.com/forgejo/test_repo/pull/3#pullrequestreview-3097007243","pull_request_url":"https://api.github.com/repos/forgejo/test_repo/pulls/3","author_association":"COLLABORATOR","_links":{"html":{"href":"https://github.com/forgejo/test_repo/pull/3#pullrequestreview-3097007243"},"pull_request":{"href":"https://api.github.com/repos/forgejo/test_repo/pulls/3"}},"submitted_at":"2025-08-07T12:49:36Z","commit_id":"c608ab3997349219e1510cdb5ddd1e5e82897dfa"}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%2F315861440%2Fcomments%3Fper_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2F4%2Freviews%3Fper_page=100
similarity index 63%
rename from services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%2F315861440%2Fcomments%3Fper_page=100
rename to services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2F4%2Freviews%3Fper_page=100
index e52428a5af..eea4344781 100644
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%2F315861440%2Fcomments%3Fper_page=100
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2F4%2Freviews%3Fper_page=100
@@ -1,25 +1,23 @@
-Content-Type: application/json; charset=utf-8
-Cache-Control: private, max-age=60, s-maxage=60
-X-Ratelimit-Reset: 1730800941
-X-Content-Type-Options: nosniff
-Content-Security-Policy: default-src 'none'
-X-Accepted-Oauth-Scopes:
-X-Xss-Protection: 0
-X-Github-Request-Id: C7CC:3118FC:3F61690:4037F90:6729E6BD
-Content-Length: 2
-X-Oauth-Scopes:
-X-Github-Api-Version-Selected: 2022-11-28
X-Ratelimit-Limit: 5000
-X-Frame-Options: deny
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-Access-Control-Allow-Origin: *
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-Etag: "450a1c087fec81e5b86092ff5372c3db8ca834c1e23c03c6b06ecca33cefd665"
+X-Ratelimit-Remaining: 4856
+X-Ratelimit-Used: 144
+X-Accepted-Oauth-Scopes: repo
X-Github-Media-Type: github.v3; format=json
-X-Ratelimit-Remaining: 4906
-X-Ratelimit-Used: 94
-X-Ratelimit-Resource: core
+X-Github-Api-Version-Selected: 2022-11-28
Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
+X-Xss-Protection: 0
+Content-Security-Policy: default-src 'none'
+Vary: Accept-Encoding, Accept, X-Requested-With
+X-Github-Request-Id: EDE1:32C4F6:A76DB4:9D7693:689B37A6
+X-Ratelimit-Reset: 1755004338
+X-Ratelimit-Resource: core
Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
+X-Frame-Options: deny
+Content-Type: application/json; charset=utf-8
+X-Oauth-Scopes: public_repo, repo:status
+Github-Authentication-Token-Expiration: 2025-09-11 10:37:11 UTC
+Access-Control-Allow-Origin: *
+X-Content-Type-Options: nosniff
+Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-[]
\ No newline at end of file
+{"message":"Not Found","documentation_url":"https://docs.github.com/rest/pulls/reviews#list-reviews-for-a-pull-request","status":"404"}
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Frequested_reviewers%3Fper_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2F7%2Frequested_reviewers%3Fper_page=100
similarity index 75%
rename from services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Frequested_reviewers%3Fper_page=100
rename to services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2F7%2Frequested_reviewers%3Fper_page=100
index 676e326094..f3bef5c3bd 100644
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Frequested_reviewers%3Fper_page=100
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2F7%2Frequested_reviewers%3Fper_page=100
@@ -1,24 +1,25 @@
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Oauth-Scopes:
-X-Ratelimit-Limit: 5000
-X-Ratelimit-Remaining: 4898
+X-Ratelimit-Remaining: 4958
+X-Content-Type-Options: nosniff
+Content-Security-Policy: default-src 'none'
+X-Oauth-Scopes: public_repo, repo:status
+X-Accepted-Oauth-Scopes:
+Github-Authentication-Token-Expiration: 2025-09-11 10:37:11 UTC
+X-Github-Media-Type: github.v3; format=json
+X-Github-Api-Version-Selected: 2022-11-28
+X-Ratelimit-Reset: 1755007969
+X-Ratelimit-Used: 42
+X-Ratelimit-Resource: core
+Etag: W/"bf72ef7e37aa7c7a418e89035db9d7f23b969af0705f1e9c7ee692aad6c272f7"
Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
+Access-Control-Allow-Origin: *
+Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
+X-Frame-Options: deny
X-Xss-Protection: 0
Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-Content-Security-Policy: default-src 'none'
-X-Github-Request-Id: C7CC:3118FC:3F623DF:4038CEB:6729E6C0
-Etag: W/"21730161122bd4f229e886dd4a85b45fa575182d6dcef7aa0016a5d21353c9ab"
-X-Accepted-Oauth-Scopes:
-X-Github-Media-Type: github.v3; format=json
-X-Ratelimit-Resource: core
-Access-Control-Allow-Origin: *
-X-Frame-Options: deny
-Content-Type: application/json; charset=utf-8
Cache-Control: private, max-age=60, s-maxage=60
-X-Ratelimit-Used: 102
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-X-Github-Api-Version-Selected: 2022-11-28
-X-Ratelimit-Reset: 1730800941
-X-Content-Type-Options: nosniff
+X-Github-Request-Id: F852:1553BC:10F18A:FD450:689B3DFF
+Content-Type: application/json; charset=utf-8
+Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
+X-Ratelimit-Limit: 5000
{"users":[],"teams":[]}
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%2F315860062%2Fcomments%3Fper_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2F7%2Freviews%3Fper_page=100
similarity index 75%
rename from services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%2F315860062%2Fcomments%3Fper_page=100
rename to services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2F7%2Freviews%3Fper_page=100
index 389c1b7567..fea2907aa4 100644
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%2F315860062%2Fcomments%3Fper_page=100
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2F7%2Freviews%3Fper_page=100
@@ -1,25 +1,26 @@
-Content-Length: 2
+X-Xss-Protection: 0
+Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
+X-Oauth-Scopes: public_repo, repo:status
+Github-Authentication-Token-Expiration: 2025-09-11 10:37:11 UTC
+X-Github-Media-Type: github.v3; format=json
+Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
+X-Github-Request-Id: F852:1553BC:10EEC0:FD190:689B3DFE
+Content-Type: application/json; charset=utf-8
+Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
X-Frame-Options: deny
+Content-Security-Policy: default-src 'none'
+Content-Length: 2
+X-Accepted-Oauth-Scopes:
X-Github-Api-Version-Selected: 2022-11-28
X-Ratelimit-Limit: 5000
-X-Ratelimit-Used: 93
+X-Ratelimit-Remaining: 4959
+X-Ratelimit-Used: 41
X-Ratelimit-Resource: core
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-Content-Type: application/json; charset=utf-8
-X-Accepted-Oauth-Scopes:
-X-Xss-Protection: 0
-X-Oauth-Scopes:
-X-Ratelimit-Remaining: 4907
-X-Ratelimit-Reset: 1730800941
Access-Control-Allow-Origin: *
-X-Content-Type-Options: nosniff
-Content-Security-Policy: default-src 'none'
Cache-Control: private, max-age=60, s-maxage=60
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Github-Request-Id: C7CC:3118FC:3F614AA:4037DB7:6729E6BD
-X-Github-Media-Type: github.v3; format=json
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-Etag: "450a1c087fec81e5b86092ff5372c3db8ca834c1e23c03c6b06ecca33cefd665"
+Etag: "bb321a3b596949885b60e203a5ea335475c7ac9e2364d10f463cb934490c25a5"
+X-Ratelimit-Reset: 1755007969
+Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
+X-Content-Type-Options: nosniff
[]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2Fcomments%2F363017488%2Freactions%3Fpage=1&per_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2Fcomments%2F2260216729%2Freactions%3Fpage=1&per_page=100
similarity index 76%
rename from services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2Fcomments%2F363017488%2Freactions%3Fpage=1&per_page=100
rename to services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2Fcomments%2F2260216729%2Freactions%3Fpage=1&per_page=100
index 748ae93381..39a6e753b9 100644
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2Fcomments%2F363017488%2Freactions%3Fpage=1&per_page=100
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2Fcomments%2F2260216729%2Freactions%3Fpage=1&per_page=100
@@ -1,25 +1,26 @@
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-Etag: "f87b0fd59e59458a9a808311324b873c6baf3fde861298a99de9986270dd4d79"
-X-Accepted-Oauth-Scopes:
-X-Ratelimit-Remaining: 4902
-X-Ratelimit-Reset: 1730800941
-X-Ratelimit-Resource: core
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-X-Github-Media-Type: github.v3; param=squirrel-girl-preview
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-Access-Control-Allow-Origin: *
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-X-Github-Request-Id: C7CC:3118FC:3F61D73:4038667:6729E6BF
Content-Type: application/json; charset=utf-8
-X-Ratelimit-Limit: 5000
-Content-Length: 2
-Cache-Control: private, max-age=60, s-maxage=60
-X-Oauth-Scopes:
+Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
+Github-Authentication-Token-Expiration: 2025-09-11 10:37:11 UTC
X-Github-Api-Version-Selected: 2022-11-28
-X-Ratelimit-Used: 98
+Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
X-Frame-Options: deny
+X-Github-Request-Id: E80A:118F3A:2082EC:1E9C92:689B4022
+Content-Length: 2
+X-Ratelimit-Remaining: 4866
+X-Ratelimit-Resource: core
+Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
+Cache-Control: private, max-age=60, s-maxage=60
+X-Oauth-Scopes: public_repo, repo:status
+X-Accepted-Oauth-Scopes:
+X-Github-Media-Type: github.v3; param=squirrel-girl-preview
+X-Ratelimit-Limit: 5000
+X-Ratelimit-Reset: 1755007969
+X-Ratelimit-Used: 134
+Access-Control-Allow-Origin: *
+Etag: "578cfdf865ccd59faa414c655476c87af814e220755c938b9545967521b6f14b"
X-Content-Type-Options: nosniff
X-Xss-Protection: 0
+Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
Content-Security-Policy: default-src 'none'
[]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2Fcomments%2F363029944%2Freactions%3Fpage=1&per_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2Fcomments%2F2260221159%2Freactions%3Fpage=1&per_page=100
similarity index 76%
rename from services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2Fcomments%2F363029944%2Freactions%3Fpage=1&per_page=100
rename to services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2Fcomments%2F2260221159%2Freactions%3Fpage=1&per_page=100
index 0b0ae88deb..1c80bb32d7 100644
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2Fcomments%2F363029944%2Freactions%3Fpage=1&per_page=100
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%2Fcomments%2F2260221159%2Freactions%3Fpage=1&per_page=100
@@ -1,25 +1,26 @@
-X-Accepted-Oauth-Scopes:
-X-Ratelimit-Remaining: 4899
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-Content-Length: 2
-X-Ratelimit-Used: 101
-Access-Control-Allow-Origin: *
+X-Ratelimit-Used: 136
X-Frame-Options: deny
-X-Content-Type-Options: nosniff
-X-Xss-Protection: 0
+Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
+X-Github-Request-Id: E80A:118F3A:20881D:1EA17C:689B4022
+Content-Type: application/json; charset=utf-8
+X-Github-Media-Type: github.v3; param=squirrel-girl-preview
+Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
+Access-Control-Allow-Origin: *
Content-Security-Policy: default-src 'none'
Cache-Control: private, max-age=60, s-maxage=60
-Etag: "f87b0fd59e59458a9a808311324b873c6baf3fde861298a99de9986270dd4d79"
-X-Oauth-Scopes:
+X-Oauth-Scopes: public_repo, repo:status
+Github-Authentication-Token-Expiration: 2025-09-11 10:37:11 UTC
X-Github-Api-Version-Selected: 2022-11-28
-X-Ratelimit-Limit: 5000
-X-Ratelimit-Reset: 1730800941
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-Content-Type: application/json; charset=utf-8
+X-Content-Type-Options: nosniff
+Content-Length: 2
Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Github-Media-Type: github.v3; param=squirrel-girl-preview
+Etag: "578cfdf865ccd59faa414c655476c87af814e220755c938b9545967521b6f14b"
+X-Ratelimit-Remaining: 4864
+X-Ratelimit-Reset: 1755007969
X-Ratelimit-Resource: core
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-X-Github-Request-Id: C7CC:3118FC:3F622AC:4038BA5:6729E6C0
+Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
+X-Xss-Protection: 0
+X-Accepted-Oauth-Scopes:
+X-Ratelimit-Limit: 5000
[]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%3Fdirection=asc&page=1&per_page=2&sort=created&state=all b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%3Fdirection=asc&page=1&per_page=2&sort=created&state=all
new file mode 100644
index 0000000000..2835f22e9b
--- /dev/null
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Fpulls%3Fdirection=asc&page=1&per_page=2&sort=created&state=all
@@ -0,0 +1,25 @@
+Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
+X-Frame-Options: deny
+Cache-Control: private, max-age=60, s-maxage=60
+X-Accepted-Oauth-Scopes:
+X-Ratelimit-Remaining: 4871
+X-Content-Type-Options: nosniff
+Content-Security-Policy: default-src 'none'
+Github-Authentication-Token-Expiration: 2025-09-11 10:37:11 UTC
+X-Github-Media-Type: github.v3; format=json
+X-Github-Api-Version-Selected: 2022-11-28
+X-Ratelimit-Reset: 1755007969
+Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
+Access-Control-Allow-Origin: *
+X-Xss-Protection: 0
+X-Github-Request-Id: E80A:118F3A:207219:1E8D78:689B401F
+Content-Type: application/json; charset=utf-8
+X-Oauth-Scopes: public_repo, repo:status
+X-Ratelimit-Limit: 5000
+X-Ratelimit-Used: 129
+Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
+Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
+Etag: W/"9669b72db2e9016fd408b8c554dc01719c614d29bb965b082a81ee0489fd0914"
+X-Ratelimit-Resource: core
+
+[{"url":"https://api.github.com/repos/forgejo/test_repo/pulls/3","id":2727677736,"node_id":"PR_kwDOPZ8tBM6ilQ8o","html_url":"https://github.com/forgejo/test_repo/pull/3","diff_url":"https://github.com/forgejo/test_repo/pull/3.diff","patch_url":"https://github.com/forgejo/test_repo/pull/3.patch","issue_url":"https://api.github.com/repos/forgejo/test_repo/issues/3","number":3,"state":"open","locked":false,"title":"Update readme.md","user":{"login":"PatDyn","id":37243484,"node_id":"MDQ6VXNlcjM3MjQzNDg0","avatar_url":"https://avatars.githubusercontent.com/u/37243484?v=4","gravatar_id":"","url":"https://api.github.com/users/PatDyn","html_url":"https://github.com/PatDyn","followers_url":"https://api.github.com/users/PatDyn/followers","following_url":"https://api.github.com/users/PatDyn/following{/other_user}","gists_url":"https://api.github.com/users/PatDyn/gists{/gist_id}","starred_url":"https://api.github.com/users/PatDyn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PatDyn/subscriptions","organizations_url":"https://api.github.com/users/PatDyn/orgs","repos_url":"https://api.github.com/users/PatDyn/repos","events_url":"https://api.github.com/users/PatDyn/events{/privacy}","received_events_url":"https://api.github.com/users/PatDyn/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"Added a feature description","created_at":"2025-08-07T12:47:06Z","updated_at":"2025-08-12T13:16:49Z","closed_at":null,"merged_at":null,"merge_commit_sha":null,"assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":9072229390,"node_id":"LA_kwDOPZ8tBM8AAAACHL88Dg","url":"https://api.github.com/repos/forgejo/test_repo/labels/enhancement","name":"enhancement","color":"a2eeef","default":true,"description":"New feature or request"}],"milestone":{"url":"https://api.github.com/repos/forgejo/test_repo/milestones/1","html_url":"https://github.com/forgejo/test_repo/milestone/1","labels_url":"https://api.github.com/repos/forgejo/test_repo/milestones/1/labels","id":13445581,"node_id":"MI_kwDOPZ8tBM4AzSnN","number":1,"title":"1.0.0","description":"Version 1","creator":{"login":"PatDyn","id":37243484,"node_id":"MDQ6VXNlcjM3MjQzNDg0","avatar_url":"https://avatars.githubusercontent.com/u/37243484?v=4","gravatar_id":"","url":"https://api.github.com/users/PatDyn","html_url":"https://github.com/PatDyn","followers_url":"https://api.github.com/users/PatDyn/followers","following_url":"https://api.github.com/users/PatDyn/following{/other_user}","gists_url":"https://api.github.com/users/PatDyn/gists{/gist_id}","starred_url":"https://api.github.com/users/PatDyn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PatDyn/subscriptions","organizations_url":"https://api.github.com/users/PatDyn/orgs","repos_url":"https://api.github.com/users/PatDyn/repos","events_url":"https://api.github.com/users/PatDyn/events{/privacy}","received_events_url":"https://api.github.com/users/PatDyn/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":1,"closed_issues":2,"state":"open","created_at":"2025-08-07T12:48:56Z","updated_at":"2025-08-12T12:34:20Z","due_on":null,"closed_at":null},"draft":false,"commits_url":"https://api.github.com/repos/forgejo/test_repo/pulls/3/commits","review_comments_url":"https://api.github.com/repos/forgejo/test_repo/pulls/3/comments","review_comment_url":"https://api.github.com/repos/forgejo/test_repo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/forgejo/test_repo/issues/3/comments","statuses_url":"https://api.github.com/repos/forgejo/test_repo/statuses/c608ab3997349219e1510cdb5ddd1e5e82897dfa","head":{"label":"forgejo:some-feature","ref":"some-feature","sha":"c608ab3997349219e1510cdb5ddd1e5e82897dfa","user":{"login":"forgejo","id":118922216,"node_id":"O_kgDOBxab6A","avatar_url":"https://avatars.githubusercontent.com/u/118922216?v=4","gravatar_id":"","url":"https://api.github.com/users/forgejo","html_url":"https://github.com/forgejo","followers_url":"https://api.github.com/users/forgejo/followers","following_url":"https://api.github.com/users/forgejo/following{/other_user}","gists_url":"https://api.github.com/users/forgejo/gists{/gist_id}","starred_url":"https://api.github.com/users/forgejo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/forgejo/subscriptions","organizations_url":"https://api.github.com/users/forgejo/orgs","repos_url":"https://api.github.com/users/forgejo/repos","events_url":"https://api.github.com/users/forgejo/events{/privacy}","received_events_url":"https://api.github.com/users/forgejo/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":1033841924,"node_id":"R_kgDOPZ8tBA","name":"test_repo","full_name":"forgejo/test_repo","private":false,"owner":{"login":"forgejo","id":118922216,"node_id":"O_kgDOBxab6A","avatar_url":"https://avatars.githubusercontent.com/u/118922216?v=4","gravatar_id":"","url":"https://api.github.com/users/forgejo","html_url":"https://github.com/forgejo","followers_url":"https://api.github.com/users/forgejo/followers","following_url":"https://api.github.com/users/forgejo/following{/other_user}","gists_url":"https://api.github.com/users/forgejo/gists{/gist_id}","starred_url":"https://api.github.com/users/forgejo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/forgejo/subscriptions","organizations_url":"https://api.github.com/users/forgejo/orgs","repos_url":"https://api.github.com/users/forgejo/repos","events_url":"https://api.github.com/users/forgejo/events{/privacy}","received_events_url":"https://api.github.com/users/forgejo/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/forgejo/test_repo","description":"Exclusively used for testing Github->Forgejo migration","fork":false,"url":"https://api.github.com/repos/forgejo/test_repo","forks_url":"https://api.github.com/repos/forgejo/test_repo/forks","keys_url":"https://api.github.com/repos/forgejo/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/forgejo/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/forgejo/test_repo/teams","hooks_url":"https://api.github.com/repos/forgejo/test_repo/hooks","issue_events_url":"https://api.github.com/repos/forgejo/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/forgejo/test_repo/events","assignees_url":"https://api.github.com/repos/forgejo/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/forgejo/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/forgejo/test_repo/tags","blobs_url":"https://api.github.com/repos/forgejo/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/forgejo/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/forgejo/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/forgejo/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/forgejo/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/forgejo/test_repo/languages","stargazers_url":"https://api.github.com/repos/forgejo/test_repo/stargazers","contributors_url":"https://api.github.com/repos/forgejo/test_repo/contributors","subscribers_url":"https://api.github.com/repos/forgejo/test_repo/subscribers","subscription_url":"https://api.github.com/repos/forgejo/test_repo/subscription","commits_url":"https://api.github.com/repos/forgejo/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/forgejo/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/forgejo/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/forgejo/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/forgejo/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/forgejo/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/forgejo/test_repo/merges","archive_url":"https://api.github.com/repos/forgejo/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/forgejo/test_repo/downloads","issues_url":"https://api.github.com/repos/forgejo/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/forgejo/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/forgejo/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/forgejo/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/forgejo/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/forgejo/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/forgejo/test_repo/deployments","created_at":"2025-08-07T12:34:21Z","updated_at":"2025-08-12T11:21:45Z","pushed_at":"2025-08-07T13:07:49Z","git_url":"git://github.com/forgejo/test_repo.git","ssh_url":"git@github.com:forgejo/test_repo.git","clone_url":"https://github.com/forgejo/test_repo.git","svn_url":"https://github.com/forgejo/test_repo","homepage":"https://codeberg.org/forgejo/forgejo/","size":6,"stargazers_count":1,"watchers_count":1,"language":null,"has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":1,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":5,"license":{"key":"0bsd","name":"BSD Zero Clause License","spdx_id":"0BSD","url":"https://api.github.com/licenses/0bsd","node_id":"MDc6TGljZW5zZTM1"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":["forgejo"],"visibility":"public","forks":1,"open_issues":5,"watchers":1,"default_branch":"main"}},"base":{"label":"forgejo:main","ref":"main","sha":"442d28a55b842472c95bead51a4c61f209ac1636","user":{"login":"forgejo","id":118922216,"node_id":"O_kgDOBxab6A","avatar_url":"https://avatars.githubusercontent.com/u/118922216?v=4","gravatar_id":"","url":"https://api.github.com/users/forgejo","html_url":"https://github.com/forgejo","followers_url":"https://api.github.com/users/forgejo/followers","following_url":"https://api.github.com/users/forgejo/following{/other_user}","gists_url":"https://api.github.com/users/forgejo/gists{/gist_id}","starred_url":"https://api.github.com/users/forgejo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/forgejo/subscriptions","organizations_url":"https://api.github.com/users/forgejo/orgs","repos_url":"https://api.github.com/users/forgejo/repos","events_url":"https://api.github.com/users/forgejo/events{/privacy}","received_events_url":"https://api.github.com/users/forgejo/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":1033841924,"node_id":"R_kgDOPZ8tBA","name":"test_repo","full_name":"forgejo/test_repo","private":false,"owner":{"login":"forgejo","id":118922216,"node_id":"O_kgDOBxab6A","avatar_url":"https://avatars.githubusercontent.com/u/118922216?v=4","gravatar_id":"","url":"https://api.github.com/users/forgejo","html_url":"https://github.com/forgejo","followers_url":"https://api.github.com/users/forgejo/followers","following_url":"https://api.github.com/users/forgejo/following{/other_user}","gists_url":"https://api.github.com/users/forgejo/gists{/gist_id}","starred_url":"https://api.github.com/users/forgejo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/forgejo/subscriptions","organizations_url":"https://api.github.com/users/forgejo/orgs","repos_url":"https://api.github.com/users/forgejo/repos","events_url":"https://api.github.com/users/forgejo/events{/privacy}","received_events_url":"https://api.github.com/users/forgejo/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/forgejo/test_repo","description":"Exclusively used for testing Github->Forgejo migration","fork":false,"url":"https://api.github.com/repos/forgejo/test_repo","forks_url":"https://api.github.com/repos/forgejo/test_repo/forks","keys_url":"https://api.github.com/repos/forgejo/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/forgejo/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/forgejo/test_repo/teams","hooks_url":"https://api.github.com/repos/forgejo/test_repo/hooks","issue_events_url":"https://api.github.com/repos/forgejo/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/forgejo/test_repo/events","assignees_url":"https://api.github.com/repos/forgejo/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/forgejo/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/forgejo/test_repo/tags","blobs_url":"https://api.github.com/repos/forgejo/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/forgejo/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/forgejo/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/forgejo/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/forgejo/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/forgejo/test_repo/languages","stargazers_url":"https://api.github.com/repos/forgejo/test_repo/stargazers","contributors_url":"https://api.github.com/repos/forgejo/test_repo/contributors","subscribers_url":"https://api.github.com/repos/forgejo/test_repo/subscribers","subscription_url":"https://api.github.com/repos/forgejo/test_repo/subscription","commits_url":"https://api.github.com/repos/forgejo/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/forgejo/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/forgejo/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/forgejo/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/forgejo/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/forgejo/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/forgejo/test_repo/merges","archive_url":"https://api.github.com/repos/forgejo/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/forgejo/test_repo/downloads","issues_url":"https://api.github.com/repos/forgejo/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/forgejo/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/forgejo/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/forgejo/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/forgejo/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/forgejo/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/forgejo/test_repo/deployments","created_at":"2025-08-07T12:34:21Z","updated_at":"2025-08-12T11:21:45Z","pushed_at":"2025-08-07T13:07:49Z","git_url":"git://github.com/forgejo/test_repo.git","ssh_url":"git@github.com:forgejo/test_repo.git","clone_url":"https://github.com/forgejo/test_repo.git","svn_url":"https://github.com/forgejo/test_repo","homepage":"https://codeberg.org/forgejo/forgejo/","size":6,"stargazers_count":1,"watchers_count":1,"language":null,"has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":1,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":5,"license":{"key":"0bsd","name":"BSD Zero Clause License","spdx_id":"0BSD","url":"https://api.github.com/licenses/0bsd","node_id":"MDc6TGljZW5zZTM1"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":["forgejo"],"visibility":"public","forks":1,"open_issues":5,"watchers":1,"default_branch":"main"}},"_links":{"self":{"href":"https://api.github.com/repos/forgejo/test_repo/pulls/3"},"html":{"href":"https://github.com/forgejo/test_repo/pull/3"},"issue":{"href":"https://api.github.com/repos/forgejo/test_repo/issues/3"},"comments":{"href":"https://api.github.com/repos/forgejo/test_repo/issues/3/comments"},"review_comments":{"href":"https://api.github.com/repos/forgejo/test_repo/pulls/3/comments"},"review_comment":{"href":"https://api.github.com/repos/forgejo/test_repo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/forgejo/test_repo/pulls/3/commits"},"statuses":{"href":"https://api.github.com/repos/forgejo/test_repo/statuses/c608ab3997349219e1510cdb5ddd1e5e82897dfa"}},"author_association":"COLLABORATOR","auto_merge":null,"active_lock_reason":null},{"url":"https://api.github.com/repos/forgejo/test_repo/pulls/7","id":2727724283,"node_id":"PR_kwDOPZ8tBM6ilcT7","html_url":"https://github.com/forgejo/test_repo/pull/7","diff_url":"https://github.com/forgejo/test_repo/pull/7.diff","patch_url":"https://github.com/forgejo/test_repo/pull/7.patch","issue_url":"https://api.github.com/repos/forgejo/test_repo/issues/7","number":7,"state":"closed","locked":false,"title":"Update readme.md","user":{"login":"PatDyn","id":37243484,"node_id":"MDQ6VXNlcjM3MjQzNDg0","avatar_url":"https://avatars.githubusercontent.com/u/37243484?v=4","gravatar_id":"","url":"https://api.github.com/users/PatDyn","html_url":"https://github.com/PatDyn","followers_url":"https://api.github.com/users/PatDyn/followers","following_url":"https://api.github.com/users/PatDyn/following{/other_user}","gists_url":"https://api.github.com/users/PatDyn/gists{/gist_id}","starred_url":"https://api.github.com/users/PatDyn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PatDyn/subscriptions","organizations_url":"https://api.github.com/users/PatDyn/orgs","repos_url":"https://api.github.com/users/PatDyn/repos","events_url":"https://api.github.com/users/PatDyn/events{/privacy}","received_events_url":"https://api.github.com/users/PatDyn/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"Adding some text to the readme","created_at":"2025-08-07T13:01:36Z","updated_at":"2025-08-12T12:47:35Z","closed_at":"2025-08-07T13:02:19Z","merged_at":"2025-08-07T13:02:19Z","merge_commit_sha":"ca43b48ca2c461f9a5cb66500a154b23d07c9f90","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":9072229344,"node_id":"LA_kwDOPZ8tBM8AAAACHL874A","url":"https://api.github.com/repos/forgejo/test_repo/labels/bug","name":"bug","color":"d73a4a","default":true,"description":"Something isn't working"}],"milestone":{"url":"https://api.github.com/repos/forgejo/test_repo/milestones/1","html_url":"https://github.com/forgejo/test_repo/milestone/1","labels_url":"https://api.github.com/repos/forgejo/test_repo/milestones/1/labels","id":13445581,"node_id":"MI_kwDOPZ8tBM4AzSnN","number":1,"title":"1.0.0","description":"Version 1","creator":{"login":"PatDyn","id":37243484,"node_id":"MDQ6VXNlcjM3MjQzNDg0","avatar_url":"https://avatars.githubusercontent.com/u/37243484?v=4","gravatar_id":"","url":"https://api.github.com/users/PatDyn","html_url":"https://github.com/PatDyn","followers_url":"https://api.github.com/users/PatDyn/followers","following_url":"https://api.github.com/users/PatDyn/following{/other_user}","gists_url":"https://api.github.com/users/PatDyn/gists{/gist_id}","starred_url":"https://api.github.com/users/PatDyn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PatDyn/subscriptions","organizations_url":"https://api.github.com/users/PatDyn/orgs","repos_url":"https://api.github.com/users/PatDyn/repos","events_url":"https://api.github.com/users/PatDyn/events{/privacy}","received_events_url":"https://api.github.com/users/PatDyn/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":1,"closed_issues":2,"state":"open","created_at":"2025-08-07T12:48:56Z","updated_at":"2025-08-12T12:34:20Z","due_on":null,"closed_at":null},"draft":false,"commits_url":"https://api.github.com/repos/forgejo/test_repo/pulls/7/commits","review_comments_url":"https://api.github.com/repos/forgejo/test_repo/pulls/7/comments","review_comment_url":"https://api.github.com/repos/forgejo/test_repo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/forgejo/test_repo/issues/7/comments","statuses_url":"https://api.github.com/repos/forgejo/test_repo/statuses/5638cb8f3278e467fc1eefcac14d3c0d5d91601f","head":{"label":"forgejo:another-feature","ref":"another-feature","sha":"5638cb8f3278e467fc1eefcac14d3c0d5d91601f","user":{"login":"forgejo","id":118922216,"node_id":"O_kgDOBxab6A","avatar_url":"https://avatars.githubusercontent.com/u/118922216?v=4","gravatar_id":"","url":"https://api.github.com/users/forgejo","html_url":"https://github.com/forgejo","followers_url":"https://api.github.com/users/forgejo/followers","following_url":"https://api.github.com/users/forgejo/following{/other_user}","gists_url":"https://api.github.com/users/forgejo/gists{/gist_id}","starred_url":"https://api.github.com/users/forgejo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/forgejo/subscriptions","organizations_url":"https://api.github.com/users/forgejo/orgs","repos_url":"https://api.github.com/users/forgejo/repos","events_url":"https://api.github.com/users/forgejo/events{/privacy}","received_events_url":"https://api.github.com/users/forgejo/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":1033841924,"node_id":"R_kgDOPZ8tBA","name":"test_repo","full_name":"forgejo/test_repo","private":false,"owner":{"login":"forgejo","id":118922216,"node_id":"O_kgDOBxab6A","avatar_url":"https://avatars.githubusercontent.com/u/118922216?v=4","gravatar_id":"","url":"https://api.github.com/users/forgejo","html_url":"https://github.com/forgejo","followers_url":"https://api.github.com/users/forgejo/followers","following_url":"https://api.github.com/users/forgejo/following{/other_user}","gists_url":"https://api.github.com/users/forgejo/gists{/gist_id}","starred_url":"https://api.github.com/users/forgejo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/forgejo/subscriptions","organizations_url":"https://api.github.com/users/forgejo/orgs","repos_url":"https://api.github.com/users/forgejo/repos","events_url":"https://api.github.com/users/forgejo/events{/privacy}","received_events_url":"https://api.github.com/users/forgejo/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/forgejo/test_repo","description":"Exclusively used for testing Github->Forgejo migration","fork":false,"url":"https://api.github.com/repos/forgejo/test_repo","forks_url":"https://api.github.com/repos/forgejo/test_repo/forks","keys_url":"https://api.github.com/repos/forgejo/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/forgejo/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/forgejo/test_repo/teams","hooks_url":"https://api.github.com/repos/forgejo/test_repo/hooks","issue_events_url":"https://api.github.com/repos/forgejo/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/forgejo/test_repo/events","assignees_url":"https://api.github.com/repos/forgejo/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/forgejo/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/forgejo/test_repo/tags","blobs_url":"https://api.github.com/repos/forgejo/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/forgejo/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/forgejo/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/forgejo/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/forgejo/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/forgejo/test_repo/languages","stargazers_url":"https://api.github.com/repos/forgejo/test_repo/stargazers","contributors_url":"https://api.github.com/repos/forgejo/test_repo/contributors","subscribers_url":"https://api.github.com/repos/forgejo/test_repo/subscribers","subscription_url":"https://api.github.com/repos/forgejo/test_repo/subscription","commits_url":"https://api.github.com/repos/forgejo/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/forgejo/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/forgejo/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/forgejo/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/forgejo/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/forgejo/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/forgejo/test_repo/merges","archive_url":"https://api.github.com/repos/forgejo/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/forgejo/test_repo/downloads","issues_url":"https://api.github.com/repos/forgejo/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/forgejo/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/forgejo/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/forgejo/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/forgejo/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/forgejo/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/forgejo/test_repo/deployments","created_at":"2025-08-07T12:34:21Z","updated_at":"2025-08-12T11:21:45Z","pushed_at":"2025-08-07T13:07:49Z","git_url":"git://github.com/forgejo/test_repo.git","ssh_url":"git@github.com:forgejo/test_repo.git","clone_url":"https://github.com/forgejo/test_repo.git","svn_url":"https://github.com/forgejo/test_repo","homepage":"https://codeberg.org/forgejo/forgejo/","size":6,"stargazers_count":1,"watchers_count":1,"language":null,"has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":1,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":5,"license":{"key":"0bsd","name":"BSD Zero Clause License","spdx_id":"0BSD","url":"https://api.github.com/licenses/0bsd","node_id":"MDc6TGljZW5zZTM1"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":["forgejo"],"visibility":"public","forks":1,"open_issues":5,"watchers":1,"default_branch":"main"}},"base":{"label":"forgejo:main","ref":"main","sha":"6dd0c6801ddbb7333787e73e99581279492ff449","user":{"login":"forgejo","id":118922216,"node_id":"O_kgDOBxab6A","avatar_url":"https://avatars.githubusercontent.com/u/118922216?v=4","gravatar_id":"","url":"https://api.github.com/users/forgejo","html_url":"https://github.com/forgejo","followers_url":"https://api.github.com/users/forgejo/followers","following_url":"https://api.github.com/users/forgejo/following{/other_user}","gists_url":"https://api.github.com/users/forgejo/gists{/gist_id}","starred_url":"https://api.github.com/users/forgejo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/forgejo/subscriptions","organizations_url":"https://api.github.com/users/forgejo/orgs","repos_url":"https://api.github.com/users/forgejo/repos","events_url":"https://api.github.com/users/forgejo/events{/privacy}","received_events_url":"https://api.github.com/users/forgejo/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":1033841924,"node_id":"R_kgDOPZ8tBA","name":"test_repo","full_name":"forgejo/test_repo","private":false,"owner":{"login":"forgejo","id":118922216,"node_id":"O_kgDOBxab6A","avatar_url":"https://avatars.githubusercontent.com/u/118922216?v=4","gravatar_id":"","url":"https://api.github.com/users/forgejo","html_url":"https://github.com/forgejo","followers_url":"https://api.github.com/users/forgejo/followers","following_url":"https://api.github.com/users/forgejo/following{/other_user}","gists_url":"https://api.github.com/users/forgejo/gists{/gist_id}","starred_url":"https://api.github.com/users/forgejo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/forgejo/subscriptions","organizations_url":"https://api.github.com/users/forgejo/orgs","repos_url":"https://api.github.com/users/forgejo/repos","events_url":"https://api.github.com/users/forgejo/events{/privacy}","received_events_url":"https://api.github.com/users/forgejo/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/forgejo/test_repo","description":"Exclusively used for testing Github->Forgejo migration","fork":false,"url":"https://api.github.com/repos/forgejo/test_repo","forks_url":"https://api.github.com/repos/forgejo/test_repo/forks","keys_url":"https://api.github.com/repos/forgejo/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/forgejo/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/forgejo/test_repo/teams","hooks_url":"https://api.github.com/repos/forgejo/test_repo/hooks","issue_events_url":"https://api.github.com/repos/forgejo/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/forgejo/test_repo/events","assignees_url":"https://api.github.com/repos/forgejo/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/forgejo/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/forgejo/test_repo/tags","blobs_url":"https://api.github.com/repos/forgejo/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/forgejo/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/forgejo/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/forgejo/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/forgejo/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/forgejo/test_repo/languages","stargazers_url":"https://api.github.com/repos/forgejo/test_repo/stargazers","contributors_url":"https://api.github.com/repos/forgejo/test_repo/contributors","subscribers_url":"https://api.github.com/repos/forgejo/test_repo/subscribers","subscription_url":"https://api.github.com/repos/forgejo/test_repo/subscription","commits_url":"https://api.github.com/repos/forgejo/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/forgejo/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/forgejo/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/forgejo/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/forgejo/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/forgejo/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/forgejo/test_repo/merges","archive_url":"https://api.github.com/repos/forgejo/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/forgejo/test_repo/downloads","issues_url":"https://api.github.com/repos/forgejo/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/forgejo/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/forgejo/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/forgejo/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/forgejo/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/forgejo/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/forgejo/test_repo/deployments","created_at":"2025-08-07T12:34:21Z","updated_at":"2025-08-12T11:21:45Z","pushed_at":"2025-08-07T13:07:49Z","git_url":"git://github.com/forgejo/test_repo.git","ssh_url":"git@github.com:forgejo/test_repo.git","clone_url":"https://github.com/forgejo/test_repo.git","svn_url":"https://github.com/forgejo/test_repo","homepage":"https://codeberg.org/forgejo/forgejo/","size":6,"stargazers_count":1,"watchers_count":1,"language":null,"has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":1,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":5,"license":{"key":"0bsd","name":"BSD Zero Clause License","spdx_id":"0BSD","url":"https://api.github.com/licenses/0bsd","node_id":"MDc6TGljZW5zZTM1"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":["forgejo"],"visibility":"public","forks":1,"open_issues":5,"watchers":1,"default_branch":"main"}},"_links":{"self":{"href":"https://api.github.com/repos/forgejo/test_repo/pulls/7"},"html":{"href":"https://github.com/forgejo/test_repo/pull/7"},"issue":{"href":"https://api.github.com/repos/forgejo/test_repo/issues/7"},"comments":{"href":"https://api.github.com/repos/forgejo/test_repo/issues/7/comments"},"review_comments":{"href":"https://api.github.com/repos/forgejo/test_repo/pulls/7/comments"},"review_comment":{"href":"https://api.github.com/repos/forgejo/test_repo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/forgejo/test_repo/pulls/7/commits"},"statuses":{"href":"https://api.github.com/repos/forgejo/test_repo/statuses/5638cb8f3278e467fc1eefcac14d3c0d5d91601f"}},"author_association":"COLLABORATOR","auto_merge":null,"active_lock_reason":null}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Freleases%3Fpage=1&per_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Freleases%3Fpage=1&per_page=100
new file mode 100644
index 0000000000..5fc5f2dc94
--- /dev/null
+++ b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fforgejo%2Ftest_repo%2Freleases%3Fpage=1&per_page=100
@@ -0,0 +1,25 @@
+X-Ratelimit-Remaining: 4877
+X-Ratelimit-Used: 123
+Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
+Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
+Content-Security-Policy: default-src 'none'
+Content-Type: application/json; charset=utf-8
+Cache-Control: private, max-age=60, s-maxage=60
+Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
+Github-Authentication-Token-Expiration: 2025-09-11 10:37:11 UTC
+X-Ratelimit-Resource: core
+Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
+X-Xss-Protection: 0
+Etag: W/"da1b952735d448e2474ba8dc4ba5b9c2a1989fb8bf0002dff577ae452601af43"
+X-Github-Media-Type: github.v3; format=json
+X-Github-Api-Version-Selected: 2022-11-28
+X-Ratelimit-Reset: 1755007969
+Access-Control-Allow-Origin: *
+X-Frame-Options: deny
+X-Content-Type-Options: nosniff
+X-Github-Request-Id: E80A:118F3A:205E1D:1E7A62:689B401C
+X-Oauth-Scopes: public_repo, repo:status
+X-Accepted-Oauth-Scopes: repo
+X-Ratelimit-Limit: 5000
+
+[{"url":"https://api.github.com/repos/forgejo/test_repo/releases/238309022","assets_url":"https://api.github.com/repos/forgejo/test_repo/releases/238309022/assets","upload_url":"https://uploads.github.com/repos/forgejo/test_repo/releases/238309022/assets{?name,label}","html_url":"https://github.com/forgejo/test_repo/releases/tag/v1.0","id":238309022,"author":{"login":"Gusted","id":25481501,"node_id":"MDQ6VXNlcjI1NDgxNTAx","avatar_url":"https://avatars.githubusercontent.com/u/25481501?v=4","gravatar_id":"","url":"https://api.github.com/users/Gusted","html_url":"https://github.com/Gusted","followers_url":"https://api.github.com/users/Gusted/followers","following_url":"https://api.github.com/users/Gusted/following{/other_user}","gists_url":"https://api.github.com/users/Gusted/gists{/gist_id}","starred_url":"https://api.github.com/users/Gusted/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Gusted/subscriptions","organizations_url":"https://api.github.com/users/Gusted/orgs","repos_url":"https://api.github.com/users/Gusted/repos","events_url":"https://api.github.com/users/Gusted/events{/privacy}","received_events_url":"https://api.github.com/users/Gusted/received_events","type":"User","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOPZ8tBM4ONE6e","tag_name":"v1.0","target_commitish":"main","name":"First Release","draft":false,"immutable":false,"prerelease":false,"created_at":"2025-08-07T13:02:19Z","updated_at":"2025-08-12T11:24:30Z","published_at":"2025-08-07T13:07:49Z","assets":[{"url":"https://api.github.com/repos/forgejo/test_repo/releases/assets/280443629","id":280443629,"node_id":"RA_kwDOPZ8tBM4Qtzrt","name":"wireguard.pdf","label":null,"uploader":{"login":"Gusted","id":25481501,"node_id":"MDQ6VXNlcjI1NDgxNTAx","avatar_url":"https://avatars.githubusercontent.com/u/25481501?v=4","gravatar_id":"","url":"https://api.github.com/users/Gusted","html_url":"https://github.com/Gusted","followers_url":"https://api.github.com/users/Gusted/followers","following_url":"https://api.github.com/users/Gusted/following{/other_user}","gists_url":"https://api.github.com/users/Gusted/gists{/gist_id}","starred_url":"https://api.github.com/users/Gusted/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Gusted/subscriptions","organizations_url":"https://api.github.com/users/Gusted/orgs","repos_url":"https://api.github.com/users/Gusted/repos","events_url":"https://api.github.com/users/Gusted/events{/privacy}","received_events_url":"https://api.github.com/users/Gusted/received_events","type":"User","user_view_type":"public","site_admin":false},"content_type":"application/pdf","state":"uploaded","size":550175,"digest":"sha256:b4cf398c21d054e8774af568395b0f7cd0e2b01322809c5dbd66c4135021ca57","download_count":0,"created_at":"2025-08-07T23:39:27Z","updated_at":"2025-08-07T23:39:29Z","browser_download_url":"https://github.com/forgejo/test_repo/releases/download/v1.0/wireguard.pdf"}],"tarball_url":"https://api.github.com/repos/forgejo/test_repo/tarball/v1.0","zipball_url":"https://api.github.com/repos/forgejo/test_repo/zipball/v1.0","body":"Hi, this is the first release! The asset contains the wireguard whitepaper, amazing read for such a simple protocol."}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo
deleted file mode 100644
index 78fde4d424..0000000000
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo
+++ /dev/null
@@ -1,25 +0,0 @@
-X-Github-Api-Version-Selected: 2022-11-28
-X-Ratelimit-Resource: core
-Access-Control-Allow-Origin: *
-X-Github-Request-Id: C7CC:3118FC:3F5EFD7:403585D:6729E6B3
-Cache-Control: private, max-age=60, s-maxage=60
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-X-Xss-Protection: 0
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-X-Github-Media-Type: github.v3; param=scarlet-witch-preview; format=json, github.mercy-preview; param=baptiste-preview.nebula-preview; format=json
-Etag: W/"bb1c9e0186e52dbd9f2c34aaf0827517384a15fd0cee7b81ad13784901db15c0"
-X-Oauth-Scopes:
-X-Accepted-Oauth-Scopes: repo
-X-Ratelimit-Limit: 5000
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-X-Content-Type-Options: nosniff
-Content-Type: application/json; charset=utf-8
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-Last-Modified: Thu, 02 Mar 2023 14:02:26 GMT
-X-Ratelimit-Remaining: 4928
-X-Ratelimit-Reset: 1730800941
-X-Ratelimit-Used: 72
-X-Frame-Options: deny
-Content-Security-Policy: default-src 'none'
-
-{"id":220672974,"node_id":"MDEwOlJlcG9zaXRvcnkyMjA2NzI5NzQ=","name":"test_repo","full_name":"go-gitea/test_repo","private":false,"owner":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/go-gitea/test_repo","description":"Test repository for testing migration from github to gitea","fork":false,"url":"https://api.github.com/repos/go-gitea/test_repo","forks_url":"https://api.github.com/repos/go-gitea/test_repo/forks","keys_url":"https://api.github.com/repos/go-gitea/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/go-gitea/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/go-gitea/test_repo/teams","hooks_url":"https://api.github.com/repos/go-gitea/test_repo/hooks","issue_events_url":"https://api.github.com/repos/go-gitea/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/go-gitea/test_repo/events","assignees_url":"https://api.github.com/repos/go-gitea/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/go-gitea/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/go-gitea/test_repo/tags","blobs_url":"https://api.github.com/repos/go-gitea/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/go-gitea/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/go-gitea/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/go-gitea/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/go-gitea/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/go-gitea/test_repo/languages","stargazers_url":"https://api.github.com/repos/go-gitea/test_repo/stargazers","contributors_url":"https://api.github.com/repos/go-gitea/test_repo/contributors","subscribers_url":"https://api.github.com/repos/go-gitea/test_repo/subscribers","subscription_url":"https://api.github.com/repos/go-gitea/test_repo/subscription","commits_url":"https://api.github.com/repos/go-gitea/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/go-gitea/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/go-gitea/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/go-gitea/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/go-gitea/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/go-gitea/test_repo/merges","archive_url":"https://api.github.com/repos/go-gitea/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/go-gitea/test_repo/downloads","issues_url":"https://api.github.com/repos/go-gitea/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/go-gitea/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/go-gitea/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/go-gitea/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/go-gitea/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/go-gitea/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/go-gitea/test_repo/deployments","created_at":"2019-11-09T16:49:20Z","updated_at":"2023-03-02T14:02:26Z","pushed_at":"2019-11-12T21:54:19Z","git_url":"git://github.com/go-gitea/test_repo.git","ssh_url":"git@github.com:go-gitea/test_repo.git","clone_url":"https://github.com/go-gitea/test_repo.git","svn_url":"https://github.com/go-gitea/test_repo","homepage":"https://codeberg.org/forgejo/forgejo/","size":1,"stargazers_count":3,"watchers_count":3,"language":null,"has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":6,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":2,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":["gitea"],"visibility":"public","forks":6,"open_issues":2,"watchers":3,"default_branch":"master","permissions":{"admin":false,"maintain":false,"push":false,"triage":false,"pull":true},"temp_clone_token":"","custom_properties":{},"organization":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"network_count":6,"subscribers_count":6}
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F1%2Freactions%3Fpage=1&per_page=2 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F1%2Freactions%3Fpage=1&per_page=2
deleted file mode 100644
index f1f9afee15..0000000000
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F1%2Freactions%3Fpage=1&per_page=2
+++ /dev/null
@@ -1,24 +0,0 @@
-Cache-Control: private, max-age=60, s-maxage=60
-X-Ratelimit-Remaining: 4923
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-X-Accepted-Oauth-Scopes: repo
-X-Github-Media-Type: github.v3; param=squirrel-girl-preview
-X-Github-Api-Version-Selected: 2022-11-28
-X-Ratelimit-Reset: 1730800941
-X-Ratelimit-Resource: core
-Content-Security-Policy: default-src 'none'
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Ratelimit-Used: 77
-Access-Control-Allow-Origin: *
-X-Xss-Protection: 0
-X-Github-Request-Id: C7CC:3118FC:3F5F8DA:403618E:6729E6B6
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-Content-Type: application/json; charset=utf-8
-Etag: W/"07b6d56c5fdc728f96fceef3d45d26b4ebac96ef5138156668055f7d496c9a75"
-X-Oauth-Scopes:
-X-Ratelimit-Limit: 5000
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-X-Frame-Options: deny
-X-Content-Type-Options: nosniff
-
-[{"id":55441655,"node_id":"MDEzOklzc3VlUmVhY3Rpb241NTQ0MTY1NQ==","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?u=7c1ba931adbdd9bab5be1a41d244425d463568cd&v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"content":"+1","created_at":"2019-11-12T20:22:13Z"}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F1%2Freactions%3Fpage=2&per_page=2 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F1%2Freactions%3Fpage=2&per_page=2
deleted file mode 100644
index fe993d3c3b..0000000000
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F1%2Freactions%3Fpage=2&per_page=2
+++ /dev/null
@@ -1,26 +0,0 @@
-Etag: "f87b0fd59e59458a9a808311324b873c6baf3fde861298a99de9986270dd4d79"
-X-Github-Media-Type: github.v3; param=squirrel-girl-preview
-X-Github-Api-Version-Selected: 2022-11-28
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-X-Content-Type-Options: nosniff
-Content-Type: application/json; charset=utf-8
-Content-Length: 2
-Cache-Control: private, max-age=60, s-maxage=60
-Link: ; rel="prev", ; rel="last", ; rel="first"
-X-Ratelimit-Limit: 5000
-X-Ratelimit-Remaining: 4922
-X-Ratelimit-Reset: 1730800941
-X-Xss-Protection: 0
-X-Github-Request-Id: C7CC:3118FC:3F5FA7C:403633C:6729E6B6
-X-Oauth-Scopes:
-X-Ratelimit-Used: 78
-X-Frame-Options: deny
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Accepted-Oauth-Scopes: repo
-X-Ratelimit-Resource: core
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-Access-Control-Allow-Origin: *
-Content-Security-Policy: default-src 'none'
-
-[]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Fcomments%3Fdirection=asc&per_page=100&sort=created b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Fcomments%3Fdirection=asc&per_page=100&sort=created
deleted file mode 100644
index 61867c5ae6..0000000000
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Fcomments%3Fdirection=asc&per_page=100&sort=created
+++ /dev/null
@@ -1,24 +0,0 @@
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Github-Media-Type: github.v3; param=squirrel-girl-preview
-X-Ratelimit-Remaining: 4917
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-Content-Type: application/json; charset=utf-8
-X-Github-Api-Version-Selected: 2022-11-28
-X-Ratelimit-Limit: 5000
-X-Ratelimit-Reset: 1730800941
-X-Ratelimit-Used: 83
-X-Content-Type-Options: nosniff
-X-Github-Request-Id: C7CC:3118FC:3F60409:4036CD0:6729E6B8
-Etag: W/"5f4d715f2578719997e324fe7b29e7eeeec048288237b44d4f320666514813ad"
-X-Accepted-Oauth-Scopes:
-X-Frame-Options: deny
-X-Xss-Protection: 0
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-X-Ratelimit-Resource: core
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-Access-Control-Allow-Origin: *
-Content-Security-Policy: default-src 'none'
-Cache-Control: private, max-age=60, s-maxage=60
-X-Oauth-Scopes:
-
-[{"url":"https://api.github.com/repos/go-gitea/test_repo/issues/comments/553111966","html_url":"https://github.com/go-gitea/test_repo/issues/2#issuecomment-553111966","issue_url":"https://api.github.com/repos/go-gitea/test_repo/issues/2","id":553111966,"node_id":"MDEyOklzc3VlQ29tbWVudDU1MzExMTk2Ng==","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"created_at":"2019-11-12T21:00:13Z","updated_at":"2019-11-12T21:00:13Z","author_association":"MEMBER","body":"This is a comment","reactions":{"url":"https://api.github.com/repos/go-gitea/test_repo/issues/comments/553111966/reactions","total_count":1,"+1":1,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"performed_via_github_app":null},{"url":"https://api.github.com/repos/go-gitea/test_repo/issues/comments/553138856","html_url":"https://github.com/go-gitea/test_repo/issues/2#issuecomment-553138856","issue_url":"https://api.github.com/repos/go-gitea/test_repo/issues/2","id":553138856,"node_id":"MDEyOklzc3VlQ29tbWVudDU1MzEzODg1Ng==","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"created_at":"2019-11-12T22:07:14Z","updated_at":"2019-11-12T22:07:14Z","author_association":"MEMBER","body":"A second comment","reactions":{"url":"https://api.github.com/repos/go-gitea/test_repo/issues/comments/553138856/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"performed_via_github_app":null}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=1&per_page=2 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=1&per_page=2
deleted file mode 100644
index bb9dea395c..0000000000
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=1&per_page=2
+++ /dev/null
@@ -1,25 +0,0 @@
-X-Ratelimit-Resource: core
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-X-Xss-Protection: 0
-X-Accepted-Oauth-Scopes: repo
-Link: ; rel="next", ; rel="last"
-X-Ratelimit-Remaining: 4921
-X-Ratelimit-Reset: 1730800941
-X-Github-Request-Id: C7CC:3118FC:3F5FC1A:40364D4:6729E6B6
-Content-Security-Policy: default-src 'none'
-X-Oauth-Scopes:
-X-Ratelimit-Used: 79
-X-Frame-Options: deny
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-X-Github-Api-Version-Selected: 2022-11-28
-Content-Type: application/json; charset=utf-8
-Etag: W/"27408cb5dd95878d6267de226341c84fd1d2c49695867baecf930579608e16a5"
-X-Github-Media-Type: github.v3; param=squirrel-girl-preview
-X-Content-Type-Options: nosniff
-Cache-Control: private, max-age=60, s-maxage=60
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Ratelimit-Limit: 5000
-Access-Control-Allow-Origin: *
-
-[{"id":55445108,"node_id":"MDEzOklzc3VlUmVhY3Rpb241NTQ0NTEwOA==","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?u=7c1ba931adbdd9bab5be1a41d244425d463568cd&v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"content":"heart","created_at":"2019-11-12T21:02:05Z"},{"id":55445150,"node_id":"MDEzOklzc3VlUmVhY3Rpb241NTQ0NTE1MA==","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?u=7c1ba931adbdd9bab5be1a41d244425d463568cd&v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"content":"laugh","created_at":"2019-11-12T21:02:35Z"}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=2&per_page=2 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=2&per_page=2
deleted file mode 100644
index e59fc93546..0000000000
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=2&per_page=2
+++ /dev/null
@@ -1,25 +0,0 @@
-X-Ratelimit-Reset: 1730800941
-X-Ratelimit-Resource: core
-X-Frame-Options: deny
-Etag: W/"cb64a4e91ab70a1ab9fe2f77cdbf7452120169f4c2cce397014efe94cc0d60bb"
-Link: ; rel="prev", ; rel="next", ; rel="last", ; rel="first"
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Oauth-Scopes:
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-X-Content-Type-Options: nosniff
-Content-Security-Policy: default-src 'none'
-Content-Type: application/json; charset=utf-8
-Cache-Control: private, max-age=60, s-maxage=60
-X-Xss-Protection: 0
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-X-Github-Request-Id: C7CC:3118FC:3F5FDBD:4036670:6729E6B7
-X-Github-Media-Type: github.v3; param=squirrel-girl-preview
-Access-Control-Allow-Origin: *
-X-Github-Api-Version-Selected: 2022-11-28
-X-Ratelimit-Limit: 5000
-X-Ratelimit-Remaining: 4920
-X-Ratelimit-Used: 80
-X-Accepted-Oauth-Scopes: repo
-
-[{"id":55445169,"node_id":"MDEzOklzc3VlUmVhY3Rpb241NTQ0NTE2OQ==","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?u=7c1ba931adbdd9bab5be1a41d244425d463568cd&v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"content":"-1","created_at":"2019-11-12T21:02:47Z"},{"id":55445177,"node_id":"MDEzOklzc3VlUmVhY3Rpb241NTQ0NTE3Nw==","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?u=7c1ba931adbdd9bab5be1a41d244425d463568cd&v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"content":"confused","created_at":"2019-11-12T21:02:52Z"}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=3&per_page=2 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=3&per_page=2
deleted file mode 100644
index 57f03c8a64..0000000000
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=3&per_page=2
+++ /dev/null
@@ -1,25 +0,0 @@
-Etag: W/"17b0dca978a885d2234548248a7d5c22264c161b73e28c5cd144e33a24dd9ed4"
-X-Github-Api-Version-Selected: 2022-11-28
-X-Ratelimit-Reset: 1730800941
-X-Ratelimit-Used: 81
-Content-Security-Policy: default-src 'none'
-Content-Type: application/json; charset=utf-8
-X-Oauth-Scopes:
-Link: ; rel="prev", ; rel="first"
-X-Ratelimit-Limit: 5000
-X-Frame-Options: deny
-X-Content-Type-Options: nosniff
-X-Accepted-Oauth-Scopes: repo
-X-Github-Media-Type: github.v3; param=squirrel-girl-preview
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-X-Xss-Protection: 0
-Access-Control-Allow-Origin: *
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-Cache-Control: private, max-age=60, s-maxage=60
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Ratelimit-Remaining: 4919
-X-Ratelimit-Resource: core
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-X-Github-Request-Id: C7CC:3118FC:3F5FF70:403681F:6729E6B7
-
-[{"id":55445188,"node_id":"MDEzOklzc3VlUmVhY3Rpb241NTQ0NTE4OA==","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?u=7c1ba931adbdd9bab5be1a41d244425d463568cd&v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"content":"hooray","created_at":"2019-11-12T21:02:58Z"},{"id":55445441,"node_id":"MDEzOklzc3VlUmVhY3Rpb241NTQ0NTQ0MQ==","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?u=7c1ba931adbdd9bab5be1a41d244425d463568cd&v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"content":"+1","created_at":"2019-11-12T21:06:04Z"}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F4%2Freactions%3Fpage=1&per_page=2 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F4%2Freactions%3Fpage=1&per_page=2
deleted file mode 100644
index f5398c3a9f..0000000000
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F4%2Freactions%3Fpage=1&per_page=2
+++ /dev/null
@@ -1,24 +0,0 @@
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-Etag: W/"dc9d10e1714eadc1507466c7d11d2dd84ae539a378835f8763b9948da44b22e1"
-X-Accepted-Oauth-Scopes: repo
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-Access-Control-Allow-Origin: *
-X-Frame-Options: deny
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-X-Github-Api-Version-Selected: 2022-11-28
-X-Ratelimit-Reset: 1730800941
-Content-Type: application/json; charset=utf-8
-X-Github-Media-Type: github.v3; param=squirrel-girl-preview
-X-Ratelimit-Remaining: 4911
-X-Ratelimit-Used: 89
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-X-Content-Type-Options: nosniff
-X-Xss-Protection: 0
-Content-Security-Policy: default-src 'none'
-X-Github-Request-Id: C7CC:3118FC:3F60D0F:40375F2:6729E6BB
-Cache-Control: private, max-age=60, s-maxage=60
-X-Oauth-Scopes:
-X-Ratelimit-Limit: 5000
-X-Ratelimit-Resource: core
-
-[{"id":59496724,"node_id":"MDEzOklzc3VlUmVhY3Rpb241OTQ5NjcyNA==","user":{"login":"lunny","id":81045,"node_id":"MDQ6VXNlcjgxMDQ1","avatar_url":"https://avatars.githubusercontent.com/u/81045?u=99b64f0ca6ef63643c7583ab87dd31c52d28e673&v=4","gravatar_id":"","url":"https://api.github.com/users/lunny","html_url":"https://github.com/lunny","followers_url":"https://api.github.com/users/lunny/followers","following_url":"https://api.github.com/users/lunny/following{/other_user}","gists_url":"https://api.github.com/users/lunny/gists{/gist_id}","starred_url":"https://api.github.com/users/lunny/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lunny/subscriptions","organizations_url":"https://api.github.com/users/lunny/orgs","repos_url":"https://api.github.com/users/lunny/repos","events_url":"https://api.github.com/users/lunny/events{/privacy}","received_events_url":"https://api.github.com/users/lunny/received_events","type":"User","user_view_type":"public","site_admin":false},"content":"heart","created_at":"2020-01-10T08:31:30Z"},{"id":59496731,"node_id":"MDEzOklzc3VlUmVhY3Rpb241OTQ5NjczMQ==","user":{"login":"lunny","id":81045,"node_id":"MDQ6VXNlcjgxMDQ1","avatar_url":"https://avatars.githubusercontent.com/u/81045?u=99b64f0ca6ef63643c7583ab87dd31c52d28e673&v=4","gravatar_id":"","url":"https://api.github.com/users/lunny","html_url":"https://github.com/lunny","followers_url":"https://api.github.com/users/lunny/followers","following_url":"https://api.github.com/users/lunny/following{/other_user}","gists_url":"https://api.github.com/users/lunny/gists{/gist_id}","starred_url":"https://api.github.com/users/lunny/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lunny/subscriptions","organizations_url":"https://api.github.com/users/lunny/orgs","repos_url":"https://api.github.com/users/lunny/repos","events_url":"https://api.github.com/users/lunny/events{/privacy}","received_events_url":"https://api.github.com/users/lunny/received_events","type":"User","user_view_type":"public","site_admin":false},"content":"+1","created_at":"2020-01-10T08:31:39Z"}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F4%2Freactions%3Fpage=2&per_page=2 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F4%2Freactions%3Fpage=2&per_page=2
deleted file mode 100644
index 79b506ea55..0000000000
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F4%2Freactions%3Fpage=2&per_page=2
+++ /dev/null
@@ -1,26 +0,0 @@
-X-Oauth-Scopes:
-X-Accepted-Oauth-Scopes: repo
-X-Ratelimit-Limit: 5000
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-Content-Length: 2
-Cache-Control: private, max-age=60, s-maxage=60
-Etag: "f87b0fd59e59458a9a808311324b873c6baf3fde861298a99de9986270dd4d79"
-X-Content-Type-Options: nosniff
-Content-Security-Policy: default-src 'none'
-X-Ratelimit-Remaining: 4910
-X-Ratelimit-Reset: 1730800941
-X-Frame-Options: deny
-Content-Type: application/json; charset=utf-8
-Link: ; rel="prev", ; rel="last", ; rel="first"
-X-Xss-Protection: 0
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-X-Github-Request-Id: C7CC:3118FC:3F60EE6:40377B6:6729E6BB
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Ratelimit-Used: 90
-X-Ratelimit-Resource: core
-X-Github-Media-Type: github.v3; param=squirrel-girl-preview
-X-Github-Api-Version-Selected: 2022-11-28
-Access-Control-Allow-Origin: *
-
-[]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2Fcomments%2F553111966%2Freactions%3Fpage=1&per_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2Fcomments%2F553111966%2Freactions%3Fpage=1&per_page=100
deleted file mode 100644
index b55068a718..0000000000
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2Fcomments%2F553111966%2Freactions%3Fpage=1&per_page=100
+++ /dev/null
@@ -1,24 +0,0 @@
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-X-Accepted-Oauth-Scopes:
-X-Github-Api-Version-Selected: 2022-11-28
-X-Ratelimit-Limit: 5000
-X-Ratelimit-Used: 84
-X-Ratelimit-Resource: core
-X-Content-Type-Options: nosniff
-Cache-Control: private, max-age=60, s-maxage=60
-Etag: W/"d2410fc0792a61666c06ed757aa53a273165d4f14f7d5259095b7a4f3a959121"
-X-Xss-Protection: 0
-Content-Security-Policy: default-src 'none'
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Oauth-Scopes:
-X-Github-Media-Type: github.v3; param=squirrel-girl-preview
-X-Ratelimit-Remaining: 4916
-X-Frame-Options: deny
-X-Github-Request-Id: C7CC:3118FC:3F60583:4036E51:6729E6B9
-Content-Type: application/json; charset=utf-8
-X-Ratelimit-Reset: 1730800941
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-Access-Control-Allow-Origin: *
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-
-[{"id":55446208,"node_id":"MDIwOklzc3VlQ29tbWVudFJlYWN0aW9uNTU0NDYyMDg=","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"content":"+1","created_at":"2019-11-12T21:13:22Z"}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2Fcomments%2F553111966%2Freactions%3Fpage=2&per_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2Fcomments%2F553111966%2Freactions%3Fpage=2&per_page=100
deleted file mode 100644
index 1e46f438e5..0000000000
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2Fcomments%2F553111966%2Freactions%3Fpage=2&per_page=100
+++ /dev/null
@@ -1,26 +0,0 @@
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Github-Media-Type: github.v3; param=squirrel-girl-preview
-Cache-Control: private, max-age=60, s-maxage=60
-X-Ratelimit-Used: 85
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-X-Github-Request-Id: C7CC:3118FC:3F606F2:4036FB5:6729E6B9
-X-Xss-Protection: 0
-Content-Type: application/json; charset=utf-8
-Etag: "f87b0fd59e59458a9a808311324b873c6baf3fde861298a99de9986270dd4d79"
-X-Oauth-Scopes:
-Link: ; rel="prev", ; rel="last", ; rel="first"
-X-Github-Api-Version-Selected: 2022-11-28
-X-Ratelimit-Resource: core
-X-Frame-Options: deny
-Content-Length: 2
-X-Accepted-Oauth-Scopes:
-X-Ratelimit-Limit: 5000
-X-Ratelimit-Remaining: 4915
-X-Ratelimit-Reset: 1730800941
-Access-Control-Allow-Origin: *
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-X-Content-Type-Options: nosniff
-Content-Security-Policy: default-src 'none'
-
-[]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%3Fdirection=asc&page=1&per_page=2&sort=created&state=all b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%3Fdirection=asc&page=1&per_page=2&sort=created&state=all
deleted file mode 100644
index 80d2f90dbc..0000000000
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%3Fdirection=asc&page=1&per_page=2&sort=created&state=all
+++ /dev/null
@@ -1,25 +0,0 @@
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-Content-Type: application/json; charset=utf-8
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Ratelimit-Limit: 5000
-X-Ratelimit-Resource: core
-Access-Control-Allow-Origin: *
-X-Frame-Options: deny
-X-Xss-Protection: 0
-Cache-Control: private, max-age=60, s-maxage=60
-Etag: W/"40580a89c26a3f7793cea4e59315e52e1106be32ded27b3ab822b7d7f74a1ecf"
-X-Github-Media-Type: github.v3; param=squirrel-girl-preview
-Link: ; rel="next", ; rel="last"
-X-Ratelimit-Reset: 1730800941
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-X-Content-Type-Options: nosniff
-X-Oauth-Scopes:
-X-Accepted-Oauth-Scopes: repo
-X-Github-Api-Version-Selected: 2022-11-28
-X-Ratelimit-Remaining: 4924
-X-Ratelimit-Used: 76
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-Content-Security-Policy: default-src 'none'
-X-Github-Request-Id: C7CC:3118FC:3F5F5B9:4035E6C:6729E6B5
-
-[{"url":"https://api.github.com/repos/go-gitea/test_repo/issues/1","repository_url":"https://api.github.com/repos/go-gitea/test_repo","labels_url":"https://api.github.com/repos/go-gitea/test_repo/issues/1/labels{/name}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/issues/1/comments","events_url":"https://api.github.com/repos/go-gitea/test_repo/issues/1/events","html_url":"https://github.com/go-gitea/test_repo/issues/1","id":520479843,"node_id":"MDU6SXNzdWU1MjA0Nzk4NDM=","number":1,"title":"Please add an animated gif icon to the merge button","user":{"login":"guillep2k","id":18600385,"node_id":"MDQ6VXNlcjE4NjAwMzg1","avatar_url":"https://avatars.githubusercontent.com/u/18600385?v=4","gravatar_id":"","url":"https://api.github.com/users/guillep2k","html_url":"https://github.com/guillep2k","followers_url":"https://api.github.com/users/guillep2k/followers","following_url":"https://api.github.com/users/guillep2k/following{/other_user}","gists_url":"https://api.github.com/users/guillep2k/gists{/gist_id}","starred_url":"https://api.github.com/users/guillep2k/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/guillep2k/subscriptions","organizations_url":"https://api.github.com/users/guillep2k/orgs","repos_url":"https://api.github.com/users/guillep2k/repos","events_url":"https://api.github.com/users/guillep2k/events{/privacy}","received_events_url":"https://api.github.com/users/guillep2k/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":1667254252,"node_id":"MDU6TGFiZWwxNjY3MjU0MjUy","url":"https://api.github.com/repos/go-gitea/test_repo/labels/bug","name":"bug","color":"d73a4a","default":true,"description":"Something isn't working"},{"id":1667254261,"node_id":"MDU6TGFiZWwxNjY3MjU0MjYx","url":"https://api.github.com/repos/go-gitea/test_repo/labels/good%20first%20issue","name":"good first issue","color":"7057ff","default":true,"description":"Good for newcomers"}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":{"url":"https://api.github.com/repos/go-gitea/test_repo/milestones/1","html_url":"https://github.com/go-gitea/test_repo/milestone/1","labels_url":"https://api.github.com/repos/go-gitea/test_repo/milestones/1/labels","id":4839941,"node_id":"MDk6TWlsZXN0b25lNDgzOTk0MQ==","number":1,"title":"1.0.0","description":"Milestone 1.0.0","creator":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":1,"closed_issues":1,"state":"closed","created_at":"2019-11-12T19:37:08Z","updated_at":"2019-11-12T21:56:17Z","due_on":"2019-11-11T08:00:00Z","closed_at":"2019-11-12T19:45:49Z"},"comments":0,"created_at":"2019-11-09T17:00:29Z","updated_at":"2019-11-12T20:29:53Z","closed_at":"2019-11-12T20:22:22Z","author_association":"MEMBER","active_lock_reason":null,"body":"I just want the merge button to hurt my eyes a little. 😠","closed_by":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/go-gitea/test_repo/issues/1/reactions","total_count":1,"+1":1,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/go-gitea/test_repo/issues/1/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/go-gitea/test_repo/issues/2","repository_url":"https://api.github.com/repos/go-gitea/test_repo","labels_url":"https://api.github.com/repos/go-gitea/test_repo/issues/2/labels{/name}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/issues/2/comments","events_url":"https://api.github.com/repos/go-gitea/test_repo/issues/2/events","html_url":"https://github.com/go-gitea/test_repo/issues/2","id":521799485,"node_id":"MDU6SXNzdWU1MjE3OTk0ODU=","number":2,"title":"Test issue","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":1667254257,"node_id":"MDU6TGFiZWwxNjY3MjU0MjU3","url":"https://api.github.com/repos/go-gitea/test_repo/labels/duplicate","name":"duplicate","color":"cfd3d7","default":true,"description":"This issue or pull request already exists"}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":{"url":"https://api.github.com/repos/go-gitea/test_repo/milestones/2","html_url":"https://github.com/go-gitea/test_repo/milestone/2","labels_url":"https://api.github.com/repos/go-gitea/test_repo/milestones/2/labels","id":4839942,"node_id":"MDk6TWlsZXN0b25lNDgzOTk0Mg==","number":2,"title":"1.1.0","description":"Milestone 1.1.0","creator":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":0,"closed_issues":2,"state":"closed","created_at":"2019-11-12T19:37:25Z","updated_at":"2019-11-12T21:39:27Z","due_on":"2019-11-12T08:00:00Z","closed_at":"2019-11-12T19:45:46Z"},"comments":2,"created_at":"2019-11-12T21:00:06Z","updated_at":"2019-11-12T22:07:14Z","closed_at":"2019-11-12T21:01:31Z","author_association":"MEMBER","active_lock_reason":null,"body":"This is test issue 2, do not touch!","closed_by":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/go-gitea/test_repo/issues/2/reactions","total_count":6,"+1":1,"-1":1,"laugh":1,"hooray":1,"confused":1,"heart":1,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/go-gitea/test_repo/issues/2/timeline","performed_via_github_app":null,"state_reason":"completed"}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Flabels%3Fpage=1&per_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Flabels%3Fpage=1&per_page=100
deleted file mode 100644
index f1d483aacb..0000000000
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Flabels%3Fpage=1&per_page=100
+++ /dev/null
@@ -1,24 +0,0 @@
-X-Ratelimit-Reset: 1730800941
-Access-Control-Allow-Origin: *
-Content-Security-Policy: default-src 'none'
-X-Github-Api-Version-Selected: 2022-11-28
-Etag: W/"01cc307b238564f2a086999fed53e0d5c880b8ec1d8d2256d99188ff47ff0ea0"
-X-Github-Media-Type: github.v3; format=json
-X-Ratelimit-Used: 74
-X-Ratelimit-Resource: core
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-X-Ratelimit-Limit: 5000
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-X-Xss-Protection: 0
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-Cache-Control: private, max-age=60, s-maxage=60
-X-Oauth-Scopes:
-X-Accepted-Oauth-Scopes: repo
-X-Ratelimit-Remaining: 4926
-X-Frame-Options: deny
-X-Content-Type-Options: nosniff
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-Content-Type: application/json; charset=utf-8
-X-Github-Request-Id: C7CC:3118FC:3F5F29C:4035B65:6729E6B4
-
-[{"id":1667254252,"node_id":"MDU6TGFiZWwxNjY3MjU0MjUy","url":"https://api.github.com/repos/go-gitea/test_repo/labels/bug","name":"bug","color":"d73a4a","default":true,"description":"Something isn't working"},{"id":1667254254,"node_id":"MDU6TGFiZWwxNjY3MjU0MjU0","url":"https://api.github.com/repos/go-gitea/test_repo/labels/documentation","name":"documentation","color":"0075ca","default":true,"description":"Improvements or additions to documentation"},{"id":1667254257,"node_id":"MDU6TGFiZWwxNjY3MjU0MjU3","url":"https://api.github.com/repos/go-gitea/test_repo/labels/duplicate","name":"duplicate","color":"cfd3d7","default":true,"description":"This issue or pull request already exists"},{"id":1667254260,"node_id":"MDU6TGFiZWwxNjY3MjU0MjYw","url":"https://api.github.com/repos/go-gitea/test_repo/labels/enhancement","name":"enhancement","color":"a2eeef","default":true,"description":"New feature or request"},{"id":1667254261,"node_id":"MDU6TGFiZWwxNjY3MjU0MjYx","url":"https://api.github.com/repos/go-gitea/test_repo/labels/good%20first%20issue","name":"good first issue","color":"7057ff","default":true,"description":"Good for newcomers"},{"id":1667254265,"node_id":"MDU6TGFiZWwxNjY3MjU0MjY1","url":"https://api.github.com/repos/go-gitea/test_repo/labels/help%20wanted","name":"help wanted","color":"008672","default":true,"description":"Extra attention is needed"},{"id":1667254269,"node_id":"MDU6TGFiZWwxNjY3MjU0MjY5","url":"https://api.github.com/repos/go-gitea/test_repo/labels/invalid","name":"invalid","color":"e4e669","default":true,"description":"This doesn't seem right"},{"id":1667254273,"node_id":"MDU6TGFiZWwxNjY3MjU0Mjcz","url":"https://api.github.com/repos/go-gitea/test_repo/labels/question","name":"question","color":"d876e3","default":true,"description":"Further information is requested"},{"id":1667254276,"node_id":"MDU6TGFiZWwxNjY3MjU0Mjc2","url":"https://api.github.com/repos/go-gitea/test_repo/labels/wontfix","name":"wontfix","color":"ffffff","default":true,"description":"This will not be worked on"}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fmilestones%3Fpage=1&per_page=100&state=all b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fmilestones%3Fpage=1&per_page=100&state=all
deleted file mode 100644
index 50b90ad4ab..0000000000
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fmilestones%3Fpage=1&per_page=100&state=all
+++ /dev/null
@@ -1,24 +0,0 @@
-X-Ratelimit-Remaining: 4927
-X-Ratelimit-Used: 73
-X-Frame-Options: deny
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Oauth-Scopes:
-X-Accepted-Oauth-Scopes: repo
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-Access-Control-Allow-Origin: *
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-X-Content-Type-Options: nosniff
-Content-Type: application/json; charset=utf-8
-X-Ratelimit-Limit: 5000
-X-Ratelimit-Resource: core
-X-Github-Request-Id: C7CC:3118FC:3F5F16C:40359F7:6729E6B4
-X-Github-Media-Type: github.v3; format=json
-X-Ratelimit-Reset: 1730800941
-Content-Security-Policy: default-src 'none'
-X-Github-Api-Version-Selected: 2022-11-28
-X-Xss-Protection: 0
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-Cache-Control: private, max-age=60, s-maxage=60
-Etag: W/"d6d673f0622636217ee3df16cdabbfea8402d3e8d1abbabe007108267b01f3e9"
-
-[{"url":"https://api.github.com/repos/go-gitea/test_repo/milestones/1","html_url":"https://github.com/go-gitea/test_repo/milestone/1","labels_url":"https://api.github.com/repos/go-gitea/test_repo/milestones/1/labels","id":4839941,"node_id":"MDk6TWlsZXN0b25lNDgzOTk0MQ==","number":1,"title":"1.0.0","description":"Milestone 1.0.0","creator":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":1,"closed_issues":1,"state":"closed","created_at":"2019-11-12T19:37:08Z","updated_at":"2019-11-12T21:56:17Z","due_on":"2019-11-11T08:00:00Z","closed_at":"2019-11-12T19:45:49Z"},{"url":"https://api.github.com/repos/go-gitea/test_repo/milestones/2","html_url":"https://github.com/go-gitea/test_repo/milestone/2","labels_url":"https://api.github.com/repos/go-gitea/test_repo/milestones/2/labels","id":4839942,"node_id":"MDk6TWlsZXN0b25lNDgzOTk0Mg==","number":2,"title":"1.1.0","description":"Milestone 1.1.0","creator":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":0,"closed_issues":2,"state":"closed","created_at":"2019-11-12T19:37:25Z","updated_at":"2019-11-12T21:39:27Z","due_on":"2019-11-12T08:00:00Z","closed_at":"2019-11-12T19:45:46Z"}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%2F315859956%2Fcomments%3Fper_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%2F315859956%2Fcomments%3Fper_page=100
deleted file mode 100644
index 435e1a0ee0..0000000000
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%2F315859956%2Fcomments%3Fper_page=100
+++ /dev/null
@@ -1,25 +0,0 @@
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Github-Media-Type: github.v3; format=json
-X-Ratelimit-Used: 92
-X-Frame-Options: deny
-X-Content-Type-Options: nosniff
-Content-Length: 2
-X-Oauth-Scopes:
-X-Ratelimit-Remaining: 4908
-X-Ratelimit-Reset: 1730800941
-X-Github-Request-Id: C7CC:3118FC:3F612D6:4037BAC:6729E6BC
-Etag: "450a1c087fec81e5b86092ff5372c3db8ca834c1e23c03c6b06ecca33cefd665"
-X-Github-Api-Version-Selected: 2022-11-28
-X-Ratelimit-Limit: 5000
-X-Ratelimit-Resource: core
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-Access-Control-Allow-Origin: *
-Cache-Control: private, max-age=60, s-maxage=60
-X-Accepted-Oauth-Scopes:
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-X-Xss-Protection: 0
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-Content-Security-Policy: default-src 'none'
-Content-Type: application/json; charset=utf-8
-
-[]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%3Fper_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%3Fper_page=100
deleted file mode 100644
index 203c363ffa..0000000000
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%3Fper_page=100
+++ /dev/null
@@ -1,24 +0,0 @@
-Cache-Control: private, max-age=60, s-maxage=60
-Etag: W/"e38ac3d6f3e77a469f9836bfa52a0b756b9ac8fdc4347530e1cb1072bbb77b46"
-X-Github-Media-Type: github.v3; format=json
-X-Frame-Options: deny
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-Access-Control-Allow-Origin: *
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Accepted-Oauth-Scopes:
-X-Github-Api-Version-Selected: 2022-11-28
-X-Ratelimit-Remaining: 4909
-X-Ratelimit-Reset: 1730800941
-Content-Security-Policy: default-src 'none'
-X-Github-Request-Id: C7CC:3118FC:3F6108F:403797A:6729E6BC
-Content-Type: application/json; charset=utf-8
-X-Ratelimit-Limit: 5000
-X-Ratelimit-Resource: core
-X-Content-Type-Options: nosniff
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-X-Oauth-Scopes:
-X-Ratelimit-Used: 91
-X-Xss-Protection: 0
-
-[{"id":315859956,"node_id":"MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzE1ODU5OTU2","user":{"login":"jolheiser","id":42128690,"node_id":"MDQ6VXNlcjQyMTI4Njkw","avatar_url":"https://avatars.githubusercontent.com/u/42128690?u=0ee1052506846129445fa12a76cd9ad9d305de71&v=4","gravatar_id":"","url":"https://api.github.com/users/jolheiser","html_url":"https://github.com/jolheiser","followers_url":"https://api.github.com/users/jolheiser/followers","following_url":"https://api.github.com/users/jolheiser/following{/other_user}","gists_url":"https://api.github.com/users/jolheiser/gists{/gist_id}","starred_url":"https://api.github.com/users/jolheiser/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jolheiser/subscriptions","organizations_url":"https://api.github.com/users/jolheiser/orgs","repos_url":"https://api.github.com/users/jolheiser/repos","events_url":"https://api.github.com/users/jolheiser/events{/privacy}","received_events_url":"https://api.github.com/users/jolheiser/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"","state":"APPROVED","html_url":"https://github.com/go-gitea/test_repo/pull/3#pullrequestreview-315859956","pull_request_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/3","author_association":"MEMBER","_links":{"html":{"href":"https://github.com/go-gitea/test_repo/pull/3#pullrequestreview-315859956"},"pull_request":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/3"}},"submitted_at":"2019-11-12T21:35:24Z","commit_id":"076160cf0b039f13e5eff19619932d181269414b"},{"id":315860062,"node_id":"MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzE1ODYwMDYy","user":{"login":"zeripath","id":1824502,"node_id":"MDQ6VXNlcjE4MjQ1MDI=","avatar_url":"https://avatars.githubusercontent.com/u/1824502?u=fcd8a9dba8714edf6ac3f87596eb72149911c720&v=4","gravatar_id":"","url":"https://api.github.com/users/zeripath","html_url":"https://github.com/zeripath","followers_url":"https://api.github.com/users/zeripath/followers","following_url":"https://api.github.com/users/zeripath/following{/other_user}","gists_url":"https://api.github.com/users/zeripath/gists{/gist_id}","starred_url":"https://api.github.com/users/zeripath/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zeripath/subscriptions","organizations_url":"https://api.github.com/users/zeripath/orgs","repos_url":"https://api.github.com/users/zeripath/repos","events_url":"https://api.github.com/users/zeripath/events{/privacy}","received_events_url":"https://api.github.com/users/zeripath/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"","state":"APPROVED","html_url":"https://github.com/go-gitea/test_repo/pull/3#pullrequestreview-315860062","pull_request_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/3","author_association":"NONE","_links":{"html":{"href":"https://github.com/go-gitea/test_repo/pull/3#pullrequestreview-315860062"},"pull_request":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/3"}},"submitted_at":"2019-11-12T21:35:36Z","commit_id":"076160cf0b039f13e5eff19619932d181269414b"},{"id":315861440,"node_id":"MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzE1ODYxNDQw","user":{"login":"lafriks","id":165205,"node_id":"MDQ6VXNlcjE2NTIwNQ==","avatar_url":"https://avatars.githubusercontent.com/u/165205?u=efe2335d2197f524c25caa7abdfcb90b77eb8d98&v=4","gravatar_id":"","url":"https://api.github.com/users/lafriks","html_url":"https://github.com/lafriks","followers_url":"https://api.github.com/users/lafriks/followers","following_url":"https://api.github.com/users/lafriks/following{/other_user}","gists_url":"https://api.github.com/users/lafriks/gists{/gist_id}","starred_url":"https://api.github.com/users/lafriks/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lafriks/subscriptions","organizations_url":"https://api.github.com/users/lafriks/orgs","repos_url":"https://api.github.com/users/lafriks/repos","events_url":"https://api.github.com/users/lafriks/events{/privacy}","received_events_url":"https://api.github.com/users/lafriks/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"","state":"APPROVED","html_url":"https://github.com/go-gitea/test_repo/pull/3#pullrequestreview-315861440","pull_request_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/3","author_association":"MEMBER","_links":{"html":{"href":"https://github.com/go-gitea/test_repo/pull/3#pullrequestreview-315861440"},"pull_request":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/3"}},"submitted_at":"2019-11-12T21:38:00Z","commit_id":"076160cf0b039f13e5eff19619932d181269414b"}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%2F338338740%2Fcomments%3Fper_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%2F338338740%2Fcomments%3Fper_page=100
deleted file mode 100644
index 48e5b2c3d9..0000000000
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%2F338338740%2Fcomments%3Fper_page=100
+++ /dev/null
@@ -1,24 +0,0 @@
-Access-Control-Allow-Origin: *
-X-Content-Type-Options: nosniff
-Content-Security-Policy: default-src 'none'
-X-Ratelimit-Resource: core
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Accepted-Oauth-Scopes:
-X-Github-Media-Type: github.v3; format=json
-X-Ratelimit-Remaining: 4903
-X-Ratelimit-Reset: 1730800941
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-X-Frame-Options: deny
-X-Github-Request-Id: C7CC:3118FC:3F61BAA:40384A5:6729E6BE
-Cache-Control: private, max-age=60, s-maxage=60
-Etag: W/"ff77892df2ec7f6eb61416e0f384ce0a6e8fbbbc1287f5d09b1980ebe9856750"
-X-Github-Api-Version-Selected: 2022-11-28
-X-Ratelimit-Limit: 5000
-X-Ratelimit-Used: 97
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-Content-Type: application/json; charset=utf-8
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-X-Xss-Protection: 0
-X-Oauth-Scopes:
-
-[{"id":363017488,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDM2MzAxNzQ4OA==","url":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments/363017488","pull_request_review_id":338338740,"diff_hunk":"@@ -1,2 +1,4 @@\n # test_repo\n Test repository for testing migration from github to gitea\n+","path":"README.md","position":3,"original_position":3,"commit_id":"2be9101c543658591222acbee3eb799edfc3853d","user":{"login":"lunny","id":81045,"node_id":"MDQ6VXNlcjgxMDQ1","avatar_url":"https://avatars.githubusercontent.com/u/81045?u=99b64f0ca6ef63643c7583ab87dd31c52d28e673&v=4","gravatar_id":"","url":"https://api.github.com/users/lunny","html_url":"https://github.com/lunny","followers_url":"https://api.github.com/users/lunny/followers","following_url":"https://api.github.com/users/lunny/following{/other_user}","gists_url":"https://api.github.com/users/lunny/gists{/gist_id}","starred_url":"https://api.github.com/users/lunny/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lunny/subscriptions","organizations_url":"https://api.github.com/users/lunny/orgs","repos_url":"https://api.github.com/users/lunny/repos","events_url":"https://api.github.com/users/lunny/events{/privacy}","received_events_url":"https://api.github.com/users/lunny/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"This is a good pull request.","created_at":"2020-01-04T05:33:06Z","updated_at":"2020-01-04T05:33:18Z","html_url":"https://github.com/go-gitea/test_repo/pull/4#discussion_r363017488","pull_request_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/4","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments/363017488"},"html":{"href":"https://github.com/go-gitea/test_repo/pull/4#discussion_r363017488"},"pull_request":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/4"}},"original_commit_id":"2be9101c543658591222acbee3eb799edfc3853d","reactions":{"url":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments/363017488/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0}}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%2F338339651%2Fcomments%3Fper_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%2F338339651%2Fcomments%3Fper_page=100
deleted file mode 100644
index 4cc66424f0..0000000000
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%2F338339651%2Fcomments%3Fper_page=100
+++ /dev/null
@@ -1,25 +0,0 @@
-X-Github-Api-Version-Selected: 2022-11-28
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-X-Frame-Options: deny
-X-Content-Type-Options: nosniff
-Cache-Control: private, max-age=60, s-maxage=60
-Etag: "450a1c087fec81e5b86092ff5372c3db8ca834c1e23c03c6b06ecca33cefd665"
-X-Github-Media-Type: github.v3; format=json
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-X-Ratelimit-Reset: 1730800941
-X-Xss-Protection: 0
-X-Oauth-Scopes:
-X-Accepted-Oauth-Scopes:
-X-Ratelimit-Limit: 5000
-Access-Control-Allow-Origin: *
-Content-Length: 2
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Ratelimit-Resource: core
-Content-Security-Policy: default-src 'none'
-X-Github-Request-Id: C7CC:3118FC:3F61EBA:40387A6:6729E6BF
-Content-Type: application/json; charset=utf-8
-X-Ratelimit-Remaining: 4901
-X-Ratelimit-Used: 99
-
-[]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%2F338349019%2Fcomments%3Fper_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%2F338349019%2Fcomments%3Fper_page=100
deleted file mode 100644
index f13d4addc7..0000000000
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%2F338349019%2Fcomments%3Fper_page=100
+++ /dev/null
@@ -1,24 +0,0 @@
-Etag: W/"f74a383d4c87ae26d218fc087bef2c41a12637dff81fd8642f59708adca1a14e"
-X-Ratelimit-Remaining: 4900
-X-Content-Type-Options: nosniff
-X-Ratelimit-Limit: 5000
-X-Ratelimit-Reset: 1730800941
-X-Xss-Protection: 0
-Content-Type: application/json; charset=utf-8
-X-Oauth-Scopes:
-X-Accepted-Oauth-Scopes:
-X-Github-Api-Version-Selected: 2022-11-28
-Access-Control-Allow-Origin: *
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-X-Frame-Options: deny
-X-Github-Media-Type: github.v3; format=json
-X-Ratelimit-Used: 100
-X-Ratelimit-Resource: core
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-X-Github-Request-Id: C7CC:3118FC:3F62065:4038955:6729E6C0
-Content-Security-Policy: default-src 'none'
-Cache-Control: private, max-age=60, s-maxage=60
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-
-[{"id":363029944,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDM2MzAyOTk0NA==","url":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments/363029944","pull_request_review_id":338349019,"diff_hunk":"@@ -19,3 +19,5 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n+","path":"LICENSE","position":4,"original_position":4,"commit_id":"2be9101c543658591222acbee3eb799edfc3853d","user":{"login":"lunny","id":81045,"node_id":"MDQ6VXNlcjgxMDQ1","avatar_url":"https://avatars.githubusercontent.com/u/81045?u=99b64f0ca6ef63643c7583ab87dd31c52d28e673&v=4","gravatar_id":"","url":"https://api.github.com/users/lunny","html_url":"https://github.com/lunny","followers_url":"https://api.github.com/users/lunny/followers","following_url":"https://api.github.com/users/lunny/following{/other_user}","gists_url":"https://api.github.com/users/lunny/gists{/gist_id}","starred_url":"https://api.github.com/users/lunny/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lunny/subscriptions","organizations_url":"https://api.github.com/users/lunny/orgs","repos_url":"https://api.github.com/users/lunny/repos","events_url":"https://api.github.com/users/lunny/events{/privacy}","received_events_url":"https://api.github.com/users/lunny/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"test a single comment.","created_at":"2020-01-04T11:21:41Z","updated_at":"2020-01-04T11:21:41Z","html_url":"https://github.com/go-gitea/test_repo/pull/4#discussion_r363029944","pull_request_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/4","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments/363029944"},"html":{"href":"https://github.com/go-gitea/test_repo/pull/4#discussion_r363029944"},"pull_request":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/4"}},"original_commit_id":"2be9101c543658591222acbee3eb799edfc3853d","reactions":{"url":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments/363029944/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0}}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%3Fper_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%3Fper_page=100
deleted file mode 100644
index c4484e078a..0000000000
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%3Fper_page=100
+++ /dev/null
@@ -1,24 +0,0 @@
-Cache-Control: private, max-age=60, s-maxage=60
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-X-Xss-Protection: 0
-Content-Security-Policy: default-src 'none'
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Github-Media-Type: github.v3; format=json
-X-Github-Api-Version-Selected: 2022-11-28
-X-Ratelimit-Reset: 1730800941
-X-Frame-Options: deny
-X-Github-Request-Id: C7CC:3118FC:3F619C6:40382C4:6729E6BE
-Access-Control-Allow-Origin: *
-X-Content-Type-Options: nosniff
-Content-Type: application/json; charset=utf-8
-X-Accepted-Oauth-Scopes:
-X-Ratelimit-Used: 96
-X-Ratelimit-Resource: core
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-Etag: W/"a47623061be83c50d3932baf8c5961386d2d45c32c42b504122c9a1359efd515"
-X-Oauth-Scopes:
-X-Ratelimit-Limit: 5000
-X-Ratelimit-Remaining: 4904
-
-[{"id":338338740,"node_id":"MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzM4MzM4NzQw","user":{"login":"lunny","id":81045,"node_id":"MDQ6VXNlcjgxMDQ1","avatar_url":"https://avatars.githubusercontent.com/u/81045?u=99b64f0ca6ef63643c7583ab87dd31c52d28e673&v=4","gravatar_id":"","url":"https://api.github.com/users/lunny","html_url":"https://github.com/lunny","followers_url":"https://api.github.com/users/lunny/followers","following_url":"https://api.github.com/users/lunny/following{/other_user}","gists_url":"https://api.github.com/users/lunny/gists{/gist_id}","starred_url":"https://api.github.com/users/lunny/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lunny/subscriptions","organizations_url":"https://api.github.com/users/lunny/orgs","repos_url":"https://api.github.com/users/lunny/repos","events_url":"https://api.github.com/users/lunny/events{/privacy}","received_events_url":"https://api.github.com/users/lunny/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"","state":"APPROVED","html_url":"https://github.com/go-gitea/test_repo/pull/4#pullrequestreview-338338740","pull_request_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/4","author_association":"MEMBER","_links":{"html":{"href":"https://github.com/go-gitea/test_repo/pull/4#pullrequestreview-338338740"},"pull_request":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/4"}},"submitted_at":"2020-01-04T05:33:18Z","commit_id":"2be9101c543658591222acbee3eb799edfc3853d"},{"id":338339651,"node_id":"MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzM4MzM5NjUx","user":{"login":"lunny","id":81045,"node_id":"MDQ6VXNlcjgxMDQ1","avatar_url":"https://avatars.githubusercontent.com/u/81045?u=99b64f0ca6ef63643c7583ab87dd31c52d28e673&v=4","gravatar_id":"","url":"https://api.github.com/users/lunny","html_url":"https://github.com/lunny","followers_url":"https://api.github.com/users/lunny/followers","following_url":"https://api.github.com/users/lunny/following{/other_user}","gists_url":"https://api.github.com/users/lunny/gists{/gist_id}","starred_url":"https://api.github.com/users/lunny/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lunny/subscriptions","organizations_url":"https://api.github.com/users/lunny/orgs","repos_url":"https://api.github.com/users/lunny/repos","events_url":"https://api.github.com/users/lunny/events{/privacy}","received_events_url":"https://api.github.com/users/lunny/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"Don't add more reviews","state":"CHANGES_REQUESTED","html_url":"https://github.com/go-gitea/test_repo/pull/4#pullrequestreview-338339651","pull_request_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/4","author_association":"MEMBER","_links":{"html":{"href":"https://github.com/go-gitea/test_repo/pull/4#pullrequestreview-338339651"},"pull_request":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/4"}},"submitted_at":"2020-01-04T06:07:06Z","commit_id":"2be9101c543658591222acbee3eb799edfc3853d"},{"id":338349019,"node_id":"MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzM4MzQ5MDE5","user":{"login":"lunny","id":81045,"node_id":"MDQ6VXNlcjgxMDQ1","avatar_url":"https://avatars.githubusercontent.com/u/81045?u=99b64f0ca6ef63643c7583ab87dd31c52d28e673&v=4","gravatar_id":"","url":"https://api.github.com/users/lunny","html_url":"https://github.com/lunny","followers_url":"https://api.github.com/users/lunny/followers","following_url":"https://api.github.com/users/lunny/following{/other_user}","gists_url":"https://api.github.com/users/lunny/gists{/gist_id}","starred_url":"https://api.github.com/users/lunny/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lunny/subscriptions","organizations_url":"https://api.github.com/users/lunny/orgs","repos_url":"https://api.github.com/users/lunny/repos","events_url":"https://api.github.com/users/lunny/events{/privacy}","received_events_url":"https://api.github.com/users/lunny/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"","state":"COMMENTED","html_url":"https://github.com/go-gitea/test_repo/pull/4#pullrequestreview-338349019","pull_request_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/4","author_association":"MEMBER","_links":{"html":{"href":"https://github.com/go-gitea/test_repo/pull/4#pullrequestreview-338349019"},"pull_request":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/4"}},"submitted_at":"2020-01-04T11:21:41Z","commit_id":"2be9101c543658591222acbee3eb799edfc3853d"}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%3Fdirection=asc&page=1&per_page=2&sort=created&state=all b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%3Fdirection=asc&page=1&per_page=2&sort=created&state=all
deleted file mode 100644
index 30883cc283..0000000000
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%3Fdirection=asc&page=1&per_page=2&sort=created&state=all
+++ /dev/null
@@ -1,24 +0,0 @@
-X-Github-Api-Version-Selected: 2022-11-28
-X-Ratelimit-Used: 87
-X-Frame-Options: deny
-X-Github-Media-Type: github.v3; format=json
-X-Ratelimit-Remaining: 4913
-X-Ratelimit-Reset: 1730800941
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-Content-Security-Policy: default-src 'none'
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Oauth-Scopes:
-X-Ratelimit-Limit: 5000
-X-Ratelimit-Resource: core
-Access-Control-Allow-Origin: *
-X-Github-Request-Id: C7CC:3118FC:3F6099B:403726B:6729E6BA
-X-Xss-Protection: 0
-Content-Type: application/json; charset=utf-8
-Cache-Control: private, max-age=60, s-maxage=60
-Etag: W/"fed37ab8ce0b78e713030ff3e601f540b7f71243ab788b477f6885119bd691c5"
-X-Accepted-Oauth-Scopes:
-X-Content-Type-Options: nosniff
-
-[{"url":"https://api.github.com/repos/go-gitea/test_repo/pulls/3","id":340118745,"node_id":"MDExOlB1bGxSZXF1ZXN0MzQwMTE4NzQ1","html_url":"https://github.com/go-gitea/test_repo/pull/3","diff_url":"https://github.com/go-gitea/test_repo/pull/3.diff","patch_url":"https://github.com/go-gitea/test_repo/pull/3.patch","issue_url":"https://api.github.com/repos/go-gitea/test_repo/issues/3","number":3,"state":"closed","locked":false,"title":"Update README.md","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"add warning to readme","created_at":"2019-11-12T21:21:43Z","updated_at":"2019-11-12T21:39:28Z","closed_at":"2019-11-12T21:39:27Z","merged_at":"2019-11-12T21:39:27Z","merge_commit_sha":"f32b0a9dfd09a60f616f29158f772cedd89942d2","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":1667254254,"node_id":"MDU6TGFiZWwxNjY3MjU0MjU0","url":"https://api.github.com/repos/go-gitea/test_repo/labels/documentation","name":"documentation","color":"0075ca","default":true,"description":"Improvements or additions to documentation"}],"milestone":{"url":"https://api.github.com/repos/go-gitea/test_repo/milestones/2","html_url":"https://github.com/go-gitea/test_repo/milestone/2","labels_url":"https://api.github.com/repos/go-gitea/test_repo/milestones/2/labels","id":4839942,"node_id":"MDk6TWlsZXN0b25lNDgzOTk0Mg==","number":2,"title":"1.1.0","description":"Milestone 1.1.0","creator":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":0,"closed_issues":2,"state":"closed","created_at":"2019-11-12T19:37:25Z","updated_at":"2019-11-12T21:39:27Z","due_on":"2019-11-12T08:00:00Z","closed_at":"2019-11-12T19:45:46Z"},"draft":false,"commits_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/3/commits","review_comments_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/3/comments","review_comment_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/issues/3/comments","statuses_url":"https://api.github.com/repos/go-gitea/test_repo/statuses/076160cf0b039f13e5eff19619932d181269414b","head":{"label":"mrsdizzie:master","ref":"master","sha":"076160cf0b039f13e5eff19619932d181269414b","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"repo":{"id":221313794,"node_id":"MDEwOlJlcG9zaXRvcnkyMjEzMTM3OTQ=","name":"test_repo","full_name":"mrsdizzie/test_repo","private":false,"owner":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"html_url":"https://github.com/mrsdizzie/test_repo","description":"Test repository for testing migration from github to gitea","fork":true,"url":"https://api.github.com/repos/mrsdizzie/test_repo","forks_url":"https://api.github.com/repos/mrsdizzie/test_repo/forks","keys_url":"https://api.github.com/repos/mrsdizzie/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mrsdizzie/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mrsdizzie/test_repo/teams","hooks_url":"https://api.github.com/repos/mrsdizzie/test_repo/hooks","issue_events_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/mrsdizzie/test_repo/events","assignees_url":"https://api.github.com/repos/mrsdizzie/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/mrsdizzie/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/mrsdizzie/test_repo/tags","blobs_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mrsdizzie/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/mrsdizzie/test_repo/languages","stargazers_url":"https://api.github.com/repos/mrsdizzie/test_repo/stargazers","contributors_url":"https://api.github.com/repos/mrsdizzie/test_repo/contributors","subscribers_url":"https://api.github.com/repos/mrsdizzie/test_repo/subscribers","subscription_url":"https://api.github.com/repos/mrsdizzie/test_repo/subscription","commits_url":"https://api.github.com/repos/mrsdizzie/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/mrsdizzie/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/mrsdizzie/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/mrsdizzie/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mrsdizzie/test_repo/merges","archive_url":"https://api.github.com/repos/mrsdizzie/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mrsdizzie/test_repo/downloads","issues_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/mrsdizzie/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/mrsdizzie/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/mrsdizzie/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mrsdizzie/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/mrsdizzie/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/mrsdizzie/test_repo/deployments","created_at":"2019-11-12T21:17:42Z","updated_at":"2019-11-12T21:18:46Z","pushed_at":"2019-11-12T21:53:39Z","git_url":"git://github.com/mrsdizzie/test_repo.git","ssh_url":"git@github.com:mrsdizzie/test_repo.git","clone_url":"https://github.com/mrsdizzie/test_repo.git","svn_url":"https://github.com/mrsdizzie/test_repo","homepage":"https://codeberg.org/forgejo/forgejo/","size":3,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":[],"visibility":"public","forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"go-gitea:master","ref":"master","sha":"72866af952e98d02a73003501836074b286a78f6","user":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":220672974,"node_id":"MDEwOlJlcG9zaXRvcnkyMjA2NzI5NzQ=","name":"test_repo","full_name":"go-gitea/test_repo","private":false,"owner":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/go-gitea/test_repo","description":"Test repository for testing migration from github to gitea","fork":false,"url":"https://api.github.com/repos/go-gitea/test_repo","forks_url":"https://api.github.com/repos/go-gitea/test_repo/forks","keys_url":"https://api.github.com/repos/go-gitea/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/go-gitea/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/go-gitea/test_repo/teams","hooks_url":"https://api.github.com/repos/go-gitea/test_repo/hooks","issue_events_url":"https://api.github.com/repos/go-gitea/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/go-gitea/test_repo/events","assignees_url":"https://api.github.com/repos/go-gitea/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/go-gitea/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/go-gitea/test_repo/tags","blobs_url":"https://api.github.com/repos/go-gitea/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/go-gitea/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/go-gitea/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/go-gitea/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/go-gitea/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/go-gitea/test_repo/languages","stargazers_url":"https://api.github.com/repos/go-gitea/test_repo/stargazers","contributors_url":"https://api.github.com/repos/go-gitea/test_repo/contributors","subscribers_url":"https://api.github.com/repos/go-gitea/test_repo/subscribers","subscription_url":"https://api.github.com/repos/go-gitea/test_repo/subscription","commits_url":"https://api.github.com/repos/go-gitea/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/go-gitea/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/go-gitea/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/go-gitea/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/go-gitea/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/go-gitea/test_repo/merges","archive_url":"https://api.github.com/repos/go-gitea/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/go-gitea/test_repo/downloads","issues_url":"https://api.github.com/repos/go-gitea/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/go-gitea/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/go-gitea/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/go-gitea/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/go-gitea/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/go-gitea/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/go-gitea/test_repo/deployments","created_at":"2019-11-09T16:49:20Z","updated_at":"2023-03-02T14:02:26Z","pushed_at":"2019-11-12T21:54:19Z","git_url":"git://github.com/go-gitea/test_repo.git","ssh_url":"git@github.com:go-gitea/test_repo.git","clone_url":"https://github.com/go-gitea/test_repo.git","svn_url":"https://github.com/go-gitea/test_repo","homepage":"https://codeberg.org/forgejo/forgejo/","size":1,"stargazers_count":3,"watchers_count":3,"language":null,"has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":6,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":2,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":["gitea"],"visibility":"public","forks":6,"open_issues":2,"watchers":3,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/3"},"html":{"href":"https://github.com/go-gitea/test_repo/pull/3"},"issue":{"href":"https://api.github.com/repos/go-gitea/test_repo/issues/3"},"comments":{"href":"https://api.github.com/repos/go-gitea/test_repo/issues/3/comments"},"review_comments":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/3/comments"},"review_comment":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/3/commits"},"statuses":{"href":"https://api.github.com/repos/go-gitea/test_repo/statuses/076160cf0b039f13e5eff19619932d181269414b"}},"author_association":"MEMBER","auto_merge":null,"active_lock_reason":null},{"url":"https://api.github.com/repos/go-gitea/test_repo/pulls/4","id":340131577,"node_id":"MDExOlB1bGxSZXF1ZXN0MzQwMTMxNTc3","html_url":"https://github.com/go-gitea/test_repo/pull/4","diff_url":"https://github.com/go-gitea/test_repo/pull/4.diff","patch_url":"https://github.com/go-gitea/test_repo/pull/4.patch","issue_url":"https://api.github.com/repos/go-gitea/test_repo/issues/4","number":4,"state":"open","locked":false,"title":"Test branch","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"do not merge this PR","created_at":"2019-11-12T21:54:18Z","updated_at":"2020-01-04T11:30:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"565d1208f5fffdc1c5ae1a2436491eb9a5e4ebae","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":1667254252,"node_id":"MDU6TGFiZWwxNjY3MjU0MjUy","url":"https://api.github.com/repos/go-gitea/test_repo/labels/bug","name":"bug","color":"d73a4a","default":true,"description":"Something isn't working"}],"milestone":{"url":"https://api.github.com/repos/go-gitea/test_repo/milestones/1","html_url":"https://github.com/go-gitea/test_repo/milestone/1","labels_url":"https://api.github.com/repos/go-gitea/test_repo/milestones/1/labels","id":4839941,"node_id":"MDk6TWlsZXN0b25lNDgzOTk0MQ==","number":1,"title":"1.0.0","description":"Milestone 1.0.0","creator":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":1,"closed_issues":1,"state":"closed","created_at":"2019-11-12T19:37:08Z","updated_at":"2019-11-12T21:56:17Z","due_on":"2019-11-11T08:00:00Z","closed_at":"2019-11-12T19:45:49Z"},"draft":false,"commits_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/4/commits","review_comments_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/4/comments","review_comment_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/issues/4/comments","statuses_url":"https://api.github.com/repos/go-gitea/test_repo/statuses/2be9101c543658591222acbee3eb799edfc3853d","head":{"label":"mrsdizzie:test-branch","ref":"test-branch","sha":"2be9101c543658591222acbee3eb799edfc3853d","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"repo":{"id":221313794,"node_id":"MDEwOlJlcG9zaXRvcnkyMjEzMTM3OTQ=","name":"test_repo","full_name":"mrsdizzie/test_repo","private":false,"owner":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"html_url":"https://github.com/mrsdizzie/test_repo","description":"Test repository for testing migration from github to gitea","fork":true,"url":"https://api.github.com/repos/mrsdizzie/test_repo","forks_url":"https://api.github.com/repos/mrsdizzie/test_repo/forks","keys_url":"https://api.github.com/repos/mrsdizzie/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mrsdizzie/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mrsdizzie/test_repo/teams","hooks_url":"https://api.github.com/repos/mrsdizzie/test_repo/hooks","issue_events_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/mrsdizzie/test_repo/events","assignees_url":"https://api.github.com/repos/mrsdizzie/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/mrsdizzie/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/mrsdizzie/test_repo/tags","blobs_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mrsdizzie/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/mrsdizzie/test_repo/languages","stargazers_url":"https://api.github.com/repos/mrsdizzie/test_repo/stargazers","contributors_url":"https://api.github.com/repos/mrsdizzie/test_repo/contributors","subscribers_url":"https://api.github.com/repos/mrsdizzie/test_repo/subscribers","subscription_url":"https://api.github.com/repos/mrsdizzie/test_repo/subscription","commits_url":"https://api.github.com/repos/mrsdizzie/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/mrsdizzie/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/mrsdizzie/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/mrsdizzie/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mrsdizzie/test_repo/merges","archive_url":"https://api.github.com/repos/mrsdizzie/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mrsdizzie/test_repo/downloads","issues_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/mrsdizzie/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/mrsdizzie/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/mrsdizzie/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mrsdizzie/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/mrsdizzie/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/mrsdizzie/test_repo/deployments","created_at":"2019-11-12T21:17:42Z","updated_at":"2019-11-12T21:18:46Z","pushed_at":"2019-11-12T21:53:39Z","git_url":"git://github.com/mrsdizzie/test_repo.git","ssh_url":"git@github.com:mrsdizzie/test_repo.git","clone_url":"https://github.com/mrsdizzie/test_repo.git","svn_url":"https://github.com/mrsdizzie/test_repo","homepage":"https://codeberg.org/forgejo/forgejo/","size":3,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":[],"visibility":"public","forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"go-gitea:master","ref":"master","sha":"f32b0a9dfd09a60f616f29158f772cedd89942d2","user":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":220672974,"node_id":"MDEwOlJlcG9zaXRvcnkyMjA2NzI5NzQ=","name":"test_repo","full_name":"go-gitea/test_repo","private":false,"owner":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/go-gitea/test_repo","description":"Test repository for testing migration from github to gitea","fork":false,"url":"https://api.github.com/repos/go-gitea/test_repo","forks_url":"https://api.github.com/repos/go-gitea/test_repo/forks","keys_url":"https://api.github.com/repos/go-gitea/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/go-gitea/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/go-gitea/test_repo/teams","hooks_url":"https://api.github.com/repos/go-gitea/test_repo/hooks","issue_events_url":"https://api.github.com/repos/go-gitea/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/go-gitea/test_repo/events","assignees_url":"https://api.github.com/repos/go-gitea/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/go-gitea/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/go-gitea/test_repo/tags","blobs_url":"https://api.github.com/repos/go-gitea/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/go-gitea/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/go-gitea/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/go-gitea/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/go-gitea/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/go-gitea/test_repo/languages","stargazers_url":"https://api.github.com/repos/go-gitea/test_repo/stargazers","contributors_url":"https://api.github.com/repos/go-gitea/test_repo/contributors","subscribers_url":"https://api.github.com/repos/go-gitea/test_repo/subscribers","subscription_url":"https://api.github.com/repos/go-gitea/test_repo/subscription","commits_url":"https://api.github.com/repos/go-gitea/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/go-gitea/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/go-gitea/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/go-gitea/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/go-gitea/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/go-gitea/test_repo/merges","archive_url":"https://api.github.com/repos/go-gitea/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/go-gitea/test_repo/downloads","issues_url":"https://api.github.com/repos/go-gitea/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/go-gitea/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/go-gitea/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/go-gitea/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/go-gitea/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/go-gitea/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/go-gitea/test_repo/deployments","created_at":"2019-11-09T16:49:20Z","updated_at":"2023-03-02T14:02:26Z","pushed_at":"2019-11-12T21:54:19Z","git_url":"git://github.com/go-gitea/test_repo.git","ssh_url":"git@github.com:go-gitea/test_repo.git","clone_url":"https://github.com/go-gitea/test_repo.git","svn_url":"https://github.com/go-gitea/test_repo","homepage":"https://codeberg.org/forgejo/forgejo/","size":1,"stargazers_count":3,"watchers_count":3,"language":null,"has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":6,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":2,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":["gitea"],"visibility":"public","forks":6,"open_issues":2,"watchers":3,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/4"},"html":{"href":"https://github.com/go-gitea/test_repo/pull/4"},"issue":{"href":"https://api.github.com/repos/go-gitea/test_repo/issues/4"},"comments":{"href":"https://api.github.com/repos/go-gitea/test_repo/issues/4/comments"},"review_comments":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/4/comments"},"review_comment":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/4/commits"},"statuses":{"href":"https://api.github.com/repos/go-gitea/test_repo/statuses/2be9101c543658591222acbee3eb799edfc3853d"}},"author_association":"MEMBER","auto_merge":null,"active_lock_reason":null}]
diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Freleases%3Fpage=1&per_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Freleases%3Fpage=1&per_page=100
deleted file mode 100644
index 470f5c5769..0000000000
--- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Freleases%3Fpage=1&per_page=100
+++ /dev/null
@@ -1,24 +0,0 @@
-Access-Control-Allow-Origin: *
-X-Frame-Options: deny
-Etag: W/"2986c85fcc06cc478457abb86a88ac7f065b6861e873ae0eeb9ac16a22efca45"
-X-Github-Api-Version-Selected: 2022-11-28
-X-Ratelimit-Used: 75
-X-Ratelimit-Resource: core
-Content-Type: application/json; charset=utf-8
-Cache-Control: private, max-age=60, s-maxage=60
-Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With
-X-Accepted-Oauth-Scopes: repo
-X-Ratelimit-Limit: 5000
-X-Ratelimit-Reset: 1730800941
-Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
-X-Xss-Protection: 0
-Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
-Content-Security-Policy: default-src 'none'
-X-Oauth-Scopes:
-X-Github-Media-Type: github.v3; format=json
-X-Ratelimit-Remaining: 4925
-Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
-X-Content-Type-Options: nosniff
-X-Github-Request-Id: C7CC:3118FC:3F5F41A:4035CB2:6729E6B4
-
-[{"url":"https://api.github.com/repos/go-gitea/test_repo/releases/21419432","assets_url":"https://api.github.com/repos/go-gitea/test_repo/releases/21419432/assets","upload_url":"https://uploads.github.com/repos/go-gitea/test_repo/releases/21419432/assets{?name,label}","html_url":"https://github.com/go-gitea/test_repo/releases/tag/v0.9.99","id":21419432,"author":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"node_id":"MDc6UmVsZWFzZTIxNDE5NDMy","tag_name":"v0.9.99","target_commitish":"master","name":"First Release","draft":false,"prerelease":false,"created_at":"2019-11-09T16:49:21Z","published_at":"2019-11-12T20:12:10Z","assets":[],"tarball_url":"https://api.github.com/repos/go-gitea/test_repo/tarball/v0.9.99","zipball_url":"https://api.github.com/repos/go-gitea/test_repo/zipball/v0.9.99","body":"A test release"}]
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/forgejo/test_repo.git/HEAD b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/HEAD
new file mode 100644
index 0000000000..b870d82622
--- /dev/null
+++ b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/HEAD
@@ -0,0 +1 @@
+ref: refs/heads/main
diff --git a/services/migrations/testdata/github/full_download/forgejo/test_repo.git/config b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/config
new file mode 100644
index 0000000000..07d359d07c
--- /dev/null
+++ b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/config
@@ -0,0 +1,4 @@
+[core]
+ repositoryformatversion = 0
+ filemode = true
+ bare = true
diff --git a/services/migrations/testdata/github/full_download/forgejo/test_repo.git/description b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/description
new file mode 100644
index 0000000000..498b267a8c
--- /dev/null
+++ b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/description
@@ -0,0 +1 @@
+Unnamed repository; edit this file 'description' to name the repository.
diff --git a/services/migrations/testdata/github/full_download/forgejo/test_repo.git/info/exclude b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/info/exclude
new file mode 100644
index 0000000000..a5196d1be8
--- /dev/null
+++ b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/info/exclude
@@ -0,0 +1,6 @@
+# git ls-files --others --exclude-from=.git/info/exclude
+# Lines that start with '#' are comments.
+# For a project mostly in C, the following would be a good set of
+# exclude patterns (uncomment them if you want to use them):
+# *.[oa]
+# *~
diff --git a/services/migrations/testdata/github/full_download/forgejo/test_repo.git/info/refs b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/info/refs
new file mode 100644
index 0000000000..07fe1b45cd
--- /dev/null
+++ b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/info/refs
@@ -0,0 +1 @@
+ca43b48ca2c461f9a5cb66500a154b23d07c9f90 refs/heads/main
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/17/58ff42c9ab82988ad33d211ef5433afd779a9e b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/17/58ff42c9ab82988ad33d211ef5433afd779a9e
new file mode 100644
index 0000000000..5a598008b9
Binary files /dev/null and b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/17/58ff42c9ab82988ad33d211ef5433afd779a9e differ
diff --git a/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/1a/0f6de7bb300de4a569371cfedf1c6ff189d374 b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/1a/0f6de7bb300de4a569371cfedf1c6ff189d374
new file mode 100644
index 0000000000..e296f574da
Binary files /dev/null and b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/1a/0f6de7bb300de4a569371cfedf1c6ff189d374 differ
diff --git a/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/44/2d28a55b842472c95bead51a4c61f209ac1636 b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/44/2d28a55b842472c95bead51a4c61f209ac1636
new file mode 100644
index 0000000000..f7aae32db0
Binary files /dev/null and b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/44/2d28a55b842472c95bead51a4c61f209ac1636 differ
diff --git a/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/56/38cb8f3278e467fc1eefcac14d3c0d5d91601f b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/56/38cb8f3278e467fc1eefcac14d3c0d5d91601f
new file mode 100644
index 0000000000..b7d43b3d6d
Binary files /dev/null and b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/56/38cb8f3278e467fc1eefcac14d3c0d5d91601f differ
diff --git a/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/59/93b8814449c4cc660132613c12cf6b26c9824c b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/59/93b8814449c4cc660132613c12cf6b26c9824c
new file mode 100644
index 0000000000..a995c75bf7
Binary files /dev/null and b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/59/93b8814449c4cc660132613c12cf6b26c9824c differ
diff --git a/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/6d/d0c6801ddbb7333787e73e99581279492ff449 b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/6d/d0c6801ddbb7333787e73e99581279492ff449
new file mode 100644
index 0000000000..aaccbfefb4
Binary files /dev/null and b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/6d/d0c6801ddbb7333787e73e99581279492ff449 differ
diff --git a/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/76/5f7381bf10911971845cc881fa54a93389a270 b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/76/5f7381bf10911971845cc881fa54a93389a270
new file mode 100644
index 0000000000..2dfcea6cd3
Binary files /dev/null and b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/76/5f7381bf10911971845cc881fa54a93389a270 differ
diff --git a/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/7c/93d105d3ee6af50705c4d2cc8dd548c2f9edc9 b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/7c/93d105d3ee6af50705c4d2cc8dd548c2f9edc9
new file mode 100644
index 0000000000..0fe680ed57
Binary files /dev/null and b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/7c/93d105d3ee6af50705c4d2cc8dd548c2f9edc9 differ
diff --git a/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/7d/c3f365f3bc83011f0df5ee8637de7dd9487c04 b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/7d/c3f365f3bc83011f0df5ee8637de7dd9487c04
new file mode 100644
index 0000000000..385dfc7fe7
--- /dev/null
+++ b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/7d/c3f365f3bc83011f0df5ee8637de7dd9487c04
@@ -0,0 +1,3 @@
+xUPÛŠÛ0ís¾â°O-˜´,téC)Ør,¥T’7ìc.JâÒ‚°äï;r»t†ñØç6gû+nñððå]/·¡?žÞ—pÿéþ3¶7Ôq8†ŸtM§8Œøº‹ç´Ù¥ï‡??æ<¾Íf«0<÷ãØÇ3RÄuv¬Wà9îûÏÍyÿ1Ø÷cúí5¤S?bŒ‡ô²XŽ17\®Ã%Ž/}:¿å¯ ‡ÀøS§:›s
+ûùlægj¿&+ VÖ<ÊJT¸#ÇûHWÈ ê|c,*éJE²u ¥À,KÚKá°–¾K²Œ7La±ÂºT]%õrbÉv¥$[¼a›°eÃb´Jú§É¸–^çæÚ@<
+íášlý&ÓB@IZ(š’~‚[‰R’*8®¥/˜ÿúƈÒh'~t¬ÅTÔÒ’øK}]×
ygØÑòU®S>§¯i¡ŒctÎ 6 O™Ê½qXW`ÝŽfsbâ§ôÒèŒfSoy- ÅRɥХÈD3¡½±ì¸Õ‰P€¬tÙÑt>³È‚¬¡ùœ¬8Õ;à“¿°||K“jýýóÙoQwÃÛ
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/9b/fcee0cb75322db96a76b49faa222e2c59f485d b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/9b/fcee0cb75322db96a76b49faa222e2c59f485d
new file mode 100644
index 0000000000..64a7a811da
Binary files /dev/null and b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/9b/fcee0cb75322db96a76b49faa222e2c59f485d differ
diff --git a/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/ba/96372ae89cfd798c343542d898da029e2d8a02 b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/ba/96372ae89cfd798c343542d898da029e2d8a02
new file mode 100644
index 0000000000..c39c6e8a75
--- /dev/null
+++ b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/ba/96372ae89cfd798c343542d898da029e2d8a02
@@ -0,0 +1,2 @@
+x-A
+Ã0{ö+z-?ô\B> WÂQh¬b©”ü¾.ä´Ã°ùeã8]®¸[+²ñÀ,oKiYÕÑ:¢ïÇ…†øû]K£P«~ªž+Õ"ÐÎ0kàKbîe>@Ø¥0ó~¥¢(<
\ No newline at end of file
diff --git a/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/bf/2e0fd70c6ef1ab5240a340ba38eb47b3e8409f b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/bf/2e0fd70c6ef1ab5240a340ba38eb47b3e8409f
new file mode 100644
index 0000000000..e92cf50fa5
Binary files /dev/null and b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/bf/2e0fd70c6ef1ab5240a340ba38eb47b3e8409f differ
diff --git a/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/ca/43b48ca2c461f9a5cb66500a154b23d07c9f90 b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/ca/43b48ca2c461f9a5cb66500a154b23d07c9f90
new file mode 100644
index 0000000000..467ab42ca3
Binary files /dev/null and b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/objects/ca/43b48ca2c461f9a5cb66500a154b23d07c9f90 differ
diff --git a/services/migrations/testdata/github/full_download/forgejo/test_repo.git/refs/heads/main b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/refs/heads/main
new file mode 100644
index 0000000000..fe8dc33916
--- /dev/null
+++ b/services/migrations/testdata/github/full_download/forgejo/test_repo.git/refs/heads/main
@@ -0,0 +1 @@
+ca43b48ca2c461f9a5cb66500a154b23d07c9f90
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/services/pull/merge.go b/services/pull/merge.go
index f69f8a87b4..c279147399 100644
--- a/services/pull/merge.go
+++ b/services/pull/merge.go
@@ -208,7 +208,30 @@ func AddCommitMessageTrailer(message, tailerKey, tailerValue string) string {
// Merge merges pull request to base repository.
// Caller should check PR is ready to be merged (review and status checks)
func Merge(ctx context.Context, pr *issues_model.PullRequest, doer *user_model.User, baseGitRepo *git.Repository, mergeStyle repo_model.MergeStyle, expectedHeadCommitID, message string, wasAutoMerged bool) error {
- if err := pr.LoadBaseRepo(ctx); err != nil {
+ pullWorkingPool.CheckIn(fmt.Sprint(pr.ID))
+ defer pullWorkingPool.CheckOut(fmt.Sprint(pr.ID))
+
+ pr, err := issues_model.GetPullRequestByID(ctx, pr.ID)
+ if err != nil {
+ log.Error("Unable to load pull request itself: %v", err)
+ return fmt.Errorf("unable to load pull request itself: %w", err)
+ }
+
+ if pr.HasMerged {
+ return models.ErrPullRequestHasMerged{
+ ID: pr.ID,
+ IssueID: pr.IssueID,
+ HeadRepoID: pr.HeadRepoID,
+ BaseRepoID: pr.BaseRepoID,
+ HeadBranch: pr.HeadBranch,
+ BaseBranch: pr.BaseBranch,
+ }
+ }
+
+ if err := pr.LoadIssue(ctx); err != nil {
+ log.Error("Unable to load issue: %v", err)
+ return fmt.Errorf("unable to load issue: %w", err)
+ } else if err := pr.LoadBaseRepo(ctx); err != nil {
log.Error("Unable to load base repo: %v", err)
return fmt.Errorf("unable to load base repo: %w", err)
} else if err := pr.LoadHeadRepo(ctx); err != nil {
@@ -216,9 +239,6 @@ func Merge(ctx context.Context, pr *issues_model.PullRequest, doer *user_model.U
return fmt.Errorf("unable to load head repo: %w", err)
}
- pullWorkingPool.CheckIn(fmt.Sprint(pr.ID))
- defer pullWorkingPool.CheckOut(fmt.Sprint(pr.ID))
-
prUnit, err := pr.BaseRepo.GetUnit(ctx, unit.TypePullRequests)
if err != nil {
log.Error("pr.BaseRepo.GetUnit(unit.TypePullRequests): %v", err)
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/services/pull/merge_test.go b/services/pull/merge_test.go
index 2a26759956..7d3b7538d6 100644
--- a/services/pull/merge_test.go
+++ b/services/pull/merge_test.go
@@ -6,7 +6,15 @@ package pull
import (
"testing"
+ "forgejo.org/models"
+ issues_model "forgejo.org/models/issues"
+ repo_model "forgejo.org/models/repo"
+ "forgejo.org/models/unittest"
+ user_model "forgejo.org/models/user"
+ "forgejo.org/modules/gitrepo"
+
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func Test_expandDefaultMergeMessage(t *testing.T) {
@@ -90,3 +98,29 @@ func TestAddCommitMessageTailer(t *testing.T) {
assert.Equal(t, "title\n\nTest-tailer: v1\nTest-tailer: v2", AddCommitMessageTrailer("title\n\nTest-tailer: v1", "Test-tailer", "v2"))
assert.Equal(t, "title\n\nTest-tailer: v1\nTest-tailer: v2", AddCommitMessageTrailer("title\n\nTest-tailer: v1\n", "Test-tailer", "v2"))
}
+
+func TestMergeMergedPR(t *testing.T) {
+ require.NoError(t, unittest.PrepareTestDatabase())
+ pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 1})
+ doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
+
+ require.NoError(t, pr.LoadBaseRepo(t.Context()))
+
+ gitRepo, err := gitrepo.OpenRepository(t.Context(), pr.BaseRepo)
+ require.NoError(t, err)
+ defer gitRepo.Close()
+
+ assert.True(t, pr.HasMerged)
+ pr.HasMerged = false
+
+ err = Merge(t.Context(), pr, doer, gitRepo, repo_model.MergeStyleRebase, "", "I should not exist", false)
+ require.Error(t, err)
+ assert.True(t, models.IsErrPullRequestHasMerged(err))
+
+ if mergeErr, ok := err.(models.ErrPullRequestHasMerged); ok {
+ assert.Equal(t, pr.ID, mergeErr.ID)
+ assert.Equal(t, pr.IssueID, mergeErr.IssueID)
+ assert.Equal(t, pr.HeadBranch, mergeErr.HeadBranch)
+ assert.Equal(t, pr.BaseBranch, mergeErr.BaseBranch)
+ }
+}
diff --git a/services/redirect/main_test.go b/services/redirect/main_test.go
new file mode 100644
index 0000000000..7363791caa
--- /dev/null
+++ b/services/redirect/main_test.go
@@ -0,0 +1,18 @@
+// Copyright 2025 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+package redirect
+
+import (
+ "testing"
+
+ "forgejo.org/models/unittest"
+
+ _ "forgejo.org/models"
+ _ "forgejo.org/models/actions"
+ _ "forgejo.org/models/activities"
+ _ "forgejo.org/models/forgefed"
+)
+
+func TestMain(m *testing.M) {
+ unittest.MainTest(m)
+}
diff --git a/services/redirect/repo.go b/services/redirect/repo.go
new file mode 100644
index 0000000000..7070ab4e2f
--- /dev/null
+++ b/services/redirect/repo.go
@@ -0,0 +1,37 @@
+// Copyright 2025 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+package redirect
+
+import (
+ "context"
+
+ access_model "forgejo.org/models/perm/access"
+ repo_model "forgejo.org/models/repo"
+ user_model "forgejo.org/models/user"
+)
+
+// LookupRepoRedirect returns the repository ID if there's a redirect registered for
+// the ownerID repository name pair. It checks if the doer has permission to view
+// the new repository.
+func LookupRepoRedirect(ctx context.Context, doer *user_model.User, ownerID int64, repoName string) (int64, error) {
+ redirectID, err := repo_model.GetRedirect(ctx, ownerID, repoName)
+ if err != nil {
+ return 0, err
+ }
+
+ redirectRepo, err := repo_model.GetRepositoryByID(ctx, redirectID)
+ if err != nil {
+ return 0, err
+ }
+
+ perm, err := access_model.GetUserRepoPermission(ctx, redirectRepo, doer)
+ if err != nil {
+ return 0, err
+ }
+
+ if !perm.HasAccess() {
+ return 0, repo_model.ErrRedirectNotExist{OwnerID: ownerID, RepoName: repoName, MissingPermission: true}
+ }
+
+ return redirectID, nil
+}
diff --git a/services/redirect/repo_test.go b/services/redirect/repo_test.go
new file mode 100644
index 0000000000..cad8414035
--- /dev/null
+++ b/services/redirect/repo_test.go
@@ -0,0 +1,55 @@
+// Copyright 2025 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+package redirect
+
+import (
+ "testing"
+
+ repo_model "forgejo.org/models/repo"
+ "forgejo.org/models/unittest"
+ user_model "forgejo.org/models/user"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestLookupRepoRedirect(t *testing.T) {
+ require.NoError(t, unittest.PrepareTestDatabase())
+
+ normalUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5})
+ ownerUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 20})
+
+ testOk := func(t *testing.T, doer *user_model.User, ownerID int64, repoName string, expectedRedirectID int64) {
+ t.Helper()
+
+ redirectID, err := LookupRepoRedirect(t.Context(), doer, ownerID, repoName)
+ require.NoError(t, err)
+ assert.Equal(t, expectedRedirectID, redirectID)
+ }
+
+ testFail := func(t *testing.T, doer *user_model.User, ownerID int64, repoName string) {
+ t.Helper()
+
+ redirectID, err := LookupRepoRedirect(t.Context(), doer, ownerID, repoName)
+ require.ErrorIs(t, err, repo_model.ErrRedirectNotExist{OwnerID: ownerID, RepoName: repoName, MissingPermission: true})
+ assert.Zero(t, redirectID)
+ }
+
+ t.Run("Public repository", func(t *testing.T) {
+ ownerID := int64(2)
+ reponame := "oldrepo1"
+
+ testOk(t, nil, ownerID, reponame, 1)
+ testOk(t, normalUser, ownerID, reponame, 1)
+ testOk(t, ownerUser, ownerID, reponame, 1)
+ })
+
+ t.Run("Private repository", func(t *testing.T) {
+ ownerID := int64(17)
+ reponame := "oldrepo24"
+
+ testFail(t, nil, ownerID, reponame)
+ testFail(t, normalUser, ownerID, reponame)
+ testOk(t, ownerUser, ownerID, reponame, 24)
+ })
+}
diff --git a/services/redirect/user.go b/services/redirect/user.go
new file mode 100644
index 0000000000..2b1d38bbc0
--- /dev/null
+++ b/services/redirect/user.go
@@ -0,0 +1,30 @@
+// Copyright 2025 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+package redirect
+
+import (
+ "context"
+
+ user_model "forgejo.org/models/user"
+)
+
+// LookupUserRedirect returns the userID if there's a redirect registered for the
+// username. It additionally checks if the doer has permission to view the new
+// user.
+func LookupUserRedirect(ctx context.Context, doer *user_model.User, userName string) (int64, error) {
+ redirect, err := user_model.GetUserRedirect(ctx, userName)
+ if err != nil {
+ return 0, err
+ }
+
+ redirectUser, err := user_model.GetUserByID(ctx, redirect.RedirectUserID)
+ if err != nil {
+ return 0, err
+ }
+
+ if !user_model.IsUserVisibleToViewer(ctx, redirectUser, doer) {
+ return 0, user_model.ErrUserRedirectNotExist{Name: userName, MissingPermission: true}
+ }
+
+ return redirect.RedirectUserID, nil
+}
diff --git a/services/redirect/user_test.go b/services/redirect/user_test.go
new file mode 100644
index 0000000000..d1ddcc2ebf
--- /dev/null
+++ b/services/redirect/user_test.go
@@ -0,0 +1,65 @@
+// Copyright 2025 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+package redirect
+
+import (
+ "testing"
+
+ "forgejo.org/models/unittest"
+ user_model "forgejo.org/models/user"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestLookupUserRedirect(t *testing.T) {
+ require.NoError(t, unittest.PrepareTestDatabase())
+
+ adminUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
+ normalUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
+
+ testOk := func(t *testing.T, doer *user_model.User, username string, expectedRedirectID int64) {
+ t.Helper()
+
+ redirectID, err := LookupUserRedirect(t.Context(), doer, username)
+ require.NoError(t, err)
+ assert.Equal(t, expectedRedirectID, redirectID)
+ }
+
+ testFail := func(t *testing.T, doer *user_model.User, username string) {
+ t.Helper()
+
+ redirectID, err := LookupUserRedirect(t.Context(), doer, username)
+ require.ErrorIs(t, err, user_model.ErrUserRedirectNotExist{Name: username, MissingPermission: true})
+ assert.Zero(t, redirectID)
+ }
+
+ t.Run("Public visibility", func(t *testing.T) {
+ username := "olduser1"
+ redirectID := int64(1)
+
+ testOk(t, nil, username, redirectID)
+ testOk(t, normalUser, username, redirectID)
+ testOk(t, adminUser, username, redirectID)
+ })
+
+ t.Run("Limited visibility", func(t *testing.T) {
+ username := "oldorg22"
+ redirectID := int64(22)
+
+ testFail(t, nil, username)
+ testOk(t, normalUser, username, redirectID)
+ testOk(t, adminUser, username, redirectID)
+ })
+
+ t.Run("Private visibility", func(t *testing.T) {
+ orgUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5})
+ username := "oldorg23"
+ redirectID := int64(23)
+
+ testFail(t, nil, username)
+ testFail(t, normalUser, username)
+ testOk(t, orgUser, username, redirectID)
+ testOk(t, adminUser, username, redirectID)
+ })
+}
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/services/user/TestReplaceInactivePrimaryEmail/forgejo_auth_token.yml b/services/user/TestReplaceInactivePrimaryEmail/forgejo_auth_token.yml
new file mode 100644
index 0000000000..93a6c184b6
--- /dev/null
+++ b/services/user/TestReplaceInactivePrimaryEmail/forgejo_auth_token.yml
@@ -0,0 +1,5 @@
+-
+ id: 1001
+ uid: 10
+ lookup_key: unique
+ purpose: user_activation
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..cc38dacf95 100644
--- a/services/user/email.go
+++ b/services/user/email.go
@@ -9,6 +9,7 @@ import (
"errors"
"strings"
+ auth_model "forgejo.org/models/auth"
"forgejo.org/models/db"
user_model "forgejo.org/models/user"
"forgejo.org/modules/setting"
@@ -171,6 +172,11 @@ func ReplaceInactivePrimaryEmail(ctx context.Context, oldEmail string, email *us
return err
}
+ // Delete previous activation token.
+ if err := auth_model.DeleteAuthTokenByUser(ctx, user.ID); err != nil {
+ return err
+ }
+
return DeleteEmailAddresses(ctx, user, []string{oldEmail})
}
@@ -205,7 +211,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/email_test.go b/services/user/email_test.go
index b48936a27e..d2cff22696 100644
--- a/services/user/email_test.go
+++ b/services/user/email_test.go
@@ -6,6 +6,7 @@ package user
import (
"testing"
+ auth_model "forgejo.org/models/auth"
"forgejo.org/models/db"
organization_model "forgejo.org/models/organization"
"forgejo.org/models/unittest"
@@ -123,25 +124,34 @@ func TestAddEmailAddresses(t *testing.T) {
}
func TestReplaceInactivePrimaryEmail(t *testing.T) {
+ defer unittest.OverrideFixtures("services/user/TestReplaceInactivePrimaryEmail/")()
require.NoError(t, unittest.PrepareTestDatabase())
- email := &user_model.EmailAddress{
- Email: "user9999999@example.com",
- UID: 9999999,
- }
- err := ReplaceInactivePrimaryEmail(db.DefaultContext, "user10@example.com", email)
- require.Error(t, err)
- assert.True(t, user_model.IsErrUserNotExist(err))
+ t.Run("User doesn't exist", func(t *testing.T) {
+ email := &user_model.EmailAddress{
+ Email: "user9999999@example.com",
+ UID: 9999999,
+ }
+ err := ReplaceInactivePrimaryEmail(db.DefaultContext, "user10@example.com", email)
+ require.Error(t, err)
+ assert.True(t, user_model.IsErrUserNotExist(err))
+ })
- email = &user_model.EmailAddress{
- Email: "user201@example.com",
- UID: 10,
- }
- err = ReplaceInactivePrimaryEmail(db.DefaultContext, "user10@example.com", email)
- require.NoError(t, err)
+ t.Run("Normal", func(t *testing.T) {
+ unittest.AssertExistsIf(t, true, &auth_model.AuthorizationToken{UID: 10})
- user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 10})
- assert.Equal(t, "user201@example.com", user.Email)
+ email := &user_model.EmailAddress{
+ Email: "user201@example.com",
+ UID: 10,
+ }
+ err := ReplaceInactivePrimaryEmail(db.DefaultContext, "user10@example.com", email)
+ require.NoError(t, err)
+
+ user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 10})
+ assert.Equal(t, "user201@example.com", user.Email)
+
+ unittest.AssertExistsIf(t, false, &auth_model.AuthorizationToken{UID: 10})
+ })
}
func TestDeleteEmailAddresses(t *testing.T) {
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 4678d3bc9a..2df3148315 100644
--- a/services/user/user_test.go
+++ b/services/user/user_test.go
@@ -15,13 +15,17 @@ 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"
+ redirect_service "forgejo.org/services/redirect"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
@@ -142,10 +146,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) {
@@ -187,7 +197,7 @@ func TestRenameUser(t *testing.T) {
require.NoError(t, RenameUser(db.DefaultContext, user, newUsername))
unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: user.ID, Name: newUsername, LowerName: strings.ToLower(newUsername)})
- redirectUID, err := user_model.LookupUserRedirect(db.DefaultContext, oldUsername)
+ redirectUID, err := redirect_service.LookupUserRedirect(db.DefaultContext, user, oldUsername)
require.NoError(t, err)
assert.Equal(t, user.ID, redirectUID)
@@ -277,3 +287,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)
+}
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}}
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}}