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/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/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/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 bc64f07013..94469b7371 100644 --- a/models/forgejo_migrations/migrate.go +++ b/models/forgejo_migrations/migrate.go @@ -109,6 +109,8 @@ var migrations = []*Migration{ NewMigration("Add `notify-email` column to `action_run` table", AddNotifyEmailToActionRun), // v34 -> v35 NewMigration("Noop because of https://codeberg.org/forgejo/forgejo/issues/8373", NoopAddIndexToActionRunStopped), + // v35 -> v36 + NewMigration("Fix wiki unit default permission", FixWikiUnitDefaultPermission), } // GetCurrentDBVersion returns the current Forgejo database version. diff --git a/models/forgejo_migrations/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/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/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/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/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 b124572bb6..bfd7e6063f 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -927,7 +927,9 @@ func UpdateUserCols(ctx context.Context, u *User, cols ...string) error { // If the user was reported as abusive and any of the columns being updated is relevant // for moderation purposes a shadow copy should be created before first update. - if err := IfNeededCreateShadowCopyForUser(ctx, u, cols...); err != nil { + // Since u is already altered at this point we are sending nil instead as an argument + // so that the unaltered version will be retrieved from DB. + if err := IfNeededCreateShadowCopyForUser(ctx, u.ID, nil, cols...); err != nil { return err } @@ -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/packages/debian/metadata.go b/modules/packages/debian/metadata.go index e44801654b..1729a2206e 100644 --- a/modules/packages/debian/metadata.go +++ b/modules/packages/debian/metadata.go @@ -46,7 +46,7 @@ var ( // https://www.debian.org/doc/debian-policy/ch-controlfields.html#source namePattern = regexp.MustCompile(`\A[a-z0-9][a-z0-9+-.]+\z`) // https://www.debian.org/doc/debian-policy/ch-controlfields.html#version - versionPattern = regexp.MustCompile(`\A(?:[0-9]:)?[a-zA-Z0-9.+~]+(?:-[a-zA-Z0-9.+-~]+)?\z`) + versionPattern = regexp.MustCompile(`\A(?:[1-9]?[0-9]:)?[a-zA-Z0-9.+~]+(?:-[a-zA-Z0-9.+-~]+)?\z`) ) type Package struct { diff --git a/modules/packages/debian/metadata_test.go b/modules/packages/debian/metadata_test.go index cfcbc57ee0..079b9c19c8 100644 --- a/modules/packages/debian/metadata_test.go +++ b/modules/packages/debian/metadata_test.go @@ -167,6 +167,14 @@ func TestParseControlFile(t *testing.T) { require.ErrorIs(t, err, ErrInvalidArchitecture) }) + t.Run("ValidVersionEpoch", func(t *testing.T) { + for _, version := range []string{"0:1.2.3-test", "1:1.2.3-test", "9:1.2.3-test", "10:1.2.3-test", "37:1.2.3-test", "99:1.2.3-test"} { + p, err := ParseControlFile(buildContent(packageName, version, packageArchitecture)) + require.NoError(t, err) + assert.NotNil(t, p) + } + }) + t.Run("Valid", func(t *testing.T) { content := buildContent(packageName, packageVersion, packageArchitecture) full := content.String() diff --git a/modules/packages/rpm/metadata.go b/modules/packages/rpm/metadata.go index 4af9af620f..503b7b1a24 100644 --- a/modules/packages/rpm/metadata.go +++ b/modules/packages/rpm/metadata.go @@ -232,9 +232,10 @@ func getEntries(h *rpmutils.RpmHeader, namesTag, versionsTag, flagsTag int, repo case "alt": for i := range names { e := &Entry{ + Name: names[i], AltFlags: uint32(flags[i]), + Version: versions[i], } - e.Version = versions[i] entries = append(entries, e) } } diff --git a/modules/setting/security.go b/modules/setting/security.go index c38d8dae79..1f38857af6 100644 --- a/modules/setting/security.go +++ b/modules/setting/security.go @@ -35,6 +35,7 @@ var ( PasswordHashAlgo string PasswordCheckPwn bool SuccessfulTokensCacheSize int + DisableQueryAuthToken bool CSRFCookieName = "_csrf" CSRFCookieHTTPOnly = true ) @@ -159,4 +160,14 @@ func loadSecurityFrom(rootCfg ConfigProvider) { PasswordComplexity = append(PasswordComplexity, name) } } + + sectionHasDisableQueryAuthToken := sec.HasKey("DISABLE_QUERY_AUTH_TOKEN") + + // TODO: default value should be true in future releases + DisableQueryAuthToken = sec.Key("DISABLE_QUERY_AUTH_TOKEN").MustBool(false) + + // warn if the setting is set to false explicitly + if sectionHasDisableQueryAuthToken && !DisableQueryAuthToken { + log.Warn("Enabling Query API Auth tokens is not recommended. DISABLE_QUERY_AUTH_TOKEN will be removed in Forgejo v13.0.0.") + } } diff --git a/modules/setting/server.go b/modules/setting/server.go index bff51f787d..3ff91d2cde 100644 --- a/modules/setting/server.go +++ b/modules/setting/server.go @@ -16,6 +16,8 @@ import ( "forgejo.org/modules/json" "forgejo.org/modules/log" "forgejo.org/modules/util" + + "github.com/caddyserver/certmagic" ) // Scheme describes protocol types @@ -206,7 +208,7 @@ func loadServerFrom(rootCfg ConfigProvider) { EnableAcme = sec.Key("ENABLE_LETSENCRYPT").MustBool(false) } if EnableAcme { - AcmeURL = sec.Key("ACME_URL").MustString("") + AcmeURL = sec.Key("ACME_URL").MustString(certmagic.LetsEncryptProductionCA) AcmeCARoot = sec.Key("ACME_CA_ROOT").MustString("") if sec.HasKey("ACME_ACCEPTTOS") { diff --git a/modules/storage/minio.go b/modules/storage/minio.go index bf51a1642a..8d4f9d6627 100644 --- a/modules/storage/minio.go +++ b/modules/storage/minio.go @@ -76,8 +76,13 @@ var getBucketVersioning = func(ctx context.Context, minioClient *minio.Client, b return err } +var initializationTimeout = 30 * time.Second + // NewMinioStorage returns a minio storage func NewMinioStorage(ctx context.Context, cfg *setting.Storage) (ObjectStorage, error) { + initCtx, cancel := context.WithTimeout(ctx, initializationTimeout) + defer cancel() + config := cfg.MinioConfig if config.ChecksumAlgorithm != "" && config.ChecksumAlgorithm != "default" && config.ChecksumAlgorithm != "md5" { return nil, fmt.Errorf("invalid minio checksum algorithm: %s", config.ChecksumAlgorithm) @@ -112,7 +117,7 @@ func NewMinioStorage(ctx context.Context, cfg *setting.Storage) (ObjectStorage, // Otherwise even if the request itself fails (403, 404, etc), the code should still continue because the parameters seem "good" enough. // Keep in mind that GetBucketVersioning requires "owner" to really succeed, so it can't be used to check the existence. // Not using "BucketExists (HeadBucket)" because it doesn't include detailed failure reasons. - err = getBucketVersioning(ctx, minioClient, config.Bucket) + err = getBucketVersioning(initCtx, minioClient, config.Bucket) if err != nil { errResp, ok := err.(minio.ErrorResponse) if !ok { @@ -125,13 +130,13 @@ func NewMinioStorage(ctx context.Context, cfg *setting.Storage) (ObjectStorage, } // Check to see if we already own this bucket - exists, err := minioClient.BucketExists(ctx, config.Bucket) + exists, err := minioClient.BucketExists(initCtx, config.Bucket) if err != nil { return nil, convertMinioErr(err) } if !exists { - if err := minioClient.MakeBucket(ctx, config.Bucket, minio.MakeBucketOptions{ + if err := minioClient.MakeBucket(initCtx, config.Bucket, minio.MakeBucketOptions{ Region: config.Location, }); err != nil { return nil, convertMinioErr(err) diff --git a/modules/storage/minio_test.go b/modules/storage/minio_test.go index ec1b2fc77a..18fe91edfb 100644 --- a/modules/storage/minio_test.go +++ b/modules/storage/minio_test.go @@ -9,8 +9,10 @@ import ( "net/http/httptest" "os" "testing" + "time" "forgejo.org/modules/setting" + "forgejo.org/modules/test" "github.com/minio/minio-go/v7" "github.com/stretchr/testify/assert" @@ -217,3 +219,41 @@ func TestMinioCredentials(t *testing.T) { }) }) } + +func TestNewMinioStorageInitializationTimeout(t *testing.T) { + defer test.MockVariableValue(&getBucketVersioning, func(ctx context.Context, minioClient *minio.Client, bucket string) error { + select { + case <-ctx.Done(): + return ctx.Err() + case <-time.After(1 * time.Millisecond): + return minio.ErrorResponse{ + StatusCode: http.StatusBadRequest, + Code: "TestError", + Message: "Mocked error for testing", + } + } + })() + + settings := &setting.Storage{ + MinioConfig: setting.MinioStorageConfig{ + Endpoint: "localhost", + AccessKeyID: "123456", + SecretAccessKey: "12345678", + Bucket: "bucket", + Location: "us-east-1", + }, + } + + // Verify that we reach `getBucketVersioning` and return the error from our mock. + storage, err := NewMinioStorage(t.Context(), settings) + require.ErrorContains(t, err, "Mocked error for testing") + assert.Nil(t, storage) + + defer test.MockVariableValue(&initializationTimeout, 1*time.Nanosecond)() + + // Now that the timeout is super low, verify that we get a context deadline exceeded error from our mock. + storage, err = NewMinioStorage(t.Context(), settings) + require.Error(t, err) + require.ErrorIs(t, err, context.DeadlineExceeded, "err must be a context deadline exceeded error, but was %v", err) + assert.Nil(t, storage) +} 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 '...", "~/ ${gitea} `gitea` (gitea) !gitea! \"gitea\" \\gitea\\ 'gitea'", "~/' ${gitea} `gitea` (gitea) !gitea! \"gitea\" \\gitea\\ '\\''gitea'\\'", + }, { + "Inline command", + "some`echo foo`thing", + "\"some\\`echo foo\\`thing\"", + }, { + "Substitution", + `;${HOME}`, + `";\${HOME}"`, + }, { + "ANSI Escape codes (not escaped)", + "\033[31;1;4mHello\033[0m", + "\"\x1b[31;1;4mHello\x1b[0m\"", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := ShellEscape(tt.toEscape); got != tt.want { - t.Errorf("ShellEscape(%q):\nGot: %s\nWanted: %s", tt.toEscape, got, tt.want) - } + assert.Equal(t, tt.want, ShellEscape(tt.toEscape)) }) } } diff --git a/modules/util/string.go b/modules/util/string.go index cf50f591c6..ca3d43ec6e 100644 --- a/modules/util/string.go +++ b/modules/util/string.go @@ -95,3 +95,25 @@ func UnsafeBytesToString(b []byte) string { func UnsafeStringToBytes(s string) []byte { return unsafe.Slice(unsafe.StringData(s), len(s)) } + +// AsciiEqualFold is taken from Golang, but reimplemented here, since the original is not exposed to public +// Taken from: https://cs.opensource.google/go/go/+/refs/tags/go1.24.4:src/net/http/internal/ascii/print.go +func ASCIIEqualFold(s, t string) bool { + if len(s) != len(t) { + return false + } + for i := 0; i < len(s); i++ { + if ASCIILower(s[i]) != ASCIILower(t[i]) { + return false + } + } + return true +} + +// AsciiLower returns the ASCII lowercase version of b. +func ASCIILower(b byte) byte { + if 'A' <= b && b <= 'Z' { + return b + ('a' - 'A') + } + return b +} diff --git a/modules/util/string_test.go b/modules/util/string_test.go index 0a4a8bbcfb..1012ab32a4 100644 --- a/modules/util/string_test.go +++ b/modules/util/string_test.go @@ -45,3 +45,29 @@ func TestToSnakeCase(t *testing.T) { assert.Equal(t, expected, ToSnakeCase(input)) } } + +func TestASCIIEqualFold(t *testing.T) { + cases := map[string]struct { + First string + Second string + Expected bool + }{ + "Empty String": {First: "", Second: "", Expected: true}, + "Single Letter Ident": {First: "h", Second: "h", Expected: true}, + "Single Letter Equal": {First: "h", Second: "H", Expected: true}, + "Single Letter Unequal": {First: "h", Second: "g", Expected: false}, + "Simple Match Ident": {First: "someString", Second: "someString", Expected: true}, + "Simple Match Equal": {First: "someString", Second: "someSTRIng", Expected: true}, + "Simple Match Unequal": {First: "someString", Second: "sameString", Expected: false}, + "Different Length": {First: "abcdef", Second: "abcdefg", Expected: false}, + "Unicode Kelvin": {First: "ghijklm", Second: "GHIJ\u212ALM", Expected: false}, + } + + for name := range cases { + c := cases[name] + t.Run(name, func(t *testing.T) { + Actual := ASCIIEqualFold(c.First, c.Second) + assert.Equal(t, c.Expected, Actual) + }) + } +} diff --git a/modules/validation/email.go b/modules/validation/email.go index 8e1ffc203d..7960a80a1f 100644 --- a/modules/validation/email.go +++ b/modules/validation/email.go @@ -72,16 +72,23 @@ func validateEmailBasic(email string) error { } func validateEmailDomain(email string) error { - if !IsEmailDomainAllowed(email) { + if _, ok := IsEmailDomainAllowed(email); !ok { return ErrEmailInvalid{email} } return nil } -func IsEmailDomainAllowed(email string) bool { - return isEmailDomainAllowedInternal( - email, +func IsEmailDomainAllowed(email string) (validEmail, ok bool) { + // Normalized the address. This strips for example comments which could be + // used to smuggle a different domain + parsedAddress, err := mail.ParseAddress(email) + if err != nil { + return false, false + } + + return true, isEmailDomainAllowedInternal( + parsedAddress.Address, setting.Service.EmailDomainAllowList, setting.Service.EmailDomainBlockList) } diff --git a/modules/validation/email_test.go b/modules/validation/email_test.go index b7ee766ddb..28158cae53 100644 --- a/modules/validation/email_test.go +++ b/modules/validation/email_test.go @@ -67,8 +67,3 @@ func TestEmailAddressValidate(t *testing.T) { }) } } - -func TestEmailDomainAllowList(t *testing.T) { - res := IsEmailDomainAllowed("someuser@localhost.localdomain") - assert.True(t, res) -} diff --git a/options/locale/locale_ar.ini b/options/locale/locale_ar.ini index 15d614e8bc..a0adbef8f8 100644 --- a/options/locale/locale_ar.ini +++ b/options/locale/locale_ar.ini @@ -50,7 +50,7 @@ concept_user_organization = المنظمة link_account = ربط الحساب rerun_all = Ø£Ø¹ÙØ¯ تشغيل جميع الوظائ٠your_profile = المل٠الشخصي -sign_out = سجل الخروج +sign_out = سجّل الخروج settings = الإعدادات locked = مقÙول error = خطأ @@ -87,7 +87,7 @@ add_all = أض٠الكل new_fork = اشتقاق جديد لمستودع new_project_column = عمود جديد add = أض٠-active_stopwatch = تتبع وقت الإنجاز +active_stopwatch = Ù…ØªØªØ¨Ù‘ÙØ¹ وقت النشاط organization = منظمة new_migrate = ترحيل جديد save = Ø§Ø­ÙØ¸ @@ -114,7 +114,7 @@ twofa_scratch = الرمز الاحتياطي للمصادقة بعاملين home = الرئيسية email = عنوان البريد الإلكتروني issues = المسائل -error404 = Ø§Ù„ØµÙØ­Ø© التي تحاول الوصول لها إما لا توجد أو أنت لست مأذون لك بعرضها. +error404 = Ø§Ù„ØµÙØ­Ø© التي تحاول الوصول لها إما غير موجودو أو أنك غير مصرح لك بعرضها. powered_by = مدعوم بواسطة %s retry = أعد المحاولة tracked_time_summary = ملخص للتتبع الزمني ÙˆÙقًا لنتائج تصÙية قائمة المسائل @@ -127,8 +127,8 @@ toggle_menu = تبديل القائمة more_items = عناصر اضاÙية copy_generic = نسخ إلى Ø§Ù„Ø­Ø§ÙØ¸Ø© invalid_data = بيانات غير صالحة: %v -filter.clear = مسح المرشحات -filter = مرشح +filter.clear = مسح عوامل التصÙية +filter = عامل تصÙية filter.is_archived = مؤرش٠filter.is_template = قوالب filter.not_mirror = ليست مرايا @@ -137,7 +137,7 @@ filter.is_mirror = مرايا filter.is_fork = الاشتقاقات filter.not_fork = ليست اشتقاقات filter.not_archived = ليس مؤرش٠-filter.public = علني +filter.public = عام filter.private = خاص new_repo.title = مستودع جديد new_migrate.title = انتقال جديد @@ -145,6 +145,11 @@ new_org.title = منظمة جديدة new_repo.link = مستودع جديد new_migrate.link = انتقال جديد +new_org.link = منظمة جديدة +test = اختبار +copy_path = نسخ المسار +error413 = لقد Ø§Ø³ØªÙ†ÙØ¯Øª حصتك. + [install] db_name = اسم قاعدة البيانات user = اسم المستخدم @@ -170,7 +175,7 @@ reinstall_confirm_check_2 = وقد يلزم إعادة تزامن المستود run_user = شغّل عبر مستخدم err_admin_name_is_invalid = اسم مستخدم المدير غير صالح reinstall_confirm_check_3 = أنت٠تؤكد أنك٠متأكد تماماً من أن Ùورجيو يعمل مع مسار app.ini الصحيح وأنك متأكد من أنه يجب عليك إعادة تثبيته. أنت ØªÙØ¤ÙƒÙ‘د٠بأنّك تÙقرّ بالمخاطر Ø§Ù„Ø³Ø§Ù„ÙØ© الذكر. -repo_path = المسار الجذري للمستودع +repo_path = المسار الجذر للمستودع err_empty_admin_email = عنوان بريد المدير لا يمكن أن يكون ÙØ§Ø±Øº. no_admin_and_disable_registration = لا يمكنك تعطيل التسجيل الذاتي للمستخدمين بدون إنشاء حساب إداري. err_admin_name_pattern_not_allowed = اسم مستخدم المدير غير صالح، هذا الأسم يطابق نمطا محجوز @@ -179,10 +184,10 @@ repo_path_helper = Ø³ØªÙØ­Ùظ كلّ مستودعات Ø¬ÙØª البعيدة Ù general_title = الإعدادات العامة lfs_path_helper = Ø§Ù„Ù…Ù„ÙØ§Øª التي تم تعقبها بواسطة Git LFS Ø³ØªÙØ®Ø²Ù† ÙÙŠ هذا الدليل. اتركه ÙØ§Ø±ØºÙ‹Ø§ لتعطيله. err_empty_db_path = طريق قاعدة بيانات SQLite3 لا يمكن أن يكون ÙØ§Ø±ØºØ§. -lfs_path = مسار جذر Ø¬ÙØª LFS -app_name_helper = يمكنك إدخال اسم شركتك هنا. +lfs_path = مسار جذر Git LFS +app_name_helper = أدخل اسم المثيل هنا. سيظهر هذا الاسم ÙÙŠ كل Ø§Ù„ØµÙØ­Ø§Øª. err_admin_name_is_reserved = اسم مستخدم المدير غير صالح، هذا الأسم محجوز -app_name = عنوان الموقع +app_name = عنوان المثيل log_root_path = مسار السجل log_root_path_helper = ستÙكتب Ù…Ù„ÙØ§Øª السجل ÙÙŠ هذا الدليل. smtp_addr = مضي٠SMTP @@ -190,7 +195,7 @@ smtp_port = Ù…Ù†ÙØ° SMTP mailer_password = كلمة مرور SMTP app_url_helper = العنوان الأساسي لاستنساخ عناوين URL HTTP(S) وإشعارات البريد الإلكتروني. mailer_user = اسم مستخدم SMTP -disable_gravatar.description = عطل Ø¬Ø±Ø§ÙØ§ØªØ§Ø± والجهات الخارجية للصور الرمزية. Ø³ØªÙØ³ØªØ®Ø¯Ù… صورة رمزية مبدئية حتى ÙŠØ±ÙØ¹ المستخدم صورة. +disable_gravatar.description = عطل Gravatar والجهات الخارجية للصور الرمزية. Ø³ØªÙØ³ØªØ®Ø¯Ù… صورة رمزية مبدئية حتى ÙŠØ±ÙØ¹ المستخدم صورة. offline_mode.description = عطل خدمات توصيل المحتوى من الجهات الخارجية، واخدم كل المحتوى محلياً. run_user_helper = اسم مستخدم نظام التشغيل الذي يشغل Ùورجيو. ملاحظة: هذا المستخدم يجب أن يكون له حق الوصول إلى المسار الجذري للمستودع. domain = نطاق الخادم @@ -199,28 +204,28 @@ smtp_from = أرسل البريد الإلكتروني كـ federated_avatar_lookup = ØªÙØ¹ÙŠÙ„ الصور الرمزية الاتحادية optional_title = إعدادات اختيارية domain_helper = نطاق أو عنوان المضي٠لخادمك. -mail_notify = ÙØ¹Ù‘Ù„ التنبيه عبر البريد الإلكتروني -app_url = الرابط الأساس Ù„Ùورجيو +mail_notify = ÙØ¹Ù‘Ù„ التنبيهات عبر البريد الإلكتروني +app_url = الرابط الأساس smtp_from_helper = عنوان البريد الإلكتروني الذي سيستخدمه Ùورجيو. أدخل عنوان بريد إلكتروني عادي أو استخدم صيغة"Name" . ssh_port_helper = رقم Ø§Ù„Ù…Ù†ÙØ° الذي يستمع له خادم SSH. اتركه ÙØ§Ø±ØºØ§Ù‹ لتعطيله. -http_port_helper = Ø§Ù„Ù…Ù†ÙØ° الذي سيستمع إليه خادم الويب Ù„Ùورجيو. -http_port = Ù…Ù†ÙØ° استماع HTTP Ù„Ùورجيو +http_port_helper = Ø§Ù„Ù…Ù†ÙØ° الذي سيستمع إليه خادم ويب Forgejo. +http_port = Ù…Ù†ÙØ° استماع HTTP ssh_port = Ù…Ù†ÙØ° خادم SSH email_title = إعدادات البريد الإلكتروني offline_mode = ÙØ¹Ù„ الوضع المحلي server_service_title = إعدادات الخادم وخدمات الجهات الخارجية register_confirm = الزم تأكيد البريد الإلكتروني للتسجيل -allow_only_external_registration.description = لا يسمح بالتسجيل إلا من خلال الخدمات الخارجية +allow_only_external_registration.description = لن يتمكن المستخدمون من إنشاء حسابات جديدة إلا باستخدام خدمات خارجية مهيأة. disable_registration = عطّل التسجيل الذاتي -federated_avatar_lookup.description = ØªÙØ¹ÙŠÙ„ الصور الرمزية الاتحادية باستخدام Ù„ÙŠØ¨Ø±Ø§ÙØ§ØªØ§Ø±. +federated_avatar_lookup.description = ØªÙØ¹ÙŠÙ„ الصور الرمزية الاتحادية باستخدام Libravatar. openid_signup = ÙØ¹Ù‘Ù„ التسجيل الذاتي عبر OpenID -disable_registration.description = عطل التسجيل الذاتي. المديرون Ùقط سيكونون قادرين على إنشاء حسابات جديدة للمستخدمين. +disable_registration.description = سيتمكن مسؤولو المثيل Ùقط من إنشاء حسابات مستخدمين جديدة. يوصى بشدة بإبقاء التسجيل معطلاً إلا إذا كنت تنوي Ø§Ø³ØªØ¶Ø§ÙØ© مثيل عام للجميع ومستعد للتعامل مع كميات كبيرة من الحسابات غير المرغوب بها. openid_signin = ÙØ¹Ù‘Ù„ تسجيل الدخول عبر OpenID openid_signin.description = ÙØ¹Ù‘Ù„ تسجيل دخول المستخدمين عبر OpenID. enable_captcha = ÙØ¹Ù‘Ù„ كابتشا التسجيل -enable_captcha.description = الزم وجود كابتشا للتسجيل الذاتي للمستخدمين. +enable_captcha.description = مطالبة المستخدمين باجتياز اختبار CAPTCHA من أجل إنشاء حسابات. openid_signup.description = ÙØ¹Ù‘Ù„ التسجيل الذاتي للمستخدمين عبر OpenID. -require_sign_in_view = الزم تسجيل الدخول لعرض Ø§Ù„ØµÙØ­Ø§Øª +require_sign_in_view = يتطلب تسجيل الدخول لعرض محتوى المثيل require_sign_in_view.description = مكّن وصول Ø§Ù„ØµÙØ­Ø§Øª للمستخدمين Ùقط. لن يرى الزائرون سوى ØµÙØ­Ø§Øª التسجيل والتسجيل. admin_setting.description = إنشاء حساب إداري هو اختياري. أول مستخدم Ù…ÙØ³Ø¬Ù„ سيصبح تلقائيا مديرا. admin_password = كلمة المرور @@ -233,7 +238,7 @@ test_git_failed = يتعذر اختبار أمر Ø¬ÙØª: %v confirm_password = أكّد كلمة المرور invalid_admin_setting = إعداد حساب المدير غير صالح: %v invalid_log_root_path = مسار السجل غير صالح: %v -default_enable_timetracking = ÙØ¹Ù‘Ù„ تتبع الوقت مبدئيا +default_enable_timetracking = ÙØ¹Ù‘Ù„ التتبع الزمني Ø§ÙØªØ±Ø§Ø¶ÙŠÙ‹Ø§ env_config_keys_prompt = ستطبق المتغيرات البيئية التالية أيضاً على مل٠الإعدادات: admin_title = إعدادات حساب المدير no_reply_address_helper = النطاق للمستخدمين بعنوان بريد إلكتروني مخÙÙŠ. مثلاً، اسم المستخدم "sarah" سو٠يسجل ÙÙŠ Ø¬ÙØª كـ"sarah@noreply.example.org" لو كان نطاق البريد الإلكتروني الخÙÙŠ مدخل كـ"noreply.example.org". @@ -242,9 +247,9 @@ default_enable_timetracking.description = ÙØ¹Ù„ تتبع الوقت للمست run_user_not_match = مستخدم التشغيل غير مطابق لأسم المستخدم الحالي: %s -> %s invalid_db_setting = إعدادات قاعدة البيانات غير صالحة: %v invalid_db_table = جدول قاعدة البيانات "%s" غير صالح: %v -default_keep_email_private.description = أخÙ٠عناوين البريد الإلكتروني للحسابات الجديدة مبدئيا. +default_keep_email_private.description = قم بتمكين Ø¥Ø®ÙØ§Ø¡ عنوان البريد الإلكتروني للمستخدمين الجدد Ø§ÙØªØ±Ø§Ø¶ÙŠÙ‹Ø§ حتى لا يتم تسريب هذه المعلومات Ùور التسجيل. env_config_keys = إعدادات بيئية -default_allow_create_organization = اسمح بإنشاء المنظمات مبدئيا +default_allow_create_organization = اسمح بإنشاء المنظمات بشكل Ø§ÙØªØ±Ø§Ø¶ÙŠ invalid_app_data_path = مسار بيانات التطبيق غير صالح: %v enable_update_checker_helper = ÙŠÙØ­Øµ لإيجاد اصدارات جديدة عن طريق الإتصال Ø¨Ø³ÙŠØ±ÙØ±Ø§Øª Ùورجيو. invalid_repo_path = المسار الجزري للمستودع غير صالح: %v @@ -252,11 +257,17 @@ internal_token_failed = ÙØ´Ù„ توليد الرمز الداخلي: %v no_reply_address = نطاقات البريد الإلكتروني المخÙية default_keep_email_private = أخÙ٠عناوين البريد الإلكتروني مبدئيا admin_name = اسم مستخدم المدير -default_allow_create_organization.description = اسمح بحسابات المستخدمين الجديدة بإنشاء المنظمات مبدئيا. +default_allow_create_organization.description = السماح للمستخدمين الجدد بإنشاء منتديات المجموعة بشكل Ø§ÙØªØ±Ø§Ø¶ÙŠ. عند تعطيل هذا الخيار، سيتعين على المسؤول منح إذن لإنشاء منتديات المجموعة للمستخدمين الجدد. password_algorithm = خوارزمية تجزئة كلمة المرور invalid_password_algorithm = خوارزمية بصمة كلمة المرور غير صالحة password_algorithm_helper = اختر خوارزمية بصمة كلمة المرور. تختل٠الخوارزميات ÙÙŠ متطلباتها وقوتها. خوارزمية argon2 آمنة لكن تتطلب الكثير من الذاكرة ولذلك قد تكون غير ملائمة للأنظمة الصغيرة. +app_slogan = شعار المثيل +app_slogan_helper = أدخل شعار المثيل الخاص بك هنا. اتركه ÙØ§Ø±ØºØ§Ù‹ لتعطيله. +smtp_from_invalid = عنوان "،بريد الإرسال كـ" غير صالح +allow_only_external_registration = السماح بالتسجيل عبر الخدمات الخارجية Ùقط +config_location_hint = سيتم Ø­ÙØ¸ خيارات التهيئة هذه ÙÙŠ: + [editor] buttons.list.ordered.tooltip = أض٠قائمة مرقمة buttons.bold.tooltip = أض٠نصًا عريضًا @@ -273,9 +284,22 @@ buttons.italic.tooltip = أض٠نصًا مائلًا buttons.link.tooltip = اض٠رابط buttons.disable_monospace_font = عطّل الخط الثابت العرض +buttons.indent.tooltip = تداخل العناصر Ø¨Ù†ÙØ³ المستوى +buttons.unindent.tooltip = ‪عناصر غير متساوية من Ù†ÙØ³ المستوى +buttons.new_table.tooltip = Ø¥Ø¶Ø§ÙØ© جدول +table_modal.header = Ø¥Ø¶Ø§ÙØ© جدول +table_modal.placeholder.header = الترويسة +table_modal.placeholder.content = المحتوى +table_modal.label.rows = الصÙÙˆÙ +table_modal.label.columns = الأعمدة +link_modal.header = Ø¥Ø¶Ø§ÙØ© رابط +link_modal.url = Url +link_modal.description = الوص٠+link_modal.paste_reminder = تلميح: باستخدام عنوان URL ÙÙŠ Ø­Ø§ÙØ¸ØªÙƒØŒ يمكنك اللصق مباشرةً ÙÙŠ المحرر لإنشاء رابط. + [aria] navbar = شريط التنقل -footer.software = عن البرمجية +footer.software = عن هذه البرمجية footer.links = روابط footer = الذيل @@ -288,31 +312,31 @@ blocked_since = محظور منذ %s comment_type_group_milestone = الأهدا٠ui = السمة email_notifications.disable = عطّل إشعارات البريد الإلكتروني -passcode_invalid = رمز الدخول خطأ. حاول مرة أخرى. +passcode_invalid = رمز الدخول خطأ. حاول مجدداً. openid_deletion = أزل عنوان OpenID activate_email = أرسل Ø§Ù„ØªÙØ¹ÙŠÙ„ uploaded_avatar_not_a_image = المل٠المرÙوع ليس صورة. theme_update_error = السمة المختارة غير موجودة. -twofa_disabled = Ø¹ÙØ·Ù‘ÙÙ„ الاستيثاق الثنائي. +twofa_disabled = تم تعطيل المصادقة الثنائية. theme_desc = ستكون هذه السمة المبدئية لك عبر الموقع. new_password = كلمة المرور الجديدة -twofa_disable_desc = تعطيل الاستيثاق الثنائي سيجعل حسابك أقل أمانًا. أتريد الاستمرار؟ -manage_themes = اختر السمة المبدئية -delete_prompt = هذه العملية ستحذ٠حسابك إلى الأبد. لا يمكن التراجع عنها بعد ذلك. -cancel = ألغ -repos_none = ليس لديك أي مستودع. +twofa_disable_desc = تعطيل المصادقة الثنائية سيجعل حسابك أقل أماناً. الاستمرار؟ +manage_themes = الموضوع Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ +delete_prompt = هذه العملية ستحذ٠حسابك إلى الأبد. لا يمكن التراجع عن ذلك. +cancel = إلغاء +repos_none = لا تملك أية مستودع. twofa_desc = لحماية حسابك من سرقة كلمة المرور، يمكنك استخدام هات٠ذكي أو جهاز آخر لاستلام كلمة مرور مؤقتة ذات استخدام واحد ("TOTP"). -email_notifications.submit = اضبط ØªÙØ¶ÙŠÙ„ات البريد الإلكتروني +email_notifications.submit = ضبط ØªÙØ¶ÙŠÙ„ات البريد الإلكتروني update_user_avatar_success = Ø­ÙØ¯Ù‘ÙØ«Øª صورة المستخدم الرمزية. activations_pending = ÙÙŠ انتظار Ø§Ù„ØªÙØ¹ÙŠÙ„ -language = اللغة +language = اللّغة primary = الأساسي update_avatar_success = Ø­ÙØ¯Ù‘ÙØ«Øª صورتك الرمزية. keep_email_private = أخÙ٠عنوان البريد delete_current_avatar = احذ٠الصورة الرمزية الحالية avatar = صورة رمزية email_preference_set_success = Ø­ÙØ¯Ù‘ÙØ«Øª ØªÙØ¶ÙŠÙ„ات البريد الإلكتروني. -scan_this_image = امسح هذه الصورة بتطبيق الاستيثاق الذي تستخدمه: +scan_this_image = امسح هذه الصورة بتطبيق المصادقة الذي تستخدمه: orgs_none = لست عضوًا ÙÙŠ أي منظمة. delete_email = أزله theme_update_success = Ø­ÙØ¯Ù‘ÙØ«Øª السمة. @@ -339,14 +363,14 @@ openid_deletion_success = أزيل عنوان OpenID. add_email_success = أضي٠عنوان البريد الجديد. enable_custom_avatar = استخدم صورة رمزية مخصصة update_avatar = حدّث الصورة الرمزية -twofa_disable = تعطيل الاستيثاق الثنائي +twofa_disable = تعطيل المصادقة الثنائية retype_new_password = تأكيد كلمة المرور الجديدة manage_emails = أدر عناوين البريد الإلكتروني then_enter_passcode = وأدخل رمز الدخول الظاهر ÙÙŠ التطبيق: update_password = حدّث كلمة المرور continue = استمر emails = عناوين البريد الإلكتروني -confirm_delete_account = Ø£ÙƒÙØ¯ الحذ٠+confirm_delete_account = تأكيد الحذ٠change_password_success = Ø­ÙØ¯Ù‘ÙØ«Øª كلمة مرورك. سجّل الدخول بكلمة مرورك الجديدة من الآن ÙØµØ§Ø¹Ø¯Ø§. email_deletion_desc = Ø³ÙŠÙØ²Ø§Ù„ عنوان البريد هذا مع كل المعلومات المرتطبة به من حسابك. لكن ستبقى إيداعات Git المودعة به بلا تغيير. أتريد الاستمرار؟ or_enter_secret = أو أدخل السر: %s @@ -365,14 +389,14 @@ saved_successfully = Ø­ÙØ¯Ù‘ÙØ«Øª إعداداتك بنجاح. update_theme = Ø­Ø¯Ù‘ÙØ« السمة access_token_deletion_confirm_action = احذ٠website = الموقع الإلكتروني -delete_token = احذ٠+delete_token = حذ٠hidden_comment_types.ref_tooltip = التعليقات التي تقول أن هذه المسألة قد أشير إليها ÙÙŠ مسألة أخرى أو إيداع أو غير ذلك… update_language_success = تم تحديث اللغة. privacy = الخصوصية comment_type_group_label = Ø§Ù„ØªØµÙ†ÙŠÙØ§Øª account_link = الحسابات المرتبطة comment_type_group_assignee = المكلÙون -update_language = Ø­Ø¯Ù‘ÙØ« اللغة +update_language = تغيير اللغة organization = المنظمات update_language_not_found = اللغة "%s" غير متاحة. update_profile_success = تم تحديث ملÙÙƒ الشخصي. @@ -390,7 +414,7 @@ account = الحساب uploaded_avatar_is_too_big = حجم المل٠المرÙوع (%d كي‌ب) يتخطى الحجم الأقصى (%d كي‌ب). biography_placeholder = أخبرنا شيئا عن Ù†ÙØ³Ùƒ! (يمكنك استخدام ماركداون) comment_type_group_reference = الإشارات -orgs = إدارة المنظمات +orgs = المنظمات update_profile = Ø­Ø¯Ù‘ÙØ« المل٠الشخصي profile = المل٠الشخصي comment_type_group_dependency = الاعتماديات @@ -400,7 +424,7 @@ can_write_info = كتابة delete = احذ٠الحساب oauth2_application_name = اسم التطبيق key_state_desc = هذا Ø§Ù„Ù…ÙØªØ§Ø­ Ø£Ø³ØªÙØ¹Ù…Ù„ خلال آخر 7 أيام -webauthn_delete_key = أزÙÙ„ Ù…ÙØªØ§Ø­ الأمان +webauthn_delete_key = إزالة Ù…ÙØªØ§Ø­ الأمان valid_forever = صالح للأبد can_read_info = قراءة create_oauth2_application_button = أنشئ تطبيقا @@ -412,16 +436,16 @@ select_permissions = أختر التصاريح added_on = Ù…ÙØ¶Ø§Ù ÙÙŠ %s show_openid = أظهر على المل٠الشخصي hide_openid = أخÙÙŠ من المل٠الشخصي -webauthn_delete_key_desc = إذا أزلت Ù…ÙØªØ§Ø­ الأمان، Ùلن تتمكن من تسجيل الدخول باستخدامه. اكمل؟ +webauthn_delete_key_desc = إذا أزلت Ù…ÙØªØ§Ø­ الأمان، Ùلن تتمكن من تسجيل الدخول باستخدامه. المتابعة؟ permissions_list = التصاريح: webauthn_key_loss_warning = إذا Ùقدت Ù…ÙØ§ØªÙŠØ­ الأمان الخاصة بك، ÙØ³ÙˆÙ تÙقد الوصول إلى حسابك. -hooks.desc = أض٠خطاطي٠ويب ØªÙØ·Ù„Ù‚ لكل مستودعاتك. +hooks.desc = Ø¥Ø¶Ø§ÙØ© خطاطي٠ويب سيتم تشغيلها لـ جميع المستودعات التي تمتلكها. keep_activity_private_popup = يجعل النشاط مرأياً لك وللمديرين Ùقط keep_email_private_popup = سيؤدي هذا إلى Ø¥Ø®ÙØ§Ø¡ عنوان بريدك الإلكتروني من ملÙÙƒ الشخصي، وكذلك عند تقديم طلب سحب أو تحرير مل٠باستخدام واجهة الويب. لن يتم تعديل الالتزامات المدÙوعة. استخدم %s ÙÙŠ الإيداعات لربطها بحسابك. ssh_key_name_used = هناك Ù…ÙØªØ§Ø­ SSH Ø¨Ù†ÙØ³ الاسم موجود Ø¨Ø§Ù„ÙØ¹Ù„ على حسابك. -authorized_oauth2_applications = تطبيقات OAuth2 المأذونة +authorized_oauth2_applications = تطبيقات OAuth2 المأذون لها uid = المعرّ٠الرمزي -manage_openid = إدارة عناوين OpenID +manage_openid = عناوين OpenID webauthn = استيثاق ثنائي (Ù…ÙØ§ØªÙŠØ­ الأمان) comment_type_group_deadline = الموعد النهائي add_key = Ø£Ø¶Ù Ù…ÙØªØ§Ø­ @@ -444,11 +468,11 @@ key_content_gpg_placeholder = يبدأ بـ '-----BEGIN PGP PUBLIC KEY BLOCK---- add_email_confirmation_sent = بريد ØªÙØ¹ÙŠÙ„ جديد تم إرساله إلى "%s". ÙŠÙØ±Ø¬Ù‰ التحقق من البريد الوارد خلال %s لتأكيد عنوان البريد الإلكتروني. ssh_desc = Ù…ÙØ§ØªÙŠØ­ SSH العمومية هذه مرتبطة بحسابك. وتسمح Ø§Ù„Ù…ÙØ§ØªÙŠØ­ الخصوصية المراÙقة بالوصول الكامل إلى مستودعاتك. ويمكن استعمال Ù…ÙØ§ØªÙŠØ­ SSH الموثَّقة لتوثيق إيداعات جت الموقَّعة Ø¨Ù…ÙØ§ØªÙŠØ­ SSH. ssh_gpg_keys = Ù…ÙØ§ØªÙŠØ­ SSH / GPG -authorized_oauth2_applications_description = لقد منحتَ إمكانية الوصول إلى حسابك الشخصي على Ùورجيو لهذه التطبيقات من تطبيقات خارجية. الرجاء إلغاء وصول التطبيقات التي لم تعد بحاجة إليها. +authorized_oauth2_applications_description = لقد منحت حق الوصول إلى حسابك الشخصي ÙÙŠ Forgejo لهذه التطبيقات الخارجية. يرجى إلغاء الوصول للتطبيقات التي لم تعد قيد الاستخدام. ssh_key_been_used = هذا Ø§Ù„Ù…ÙØªØ§Ø­ الـSSH تم Ø¥Ø¶Ø§ÙØªÙ‡ Ø¨Ø§Ù„ÙØ¹Ù„ إلى هذا الخادم. password_change_disabled = المستخدمين غير المحليين لا يمكنهم تغيير كلمة مرورهم عن طريق واجهة ويب Ùورجيو. token_state_desc = هذا الرمز استخدم خلال آخر 7 أيام -delete_key = أزله +delete_key = إزالة ssh_invalid_token_signature = Ù…ÙØªØ§Ø­ SSH المزود، والتوقيع والرمز لا يتطابقوا أو الرمز قديم. ssh_token_help = يمكنك توليد توقيع باستخدام: gpg_key_verify = تحقق @@ -462,10 +486,10 @@ unbind = الغ الربط verify_ssh_key_success = تم التحقق من Ù…ÙØªØ§Ø­ SSH "%s". gpg_token_required = يجب أن تقدم توقيعاً للرمز التالي ssh_key_verified_long = تم التحقق من Ø§Ù„Ù…ÙØªØ§Ø­ مع رمز ويمكن استخدامه للتحقق من الإيداعات المتطابقة مع أي عناوين البريد Ø§Ù„Ù…ÙØ¹Ù„Ø© لهذا المستخدم. -gpg_key_deletion = أزل Ù…ÙØªØ§Ø­ GPG +gpg_key_deletion = إزالة Ù…ÙØªØ§Ø­ GPG gpg_token_help = يمكنك توليد توقيع باستخدام: -ssh_key_deletion = أزل Ù…ÙØªØ§Ø­ SSH -ssh_token = رمز +ssh_key_deletion = إزالة Ù…ÙØªØ§Ø­ SSH +ssh_token = رمز ÙØ±ÙŠØ¯ ssh_disabled = SSH Ù…ÙØ¹Ø·Ù„ gpg_key_verified_long = تم التحقق من Ø§Ù„Ù…ÙØªØ§Ø­ بواسطة رمز ويمكن استخدامه للتحقق من إيداعات متطابقة لعناوين البريد Ø§Ù„Ù…ÙØ¹Ù„Ø© لهذا المستخدم Ø¨Ø§Ù„Ø¥Ø¶Ø§ÙØ© إلى أي هويات متطابقة لهذا Ø§Ù„Ù…ÙØªØ§Ø­. change_username_redirect_prompt = اسم المستخدم القديم سو٠يعاد توجيهه حتى يطالب به شخص آخر. @@ -473,7 +497,7 @@ add_key_success = تم Ø¥Ø¶Ø§ÙØ© Ù…ÙØªØ§Ø­ SSH "%s". key_name = اسم Ø§Ù„Ù…ÙØªØ§Ø­ comment_type_group_time_tracking = تتبع الوقت gpg_invalid_token_signature = Ù…ÙØªØ§Ø­ GPG المزود، والتوقيع والرمز لا يتطابقوا أو الرمز قديم. -ssh_key_verified = Ù…ÙØªØ§Ø­ Ù…ÙØªØ­Ù‚Ù‚ منه +ssh_key_verified = Ù…ÙØªØ§Ø­ تم التحقق منه ssh_key_deletion_success = تم إزالة Ù…ÙØªØ§Ø­ SSH. key_signature_ssh_placeholder = يبدأ بـ'-----BEGIN SSH SIGNATURE-----' gpg_token_code = echo "%s" | gpg -a --default-key %s --detach-sig @@ -487,7 +511,7 @@ gpg_key_deletion_desc = إزالة Ù…ÙØªØ§Ø­ GPG ÙŠÙلغي تحقق الإيد permission_read = القراءة ssh_token_signature = توقيع SSH Ù…ØµÙØ­ ssh_key_deletion_desc = إزالة Ù…ÙØªØ§Ø­ SSH يلغي وصوله إلى حسابك. أكمل؟ -revoke_key = أسحب +revoke_key = سحب gpg_token = رمز gpg_key_matched_identities_long = الهويات المدمجة ÙÙŠ هذا Ø§Ù„Ù…ÙØªØ§Ø­ تطابق عناوين البريد الإلكتروني Ø§Ù„Ù…ÙØ¹Ù„Ø© التالية لهذا المستخدم. ويمكن التحقق من صحة الإيداعات المطابقة لهذه العناوين البريدية مع هذا Ø§Ù„Ù…ÙØªØ§Ø­. key_content = المحتوى @@ -501,7 +525,121 @@ remove_oauth2_application_success = Ø£ÙØ²ÙŠÙ„ التطبيق. update_oauth2_application_success = لقد حدّثت بنجاح تطبيق OAuth2. oauth2_redirect_uris = روابط إعادة التوجيه. نرجو وضع كل رابط ÙÙŠ سطر وحده. remove_account_link = أزل الحساب المربوط -remove_account_link_success = Ø£ÙØ²ÙŠÙ„ الحساب المربوط. +remove_account_link_success = Ø£ÙØ²ÙŠÙ„ الحساب المرتبط. + +quota = كوتا + +storage_overview = نظرة عامة على التخزين +pronouns = الضمائر +pronouns_unspecified = غير محدد +change_username_redirect_prompt.with_cooldown.one = سيصبح اسم المستخدم القديم متاحًا للجميع بعد ÙØªØ±Ø© تباطؤ تبلغ %[1]d يومًا. لا يزال بإمكانك استعادة اسم المستخدم القديم خلال ÙØªØ±Ø© التهدئة. +change_username_redirect_prompt.with_cooldown.few = سيصبح اسم المستخدم القديم متاحًا للجميع بعد ÙØªØ±Ø© تباطؤ تبلغ يومًا. لا يزال بإمكانك استعادة اسم المستخدم القديم خلال ÙØªØ±Ø© التهدئة. +language.title = اللغة Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ© +language.description = سيتم Ø­ÙØ¸ هذه اللغة ÙÙŠ حسابك واستخدامها كلغة Ø§ÙØªØ±Ø§Ø¶ÙŠØ© بعد تسجيل الدخول. +language.localization_project = "ساعدنا ÙÙŠ ترجمة Forgejo إلى لغتك! المزيد من المعلومات. +hints = تلميحات +additional_repo_units_hint = اقتراح ØªÙØ¹ÙŠÙ„ وحدات المستودعات الإضاÙية +additional_repo_units_hint_description = اعرض تلميح "ØªÙØ¹ÙŠÙ„ المزيد" للمستودعات التي لم يتم ØªÙØ¹ÙŠÙ„ جميع الوحدات المتاحة بها. +update_hints = Ø­Ø¯Ù‘ÙØ« التلميحات +update_hints_success = تم تحديث التلميحات. +keep_activity_private.description = سيكون نشاطك العام مرئيًا لك ولمشرÙÙŠ المثيل Ùقط. +change_password = غيّر كلمة المرور +keep_pronouns_private = إظهار الضمائر للمستخدمين الذين تمت مصادقتهم Ùقط +keep_pronouns_private.description = سيؤدي ذلك إلى Ø¥Ø®ÙØ§Ø¡ ضمائرك عن الزوار الذين لم يقوموا بتسجيل الدخول. +manage_ssh_principals = إدارة مدراء شهادات SSH الرئيسية +principal_desc = هذه الهÙويات الرئيسية لشهادات SSH مرتبطة بحسابك وتتيح وصولاً كاملاً إلى مستودعاتك. +ssh_helper = هل تحتاج مساعدة؟ اطلع على الدليل لـ إنشاء Ù…ÙØ§ØªÙŠØ­ SSH الخاصة بك أو لحل المشكلات الشائعة التي قد تواجهها عند استخدام SSH. +gpg_helper = تحتاج لمساعدة؟ اطّلع على الدليل حول GPG. +add_new_principal = Ø¥Ø¶Ø§ÙØ© هوية رئيسية +ssh_principal_been_used = تمت Ø¥Ø¶Ø§ÙØ© هذه الهوية الرئيسية إلى الخادم مسبقاً. +gpg_key_matched_identities = الهويات المتطابقة: +subkeys = Ø§Ù„Ù…ÙØ§ØªÙŠØ­ Ø§Ù„ÙØ±Ø¹ÙŠØ© +add_principal_success = تمت Ø¥Ø¶Ø§ÙØ© الهوية الرئيسية لشهادة "SSH "%s. +ssh_principal_deletion = إزالة الهوية الرئيسية لشهادة SSH +ssh_principal_deletion_desc = إزالة هوية رئيسية لشهادة SSH ستسحب صلاحية وصولها إلى حسابك. تريد المتابعة؟ +ssh_principal_deletion_success = تم إزالة الهوية. +no_activity = لا يوجد نشاط حديث +principal_state_desc = استخدمت هذه الهوية ÙÙŠ آخر 7 أيام +ssh_signonly = SSH معطّل حاليًا، لذا ØªÙØ³ØªØ®Ø¯Ù… هذه Ø§Ù„Ù…ÙØ§ØªÙŠØ­ Ùقط للتحقق من توقيع الإيداع. +ssh_externally_managed = يتم إدارة Ù…ÙØªØ§Ø­ SSH هذا خارجيًا لهذا المستخدم +manage_access_token = رموز الوصول Ø§Ù„ÙØ±ÙŠØ¯Ø© +generate_new_token = توليد رمز جديد +tokens_desc = تمنح هذه الرموز Ø§Ù„ÙØ±ÙŠØ¯Ø© إمكانية الوصول إلى حسابك باستخدام واجهة برمجة تطبيقات Forgejo. +token_name = اسم الرمز Ø§Ù„ÙØ±ÙŠØ¯ +generate_token = توليد رمز ÙØ±ÙŠØ¯ +generate_token_success = تم إنشاء الرمز Ø§Ù„ÙØ±ÙŠØ¯ الجديد الخاص بك. انسخه الآن لأنه لن يظهر مرة أخرى. +generate_token_name_duplicate = اسم التطبيق %s Ù…ÙØ³ØªØ®Ø¯Ù… مسبقًا. ÙŠÙØ±Ø¬Ù‰ استخدام اسم جديد. +access_token_deletion = حذ٠رمز الوصول Ø§Ù„ÙØ±ÙŠØ¯ +access_token_deletion_desc = حذ٠الرمز Ø§Ù„ÙØ±ÙŠØ¯ سيسحب صلاحية الوصول إلى حسابك من التطبيقات التي تستخدمه. لا يمكن التراجع عن هذا الإجراء. تريد المتابعة؟ +delete_token_success = تم حذ٠الرمز Ø§Ù„ÙØ±ÙŠØ¯. لم يعد بإمكان التطبيقات التي تستخدمه الوصول إلى حسابك. +regenerate_token = إعادة التوليد +access_token_regeneration = إعادة توليد رمز وصول ÙØ±ÙŠØ¯ +access_token_regeneration_desc = سيؤدي إعادة إنشاء رمز ÙØ±ÙŠØ¯ إلى إبطال الوصول إلى حسابك للتطبيقات التي تستخدمه. لا يمكن التراجع عن ذلك. المتابعة؟ +regenerate_token_success = تم إعادة إنشاء الرمز الغريد. لم يعد بإمكان التطبيقات التي تستخدمه الوصول إلى حسابك ويجب تحديثها بالرمز الجديد. +repo_and_org_access = الوصول إلى المستودع والمنظمة +permission_no_access = لا وصول +permission_write = قراءة وكتابة +access_token_desc = تقتصر صلاحيات الرمز المحددة على مسارات واجهة البرمجة (API) المقابلة Ùقط. اطلع على الوثائق لمزيد من المعلومات. +at_least_one_permission = يجب عليك تحديد صلاحية واحدة على الأقل لإنشاء رمز ÙØ±ÙŠØ¯ +oauth2_applications_desc = تمكّن تطبيقات OAuth2 تطبيقات الطر٠الثالث من مصادقة المستخدمين بأمان ÙÙŠ مثيل Forgejo هذا. +remove_oauth2_application_desc = ستؤدي إزالة تطبيق OAuth2 إلى إبطال الوصول إلى جميع رموز الوصول Ø§Ù„ÙØ±ÙŠØ¯Ø© الموقعة. المتابعة؟ +oauth2_confidential_client = العميل السري. حدد للتطبيقات التي ØªØ­Ø§ÙØ¸ على السرية، مثل تطبيقات الويب. لا تحدد للتطبيقات الأصلية بما ÙÙŠ ذلك تطبيقات سطح المكتب وتطبيقات الأجهزة المحمولة. +oauth2_client_id = معر٠العميل +oauth2_client_secret = سر العميل +oauth2_regenerate_secret = تجديد السر +oauth2_regenerate_secret_hint = Ùقدت سرك؟ +oauth2_client_secret_hint = لن يظهر السر مرة أخرى بعد مغادرة هذه Ø§Ù„ØµÙØ­Ø© أو تحديثها. يرجى التأكد من أنك قمت Ø¨Ø­ÙØ¸Ù‡. +oauth2_application_create_description = ‪تمنح تطبيقات OAuth2 تطبيقات الطر٠الثالث حق الوصول إلى حسابات المستخدمين على هذا المثيل. +oauth2_application_remove_description = ستؤدي إزالة تطبيق OAuth2 إلى منعه من الوصول إلى حسابات المستخدمين المصرح لهم على هذا المثيل. المتابعة؟ +oauth2_application_locked = يقوم Forgejo بالتسجيل المسبق لبعض تطبيقات OAuth2 عند بدء التشغيل إذا تم تمكينها ÙÙŠ التكوين. لمنع السلوك غير المتوقع، لا يمكن تحريرها أو إزالتها. يرجى الرجوع إلى وثائق OAuth2 لمزيد من المعلومات. +revoke_oauth2_grant = سحب صلاحية الوصول +revoke_oauth2_grant_description = سيؤدي إبطال الوصول لهذا التطبيق التابع لجهة خارجية إلى منع هذا التطبيق من الوصول إلى بياناتك. أنت متأكد؟ +revoke_oauth2_grant_success = تم سحب صلاحية الوصول بنجاح. +twofa_recovery_tip = إذا Ùقدت جهازك، ستتمكن من استخدام Ù…ÙØªØ§Ø­ الاسترداد للاستخدام مرة واحدة لاستعادة الوصول إلى حسابك. +twofa_is_enrolled = حسابك مسجّل حاليًا ÙÙŠ المصادقة الثنائية. +twofa_not_enrolled = حسابك غير مسجّل حالياً ÙÙŠ المصادقة الثنائية. +twofa_scratch_token_regenerate = إعادة إنشاء Ù…ÙØªØ§Ø­ الاسترداد للاستخدام مرة واحدة +twofa_scratch_token_regenerated = Ù…ÙØªØ§Ø­ الاسترداد للاستخدام مرة واحدة هو %s الآن. قم بتخزينه ÙÙŠ مكان آمن، Ùلن يتم عرضه مجدداً. +twofa_enroll = التسجيل ÙÙŠ المصادقة الثنائية +regenerate_scratch_token_desc = إذا Ùقدت Ù…ÙØªØ§Ø­ الاسترداد الخاص بك ÙÙŠ غير محله أو استخدمته Ø¨Ø§Ù„ÙØ¹Ù„ لتسجيل الدخول، يمكنك إعادة تعيينه هنا. +twofa_enrolled = تم تسجيل حسابك بنجاح. قم بتخزين Ù…ÙØªØ§Ø­ الاسترداد للاستخدام لمرة واحدة (%s) ÙÙŠ مكان آمن، Ùلن يتم عرضه مجدداً. +twofa_failed_get_secret = Ø¥Ø®ÙØ§Ù‚ ÙÙŠ الحصول على سر. +webauthn_desc = Ù…ÙØ§ØªÙŠØ­ الأمان هي أجهزة ÙØ¹Ù„ية تحوي على Ù…ÙØ§ØªÙŠØ­ تشÙير. يمكن استخدامها للتحقق بخطوتين. يجب أن تدعم Ù…ÙØ§ØªÙŠØ­ الأمان معيار WebAuthn Authenticator. +webauthn_register_key = Ø¥Ø¶Ø§ÙØ© Ù…ÙØªØ§Ø­ تشÙير +webauthn_nickname = الاسم المستعار +webauthn_alternative_tip = قد ترغب ÙÙŠ تكوين أسلوب مصادقة إضاÙÙŠ. +manage_account_links = الحسابات المرتبطة +manage_account_links_desc = هذه الحسابات الخارجية مرتبطة بحسابك ÙÙŠ Forgejo. +remove_account_link_desc = ستؤدي إزالة حساب مرتبط إلى إلغاء وصوله إلى حساب Forgejo الخاص بك. المتابعة؟ +delete_with_all_comments = حسابك أصغر من %s. لتجنب التعليقات الوهمية، سيتم حذ٠جميع تعليقات المشكلة/المسؤولية الشخصية معها. +delete_account_desc = هل أنت متأكد من رغبتك ÙÙŠ حذ٠حساب المستخدم هذا نهائيًا؟ +email_notifications.onmention = البريد الإلكتروني Ùقط عند الإشارة +email_notifications.andyourown = والإشعارات الخاصة بك +visibility = رؤية المستخدم +visibility.public = عام +visibility.public_tooltip = مرئي للجميع +visibility.limited = محدود +visibility.limited_tooltip = مرئية Ùقط للمستخدمين الذين قاموا بتسجيل الدخول +visibility.private = خاص +visibility.private_tooltip = مرئي Ùقط لأعضاء المؤسسات التي انضممت إليها +user_block_yourself = لا يمكنك حظر Ù†ÙØ³Ùƒ. +quota.applies_to_user = تنطبق قواعد الحصص التالية على حسابك +quota.rule.exceeded = تم تجاوزه +quota.rule.exceeded.helper = لقد تجاوز الحجم الإجمالي للكائنات لهذه القاعدة الحصة النسبية. +quota.rule.no_limit = غير محدود +quota.sizes.all = الكل +quota.sizes.repos.all = المستودعات +quota.sizes.repos.public = مستودعات عامة +quota.sizes.repos.private = مستودعات خاصة +quota.sizes.git.all = محتوى Git +quota.sizes.git.lfs = Git LFS +quota.sizes.assets.all = الأصول +quota.sizes.assets.attachments.all = المرÙقات +quota.sizes.assets.attachments.issues = إصدار المرÙقات +quota.sizes.assets.attachments.releases = تحرير المرÙقات +quota.sizes.assets.artifacts = التح٠الÙنية +quota.sizes.assets.packages.all = الحزم +quota.sizes.wiki = الموسوعة [org] follow_blocked_user = لا يمكنك إتباع هذه المنظمة لأن هذه المنظمة حظرتك. @@ -610,7 +748,7 @@ pulls.blocked_by_user = لا يمكنك أن ترسل طلب سحب ÙÙŠ هذا migrate.migrating_milestones = ترحيل الأهدا٠migrate_items_milestones = أهدا٠repo_size = حجم المستودع -object_format = صيغة الكائنات +object_format = تنسيق الكائنات use_template = استخدم هذا القالب migrate_items_merge_requests = طلبات الدمج repo_name = اسم المستودع @@ -618,11 +756,11 @@ template = القالب projects.modify = عدّل المشروع tree_path_not_found_commit = المسار %[1]s غير موجود ÙÙŠ الإيداع %[2]s repo_lang = اللغة -fork_repo = اشتق المستودع +fork_repo = اشتقاق المستودع fork_no_valid_owners = لا يمكن اشتقاق هذا المستودع لعدم وجود مالك صالح. license = الترخيص fork_branch = Ø§Ù„ÙØ±Ø¹ الذي Ø³ÙŠÙØ³ØªÙ†Ø³Ø® إلى الاشتقاق -template_helper = اجعل المستودع قالبا +template_helper = اجعل المستودع قالباً owner = المالك projects.deletion_success = تم حذ٠المشروع. projects.deletion = احذ٠المشروع @@ -632,14 +770,14 @@ projects.edit = عدّل المشروع template.avatar = الصورة الرمزية migrate_items_wiki = الموسوعة repo_desc = الوص٠-template_select = اختر قالبا. +template_select = اختر قالبا repo_name_helper = الأسماء الحسنة للمستودعات تستخدم كلمات Ù…ÙØªØ§Ø­ÙŠØ© قصيرة وسهلة التذكر ÙˆÙØ±ÙŠØ¯Ø©. -default_branch = Ø§Ù„ÙØ±Ø¹ المبدئي +default_branch = Ø§Ù„ÙØ±Ø¹ Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ all_branches = كل Ø§Ù„ÙØ±ÙˆØ¹ -migrate_items_issues = المسائل +migrate_items_issues = البلاغات projects.deletion_desc = حذ٠مشروع يحذ٠كل المسائل المرتبطة به. أتريد الاستمرار؟ -repo_desc_helper = أدخل ÙˆØµÙØ§ قصيرا (اختياريا) -create_repo = أنشئ مستودعا +repo_desc_helper = أدخل ÙˆØµÙØ§Ù‹ قصيراً (اختياري) +create_repo = إنشاء مستودع migrate_items_releases = الإصدارات already_forked = لقد اشتققت %s Ø¨Ø§Ù„ÙØ¹Ù„ license_helper = اختر مل٠ترخيص. @@ -660,7 +798,7 @@ issues.remove_milestone_at = `أزال هذه المسألة من الهد٠issues.filter_assginee_no_assignee = بلا مكل٠issues.new.no_milestone = بلا هد٠issues.new.projects = المشروعات -delete_preexisting_label = احذ٠+delete_preexisting_label = حذ٠issues.context.edit = عدّل branch.rename = غيّر اسم Ø§Ù„ÙØ±Ø¹ "%s" issue_labels = ØªØµÙ†ÙŠÙØ§Øª المسائل @@ -756,7 +894,7 @@ milestones.deletion_desc = حذ٠هد٠يحذÙÙ‡ من كل المسائل ا issues.desc = نظّم إبلاغات العلل، والمهام، والأهداÙ. issues.choose.ignore_invalid_templates = Ø£ÙهمÙلت القوالب Ø§Ù„ØªØ§Ù„ÙØ© branch.renamed = غÙيّر اسم Ø§Ù„ÙØ±Ø¹ %s إلى %s. -delete_preexisting = Ø§Ø­Ø°Ù Ø§Ù„Ù…Ù„ÙØ§Øª الموجودة سابقا +delete_preexisting = Ø­Ø°Ù Ø§Ù„Ù…Ù„ÙØ§Øª الموجودة مسبقاً branch.included_desc = هذا Ø§Ù„ÙØ±Ø¹ جزء من Ø§Ù„ÙØ±Ø¹ المبدئي trust_model_helper_collaborator_committer = مشترك+مودع: ثق بتوقيعات المشتركين التي تطابق المودع issues.reopened_at = `أعاد ÙØªØ­ هذه المسألة %s` @@ -830,7 +968,7 @@ issues.reopen_comment_issue = علّق وأعد ÙØªØ­Ù‡Ø§ issues.dependency.add = أض٠اعتمادية… issues.label_deletion_desc = حذ٠تصني٠يحذÙÙ‡ من كل المسائل، أتريد الاستمرار؟ labels = Ø§Ù„ØªØµÙ†ÙŠÙØ§Øª -delete_preexisting_content = Ø§Ø­Ø°Ù Ø§Ù„Ù…Ù„ÙØ§Øª ÙÙŠ %s +delete_preexisting_content = Ø­Ø°Ù Ø§Ù„Ù…Ù„ÙØ§Øª ÙÙŠ %s milestones.deletion = احذ٠الهد٠issues.comment_pull_merged_at = دمج الإيداع %[1]s إلى %[2]s %[3]s issues.new.closed_milestone = الأهدا٠التامة @@ -872,7 +1010,7 @@ issues.dependency.issue_no_dependencies = بلا اعتمادية. issues.filter_sort.mostcomment = الأكثر تعليقات issues.label.filter_sort.reverse_by_size = الأكبر حجما release.message = صÙ٠هذا الإصدار -editor.cancel_lower = ألغ٠+editor.cancel_lower = إلغاء issues.label.filter_sort.reverse_alphabetically = أبجديا معكوسا trust_model_helper = اختر نموذج الثقة للتحقق من التوقيعات. الخيارات المتاحة هي: issues.unlock_error = لا يمكن ÙÙƒ Ù‚ÙÙ„ مسألة غير مقÙلة. @@ -906,7 +1044,7 @@ issues.label_archive = أرش٠التصني٠issues.choose.blank_about = أنشئ مسألة من القالب المبدئي. issues.filter_poster = منشئ release.delete_release = احذ٠الإصدار -editor.cancel = ألغ٠+editor.cancel = إلغاء issues.change_title_at = `غيّر العنوان من %s إلى %s %s` branch.new_branch_from = أنشئ ÙØ±Ø¹Ù‹Ø§ جديدًا من "%s" issues.due_date_form_edit = "عدّل" @@ -918,7 +1056,7 @@ issues.filter_assignee = مكل٠issues.open_title = حالية download_file = نزّل المل٠issues.attachment.download = `انقر لتنزيل "%s"` -download_archive = نزّل المستودع +download_archive = تنزيل المستودع download_tar = نزّل TAR.GZ download_zip = نزّل ZIP releases.desc = تتبع إصدارات المشروع وتنزيلاته. @@ -931,15 +1069,15 @@ projects.desc = أدر المسائل وطلبات الدمج ÙÙŠ لوحات Ù… ambiguous_runes_header = `يحتوي هذا المل٠على محار٠يونيكود غامضة` executable_file = مل٠تنÙيذي settings.webhook.response = الاستجابة -editor.delete = احذ٠%s -file_view_raw = أظهر المجرد +editor.delete = حذ٠%s +file_view_raw = أظهر الخام settings.add_webhook = أض٠خطا٠ويب settings.slack_channel = قناة commits = إيداعات commit = إيداع -editor.upload_file = Ø§Ø±ÙØ¹ Ù…Ù„ÙØ§ +editor.upload_file = Ø±ÙØ¹ مل٠settings.webhook.headers = الترويسات -org_labels_desc_manage = أدرها +org_labels_desc_manage = إدارة editor.patch = طبّق الرقعة editor.must_have_write_access = يجب أن يكون لديك إمكانية الكتابة حتى تعدّل هذا المل٠أو تقترح تعديلات. template.webhooks = خطاطي٠الويب @@ -963,12 +1101,12 @@ settings.webhook.payload = المحتوى invisible_runes_header = `يحتوي هذا المل٠على محار٠يونيكود غير مرئية` editor.filename_help = أض٠مجلدا بكتابة اسمه ثم شرطة مائلة ('/'). احذ٠مجلدا بضغط زر Backspace أول شيء ÙÙŠ خانة الاسم. editor.commit_changes = أودع التعديلات -editor.add_file = Ø£Ø¶Ù Ù…Ù„ÙØ§ +editor.add_file = Ø¥Ø¶Ø§ÙØ© مل٠settings.githook_name = اسم الخطا٠editor.fork_before_edit = يجب أن تشتق هذا المستودع حتى تعدّل هذا المل٠أو تقترح تعديلات. projects.description_placeholder = الوص٠tag = وسم -file_raw = مجرد +file_raw = خام projects.create = أنشئ مشروعا settings.update_webhook = حدّث خطا٠الويب editor.push_rejected_no_message = لقد Ø±ÙØ¶ الخادوم التعديل بغير رسالة. نرجو مراجعة خطاطي٠جت. @@ -987,7 +1125,7 @@ editor.no_changes_to_show = لا توجد تعديلات لعرضها. settings.webhook.test_delivery = اختبار التوصيل commit_graph.hide_pr_refs = أخÙ٠طلبات الدمج editor.new_file = مل٠جديد -file_view_source = أظهر المصدر +file_view_source = عرض المصدر settings.webhook_deletion_success = أزيل خطا٠الويب. projects.title = العنوان settings.slack_domain = النطاق @@ -1016,11 +1154,11 @@ settings.add_hook_success = أضي٠خطا٠الويب. commit.revert-header = إرجاع: %s editor.file_already_exists = يوجد ÙØ¹Ù„ا ÙÙŠ هذا المستودع مل٠باسم "%s". settings.web_hook_name_matrix = متركس -editor.filename_cannot_be_empty = لا يمكن ترك اسم Ø§Ù„Ù…Ù„Ù ÙØ§Ø±ØºØ§. +editor.filename_cannot_be_empty = لا يمكن ترك اسم Ø§Ù„Ù…Ù„Ù ÙØ§Ø±ØºØ§Ù‹. editor.add_tmpl = أض٠'<%s>' editor.new_branch_name_desc = اسم Ø§Ù„ÙØ±Ø¹ الجديد… release = إصدار -editor.delete_this_file = احذ٠المل٠+editor.delete_this_file = حذ٠المل٠editor.or = أو editor.push_rejected_summary = رسالة Ø§Ù„Ø±ÙØ¶ الكاملة: settings.webhook_deletion = أزل خطا٠الويب @@ -1328,6 +1466,210 @@ pulls.merge_conflict = تعذر الدمج: حدث نزاع خلال الدمج. pulls.rebase_conflict = تعذر الدمج: حدث نزاع خلال إعادة تأسيس الإيداع: %[1]s. مساعدة: جرب طريقة أخرى pulls.has_merged = ÙØ´Ù„: لقد تم دمج هذا الطلب، Ùلا يمكنك دمجه مجددا أو تغيير Ø§Ù„ÙØ±Ø¹ الهدÙ. +new_repo_helper = يحتوي المستودع على جميع Ù…Ù„ÙØ§Øª المشروع، بما ÙÙŠ ذلك سجل التعديلات. هل تستضي٠واحدًا Ø¨Ø§Ù„ÙØ¹Ù„ على منصة أخرى؟ نقل المستودع. +new_from_template = استخدم قالباً +new_from_template_description = يمكنك تحديد قالب مستودع موجود على هذا المثيل وتطبيق إعداداته. +new_advanced = إعدادات مقتدمة +new_advanced_expand = انقر للتوسعة +owner_helper = قد لا تظهر بعض منتديات المجموعة ÙÙŠ القائمة المنسدلة بسبب الحد الأقصى لعدد المستودعات. +size_format = %[1]s: %[2]s, %[3]s: %[4]s +visibility = الرؤية +visibility_description = Ùقط المالك أو أعضاء المؤسسة إذا كان لديهم حقوق، سيتمكنون من رؤيته. +visibility_fork_helper = (سيؤثر تغيير ذلك على رؤية جميع المشتقات.) +clone_helper = تحتاج مساعدة ÙÙŠ الاستنساخ؟ Ø²ÙØ± المساعدة. +fork_from = اشتق من +fork_visibility_helper = لا يمكن تغيير ظهور المستودع المشتّق. +open_with_editor = Ø§ÙØªØ­ بـ %s +generate_repo = توليد لمستودع +generate_from = التوليد من +repo_gitignore_helper = حدد قوالب .gitignore +repo_gitignore_helper_desc = اختر Ø§Ù„Ù…Ù„ÙØ§Øª التي لا تريد تتبعها من قائمة القوالب الخاصة باللغات الشائعة. يتم تضمين القطع الأثرية النموذجية التي تم إنشاؤها بواسطة أدوات البناء الخاصة بكل لغة ÙÙŠ .gitignore بشكل Ø§ÙØªØ±Ø§Ø¶ÙŠ. +license_helper_desc = تحدد الرخصة ما يمكن للآخرين ÙØ¹Ù„Ù‡ أو عدم ÙØ¹Ù„Ù‡ Ø¨Ø´ÙŠÙØ±Ø© برمجيتك. لست متأكدًا من الرخصة المناسبة لمشروعك؟ طالع اختيار الرخصة. +readme = README +readme_helper = حدد قالب مل٠README +readme_helper_desc = هذا هو المكان الذي يمكنك Ùيه كتابة وص٠كامل لمشروعك. +auto_init = تهيئة المستودع +auto_init_description = ابدأ سجل Git بمل٠READMEØŒ مع إمكانية Ø¥Ø¶Ø§ÙØ© Ù…Ù„ÙØ§Øª الرخصة Ùˆ.gitignore اختيارياً. +default_branch_label = Ø§ÙØªØ±Ø§Ø¶ÙŠ +default_branch_helper = Ø§Ù„ÙØ±Ø¹ Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ Ù‡Ùˆ Ø§Ù„ÙØ±Ø¹ الأساسي لطلبات السحب ،وعمليات إلإيداع. +mirror_prune = تنقية +mirror_prune_desc = إزالة مراجع التتبع عن Ø¨ÙØ¹Ø¯ القديمة +mirror_interval = Ø§Ù„ÙØ§ØµÙ„ الزمني للمرآة (وحدات الوقت الصحيحة هي 'h' ØŒ'm' ØŒ's'). 0 لتعطيل المزامنة الدورية. (الحد الأدنى: %s) +mirror_interval_invalid = Ø§Ù„ÙØ§ØµÙ„ الزمني للمرآة غير صالح. +mirror_public_key = Ù…ÙØªØ§Ø­ SSH عام +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 = استنساخ عبر URL +mirror_address_desc = ضع أي بيانات اعتماد مطلوبة ÙÙŠ قسم المصادقة. +mirror_address_protocol_invalid = عنوان URL المقدم غير صالح. يمكن استخدام مواقع http(s):// أو git:// Ùقط للنسخ المتطابق. +mirror_lfs = تخزين Ø§Ù„Ù…Ù„ÙØ§Øª الكبيرة (LFS) +mirror_lfs_desc = تنشيط النسخ المتطابق لبيانات LFS. +mirror_lfs_endpoint = نقطة نهاية LFS +mirror_lfs_endpoint_desc = ستحاول المزامنة استخدام عنوان url المستنسخ إلى تحديد خادم LFS. يمكنك أيضًا تحديد نقطة نهاية مخصصة إذا كانت بيانات LFS المستودع مخزنة ÙÙŠ مكان آخر. +mirror_last_synced = آخر مزامنة +mirror_password_placeholder = (لم يتم تعديله) +mirror_password_blank_placeholder = (بلا تعيين) +mirror_password_help = تغيير اسم المستخدم لمسح كلمة المرور المخزنة. +watchers = المراقبون +stargazers = Ø§Ù„Ù…Ù…ÙŠÙ‘ÙØ²ÙˆÙ† بنجمة +stars_remove_warning = سيؤدي ذلك إلى إزالة جميع النجوم من هذا المستودع. +stars = النجوم +reactions_more = Ùˆ %d أكثر +language_other = Ø£ÙØ®Ø±Ù‰ +adopt_search = أدخل اسم المستخدم للبحث عن مستودعات غير معتمدة... (اتركه ÙØ§Ø±ØºØ§Ù‹ للعثور على الكل) +adopt_preexisting_label = اعتماد Ø§Ù„Ù…Ù„ÙØ§Øª +adopt_preexisting = اعتماد Ø§Ù„Ù…Ù„ÙØ§Øª الموجودة مسبقاً +adopt_preexisting_content = إنشاء مستودع من %s +adopt_preexisting_success = Ø§Ù„Ù…Ù„ÙØ§Øª المعتمدة والمستودع الذي تم إنشاؤه من %s +delete_preexisting_success = Ø§Ù„Ù…Ù„ÙØ§Øª Ø§Ù„Ù…Ø­Ø°ÙˆÙØ© غير المعتمدة ÙÙŠ %s +blame_prior = عرض النّقد قبل هذا التغيير +blame.ignore_revs = جاري تجاهل المراجعات ÙÙŠ .git-blame-ignore-revs. انقر هنا لتجاوز وعرض واجهة blame العادية. +blame.ignore_revs.failed = ÙØ´Ù„ تجاهل المراجعات ÙÙŠ .git-blame-ignore-revs. +author_search_tooltip = عرض كحد أقصى 30 مستخدمًا +summary_card_alt = بطاقة ملخص المستودع %s +transfer.accept = قبول النقل +transfer.accept_desc = النقل إلى â€%s“ +transfer.reject = Ø±ÙØ¶ النقل +transfer.reject_desc = إلغاء النقل إلى â€%s“ +transfer.no_permission_to_accept = لا تملك الصلاحية لقبول هذا النقل. +transfer.no_permission_to_reject = لا تملك الصلاحية Ù„Ø±ÙØ¶ هذا النقل. +desc.private = خاص +desc.public = عام +desc.template = قالب +desc.internal = داخلي +desc.archived = مؤرش٠+template.items = عناصر القالب +template.git_content = محتوى Git (Ø§Ù„ÙØ±Ø¹ Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ) +template.git_hooks_tooltip = يتعذر عليك حاليًا تعديل أو إزالة Ø®Ø·Ø§ÙØ§Øª Git بمجرد Ø¥Ø¶Ø§ÙØªÙ‡Ø§. حدد هذا Ùقط إذا كنت تثق بمستودع القالب. +template.topics = المواضيع +template.issue_labels = وسوم الإبلاغات +template.one_item = يجب على الأقل تحديد عنصر قالب واحد +template.invalid = يجب تحديد مستودع القوالب +archive.title = تمت Ø£Ø±Ø´ÙØ© هذا المستودع. يمكنك عرض Ø§Ù„Ù…Ù„ÙØ§Øª واستنساخه، لكن لا يمكنك إجراء أي تغييرات على حالته، مثل Ø¯ÙØ¹ وإنشاء بلاغات أو طلبات سحب أو تعليقات جديدة. +archive.title_date = تمت Ø£Ø±Ø´ÙØ© هذا المستودع على %s. يمكنك عرض Ø§Ù„Ù…Ù„ÙØ§Øª واستنساخه، لكن لا يمكنك إجراء أي تغييرات على حالته، مثل Ø¯ÙØ¹ وإنشاء بلاغات أو طلبات سحب أو تعليقات جديدة. +archive.nocomment = التعليق غير ممكن لأن المستودع تمت Ø£Ø±Ø´ÙØªÙ‡. +archive.pull.noreview = هذا المستودع مؤرشÙ. لا يمكنك مراجعة طلبات السحب. +sync_fork.branch_behind_one = هذا Ø§Ù„ÙØ±Ø¹ هو %[1]d إيداع خل٠%[2]s +sync_fork.branch_behind_few = هذا Ø§Ù„ÙØ±Ø¹ هو %[1]d إيداعات خل٠%[2]s +sync_fork.button = مزامنة +form.reach_limit_of_creation_1 = لقد وصل المالك Ø¨Ø§Ù„ÙØ¹Ù„ إلى الحد الأقصى للمستودع %d. +form.reach_limit_of_creation_n = لقد وصل المالك Ø¨Ø§Ù„ÙØ¹Ù„ إلى الحد الأقصى للمستودعات %d. +form.name_reserved = تم حجز اسم المستودع â€%s“. +form.name_pattern_not_allowed = النمط â€%s“ غير مسموح به ÙÙŠ اسم المستودع. +form.string_too_long = السلسلة المحددة أطول من d Ø­Ø±ÙØ§Ù‹. +need_auth = المصادقة +migrate_options = خيارات الترحيل +migrate_options_mirror_helper = سيكون هذا المستودع مرآة +migrate_options_lfs = ترحيل Ù…Ù„ÙØ§Øª LFS +migrate_options_lfs_endpoint.label = نقطة نهاية LFS +migrate_options_lfs_endpoint.description = سيحاول الترحيل استخدام مسار Git البعيد (remote) لـ تحديد خادم LFS. يمكنك أيضًا تحديد نقطة نهاية مخصصة إذا كانت بيانات LFS للمستودع مخزنة ÙÙŠ مكان آخر. +migrate_options_lfs_endpoint.description.local = يتم دعم مسار الخادم المحلي أيضاً. +migrate_options_lfs_endpoint.placeholder = إذا ØªÙØ±ÙƒØª ÙØ§Ø±ØºØ©ØŒ سيتم اشتقاق نقطة النهاية من عنوان URL المستنسخ +migrate_items = عناصر الترحيل +migrate_repo = ترحيل المستودع +migrate.repo_desc_helper = اتركه ÙØ§Ø±ØºØ§Ù‹ لاستيراد الوص٠الموجود +migrate.clone_address = ترحيل / استنساخ من عنوان URL +migrate.clone_address_desc = رابط HTTP(S) أو Git لاستنساخ مستودع موجود +migrate.clone_local_path = أو مسار خادم محلي +migrate.permission_denied = لا ÙŠÙØ³Ù…Ø­ لك باستيراد المستودعات المحلية. +migrate.permission_denied_blocked = لا يمكنك الاستيراد من مضيÙين غير مسموح بهم، ÙŠÙØ±Ø¬Ù‰ الطلب من المسؤول التحقق من إعدادات ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS. +migrate.invalid_local_path = المسار المحلي غير صالح. Ùهو غير موجود أو ليس مجلداً. +migrate.invalid_lfs_endpoint = نقطة نهاية LFS غير صالحة. +migrate.failed = أخÙÙ‚ الترحيل: %v +migrate.migrate_items_options = رمز الوصول Ø§Ù„ÙØ±ÙŠØ¯ مطلوب لترحيل العناصر الإضاÙية +migrated_from = تم الترحيل من %[2]s +migrated_from_fake =تم الترحيل من %[1]s +migrate.migrate = الترحيل من %s +migrate.migrating = الترحيل من %s … +migrate.migrating_failed = ÙØ´Ù„ الترحيل من %s. +migrate.migrating_failed.error = أخÙÙ‚ الترحيل: %s +migrate.migrating_failed_no_addr = أخÙÙ‚ الترحيل. +migrate.github.description = ترحيل البيانات من github.com أو خادم GitHub Enterprise. +migrate.git.description = ترحيل مستودع Ùقط من أي خدمة Git. +migrate.gitlab.description = ترحيل البيانات من gitlab.com أو مثيلات GitLab الأخرى. +migrate.gitea.description = ترحيل البيانات من gitea.com أو مثيلات Gitea الأخرى. +migrate.gogs.description = ترحيل البيانات من notabug.org أو مثيلات Gogs الأخرى. +migrate.onedev.description = ترحيل البيانات من code.onedev.io أو مثيلات OneDev الأخرى. +migrate.codebase.description = ترحيل البيانات من codebasehq.com. +migrate.gitbucket.description = ترحيل البيانات من مثيلات GitBucket. +migrate.migrating_git = ترحيل بيانات Git +migrate.migrating_topics = ترحيل المواضيع +migrate.migrating_labels = ترحيل الوسوم +migrate.migrating_releases = ترحيل الإصدارات +migrate.migrating_issues = ترحيل البلاغات +migrate.migrating_pulls = ترحيل طلبات السحب +migrate.cancel_migrating_title = إلغاء الترحيل +migrate.cancel_migrating_confirm = تريد إلغاء عملية الترحيل هذه؟ +mirror_from = مرآة لـ +forked_from = مشتقّ من +generated_from = تم توليده من +fork_from_self = لا يمكنك اشتقاق مستودع تملكه. +fork_guest_user = سجّل الدخول لاشتقاق هذا المستودع. +watch_guest_user = سجّل الدخول لمشاهدة هذا المستودع. +star_guest_user = قم بتسجيل الدخول لإعطاء نجمة لهذا المستودع. +subscribe.issue.guest.tooltip = سجّل الدخول للاشتراك ÙÙŠ هذا البلاغ. +subscribe.pull.guest.tooltip = سجّل الدخول للاشتراك ÙÙŠ طلب السحب هذا. +watch = شاهد +unwatch = إلغاء المشاهدة +star = نجمة +unstar = إزالة النجمة +fork = اشتقاق +more_operations = المزيد من العمليات +no_desc = لا يوجد وص٠+quick_guide = دليل سريع +clone_this_repo = استنسخ هذا المستودع +cite_this_repo = الاستشهاد بهذا المستودع +create_new_repo_command = إنشاء مستودع جديد على موجّه الأوامر +push_exist_repo = Ø¯ÙØ¹ مستودع موجود من موجّه الأوامر +empty_message = لا يحتوي هذا المستودع على أي محتوى. +broken_message = لا يمكن قراءة بيانات Git التي يستند إليها هذا المستودع. اتصل بمسؤول هذا المثيل أو احذ٠هذا المستودع. +code = الكود +code.desc = الوصول إلى Ø§Ù„Ø´ÙŠÙØ±Ø© المصدرية ÙˆØ§Ù„Ù…Ù„ÙØ§Øª والالتزامات ÙˆØ§Ù„ÙØ±ÙˆØ¹. +branch = ÙØ±Ø¹ +tree = شجرة + +clear_ref = 'مسح المرجع الحالي' +filter_branch_and_tag = تصÙية Ø§Ù„ÙØ±Ø¹ أو العلامة +find_tag = البحث عن علامة +project = المشارييع +n_commit_one = %s إيداع +n_commit_few = %s إيداعات +n_branch_one = %s ÙØ±Ø¹ +n_branch_few = %s ÙØ±ÙˆØ¹ +n_tag_one = %s علامة +n_tag_few = ‪%s علامات +n_release_one = %s إصدار +n_release_few = %s إصدارات +file.title = %s عند %s +file_follow = متابعة الروابط الرمزية +file_view_rendered = عرض Ø§Ù„Ù…ÙØ®Ø±Ø¬ النهائي +view_git_blame = عرض مسؤول تعديل git +stored_lfs = مخزن مع Git LFS +symbolic_link = رابط رمزي +vendored = مضمن +commit_graph = الرسم البياني للإيداع +commit.contained_in = هذا الإيداع موجود ÙÙŠ: +commit.contained_in_default_branch = هذا الإيداع جزء من Ø§Ù„ÙØ±Ø¹ Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ +normal_view = عرض عادي +line = سطر +lines = أسطر +from_comment = (تعليق) +no_eol.text = لا EOL +no_eol.tooltip = هذا المل٠لا يحتوي على نهاية لخط الشخصية. +editor.edit_file = عدّل المل٠+editor.cannot_edit_lfs_files = لا يمكن تحرير Ù…Ù„ÙØ§Øª LFS ÙÙŠ واجهة الويب. +editor.edit_this_file = عدل المل٠+editor.this_file_locked = المل٠مقÙÙ„ +editor.file_delete_success = تم حذ٠المل٠"%s". +editor.name_your_file = اسم ملÙك… +editor.add_tmpl.filename = اسم المل٠+editor.signoff_desc = أض٠مقطورة موقّعة من Ù‚ÙØ¨Ù„ Ø§Ù„Ù…ÙØ¬Ø±Ù‘د ÙÙŠ نهاية رسالة سجل الدخول. +editor.propose_file_change = اقتراح تغيير المل٠+editor.new_branch_name = تسمية Ø§Ù„ÙØ±Ø¹ الجديد لهذا الإيداع + [mail] admin.new_user.text = من ÙØ¶Ù„Ùƒ اضغط هنا لإدارة هذا المستخدم من لوحة الإدارة. admin.new_user.subject = مستخدم جديد: %s سجل حالاً @@ -1386,6 +1728,22 @@ issue.action.ready_for_review = @%[1]s علّم هذا الطلب للس issue_assigned.pull = @%[1]s عيّنك إلى طلب سحب %[2]s ÙÙŠ مستودع %[3]s. issue.action.review_dismissed = @%[1]s أستبعد آخر مراجعة من %[2]s لهذا الطلب للسحب. +password_change.subject = تم تغيير كلمة مرورك +password_change.text_1 = تم تغيير كلمة مرور حسابك للتو. +primary_mail_change.subject = تم تغيير البريد الأساسي الخاص بك +primary_mail_change.text_1 = تم تغيير البريد الإلكتروني الأساسي لحسابك إلى %[1]s. هذا يعني أن عنوان البريد الإلكتروني هذا لن يتلقى إشعارات البريد لحسابك بعد الآن. +totp_disabled.subject = تم تعطيل TOTP +totp_disabled.text_1 = تم تعطيل كلمة المرور لمرة واحدة المستندة إلى الوقت (TOTP) على حسابك للتو. +totp_disabled.no_2fa = لم تعد هناك طرق Ø£ÙØ®Ø±Ù‰ للمصادقة الثنائية (2FA) قيد التهيئة عد الآن ØŒ أي أنه لم يعد من الضروري تسجيل الدخول إلى حسابك باستخدام المصادقة الثنائية (2FA). +removed_security_key.subject = تمت إزالة Ù…ÙØªØ§Ø­ الأمان +removed_security_key.text_1 = تم إزالة Ù…ÙØªØ§Ø­ الأمان â€%[1] s“ للتو من حسابك. +removed_security_key.no_2fa = لم تعد هناك طرق أخرى للمصادقة الثنائية (2FA) قيد التهيئة بعد الآن، أي لم يعد من الضروري تسجيل الدخول إلى حسابك باستخدام المصادقة الثنائية (2FA). +account_security_caution.text_1 = إذا كان هذا أنت، Ùيمكنك تجاهل هذا البريد بأمان. +account_security_caution.text_2 = إذا لم تكن أنت، Ùهذا يعني أن حسابك مخترق. يرجى الاتصال بمسؤولي هذا الموقع. +totp_enrolled.subject = لقد قمت بتشيط TOTP كطريقة 2FA +totp_enrolled.text_1.no_webauthn = لقد قمت للتو بتمكين TOTP لحسابك. هذا يعني أنه بالنسبة لجميع عمليات تسجيل الدخول المستقبلية إلى حسابك، يجب عليك استخدام TOTP كطريقة للمصادقة الثنائية. +totp_enrolled.text_1.has_webauthn = لقد قمت للتو بتمكين TOTP لحسابك. هذا يعني أنه بالنسبة لجميع عمليات تسجيل الدخول المستقبلية إلى حسابك، يمكنك استخدام TOTP كطريقة للمصادقة الثنائية ØŒ أو استخدام أي من Ù…ÙØ§ØªÙŠØ­ الأمان الخاصة بك. + [error] not_found = تعذر العثور على الهدÙ. report_message = إن كنت متيقّÙنًا أن هذه علة ÙÙŠ Ùورجيو، رجاءً ابحث ÙÙŠ كودبيرج أو Ø§ÙØªØ­ مسأله جديدة إذا لزم الأمر. @@ -1420,7 +1778,7 @@ joined_on = انضم ÙÙŠ %s user_bio = السيرة الذاتية repositories = المستودعات activity = النشاط العام -projects = مشاريع +projects = المشاريع unfollow = إلغ٠المتابعة settings = إعدادات المستخدم following_few = %d يتابع @@ -1428,7 +1786,7 @@ follow = تابع followers_few = %d متابعين form.name_reserved = اسم المستخدم "%s" محجوز. email_visibility.limited = عنوان بريدك الإلكتروني ظاهر لكل المستخدمين Ø§Ù„Ù…ÙØ³ØªÙŽÙˆØ«ÙŽÙ‚ين -code = البرمجية +code = الكود overview = نظرة عامة watched = المستودعات المشاهدة disabled_public_activity = هذا المستخدم عطّل الظهور العام للنشاط. @@ -1438,6 +1796,18 @@ starred = المستودعات المميّزة بنجمة form.name_chars_not_allowed = اسم المستخدم "%s" يحتوي على رموز غير صالحة. form.name_pattern_not_allowed = النمط "s%" غير مسموح به ÙÙŠ إسم المستخدم. +followers.title.one = Ù…ØªØ§Ø¨ÙØ¹ +followers.title.few = متابعين +following.title.one = متابعة +following.title.few = متابعة +followers_one = %d Ù…ØªØ§Ø¨ÙØ¹ +following_one = %d ÙŠÙØªØ§Ø¨Ø¹ +public_activity.visibility_hint.self_public = نشاطك مرئي للجميع، باستثناء Ø§Ù„ØªÙØ§Ø¹Ù„ات ÙÙŠ المساحات الخاصة. اضبط الإعدادات. +public_activity.visibility_hint.admin_public = هذا النشاط مرئي للجميع، ولكن Ø¨ØµÙØªÙƒ مسؤولاً يمكنك أيضًا رؤية Ø§Ù„ØªÙØ§Ø¹Ù„ات ÙÙŠ المساحات الخاصة. +public_activity.visibility_hint.self_private = نشاطك مرئي لك ÙˆÙ„Ø³ÙØ¹Ø§Ø© المثيل Ùقط. تعديل الإعدادات. +public_activity.visibility_hint.admin_private = هذا النشاط مرئي لك لأنك مسؤول، ولكن المستخدم يريد أن يظل خاصاً. +public_activity.visibility_hint.self_private_profile = نشاطك مرئي لك ÙˆÙ„Ø³ÙØ¹Ø§Ø© المثيل Ùقط لأن ملÙÙƒ الشخصي خاص. تعديل الإعدادات. + [auth] change_unconfirmed_email_error = تعذر تغيير البريد الإلكتروني: %v change_unconfirmed_email_summary = تغيير البريد الإلكتروني الذي ÙŠÙØ±Ø³Ù„ Ø§Ù„ØªÙØ¹ÙŠÙ„ له. @@ -1457,11 +1827,11 @@ active_your_account = ÙØ¹Ù‘Ù„ حسابك register_helper_msg = هل لديك حساب Ø¨Ø§Ù„ÙØ¹Ù„ØŸ سجل الدخول! manual_activation_only = تواصل مع مدير موقعك لإكمال Ø§Ù„ØªÙØ¹ÙŠÙ„. must_change_password = حدّث كلمة المرور الخاصة بك -send_reset_mail = أرسل رسالة استعادة حساب +send_reset_mail = أرسل بريد الاستعادة resend_mail = اضغط هنا لإعادة إرسالة رسالة ØªÙØ¹ÙŠÙ„ حسابك has_unconfirmed_mail = أهلا يا %sØŒ لديك عنوان بريد إلكتروني غير مؤكَّد (%s). إن لم تستلم رسالة تأكيد أو تريد إرسال واحدة جديدة، Ùنرجو الضغط على الزر الذي بالأسÙÙ„. email_not_associate = عنوان البريد هذا غير مرتبط بأي حساب. -reset_password = استعادة حساب +reset_password = استعادة الحساب oauth_signin_tab = أربط بحساب موجود invalid_password = كلمة المرور الخاصة بك لا تطابق كلمة المرور التي استخدمت لتسجيل الحساب. oauth_signin_title = سجّل الدخول لتأذن للحساب المربوط @@ -1482,13 +1852,13 @@ reset_password_wrong_user = أنت Ù…ÙØ³Ø¬Ù„ كـ %sØŒ لكن رابط أعاد openid_connect_title = اتصل بحساب موجود confirmation_mail_sent_prompt = تم إرسال بريد تأكيد جديد إلى %s. يرجى التأكد من صندوق بريدك ÙÙŠ خلال %s حتى تكتمل عملية التسجيل. إذا كان عنوان البريد خاطئ، يمكنك تسجيل الدخول وطلب بريد تأكيد جديد ÙŠÙØ±Ø³Ù„ إلى عنوان آخر. scratch_code = رمز الخدش -invalid_code_forgot_password = رمز تأكيدك غير صحيح أو انتهى اضغط هنا للإعادة. +invalid_code_forgot_password = رمز تأكيدك غير صحيح أو انتهت صلاحيته. اضغط هنا للإعادة. openid_register_title = أنشئ حسابًا جديدًا verify = تحقق twofa_scratch_used = لقد استخدمت رمز الخدش الخاص بك. لقد تم إعادة توجيهك إلى إعدادات المصادقة الثنائية حتى يمكنك إزالة تسجيل جهازك أو توليد رمز خدش جديد. oauth_signup_submit = أكمل الحساب oauth.signin.error = كان هناك خطأ ÙÙŠ تجهيز طلب الإذن إذا استمر هذا الخطأ، يرجى الاتصال بالمدير. -invalid_code = رمز تأكيدك غير صحيح أو انتهى. +invalid_code = رمز تأكيدك غير صحيح أو انتهت صلاحيته. oauth_signup_title = أكمل حساب جديد resent_limit_prompt = لقد طلبت Ø¨Ø§Ù„ÙØ¹Ù„ بريداً إلكترونياً Ù„Ù„ØªÙØ¹ÙŠÙ„ مؤخراً من ÙØ¶Ù„Ùƒ انتظر 3 دقائق وحاول مرة أخرى. reset_password_mail_sent_prompt = تم إرسال بريد تأكيد جديد إلى %s. يرجى التأكد من صندوق بريدك ÙÙŠ خلال %s حتى تكتمل عملية استعادة الحساب. @@ -1513,6 +1883,14 @@ remember_me = تذكر هذا الجهاز remember_me.compromised = رمز Ø§Ù„Ø§Ø­ØªÙØ§Ø¸ بتسجيل الدخول لم يعد صالحا، مما قد يعني اختراق الحساب. نرجو مراجعة حسابك لرؤية أي نشاط غير مألوÙ. authorization_failed_desc = ÙØ´Ù„ التÙويض لأننا اكتشÙنا طلبًا غير صالح. يرجى الاتصال بمشر٠التطبيق الذي حاولت ترخيصه. +hint_login = لديك حساب Ø¨Ø§Ù„ÙØ¹Ù„ØŸ سجّل الدخول الآن! +hint_register = يلزمك حساب ØŸ سجّÙÙ„ الآن. +sign_up_button = سجّÙÙ„ الآن. +unauthorized_credentials = بيانات الاعتماد غير صحيحة أو انتهت صلاحيتها. أعد محاولة تنÙيذ الأمر أو راجع %s لمزيد من المعلومات +use_onetime_code = استخدم رمزًا لمرة واحدة +back_to_sign_in = العودة إلى تسجيل الدخول +sign_in_openid = المتابعة باستخدام OpenID + [packages] rpm.repository.multiple_groups = هذه الحزمة Ù…ØªÙˆÙØ±Ø© ÙÙŠ مجموعات متعددة. rpm.repository.architectures = بنيات @@ -1556,6 +1934,10 @@ number_of_contributions_in_the_last_12_months = %s مساهم ÙÙŠ آخر 12 Ø´ contributions_zero = بلا مساهمات more = أكثر +contributions_format = {contributions} مساهمة ÙÙŠ {day} {month} {year} +contributions_one = المساهمة +contributions_few = المساهمات + [admin] self_check.database_fix_mysql = لمستخدمين ميسكول/ماريا دي بي، يمكنك استخدام أمر "forgejo doctor convert" لإصلاح مشاكل التجمّع، أو يمكنك أيضاً إصلاح المشكلة عن طريق تعديل السيكول يدوياً. self_check.database_collation_mismatch = توقع قاعدة البيانات لتستعمل تجميع: %s @@ -1706,7 +2088,7 @@ enterred_invalid_org_name = اسم المنظمة التي أدخلته خطأ. lang_select_error = اختر لغة من القائمة. alpha_dash_error = ` لا يجب أن يحتوي إلا على الحرو٠الإنجليزية والأرقام والشرطة ("-") والشرطة السÙلية ("_").` alpha_dash_dot_error = ` لا يجب أن يحتوي إلا على الحرو٠الإنجليزية والأرقام والشرطة ("-") والشرطة السÙلية ("_") والنقطة (".").` -repo_name_been_taken = اسم المستودع مستعمل Ø¨Ø§Ù„ÙØ¹Ù„. +repo_name_been_taken = اسم المستودع مستخدم Ø¨Ø§Ù„ÙØ¹Ù„. Email = البريد الإلكتروني auth_failed = ÙØ´Ù„ الاستيثاق: %v email_error = ` ليس عنوان بريد إلكتروني صالح.` @@ -1726,10 +2108,10 @@ still_has_org = "حسابك عضو ÙÙŠ منظمة أو أكثر؛ غادرهم repository_files_already_exist.adopt_or_delete = Ø§Ù„Ù…Ù„ÙØ§Øª موجودة Ø¨Ø§Ù„ÙØ¹Ù„ لهذا المستودع. إما اعتمادها أو حذÙها. repository_files_already_exist.delete = Ø§Ù„Ù…Ù„ÙØ§Øª موجودة Ø¨Ø§Ù„ÙØ¹Ù„ لهذا المستودع. يجب عليك حذÙها. repository_files_already_exist.adopt = Ø§Ù„Ù…Ù„ÙØ§Øª موجودة Ø¨Ø§Ù„ÙØ¹Ù„ لهذا المستودع ويمكن اعتمادها Ùقط. -repository_files_already_exist = Ø§Ù„Ù…Ù„ÙØ§Øª موجودة Ø¨Ø§Ù„ÙØ¹Ù„ لهذا المستودع. تواصل مع مدير النظام. +repository_files_already_exist = Ø§Ù„Ù…Ù„ÙØ§Øª موجودة Ø¨Ø§Ù„ÙØ¹Ù„ لهذا المستودع. اتصل بمدير النظام. TeamName = اسم Ø§Ù„ÙØ±ÙŠÙ‚ username_has_not_been_changed = لم يتم تغيير اسم المستخدم -username_change_not_local_user = المستخدمين غير المحليين غير مسموح لهم بتغيير أسماؤهم. +username_change_not_local_user = المستخدمين غير المحليين غير مسموح لهم بتغيير أسمائهم. captcha_incorrect = الكابتشا خاطئة. AdminEmail = عنوان البريد الإلكتروني للمدير team_no_units_error = اسمح بالوصول إلى قسم واحد على الأقل ÙÙŠ المستودعات. @@ -1757,6 +2139,24 @@ CommitChoice = إختيار الإداع regex_pattern_error = ` نمط التعبير النمطي غير صالح: %s.` username_error = ` ÙŠÙمكنه أن يحتوي على حرو٠إنجليزية وأرقام وشرطة ("-") وشرطة سÙلية ("_") Ùˆ نقطة (".") Ùقط. ويمكنه ان يبدأ وينتهي بحر٠او برقم.` +FullName = الاسم الكامل +Description = الوص٠+Pronouns = الضمائر +Biography = النبذة +Website = موقع الويب +Location = الموقع +To = اسم Ø§Ù„ÙØ±Ø¹ +AccessToken = رمز الوصول +invalid_group_team_map_error = ` التعيين غير صالح: %s ` +username_claiming_cooldown = لا يمكن المطالبة باسم المستخدم، لأن ÙØªØ±Ø© تباطؤه لم تنته٠بعد. يمكن المطالبة به عند %[1]s. +repository_force_private = وضع الخاص الإجباري Ù…ÙØ¹Ù‘Ù„: لا يمكن تحويل المستودعات الخاصة إلى عامة. +visit_rate_limit = تناولت الزيارة عن Ø¨ÙØ¹Ø¯ الحد من معدلها. +email_domain_is_not_allowed = نطاق البريد الإلكتروني للمستخدم %s يتعارض مع قائمة النطاقات المسموحة ØŒ أو الممنوعة. يرجى التأكد من إدخال عنوان البريد الإلكتروني بشكل صحيح. +unset_password = المستخدم المسجل لم يقم بتعيين كلمة مرور. +unsupported_login_type = نوع تسجيل الدخول غير مدعوم لحذ٠الحساب. +invalid_ssh_principal = أصل غير صالح: %s +required_prefix = Ø§Ù„Ù…ÙØ¯Ø®Ù„ يجب أن يبدأ مع "%s" + [home] filter = تصÙيات أخرى show_archived = مؤرش٠@@ -1803,6 +2203,11 @@ relevant_repositories_tooltip = تم Ø£Ø®ÙØ§Ø¡ المستودعات التي Ù‡ relevant_repositories = يتم اظهار المستودعات المتعلقة Ùقط. أظهر النتائج غير Ø§Ù„Ù…ØµÙØ§Ø©. code_last_indexed_at = ÙÙهرس آخر مرة %s +stars_one = %d نجمة +stars_few = %d نجوم +forks_one = %d نسخة +forks_few = %d Ù†ÙØ³ÙŽØ® + [actions] variables.none = لا توجد متغيرات بعد. variables.deletion = أزل المتغير @@ -1973,21 +2378,30 @@ component_failed_to_load = حدث خطأ غير متوقع. [search] -org_kind = بحث ÙÙŠ المنظمات... +org_kind = بحث ÙÙŠ المنظمات… code_search_unavailable = البحث ÙÙŠ الكود غير Ù…ØªÙˆÙØ± حاليًا. يرجى الاتصال بمدير الموقع. -search = ابحث... +search = البحث… type_tooltip = نوع البحث fuzzy = أجعد fuzzy_tooltip = قم بتضمين النتائج التي تتطابق أيضًا مع مصطلح البحث بشكل وثيق match = تتناسب match_tooltip = قم بتضمين النتائج التي تطابق مصطلح البحث المحدد Ùقط -repo_kind = بحث ÙÙŠ المستودعات... -user_kind = بحث عن المستخدمين... -team_kind = بحث عن Ø§Ù„ÙØ±Ù‚ ... -code_kind = بحث ÙÙŠ الكود... -project_kind = البحث ضمن المشاريع... -branch_kind = البحث ضمن Ø§Ù„ÙØ±ÙˆØ¹... +repo_kind = بحث ÙÙŠ المستودعات… +user_kind = بحث عن المستخدمين… +team_kind = بحث عن Ø§Ù„ÙØ±Ù‚… +code_kind = بحث ضمن الكود… +project_kind = البحث ضمن المشاريع… +branch_kind = البحث ضمن Ø§Ù„ÙØ±ÙˆØ¹â€¦ no_results = لا توجد نتائج مطابقة. -issue_kind = البحث ضمن الأعطال... -pull_kind = البحث ضمن طلبات السحب... +issue_kind = البحث ضمن الأعطال… +pull_kind = البحث ضمن طلبات السحب… keyword_search_unavailable = البحث من خلال الكلمات Ø§Ù„Ù…ÙØªØ§Ø­ÙŠØ© ليس Ù…ØªÙˆÙØ± حالياً. رجاءاً تواصل مع مشر٠الموقع. +union = مطابقة عامة +union_tooltip = عرض النتائج التي تطابق أي من الكلمات Ø§Ù„Ù…ÙØªØ§Ø­ÙŠØ© Ø§Ù„Ù…ÙØµÙˆÙ„Ø© Ø¨Ù…Ø³Ø§ÙØ§Øª +exact = مطابق +exact_tooltip = عرض النتائج التي تطابق مصطلح البحث بالضبط Ùقط +regexp = RegExp +regexp_tooltip = تعامل مع عبارة البحث على أنها تعبير نمطي +package_kind = البحث ضمن الحزم… +commit_kind = البحث ضمن الإيداعات… +runner_kind = البحث ضمن المشغّÙلات… diff --git a/options/locale/locale_be.ini b/options/locale/locale_be.ini index fe04dadc3e..25aff3019c 100644 --- a/options/locale/locale_be.ini +++ b/options/locale/locale_be.ini @@ -7,10 +7,20 @@ sign_in = УвайÑці sign_in_or = або sign_out = ВыйÑці sign_up = ЗарÑгіÑтравацца -link_account = ЗвÑзаць Уліковы Ð·Ð°Ð¿Ñ–Ñ +link_account = ЗвÑзаць уліковы Ð·Ð°Ð¿Ñ–Ñ register = РÑгіÑÑ‚Ñ€Ð°Ñ†Ñ‹Ñ version = ВерÑÑ–Ñ powered_by = Працуе на â„…s page = Старонка home = Ð“Ð°Ð»Ð¾ÑžÐ½Ð°Ñ Ð¡Ñ‚Ð°Ñ€Ð¾Ð½ÐºÐ° -sign_in_with_provider = УвайÑці з %s \ No newline at end of file +sign_in_with_provider = УвайÑці з %s +template = Шаблон +language = Мова +notifications = ÐпавÑшчÑнні +create_new = Стварыць… +user_profile_and_more = Профіль Ñ– налады… +signed_in_as = Увайшоў Ñк +enable_javascript = ГÑты вÑб-Ñайт патрабуе JavaScript. +toc = ЗмеÑÑ‚ +licenses = ЛіцÑнзіі +return_to_forgejo = Ð’Ñрнуцца да Forgejo \ No newline at end of file diff --git a/options/locale/locale_bg.ini b/options/locale/locale_bg.ini index 1b9767f674..35e33f4430 100644 --- a/options/locale/locale_bg.ini +++ b/options/locale/locale_bg.ini @@ -142,6 +142,8 @@ webauthn_error = ÐеуÑпешно прочитане на Ð²Ð°ÑˆÐ¸Ñ ÐºÐ»ÑŽÑ‡ webauthn_unsupported_browser = ВашиÑÑ‚ браузър в момента не поддържа WebAuthn. webauthn_error_duplicated = Ключът за ÑигурноÑÑ‚ не е разрешен за тази заÑвка. МолÑ, уверете Ñе, че ключът не е вече региÑтриран. +tracked_time_summary = Обобщение на проÑледеното време въз оÑнова на филтрите в ÑпиÑъка ÑÑŠÑ Ð·Ð°Ð´Ð°Ñ‡Ð¸ + [settings] ui = Тема delete_key = Премахване @@ -324,7 +326,7 @@ permissions_list = РазрешениÑ: edit_oauth2_application = Редактиране на OAuth2 приложение remove_oauth2_application = Премахване на OAuth2 приложение twofa_recovery_tip = Ðко загубите уÑтройÑтвото Ñи, ще можете да използвате ключ за еднократно възÑтановÑване, за да Ñи върнете доÑтъпа до акаунта. -visibility.private_tooltip = Видим Ñамо за членове на организации, в които учаÑтвате +visibility.private_tooltip = Видим Ñамо за учаÑтници в организации, в които учаÑтвате quota.applies_to_user = Следните правила за квота Ñе прилагат за Ð²Ð°ÑˆÐ¸Ñ Ð°ÐºÐ°ÑƒÐ½Ñ‚ quota.rule.no_limit = Ðеограничена hints = ПодÑказки @@ -381,6 +383,20 @@ comment_type_group_lock = СъÑтоÑние на заключване can_not_add_email_activations_pending = Има чакаща активациÑ, опитайте отново Ñлед нÑколко минути, ако иÑкате да добавите нова ел. поща. storage_overview = Преглед на Ñъхранението +webauthn = Двуфакторно удоÑтоверÑване (Ключове за ÑигурноÑÑ‚) +quota.sizes.all = Ð’Ñички +quota.sizes.repos.all = Хранилища +quota.sizes.repos.public = Публични хранилища +quota.sizes.repos.private = ЧаÑтни хранилища +quota.sizes.git.all = Git Ñъдържание +quota.sizes.git.lfs = Git LFS +quota.sizes.assets.attachments.all = Прикачени файлове +quota.sizes.assets.attachments.issues = Прикачени файлове към задачи +quota.sizes.assets.attachments.releases = Прикачени файлове към Ð¸Ð·Ð´Ð°Ð½Ð¸Ñ +quota.sizes.assets.artifacts = Ðртефакти +quota.sizes.assets.packages.all = Пакети +quota.sizes.wiki = Уики + [packages] container.labels.value = СтойноÑÑ‚ alpine.repository.repositories = Хранилища @@ -439,6 +455,113 @@ arch.version.conflicts = Ð’ конфликт alpine.repository.branches = Клонове arch.pacman.repo.multi.item = ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð·Ð° %s +desc = Управление на пакетите на хранилището. +alpine.registry = ÐаÑтройте този региÑтър, като добавите URL адреÑа във Ð²Ð°ÑˆÐ¸Ñ Ñ„Ð°Ð¹Ð» /etc/apk/repositories: +alpine.registry.key = Изтеглете Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ð¸Ñ RSA ключ на региÑтъра в папката /etc/apk/keys/, за да проверите подпиÑа на индекÑа: +alpine.registry.info = Изберете $branch и $repository от ÑпиÑъка по-долу. +alpine.install = За да инÑталирате пакета, изпълнете Ñледната команда: +arch.version.properties = СвойÑтва на верÑиÑта +arch.version.makedepends = ЗавиÑимоÑти за изграждането +arch.version.checkdepends = ЗавиÑимоÑти за проверката +chef.registry = ÐаÑтройте този региÑтър във Ð²Ð°ÑˆÐ¸Ñ Ñ„Ð°Ð¹Ð» ~/.chef/config.rb: +chef.install = За да инÑталирате пакета, изпълнете Ñледната команда: +composer.registry = ÐаÑтройте този региÑтър във Ð²Ð°ÑˆÐ¸Ñ Ñ„Ð°Ð¹Ð» ~/.composer/config.json: +composer.install = За да инÑталирате пакета Ñ Composer, изпълнете Ñледната команда: +composer.dependencies = ЗавиÑимоÑти +conan.details.repository = Хранилище +conan.registry = ÐаÑтройте този региÑтър от ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¸Ñ Ñ€ÐµÐ´: +conan.install = За да инÑталирате пакета Ñ Conan, изпълнете Ñледната команда: +conda.registry = ÐаÑтройте този региÑтър като Conda хранилище във Ð²Ð°ÑˆÐ¸Ñ Ñ„Ð°Ð¹Ð» .condarc: +conda.install = За да инÑталирате пакета Ñ Conda, изпълнете Ñледната команда: +container.pull = Издърпайте образа от ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¸Ñ Ñ€ÐµÐ´: +container.multi_arch = ОС / Ðрхитектура +container.layers = Слоеве на образа +cran.registry = ÐаÑтройте този региÑтър във Ð²Ð°ÑˆÐ¸Ñ Ñ„Ð°Ð¹Ð» Rprofile.site: +cran.install = За да инÑталирате пакета, изпълнете Ñледната команда: +debian.registry = ÐаÑтройте този региÑтър от ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¸Ñ Ñ€ÐµÐ´: +debian.registry.info = Изберете $distribution и $component от ÑпиÑъка по-долу. +debian.install = За да инÑталирате пакета, изпълнете Ñледната команда: +debian.repository = Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° хранилището +debian.repository.distributions = ДиÑтрибуции +debian.repository.components = Компоненти +debian.repository.architectures = Ðрхитектури +helm.registry = ÐаÑтройте този региÑтър от ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¸Ñ Ñ€ÐµÐ´: +helm.install = За да инÑталирате пакета, изпълнете Ñледната команда: +maven.registry = ÐаÑтройте този региÑтър във файла на Ð²Ð°ÑˆÐ¸Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚ pom.xml: +maven.install = За да използвате пакета, включете Ñледното в блока dependencies във файла pom.xml: +maven.install2 = Изпълнете през ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¸Ñ Ñ€ÐµÐ´: +maven.download = За да изтеглите завиÑимоÑтта, изпълнете през ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¸Ñ Ñ€ÐµÐ´: +nuget.registry = ÐаÑтройте този региÑтър от ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¸Ñ Ñ€ÐµÐ´: +nuget.install = За да инÑталирате пакета Ñ NuGet, изпълнете Ñледната команда: +nuget.dependency.framework = Целева платформа +npm.registry = ÐаÑтройте този региÑтър във файла на Ð²Ð°ÑˆÐ¸Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚ .npmrc: +npm.install = За да инÑталирате пакета Ñ npm, изпълнете Ñледната команда: +npm.install2 = или го добавете във файла package.json: +npm.dependencies.optional = Опционални завиÑимоÑти +npm.details.tag = Маркер +pub.install = За да инÑталирате пакета Ñ Dart, изпълнете Ñледната команда: +pypi.requires = ИзиÑква Python +pypi.install = За да инÑталирате пакета Ñ pip, изпълнете Ñледната команда: +rpm.registry = ÐаÑтройте този региÑтър от ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¸Ñ Ñ€ÐµÐ´: +rpm.distros.redhat = на диÑтрибуции, базирани на RedHat +rpm.distros.suse = на диÑтрибуции, базирани на SUSE +rpm.install = За да инÑталирате пакета, изпълнете Ñледната команда: +rpm.repository = Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° хранилището +rpm.repository.architectures = Ðрхитектури +rpm.repository.multiple_groups = Този пакет е наличен в нÑколко групи. +alt.registry = ÐаÑтройте този региÑтър от ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¸Ñ Ñ€ÐµÐ´: +alt.registry.install = За да инÑталирате пакета, изпълнете Ñледната команда: +alt.install = ИнÑталиране на пакет +alt.setup = Добавете хранилище към ÑпиÑъка ÑÑŠÑ Ñвързани хранилища (изберете необходимата архитектура вмеÑто „_arch_“): +alt.repository = Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° хранилището +alt.repository.architectures = Ðрхитектури +alt.repository.multiple_groups = Този пакет е наличен в нÑколко групи. +swift.registry = ÐаÑтройте този региÑтър от ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¸Ñ Ñ€ÐµÐ´: +swift.install = Добавете пакета във Ð²Ð°ÑˆÐ¸Ñ Ñ„Ð°Ð¹Ð» Package.swift: +swift.install2 = и изпълнете Ñледната команда: +vagrant.install = За да добавите Vagrant box, изпълнете Ñледната команда: +settings.link = Свързване на този пакет Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ðµ +settings.link.description = Ðко Ñвържете пакет Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ðµ, пакетът Ñе изброÑва в ÑпиÑъка Ñ Ð¿Ð°ÐºÐµÑ‚Ð¸ на хранилището. +settings.link.select = Изберете хранилище +settings.link.button = ОбновÑване на връзката на хранилището +settings.link.success = Връзката на хранилището беше уÑпешно обновена. +settings.link.error = ÐеуÑпешно обновÑване на връзката на хранилището. +settings.delete.description = Изтриването на пакет е трайно и не може да бъде отменено. +settings.delete.notice = Ðа път Ñте да изтриете %s (%s). Тази Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ðµ необратима, Ñигурни ли Ñте? +owner.settings.cargo.title = Ð˜Ð½Ð´ÐµÐºÑ Ð½Ð° региÑтъра на Cargo +owner.settings.cargo.initialize = Инициализиране на Ð¸Ð½Ð´ÐµÐºÑ +owner.settings.cargo.initialize.description = Ðеобходимо е Ñпециално Git хранилище за индекÑ, за да Ñе използва региÑтърът на Cargo. Използването на тази Ð¾Ð¿Ñ†Ð¸Ñ Ñ‰Ðµ (пре)Ñъздаде хранилището и ще го конфигурира автоматично. +owner.settings.cargo.initialize.error = ÐеуÑпешно инициализиране на индекÑа на Cargo: %v +owner.settings.cargo.initialize.success = ИндекÑÑŠÑ‚ на Cargo беше уÑпешно Ñъздаден. +owner.settings.cargo.rebuild = Преизграждане на Ð¸Ð½Ð´ÐµÐºÑ +owner.settings.cargo.rebuild.description = Преизграждането може да бъде полезно, ако индекÑÑŠÑ‚ не е Ñинхронизиран ÑÑŠÑ Ñъхранените Cargo пакети. +owner.settings.cargo.rebuild.error = ÐеуÑпешно преизграждане на индекÑа на Cargo: %v +owner.settings.cargo.rebuild.success = ИндекÑÑŠÑ‚ на Cargo беше уÑпешно преизграден. +owner.settings.cargo.rebuild.no_index = Ðе може да Ñе преизгради, нÑма инициализиран индекÑ. +owner.settings.cleanuprules.title = Правила за почиÑтване +owner.settings.cleanuprules.add = ДобавÑне на правило за почиÑтване +owner.settings.cleanuprules.edit = Редактиране на правилото за почиÑтване +owner.settings.cleanuprules.none = Ð’Ñе още нÑма правила за почиÑтване. +owner.settings.cleanuprules.preview = Преглед на правило за почиÑтване +owner.settings.cleanuprules.preview.overview = %d пакета Ñа наÑрочени за премахване. +owner.settings.cleanuprules.preview.none = Правилото за почиÑтване не Ñъвпада Ñ Ð½Ð¸Ñ‚Ð¾ един пакет. +owner.settings.cleanuprules.enabled = Включено +owner.settings.cleanuprules.pattern_full_match = Прилагане на шаблона към пълното име на пакета +owner.settings.cleanuprules.keep.title = ВерÑиите, които ÑъответÑтват на тези правила, Ñе запазват, дори ако ÑъответÑтват на правило за премахване по-долу. +owner.settings.cleanuprules.keep.count = Запазване на най-новите +owner.settings.cleanuprules.keep.count.1 = 1 верÑÐ¸Ñ Ð½Ð° пакет +owner.settings.cleanuprules.keep.count.n = %d верÑии на пакет +owner.settings.cleanuprules.keep.pattern = Запазване на верÑии, ÑъответÑтващи на +owner.settings.cleanuprules.keep.pattern.container = ВерÑиÑта latest винаги Ñе запазва за Container пакети. +owner.settings.cleanuprules.remove.title = ВерÑиите, които ÑъответÑтват на тези правила, Ñе премахват, оÑвен ако правило по-горе не казва да Ñе запазÑÑ‚. +owner.settings.cleanuprules.remove.days = Премахване на верÑии, по-Ñтари от +owner.settings.cleanuprules.remove.pattern = Премахване на верÑии, ÑъответÑтващи на +owner.settings.cleanuprules.success.update = Правилото за почиÑтване е обновено. +owner.settings.cleanuprules.success.delete = Правилото за почиÑтване е изтрито. +owner.settings.chef.title = РегиÑтър на Chef +owner.settings.chef.keypair = Генериране на двойка ключове +owner.settings.chef.keypair.description = ЗаÑвките, изпратени до региÑтъра на Chef, трÑбва да бъдат криптографÑки подпиÑани като ÑредÑтво за удоÑтоверÑване. При генериране на двойка ключове, Ñамо публичниÑÑ‚ ключ Ñе ÑъхранÑва във Forgejo. ЧаÑтниÑÑ‚ ключ ви Ñе предоÑтавÑ, за да Ñе използва Ñ knife. Генерирането на нова двойка ключове ще презапише предишната. + [tool] hours = %d чаÑа now = Ñега @@ -940,9 +1063,9 @@ editor.no_changes_to_show = ÐÑма промени за показване. issues.choose.get_started = Първи Ñтъпки issues.change_milestone_at = `промени етапа от %s на %s %s` issues.change_project_at = `промени проекта от %s на %s %s` -issues.self_assign_at = `Ñи Ñамо-възложи това %s` +issues.self_assign_at = `Ñи Ñамовъзложи това %s` issues.remove_assignee_at = `е премахнат като изпълнител от %s %s` -issues.remove_self_assignment = `Ñе Ñамо-премахна като изпълнител %s` +issues.remove_self_assignment = `Ñе Ñамопремахна като изпълнител %s` issues.add_assignee_at = `му бе възложено това от %s %s` pulls.merged_by = от %[3]s бе ÑлÑта %[1]s pulls.merged_by_fake = от %[2]s бе ÑлÑта %[1]s @@ -1272,7 +1395,7 @@ issues.review.show_resolved = Показване на решено issues.review.hide_resolved = Скриване на решено issues.review.resolve_conversation = Решаване на обÑъждането diff.comment.markdown_info = Поддържа Ñе Ñтилизиране Ñ ÐœÐ°Ñ€ÐºÐ´Ð°ÑƒÐ½. -diff.file_suppressed = Разликите не Ñа показани, защото Ñа твърде много +diff.file_suppressed = Разликите във файла Ñа потиÑнати, защото Ñа твърде много pulls.reject_count_n = %d поиÑкани промени settings.pulls.default_allow_edits_from_maintainers = ПозволÑване на редакции от поддържащите по подразбиране fork_branch = Клон за клониране в разклонението @@ -1347,7 +1470,7 @@ settings.default_branch_desc = Изберете Ñтандартен клон з settings.transfer.button = ПрехвърлÑне на притежанието settings.transfer.modal.title = ПрехвърлÑне на притежанието ambiguous_runes_line = `Този ред Ñъдържа двуÑмиÑлени Уникод знаци` -ambiguous_character = `%[1]c [U+%04[1]X] може да бъде объркан Ñ %[2]c [U+%04[2]X]` +ambiguous_character = `%[1]c [U+%04[1]X] може да бъде объркан ÑÑŠÑ %[2]c [U+%04[2]X]` invisible_runes_header = `Този файл Ñъдържа невидими Уникод знаци` issues.all_title = Общо issues.new.assign_to_me = Възлагане на мен @@ -1446,7 +1569,7 @@ generated_from = генерирано от clear_ref = `ИзчиÑтване на текущата препратка` file_follow = ПоÑледване на Ñимволната връзка commitstatus.failure = ÐеуÑпех -issues.filter_label_exclude = `Използвайте alt + click/enter, за да изключите етикети` +issues.filter_label_exclude = Използвайте Alt + Click, за да изключите етикети migrate.migrating_failed = Мигрирането от %s е неуÑпешно. migrate.migrating_issues = Мигриране на задачи mirror_from = огледално на @@ -1576,6 +1699,178 @@ issues.force_push_compare = СравнÑване pulls.status_checking = ÐÑкои проверки Ñа в очакване pulls.nothing_to_compare = Тези клонове Ñа равни. Ðе е нужно да Ñъздавате заÑвка за Ñливане. +rss.must_be_on_branch = ТрÑбва да Ñте на клон, за да имате RSS емиÑиÑ. +admin.manage_flags = Управление на флаговете +admin.enabled_flags = Флагове, включени за хранилището: +admin.update_flags = ОбновÑване на флаговете +admin.failed_to_replace_flags = ÐеуÑпешна замÑна на флаговете на хранилището +admin.flags_replaced = Флаговете на хранилището Ñа заменени +fork_to_different_account = РазклонÑване в друг акаунт +mirror_interval = Интервал на огледалото (валидни единици за време Ñа „h“, „m“, „s“). 0 за изключване на периодичната ÑинхронизациÑ. (Минимален интервал: %s) +mirror_interval_invalid = Интервалът на огледалото не е валиден. +mirror_use_ssh.text = Използване на SSH удоÑтоверÑване +mirror_use_ssh.helper = Forgejo ще Ñъздаде огледало на хранилището чрез Git през SSH и ще генерира двойка ключове за ваÑ, когато изберете тази опциÑ. ТрÑбва да Ñе уверите, че генерираниÑÑ‚ публичен ключ е упълномощен да изтлаÑква към целевото хранилище. Ðе можете да използвате удоÑтоверÑване, базирано на парола, когато избирате това. +mirror_use_ssh.not_available = SSH удоÑтоверÑването не е налично. +mirror_denied_combination = Ðе може да Ñе използва удоÑтоверÑване Ñ Ð¿ÑƒÐ±Ð»Ð¸Ñ‡ÐµÐ½ ключ и парола едновременно. +mirror_sync_on_commit = Синхронизиране при изтлаÑкване на Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ +mirror_address_desc = ПоÑтавете вÑички необходими данни за удоÑтоверÑване в ÑекциÑта „Упълномощаване“. +mirror_address_url_invalid = ПредоÑтавениÑÑ‚ URL е невалиден. ТрÑбва да екранирате правилно вÑички компоненти на URL адреÑа. +mirror_address_protocol_invalid = ПредоÑтавениÑÑ‚ URL е невалиден. Само http(s):// или git:// адреÑи могат да Ñе използват за огледални хранилища. +mirror_lfs = Съхранение на големи файлове (LFS) +mirror_password_help = Променете потребителÑкото име, за да изтриете запазена парола. +unit_disabled = ÐдминиÑтраторът на Ñайта е изключил тази ÑÐµÐºÑ†Ð¸Ñ Ð½Ð° хранилището. +summary_card_alt = Карта Ñ Ð¾Ð±Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ðµ на хранилище %s +template.items = Елементи на шаблона +template.git_content = Git Ñъдържание (Ñтандартен клон) +template.git_hooks = Git куки +template.git_hooks_tooltip = Ð’ момента не можете да променÑте или премахвате Git куки, Ñлед като Ñа добавени. Изберете това Ñамо ако Ñе доверÑвате на шаблонното хранилище. +template.one_item = ТрÑбва да изберете поне един елемент от шаблона +template.invalid = ТрÑбва да изберете шаблонно хранилище +migrate.cancel_migrating_title = Отказ от миграциÑта +migrate.cancel_migrating_confirm = ИÑкате ли да откажете тази миграциÑ? +invisible_runes_description = `Този файл Ñъдържа невидими Уникод знаци, които Ñа неразличими за хората, но могат да бъдат обработени по различен начин от компютър. Ðко ÑмÑтате, че това е умишлено, можете Ñпокойно да пренебрегнете това предупреждение. Използвайте бутона „Екраниране“, за да ги разкриете.` +ambiguous_runes_header = `Този файл Ñъдържа двуÑмиÑлени Уникод знаци` +ambiguous_runes_description = `Този файл Ñъдържа Уникод знаци, които могат да бъдат объркани Ñ Ð´Ñ€ÑƒÐ³Ð¸ знаци. Ðко ÑмÑтате, че това е умишлено, можете Ñпокойно да пренебрегнете това предупреждение. Използвайте бутона „Екраниране“, за да ги разкриете.` +file_copy_permalink = Копиране на поÑтоÑнна връзка +view_git_blame = Преглед на git blame +video_not_supported_in_browser = ВашиÑÑ‚ браузър не поддържа HTML5 тага „video“. +audio_not_supported_in_browser = ВашиÑÑ‚ браузър не поддържа HTML5 тага „audio“. +stored_lfs = Съхранено Ñ Git LFS +commit_graph.select = Изберете клонове +editor.cannot_edit_lfs_files = LFS файлове не могат да Ñе редактират в уеб интерфейÑа. +editor.filename_help = Добавете директориÑ, като въведете името Ñ, поÑледвано от наклонена черта („/“). Премахнете директориÑ, като натиÑнете backspace в началото на полето за въвеждане. +editor.commit_signed_changes = Подаване на подпиÑани промени +editor.require_signed_commit = Клонът изиÑква подпиÑано подаване +editor.commit_email = Ел. поща на подаването +commits.desc = Разглеждане на иÑториÑта на промените в Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð½Ð¸Ñ ÐºÐ¾Ð´. +commits.search.tooltip = Можете да добавите Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ ÐºÑŠÐ¼ ключовите думи Ñ â€žauthor:“, „committer:“, „after:“ или „before:“, напр. „revert author:Alice before:2019-01-13“. +commits.signed_by = ПодпиÑано от +commits.signed_by_untrusted_user = ПодпиÑано от недоверен потребител +commits.signed_by_untrusted_user_unmatched = ПодпиÑано от недоверен потребител, който не Ñъвпада Ñ Ð¿Ð¾Ð´Ð°Ð²Ð°Ñ‰Ð¸Ñ +commits.ssh_key_fingerprint = Отпечатък на SSH ключ +commits.view_single_diff = Преглед на промените в този файл, въведени в това подаване +commit.revert = Връщане +commit.revert-header = Връщане: %s +commit.revert-content = Изберете клон, върху който да Ñе върне: +issues.desc = Организирайте доклади за грешки, задачи и етапи. +issues.choose.ignore_invalid_templates = Ðевалидните шаблони Ñа игнорирани +issues.choose.invalid_config = КонфигурациÑта на задачите Ñъдържа грешки: +issues.filter_type.all_pull_requests = Ð’Ñички заÑвки за Ñливане +issues.role.member_helper = Този потребител е учаÑтник в организациÑта, притежаваща това хранилище. +issues.lock.unknown_reason = Ðе може да Ñе заключи задача Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑтна причина. +issues.lock_duplicate = Задача не може да бъде заключена два пъти. +issues.unlock_error = Ðе може да Ñе отключи задача, коÑто не е заключена. +issues.lock.notice_1 = - Други потребители не могат да добавÑÑ‚ нови коментари към тази задача. +issues.lock.notice_2 = - Вие и други Ñътрудници Ñ Ð´Ð¾Ñтъп до това хранилище вÑе още можете да оÑтавÑте коментари, които другите да виждат. +issues.lock.notice_3 = - Винаги можете да отключите тази задача отново в бъдеще. +issues.unlock.notice_1 = - Ð’Ñеки ще може отново да коментира тази задача. +issues.unlock.notice_2 = - Винаги можете да заключите тази задача отново в бъдеще. +issues.lock.title = Заключване на обÑъждането по тази задача. +issues.unlock.title = Отключване на обÑъждането по тази задача. +issues.comment_on_locked = Ðе можете да коментирате заключена задача. +issues.delete.text = ÐаиÑтина ли иÑкате да изтриете тази задача? (Това ще премахне трайно цÑлото Ñъдържание. ПомиÑлете дали вмеÑто това да не Ñ Ð·Ð°Ñ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ðµ, ако възнамерÑвате да Ñ Ð·Ð°Ð¿Ð°Ð·Ð¸Ñ‚Ðµ архивирана) +issues.cancel_tracking_history = `отмени проÑледÑването на времето %s` +issues.add_time_sum_to_small = Ðе е въведено време. +issues.due_date_form = гггг-мм-дд +issues.due_date_invalid = КрайниÑÑ‚ Ñрок е невалиден или извън обхвата. МолÑ, използвайте формата „гггг-мм-дд“. +issues.dependency.no_permission_1 = ÐÑмате разрешение да прочетете %d завиÑимоÑÑ‚ +issues.dependency.no_permission_n = ÐÑмате разрешение да прочетете %d завиÑимоÑти +issues.dependency.no_permission.can_remove = ÐÑмате разрешение да прочетете тази завиÑимоÑÑ‚, но можете да Ñ Ð¿Ñ€ÐµÐ¼Ð°Ñ…Ð½ÐµÑ‚Ðµ +issues.dependency.issue_batch_close_blocked = Ðе могат да бъдат затворени групово избраните задачи, защото задача #%d вÑе още има отворени завиÑимоÑти +issues.dependency.blocked_by_short = ЗавиÑи от +issues.dependency.setting = Включване на завиÑимоÑти за задачи и заÑвки за Ñливане +issues.dependency.add_error_same_issue = Ðе можете да направите задача завиÑима от Ñамата неÑ. +issues.dependency.add_error_dep_issue_not_exist = ЗавиÑимата задача не ÑъщеÑтвува. +issues.dependency.add_error_cannot_create_circular = Ðе можете да Ñъздадете завиÑимоÑÑ‚ Ñ Ð´Ð²Ðµ задачи, които Ñе блокират взаимно. +issues.dependency.add_error_dep_not_same_repo = И двете задачи трÑбва да Ñа в едно и Ñъщо хранилище. +issues.review.self.rejection = Ðе можете да поиÑкате промени в ÑобÑтвената Ñи заÑвка за Ñливане. +issues.review.dismissed = отхвърли рецензиÑта на %s %s +issues.review.content.empty = ТрÑбва да оÑтавите коментар, поÑочващ иÑканите промени. +issues.review.add_review_requests = поиÑка рецензии от %[1]s %[2]s +issues.review.remove_review_request = премахна заÑвката за Ñ€ÐµÑ†ÐµÐ½Ð·Ð¸Ñ Ð·Ð° %[1]s %[2]s +issues.review.remove_review_requests = премахна заÑвките за Ñ€ÐµÑ†ÐµÐ½Ð·Ð¸Ñ Ð·Ð° %[1]s %[2]s +issues.review.remove_review_request_self = отказа да рецензира %s +issues.review.pending.tooltip = Този коментар в момента не е видим за други потребители. За да изпратите изчакващите Ñи коментари, изберете „%s“ -> „%s/%s/%s“ в горната чаÑÑ‚ на Ñтраницата. +issues.review.outdated = ОÑтарÑл +issues.review.outdated_description = Съдържанието е променено, Ñлед като е направен този коментар +issues.review.show_outdated = Показване на оÑтарели +issues.review.hide_outdated = Скриване на оÑтарели +issues.content_history.options = Опции +issues.blocked_by_user = Ðе можете да Ñъздавате задачи в това хранилище, защото Ñте блокирани от Ð¿Ñ€Ð¸Ñ‚ÐµÐ¶Ð°Ñ‚ÐµÐ»Ñ Ð½Ð° хранилището. +comment.blocked_by_user = Коментирането не е възможно, защото Ñте блокирани от Ð¿Ñ€Ð¸Ñ‚ÐµÐ¶Ð°Ñ‚ÐµÐ»Ñ Ð½Ð° хранилището или от автора. +issues.reopen.blocked_by_user = Ðе можете да отворите наново тази задача, защото Ñте блокирани от Ð¿Ñ€Ð¸Ñ‚ÐµÐ¶Ð°Ñ‚ÐµÐ»Ñ Ð½Ð° хранилището или от автора на тази задача. +compare.compare_base = оÑнова +compare.compare_head = ÑравнÑване +pulls.desc = Включване на заÑвки за Ñливане и рецензии на код. +pulls.view = Преглед на заÑвката за Ñливане +pulls.allow_edits_from_maintainers_desc = Потребители Ñ Ð¿Ñ€Ð°Ð²Ð¾ на Ð·Ð°Ð¿Ð¸Ñ Ð² оÑÐ½Ð¾Ð²Ð½Ð¸Ñ ÐºÐ»Ð¾Ð½ могат Ñъщо да изтлаÑкват към този клон +pulls.allow_edits_from_maintainers_err = ОбновÑването е неуÑпешно +pulls.has_changed_since_last_review = Променено Ñлед поÑледната ви Ñ€ÐµÑ†ÐµÐ½Ð·Ð¸Ñ +pulls.switch_comparison_type = Превключване на типа Ñравнение +pulls.filter_branch = Филтриране на клон +pulls.review_only_possible_for_full_diff = Рецензирането е възможно Ñамо при преглед на пълните разлики +pulls.wrong_commit_id = ID на подаването трÑбва да бъде ID на подаване в Ñ†ÐµÐ»ÐµÐ²Ð¸Ñ ÐºÐ»Ð¾Ð½ +pulls.blocked_by_user = Ðе можете да Ñъздадете заÑвка за Ñливане в това хранилище, защото Ñте блокирани от Ð¿Ñ€Ð¸Ñ‚ÐµÐ¶Ð°Ñ‚ÐµÐ»Ñ Ð½Ð° хранилището. +pulls.no_merge_desc = Тази заÑвка за Ñливане не може да бъде ÑлÑта, защото вÑички опции за Ñливане в хранилището Ñа изключени. +pulls.no_merge_helper = Включете опциите за Ñливане в наÑтройките на хранилището или Ñлейте заÑвката за Ñливане ръчно. +pulls.no_merge_wip = Тази заÑвка за Ñливане не може да бъде ÑлÑта, защото е отбелÑзана като в Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð½Ð° работа. +pulls.squash_merge_pull_request = Създаване на ÑплеÑкано подаване +pulls.merge_manually = Ръчно ÑлÑта +pulls.merge_commit_id = ID на подаването ÑÑŠÑ Ñливане +pulls.require_signed_wont_sign = Клонът изиÑква подпиÑани подаваниÑ, но това Ñливане нÑма да бъде подпиÑано +pulls.merge_conflict = Сливането е неуÑпешно: Възникна конфликт по време на Ñливането. ПодÑказка: Опитайте различна ÑÑ‚Ñ€Ð°Ñ‚ÐµÐ³Ð¸Ñ +pulls.merge_conflict_summary = Съобщение за грешка +pulls.rebase_conflict_summary = Съобщение за грешка +pulls.has_merged = ÐеуÑпешно: ЗаÑвката за Ñливане е ÑлÑта, не можете да Ñлеете отново или да промените Ñ†ÐµÐ»ÐµÐ²Ð¸Ñ ÐºÐ»Ð¾Ð½. +pulls.push_rejected = ИзтлаÑкването е неуÑпешно: ИзтлаÑкването е отхвърлено. Прегледайте Git куките за това хранилище. +pulls.push_rejected_no_message = ИзтлаÑкването е неуÑпешно: ИзтлаÑкването е отхвърлено, но нÑма отдалечено Ñъобщение. Прегледайте Git куките за това хранилище +pulls.update_not_allowed = ÐÑмате разрешение да обновÑвате клона +pulls.outdated_with_base_branch = Този клон е оÑтарÑл ÑпрÑмо оÑÐ½Ð¾Ð²Ð½Ð¸Ñ ÐºÐ»Ð¾Ð½ +pulls.cmd_instruction_merge_warning = Предупреждение: ÐаÑтройката „Ðвтоматично откриване на ръчно Ñливане“ не е включена за това хранилище, ще трÑбва да отбележите тази заÑвка за Ñливане като ръчно ÑлÑта Ñлед това. +pulls.editable_explanation = Тази заÑвка за Ñливане позволÑва редакции от поддържащите. Можете да допринеÑете директно към неÑ. +pulls.auto_merge_button_when_succeed = (Когато проверките Ñа уÑпешни) +pulls.auto_merge_when_succeed = Ðвтоматично Ñливане, когато вÑички проверки Ñа уÑпешни +pulls.auto_merge_newly_scheduled = ЗаÑвката за Ñливане е наÑрочена за Ñливане, когато вÑички проверки Ñа уÑпешни. +pulls.auto_merge_has_pending_schedule = %[1]s наÑрочи тази заÑвка за Ñливане за автоматично Ñливане, когато вÑички проверки Ñа уÑпешни %[2]s. +pulls.auto_merge_cancel_schedule = ОтмÑна на автоматичното Ñливане +pulls.auto_merge_not_scheduled = Тази заÑвка за Ñливане не е наÑрочена за автоматично Ñливане. +pulls.auto_merge_canceled_schedule = Ðвтоматичното Ñливане е отменено за тази заÑвка за Ñливане. +pulls.auto_merge_newly_scheduled_comment = `наÑрочи тази заÑвка за Ñливане за автоматично Ñливане, когато вÑички проверки Ñа уÑпешни %[1]s` +pulls.auto_merge_canceled_schedule_comment = `отмени автоматичното Ñливане на тази заÑвка за Ñливане, когато вÑички проверки Ñа уÑпешни %[1]s` +pulls.delete.title = Да Ñе изтрие ли тази заÑвка за Ñливане? +pulls.delete.text = ÐаиÑтина ли иÑкате да изтриете тази заÑвка за Ñливане? (Това ще премахне трайно цÑлото Ñъдържание. ПомиÑлете дали вмеÑто това да не Ñ Ð·Ð°Ñ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ðµ, ако възнамерÑвате да Ñ Ð·Ð°Ð¿Ð°Ð·Ð¸Ñ‚Ðµ архивирана) +diff.data_not_available = Съдържанието на разликите не е налично +diff.bin = ДВОИЧЕР+diff.file_suppressed_line_too_long = Разликите във файла Ñа потиÑнати, защото един или повече редове Ñа твърде дълги +diff.too_many_files = ÐÑкои файлове не бÑха показани, защото твърде много файлове имат промени в тези разлики +diff.show_more = Показване на още +diff.generated = генериран +diff.comment.add_line_comment = ДобавÑне на коментар към ред +diff.comment.add_review_comment = ДобавÑне на коментар +diff.review.self_reject = Ðвторите на заÑвки за Ñливане не могат да поиÑкват промени в ÑобÑтвените Ñи заÑвки +diff.review.self_approve = Ðвторите на заÑвки за Ñливане не могат да одобрÑват ÑобÑтвените Ñи заÑвки +diff.image.side_by_side = Едно до друго +diff.image.swipe = Плъзгане +diff.image.overlay = ÐаÑлагване +diff.has_escaped = Този ред има Ñкрити Уникод знаци +release.tag_name_protected = Името на маркера е защитено. +release.add_tag_msg = Използване на заглавието и Ñъдържанието на изданието като Ñъобщение на маркера. +release.hide_archive_links = Скриване на автоматично генерираните архиви +release.hide_archive_links_helper = Скрийте автоматично генерираните архиви Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼ÐµÐ½ код за това издание. Ðапример, ако качвате Ñвои ÑобÑтвени. +release.asset_external_url = Външен URL Ð°Ð´Ñ€ÐµÑ +release.summary_card_alt = Карта Ñ Ð¾Ð±Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ðµ на издание ÑÑŠÑ Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ðµ „%s“ в хранилище %s +branch.protected_deletion_failed = Клонът „%s“ е защитен. Ðе може да бъде изтрит. +branch.default_deletion_failed = Клонът „%s“ е ÑтандартниÑÑ‚ клон. Ðе може да бъде изтрит. +branch.included_desc = Този клон е чаÑÑ‚ от ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ ÐºÐ»Ð¾Ð½ +branch.included = Включен +branch.warning_rename_default_branch = Преименувате ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ ÐºÐ»Ð¾Ð½. +topic.count_prompt = Ðе можете да изберете повече от 25 теми +find_file.no_matching = Ðе е намерен Ñъвпадащ файл +error.csv.too_large = Ðе може да Ñе визуализира този файл, защото е твърде голÑм. +error.csv.unexpected = Ðе може да Ñе визуализира този файл, защото Ñъдържа неочакван знак на ред %d и колона %d. +error.csv.invalid_field_count = Ðе може да Ñе визуализира този файл, защото има грешен брой полета на ред %d. +error.broken_git_hook = Git куките на това хранилище изглеждат повредени. МолÑ, поÑледвайте документациÑта, за да ги поправите, Ñлед което изтлаÑкайте подаваниÑ, за да обновите ÑтатуÑа. + [modal] confirm = Потвърждаване no = Ðе @@ -1663,18 +1958,18 @@ follow_blocked_user = Ðе можете да Ñледвате тази орга settings.delete_prompt = ОрганизациÑта ще бъде премахната завинаги. Това ÐЕ МОЖЕ да бъде отменено! settings.labels_desc = Добавете етикети, които могат да Ñе използват за задачи за вÑички хранилища в тази организациÑ. teams.none_access = Без доÑтъп -teams.members.none = ÐÑма членове в този екип. +teams.members.none = ÐÑма учаÑтници в този екип. repo_updated = Обновено %s teams.delete_team_success = Екипът е изтрит. teams.search_repo_placeholder = ПотърÑете хранилище… teams.delete_team_title = Изтриване на екипа -teams.add_team_member = ДобавÑне на член на екипа +teams.add_team_member = ДобавÑне на учаÑтник в екипа teams.read_access_helper = Членовете могат да преглеждат и клонират хранилищата на екипа. teams.invite.description = МолÑ, щракнете върху бутона по-долу, за да Ñе приÑъедините към екипа. teams.invite.title = Поканени Ñте да Ñе приÑъедините към екип %s в Ð¾Ñ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ %s. team_permission_desc = Разрешение members.public_helper = Да е Ñкрит -teams.members = Членове на екипа +teams.members = УчаÑтници в екипа teams.delete_team = Изтриване на екипа members.owner = Притежател members.member_role = Ð Ð¾Ð»Ñ Ð½Ð° учаÑтника: @@ -1685,6 +1980,38 @@ settings.delete_org_desc = Тази Ð¾Ñ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ‰Ðµ бъде изт open_dashboard = ОтварÑне на таблото settings.change_orgname_prompt = Бележка: ПромÑната на името на организациÑта ще промени и URL адреÑа на вашата Ð¾Ñ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¸ ще оÑвободи Ñтарото име. +team_access_desc = ДоÑтъп до хранилище +team_unit_desc = Разрешаване на доÑтъп до Ñекции на хранилището +team_unit_disabled = (Изключено) +form.name_reserved = Името на организациÑта „%s“ е резервирано. +form.name_pattern_not_allowed = Шаблонът „%s“ не е разрешен в име на организациÑ. +form.create_org_not_allowed = ÐÑмате разрешение да Ñъздавате организациÑ. +settings.update_setting_success = ÐаÑтройките на организациÑта Ñа обновени. +settings.change_orgname_redirect_prompt = Старото име ще Ñе пренаÑочва, докато не бъде взето. +settings.change_orgname_redirect_prompt.with_cooldown.one = Старото име на организациÑта ще бъде доÑтъпно за вÑички Ñлед период на изчакване от %[1]d ден. Ð’Ñе още можете да Ñи върнете Ñтарото име по време на периода на изчакване. +settings.change_orgname_redirect_prompt.with_cooldown.few = Старото име на организациÑта ще бъде доÑтъпно за вÑички Ñлед период на изчакване от %[1]d дни. Ð’Ñе още можете да Ñи върнете Ñтарото име по време на периода на изчакване. +settings.update_avatar_success = Профилната Ñнимка на организациÑта е обновена. +settings.hooks_desc = Добавете уеб-куки, които ще Ñе задейÑтват за вÑички хранилища в тази организациÑ. +members.membership_visibility = ВидимоÑÑ‚ на учаÑтничеÑтвото: +members.public = Видим +members.private = Скрит +members.invite_desc = ДобавÑне на нов учаÑтник към %s: +members.invite_now = Поканване Ñега +teams.admin_access = ÐдминиÑтраторÑки доÑтъп +teams.invite_team_member = Поканване в %s +teams.invite_team_member.list = Чакащи покани +teams.delete_team_desc = Изтриването на екип отнема доÑтъпа до хранилището от неговите учаÑтници. Продължаване? +teams.remove_all_repos_desc = Това ще премахне вÑички хранилища от екипа. +teams.add_all_repos_title = ДобавÑне на вÑички хранилища +teams.add_all_repos_desc = Това ще добави вÑички хранилища на организациÑта към екипа. +teams.add_nonexistent_repo = Хранилището, което Ñе опитвате да добавите, не ÑъщеÑтвува, молÑ, първо го Ñъздайте. +teams.add_duplicate_users = ПотребителÑÑ‚ вече е учаÑтник в екипа. +teams.repos.none = ÐÑма хранилища, до които този екип да има доÑтъп. +teams.specific_repositories = Конкретни хранилища +teams.specific_repositories_helper = УчаÑтниците ще имат доÑтъп Ñамо до хранилища, изрично добавени към екипа. Избирането на това нÑма автоматично да премахне хранилища, вече добавени Ñ Ð’Ñички хранилища. +teams.all_repositories_helper = Екипът има доÑтъп до вÑички хранилища. Избирането на това ще добави вÑички ÑъщеÑтвуващи хранилища към екипа. +teams.invite.by = Поканен от %s + [install] admin_password = Парола user = ПотребителÑко име @@ -1978,14 +2305,14 @@ Pronouns = МеÑÑ‚Ð¾Ð¸Ð¼ÐµÐ½Ð¸Ñ Biography = Ð‘Ð¸Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ Website = УебÑайт Location = МеÑтоположение -cannot_add_org_to_team = ÐžÑ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ðµ може да бъде добавена като член на екип. +cannot_add_org_to_team = ÐžÑ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ðµ може да бъде добавена като учаÑтник в екип. auth_failed = ÐеуÑпешно удоÑтоверÑване: %v team_no_units_error = Разрешете доÑтъп до поне една ÑÐµÐºÑ†Ð¸Ñ Ð½Ð° хранилището. password_uppercase_one = Поне един голÑм знак CommitSummary = Обобщение на подаването username_error = ` може да Ñъдържа Ñамо буквено-цифрови знаци („0-9“, „a-z“, „A-Z“), тире („-“), долна черта („_“) и точка („.“). Ðе може да започва или завършва Ñ Ð½Ðµ-буквено-цифрови знаци, като Ñъщо така Ñа забранени и поÑледователни не-буквено-цифрови знаци.` username_error_no_dots = ` може да Ñъдържа Ñамо буквено-цифрови знаци („0-9“, „a-z“, „A-Z“), тире („-“) и долна черта („_“). Ðе може да започва или завършва Ñ Ð½Ðµ-буквено-цифрови знаци, като Ñъщо така Ñа забранени и поÑледователни не-буквено-цифрови знаци.` -duplicate_invite_to_team = ПотребителÑÑ‚ вече е поканен като член на екипа. +duplicate_invite_to_team = ПотребителÑÑ‚ вече е поканен като учаÑтник в екипа. must_use_public_key = Ключът, който предоÑтавихте, е чаÑтен ключ. МолÑ, не качвайте чаÑÑ‚Ð½Ð¸Ñ Ñи ключ никъде. ВмеÑто това използвайте Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ð¸Ñ Ñи ключ. org_still_own_packages = Тази Ð¾Ñ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²Ñе още притежава един или повече пакети, първо ги изтрийте. admin_cannot_delete_self = Ðе можете да изтриете Ñебе Ñи, когато Ñте админиÑтратор. МолÑ, първо премахнете админиÑтраторÑките Ñи привилегии. @@ -2006,7 +2333,7 @@ enterred_invalid_repo_name = Името на хранилището, което enterred_invalid_org_name = Името на организациÑта, което въведохте, е неправилно. enterred_invalid_password = Паролата, коÑто въведохте, е неправилна. organization_leave_success = УÑпешно напуÑнахте организациÑта %s. -still_has_org = ВашиÑÑ‚ акаунт е член на една или повече организации, първо ги напуÑнете. +still_has_org = ВашиÑÑ‚ акаунт е учаÑтник в една или повече организации, първо ги напуÑнете. org_still_own_repo = Тази Ð¾Ñ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²Ñе още притежава едно или повече хранилища, първо ги изтрийте или прехвърлете. target_branch_not_exist = ЦелевиÑÑ‚ клон не ÑъщеÑтвува. glob_pattern_error = ` glob шаблонът е невалиден: %s.` @@ -2017,6 +2344,18 @@ AdminEmail = ÐдминиÑтраторÑки Ð°Ð´Ñ€ÐµÑ Ð·Ð° ел. поща email_domain_is_not_allowed = Домейнът на адреÑа за ел. поща на Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ %s е в конфликт Ñ EMAIL_DOMAIN_ALLOWLIST или EMAIL_DOMAIN_BLOCKLIST. Уверете Ñе, че Ñте въвели правилно адреÑа за ел. поща. email_been_used = ÐдреÑÑŠÑ‚ за ел. поща вече Ñе използва. +NewBranchName = Име на Ð½Ð¾Ð²Ð¸Ñ ÐºÐ»Ð¾Ð½ +git_ref_name_error = ` трÑбва да е правилно форматирано име на Git препратка.` +regex_pattern_error = ` шаблонът на регулÑÑ€Ð½Ð¸Ñ Ð¸Ð·Ñ€Ð°Ð· е невалиден: %s.` +repository_files_already_exist = Вече ÑъщеÑтвуват файлове за това хранилище. Свържете Ñе ÑÑŠÑ ÑиÑÑ‚ÐµÐ¼Ð½Ð¸Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратор. +repository_files_already_exist.delete = Вече ÑъщеÑтвуват файлове за това хранилище. ТрÑбва да ги изтриете. +enterred_invalid_owner_name = Името на Ð½Ð¾Ð²Ð¸Ñ Ð¿Ñ€Ð¸Ñ‚ÐµÐ¶Ð°Ñ‚ÐµÐ» не е валидно. +last_org_owner = Ðе можете да премахнете поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ» от екипа на „притежателите“. ТрÑбва да има поне един притежател за организациÑ. +invalid_ssh_key = Ðе може да Ñе потвърди вашиÑÑ‚ SSH ключ: %s +invalid_gpg_key = Ðе може да Ñе потвърди вашиÑÑ‚ GPG ключ: %s +unable_verify_ssh_key = Ðе може да Ñе потвърди SSH ключът, проверете го отново за грешки. +required_prefix = ВъведениÑÑ‚ текÑÑ‚ трÑбва да започва Ñ â€ž%s“ + [action] close_issue = `затвори задача %[3]s#%[2]s` rename_repo = преименува хранилище от %[1]s на %[3]s @@ -2045,6 +2384,12 @@ compare_branch = СравнÑване compare_commits_general = СравнÑване на Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ compare_commits = Сравнете %d Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ +transfer_repo = прехвърли хранилище %s към %s +mirror_sync_push = Ñинхронизира Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ ÐºÑŠÐ¼ %[3]s на %[4]s от огледало +mirror_sync_create = Ñинхронизира нова препратка %[3]s към %[4]s от огледало +mirror_sync_delete = Ñинхронизира и изтри препратка %[2]s на %[3]s от огледало +review_dismissed = `отхвърли Ñ€ÐµÑ†ÐµÐ½Ð·Ð¸Ñ Ð¾Ñ‚ %[4]s за %[3]s#%[2]s` + [auth] tab_openid = OpenID openid_connect_submit = Свързване @@ -2178,6 +2523,15 @@ variables.not_found = Променливата не е открита. variables.id_not_exist = Променлива Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ‚Ð¾Ñ€ %d не ÑъщеÑтвува. runners.owner_type = Тип +unit.desc = Управление на интегрирани CI/CD pipelines Ñ Forgejo Actions. +status.unknown = ÐеизвеÑтно +status.waiting = Изчаква Ñе +status.running = ИзпълнÑва Ñе +status.success = УÑпешно +status.failure = ÐеуÑпешно +status.cancelled = Отменено +status.skipped = ПропуÑнато + [heatmap] less = По-малко number_of_contributions_in_the_last_12_months = %s приноÑа през поÑледните 12 меÑеца @@ -2258,3 +2612,32 @@ eib = ЕиБ [translation_meta] test = окей + +[repo.permissions] +code.read = Четене: ДоÑтъп и клониране на кода на хранилището. +code.write = ПиÑане: ИзтлаÑкване към хранилището, Ñъздаване на клонове и маркери. +issues.read = Четене: Четене и Ñъздаване на задачи и коментари. +issues.write = ПиÑане: ЗатварÑне на задачи и управление на метаданни като етикети, етапи, изпълнители, крайни Ñрокове и завиÑимоÑти. +pulls.read = Четене: Четене и Ñъздаване на заÑвки за Ñливане. +pulls.write = ПиÑане: ЗатварÑне на заÑвки за Ñливане и управление на метаданни като етикети, етапи, изпълнители, крайни Ñрокове и завиÑимоÑти. +releases.read = Четене: Преглед и изтеглÑне на изданиÑ. +wiki.read = Четене: Четене на интегрираното уики и неговата иÑториÑ. +wiki.write = ПиÑане: Създаване, обновÑване и изтриване на Ñтраници в интегрираното уики. +projects.read = Четене: ДоÑтъп до проектните табла на хранилището. +projects.write = ПиÑане: Създаване и редактиране на проекти и колони. + +[gpg] +default_key = ПодпиÑано Ñ ÐºÐ»ÑŽÑ‡ по подразбиране +error.extract_sign = ÐеуÑпешно извличане на Ð¿Ð¾Ð´Ð¿Ð¸Ñ +error.generate_hash = ÐеуÑпешно генериране на хеш на подаването +error.no_committer_account = ÐÑма акаунт, Ñвързан Ñ Ð°Ð´Ñ€ÐµÑа за ел. поща на Ð¿Ð¾Ð´Ð°Ð²Ð°Ñ‰Ð¸Ñ +error.no_gpg_keys_found = Ðе е намерен извеÑтен ключ за този Ð¿Ð¾Ð´Ð¿Ð¸Ñ Ð² базата данни +error.not_signed_commit = Ðе е подпиÑано подаване +error.failed_retrieval_gpg_keys = ÐеуÑпешно извличане на ключ, Ñвързан Ñ Ð°ÐºÐ°ÑƒÐ½Ñ‚Ð° на Ð¿Ð¾Ð´Ð°Ð²Ð°Ñ‰Ð¸Ñ +error.probable_bad_signature = Ð’ÐИМÐÐИЕ! Въпреки че има ключ Ñ Ñ‚Ð¾Ð²Ð° ID в базата данни, той не потвърждава това подаване! Това подаване е ПОДОЗРИТЕЛÐО. +error.probable_bad_default_signature = Ð’ÐИМÐÐИЕ! Въпреки че ключът по подразбиране има това ID, той не потвърждава това подаване! Това подаване е ПОДОЗРИТЕЛÐО. + +[units] +unit = Елемент +error.no_unit_allowed_repo = ÐÑмате разрешение за доÑтъп до Ð½Ð¸ÐºÐ¾Ñ ÑÐµÐºÑ†Ð¸Ñ Ð½Ð° това хранилище. +error.unit_not_allowed = ÐÑмате разрешение за доÑтъп до тази ÑÐµÐºÑ†Ð¸Ñ Ð½Ð° хранилището. diff --git a/options/locale/locale_ca.ini b/options/locale/locale_ca.ini index 9cb7d5e50c..ea2af3b645 100644 --- a/options/locale/locale_ca.ini +++ b/options/locale/locale_ca.ini @@ -153,26 +153,26 @@ fuzzy = Difusa search = Cerca... type_tooltip = Tipus de cerca fuzzy_tooltip = Inclou resultats que s'assemblen al terme de la cerca -repo_kind = Cerca repos... -user_kind = Cerca usuaris... +repo_kind = Cerca repos… +user_kind = Cerca usuaris… code_search_unavailable = La cerca de codi no està disponible actualment. Si us plau concteu amb l'administrador del lloc. code_search_by_git_grep = Els resultats actuals de la cerca de codi són proporcionats per "git grep". Podríen haver-hi millors resultats si l'administrador del lloc habilita l'indexador de codi. -package_kind = Cerca paquets... -project_kind = Cerca projectes... -branch_kind = Cerca branques... -commit_kind = Cerca commits... -runner_kind = Cerca executors... +package_kind = Cerca paquets… +project_kind = Cerca projectes… +branch_kind = Cerca branques… +commit_kind = Cerca commits… +runner_kind = Cerca executors… no_results = Cap resultat coincident trobat. keyword_search_unavailable = La cerca per paraula clau no està disponible ara mateix. Si us plau contacteu amb l'administrador del lloc. union = Paraules clau union_tooltip = Inclou resultats que encaixen amb qualsevol paraula clau separada per espais -org_kind = Cerca organitzacions... -team_kind = Cerca teams... -code_kind = Cerca codi... -pull_kind = Cerca "pulls"... +org_kind = Cerca organitzacions… +team_kind = Cerca teams… +code_kind = Cerca codi… +pull_kind = Cerca "pulls"… exact = Exacte exact_tooltip = Inclou només resultats que són exactament el terme de cerca -issue_kind = Cerca problemes... +issue_kind = Cerca problemes… regexp = RegExp regexp_tooltip = Interpreta el terme de cerca com una expressió regular diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index 830065fb64..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 @@ -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 @@ -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 c82779ab60..99b5789de3 100644 --- a/options/locale/locale_da.ini +++ b/options/locale/locale_da.ini @@ -1,6 +1,3 @@ - - - [common] home = Hjem dashboard = Instrumentpanel @@ -978,8 +975,8 @@ delete_with_all_comments = Din konto er yngre end %s. For at undgÃ¥ spøgelsesko delete_account_title = Slet brugerkonto user_block_yourself = Du kan ikke blokere dig selv. pronouns_custom_label = Brugerdefinerede stedord -change_username_redirect_prompt.with_cooldown.one = Det gamle brugernavn vil være tilgængeligt for alle efter en nedkølingsperiode pÃ¥ %[1]d dag, du kan stadig kræve det gamle brugernavn tilbage i nedkølingsperioden. -change_username_redirect_prompt.with_cooldown.few = Det gamle brugernavn vil være tilgængeligt for alle efter en nedkølingsperiode pÃ¥ %[1]d dage, du kan stadig kræve det gamle brugernavn tilbage i nedkølingsperioden. +change_username_redirect_prompt.with_cooldown.one = Det gamle brugernavn vil være tilgængeligt for alle efter en nedkølingsperiode pÃ¥ %[1]d dag, Ã¥r. Du kan stadig kræve det gamle brugernavn tilbage i nedkølingsperioden. +change_username_redirect_prompt.with_cooldown.few = Det gamle brugernavn vil være tilgængeligt for alle efter en nedkølingsperiode pÃ¥ %[1]d dage, Ã¥r. Du kan stadig kræve det gamle brugernavn tilbage i nedkølingsperioden. keep_pronouns_private = Vis kun stedord til godkendte brugere keep_pronouns_private.description = Dette vil skjule dine stedord for besøgende, der ikke er logget ind. quota.applies_to_user = Følgende kvoteregler gælder for din konto @@ -1520,13 +1517,13 @@ issues.add_labels = tilføjede %s etiketterne %s issues.add_remove_labels = tilføjede %s og fjernede %s etiketter %s issues.add_milestone_at = `føjede dette til %s milepælen %s` issues.add_project_at = `føjede dette til %s- projektet %s` -issues.ref_reopening_from = `henviste til dette problem fra en pull-anmodning %[3]s, der vil genÃ¥bne den, %[1]s` +issues.ref_reopening_from = `henviste til dette problem fra en pull-anmodning %[3]s, der vil genÃ¥bne det, %[1]s` issues.ref_closed_from = `lukkede dette problem %[4]s %[2 ]s` issues.ref_reopened_from = `genÃ¥bnede dette problem %[4]s %[2 ]s` issues.ref_from = `fra %[1]s` issues.author = Forfatter issues.commit_ref_at = `henviste til dette problem fra en commit %s` -issues.ref_issue_from = `henviste til dette problem %[3]s %[2 ]s` +issues.ref_issue_from = `henviste til dette problem %[3]s %[1]s` issues.ref_pull_from = `henviste til denne pull-anmodning %[3]s %[1]s` issues.ref_closing_from = `henviste til dette problem fra en pull-anmodning %[3]s, der vil lukke det, %[1]s` issues.author.tooltip.issue = Denne bruger er forfatteren til dette problem. @@ -1582,7 +1579,7 @@ issues.change_ref_at = `ændret reference fra %s til issues.remove_ref_at = `fjernet reference %s %s` issues.add_ref_at = `tilføjet reference %s %s` issues.delete_branch_at = `slettet gren %s %s` -issues.filter_label_exclude = `Brug alt + klik/enter for at ekskludere etiketter` +issues.filter_label_exclude = Brug Alt + klik for at ekskludere etiketter issues.filter_milestone = Milepæl issues.filter_milestone_all = Alle milepæle issues.filter_milestone_none = Ingen milepæle @@ -2833,8 +2830,8 @@ team_permission_desc = Tilladelse members.member = Medlem settings.change_orgname_prompt = Bemærk: Ændring af organisationens navn vil ogsÃ¥ ændre din organisations URL og frigøre det gamle navn. settings.change_orgname_redirect_prompt = Det gamle navn vil omdirigere, indtil det gøres krav pÃ¥. -settings.change_orgname_redirect_prompt.with_cooldown.one = Det gamle organisationsnavn vil være tilgængeligt for alle efter en nedkølingsperiode pÃ¥ %[1]d dag, du kan stadig kræve det gamle navn tilbage i nedkølingsperioden. -settings.change_orgname_redirect_prompt.with_cooldown.few = Det gamle organisationsnavn vil være tilgængeligt for alle efter en nedkølingsperiode pÃ¥ %[1]d dage, du kan stadig kræve det gamle navn tilbage i . +settings.change_orgname_redirect_prompt.with_cooldown.one = Det gamle organisationsnavn vil være tilgængeligt for alle efter en nedkølingsperiode pÃ¥ %[1]d dag, Ã¥r. Du kan stadig kræve det gamle navn tilbage i nedkølingsperioden. +settings.change_orgname_redirect_prompt.with_cooldown.few = Det gamle organisationsnavn vil være tilgængeligt for alle efter en nedkølingsperiode pÃ¥ %[1]d dage, Ã¥r. Du kan stadig kræve det gamle navn tilbage i. settings.update_avatar_success = Organisationens avatar er blevet opdateret. members.public_helper = Gør skjult members.private = Skjult diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index f8bfc9258a..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.
Gib einen absoluten Pfad an, wenn Forgejo als Service gestartet wird. -reinstall_error=Du versuchst, in eine bereits existierende Forgejo Datenbank zu installieren +reinstall_error=Du versuchst, in eine bereits existierende Forgejo-Datenbank zu installieren reinstall_confirm_message=Eine Neuinstallation mit einer bestehenden Forgejo-Datenbank kann mehrere Probleme verursachen. In den meisten Fällen solltest du deine vorhandene „app.ini“ verwenden, um Forgejo auszuführen. Wenn du weißt, was du tust, bestätige die folgenden Angaben: reinstall_confirm_check_1=Die von der SECRET_KEY in app.ini verschlüsselten Daten können verloren gehen: Benutzer können sich unter Umständen nicht mit 2FA/OTP einloggen und Spiegel könnten nicht mehr richtig funktionieren. Mit der Ankreuzung dieses Kästchens bestätigst du, dass die aktuelle app.ini-Datei den korrekten SECRET_KEY enthält. reinstall_confirm_check_2=Die Repositorys und Einstellungen müssen eventuell neu synchronisiert werden. Durch das Ankreuzen dieses Kästchens bestätigst du, dass du die Hooks für die Repositorys und die authorized_keys-Datei manuell neu synchronisierst. Du bestätigst, dass du sicherstellst, dass die Repository- und Spiegeleinstellungen korrekt sind. reinstall_confirm_check_3=Du bestätigst, dass du absolut sicher bist, dass diese Forgejo mit der richtigen app.ini läuft, und du sicher bist, dass du neu installieren musst. Du bestätigst, dass du die oben genannten Risiken anerkennst. -err_empty_db_path=Der SQLite3 Datenbankpfad darf nicht leer sein. +err_empty_db_path=Der SQLite3-Datenbankpfad darf nicht leer sein. no_admin_and_disable_registration=Du kannst Selbst-Registrierungen nicht deaktivieren, ohne ein Administratorkonto zu erstellen. err_empty_admin_password=Das Administrator-Passwort darf nicht leer sein. err_empty_admin_email=Die Administrator-E-Mail darf nicht leer sein. @@ -463,7 +463,7 @@ openid_register_title=Neues Konto einrichten openid_register_desc=Die gewählte OpenID-URI ist unbekannt. Ordne sie hier einem neuen Account zu. openid_signin_desc=Gib deine OpenID-URI ein, zum Beispiel alice.openid.example.org oder https://openid.example.org/alice. disable_forgot_password_mail=Die Kontowiederherstellung ist deaktiviert, da keine E-Mail eingerichtet ist. Bitte kontaktiere den zuständigen Administrator. -disable_forgot_password_mail_admin=Die Kontowiederherstellung ist nur verfügbar, wenn eine E-Mail eingerichtet wurde. Bitte richte eine E-Mail Adresse ein, um die Kontowiederherstellung freizuschalten. +disable_forgot_password_mail_admin=Die Kontowiederherstellung ist nur verfügbar, wenn eine E-Mail eingerichtet wurde. Bitte richte eine E-Mail-Adresse ein, um die Kontowiederherstellung freizuschalten. email_domain_blacklisted=Du kannst dich nicht mit deiner E-Mail-Adresse registrieren. authorize_application=Anwendung autorisieren authorize_redirect_notice=Du wirst zu %s weitergeleitet, wenn du diese Anwendung autorisierst. @@ -530,8 +530,8 @@ issue.action.merge=@%[1]s hat #%[2]d in %[3]s zusammengeführt. issue.action.approve=@%[1]s hat diesen Pull-Request genehmigt. issue.action.reject=@%[1]s hat Änderungen auf diesem Pull-Request angefordert. issue.action.review=@%[1]s hat diesen Pull-Request kommentiert. -issue.action.review_dismissed=@%[1]s hat das letzte Review von %[2]s für diesen Pull-Request verworfen. -issue.action.ready_for_review=@%[1]s hat diesen Pull-Request zum Review freigegeben. +issue.action.review_dismissed=@%[1]s hat die letzte Sichtung von %[2]s für diesen Pull-Request verworfen. +issue.action.ready_for_review=@%[1]s hat diesen Pull-Request für die Sichtung freigegeben. issue.action.new=@%[1]s hat #%[2]d geöffnet. issue.in_tree_path=In %s: @@ -540,8 +540,8 @@ release.new.text=@%[1]s hat %[2]s in %[3]s released release.title=Titel: %s release.note=Anmerkung: release.downloads=Downloads: -release.download.zip=Quellcode (ZIP Datei) -release.download.targz=Quellcode (TAR.GZ Datei) +release.download.zip=Quellcode (ZIP) +release.download.targz=Quellcode (TAR.GZ) repo.transfer.subject_to=%s möchte „%s“ an %s übertragen repo.transfer.subject_to_you=%s möchte dir „%s“ übertragen @@ -633,7 +633,7 @@ repository_files_already_exist=Dateien für dieses Repository sind bereits vorha repository_files_already_exist.adopt=Dateien für dieses Repository existieren bereits und können nur übernommen werden. repository_files_already_exist.delete=Dateien für dieses Repository sind bereits vorhanden. Du must sie löschen. repository_files_already_exist.adopt_or_delete=Dateien für dieses Repository existieren bereits. Du musst sie entweder übernehmen oder löschen. -visit_rate_limit=Das Rate-Limit bei der Gegenseite wurde erreicht. +visit_rate_limit=Die Ratenbegrenzung bei der Gegenseite wurde erreicht. 2fa_auth_required=Die Gegenseite benötigt Zweifaktorauthentifikation. org_name_been_taken=Der Organisationsname ist bereits vergeben. team_name_been_taken=Der Teamname ist bereits vergeben. @@ -750,9 +750,9 @@ twofa=Zwei-Faktor-Authentifizierung (TOTP) account_link=Verknüpfte Benutzerkonten organization=Organisationen uid=UID -webauthn=Hardware-Sicherheitsschlüssel +webauthn=Zwei-Faktor-Authentifizierung (Sicherheitsschlüssel) -public_profile=Öffentliches Profil +public_profile=Öffentliches profil biography_placeholder=Erzähle anderen ein wenig über dich selbst! (Markdown wird unterstützt) location_placeholder=Teile deinen ungefähren Standort mit anderen profile_desc=Über dich @@ -787,7 +787,7 @@ comment_type_group_time_tracking=Zeiterfassung comment_type_group_deadline=Frist comment_type_group_dependency=Abhängigkeit comment_type_group_lock=Sperrstatus -comment_type_group_review_request=Angeforderte Reviews +comment_type_group_review_request=Angeforderte Sichtungen comment_type_group_pull_request_push=Hinzugefügte Commits comment_type_group_project=Projekt comment_type_group_issue_ref=Issue-Referenz @@ -873,7 +873,7 @@ gpg_key_matched_identities_long=Die eingebetteten Identitäten in diesem Schlüs gpg_key_verified=Verifizierter Schlüssel gpg_key_verified_long=Der Schlüssel wurde mit einem Token verifiziert. Er kann verwendet werden, um Commits zu verifizieren, die mit irgendeiner für diesen Nutzer aktivierten E-Mail-Adresse und irgendeiner Identität dieses Schlüssels übereinstimmen. gpg_key_verify=Verifizieren -gpg_invalid_token_signature=Der GPG-Key, die Signatur, und das Token stimmen nicht überein, oder das Token ist veraltet. +gpg_invalid_token_signature=Der GPG-Key, die Signatur und das Token stimmen nicht überein, oder das Token ist veraltet. gpg_token_required=Du musst eine Signatur für das folgende Token angeben gpg_token=Token gpg_token_help=Du kannst eine Signatur wie folgt generieren: @@ -885,9 +885,9 @@ ssh_key_verified=Verifizierter Schlüssel ssh_key_verified_long=Der Schlüssel wurde mit einem Token verifiziert. Er kann verwendet werden, um Commits zu verifizieren, die mit irgendeiner für diesen Nutzer aktivierten E-Mail-Adresse und irgendeiner Identität dieses Schlüssels übereinstimmen. ssh_key_verify=Verifizieren ssh_invalid_token_signature=Der gegebene SSH-Schlüssel, Signatur oder Token stimmen nicht überein oder der Token ist veraltet. -ssh_token_required=Du musst eine Signatur für den Token unten angeben +ssh_token_required=Sie müssen eine Signatur für das Token unten angeben ssh_token=Token -ssh_token_help=Du kannst eine Signatur wie folgt generieren: +ssh_token_help=Sie können eine Signatur wie folgt generieren: ssh_token_signature=SSH-Textsignatur (armored signature) key_signature_ssh_placeholder=Beginnt mit „-----BEGIN SSH SIGNATURE-----“ verify_ssh_key_success=SSH-Key „%s“ wurde verifiziert. @@ -902,10 +902,10 @@ add_principal_success=Die SSH-Zertifikatsidentität „%s“ wurde hinzugefügt. delete_key=Entfernen ssh_key_deletion=SSH-Schlüssel entfernen gpg_key_deletion=GPG-Schlüssel entfernen -ssh_principal_deletion=SSH-Zertifik-Identität entfernen +ssh_principal_deletion=SSH-Zertifikats-Principal entfernen ssh_key_deletion_desc=Wenn du einen SSH-Key entfernst, hast du mit diesem Key keinen Zugriff mehr. Fortfahren? gpg_key_deletion_desc=Wenn du einen GPG-Schlüssel entfernst, können damit unterschriebene Commits nicht mehr verifiziert werden. Fortfahren? -ssh_principal_deletion_desc=Das Entfernen einer SSH-Zertifikat-Identität entzieht den Zugriff auf dein Konto. Fortfahren? +ssh_principal_deletion_desc=Das Entfernen eines SSH-Zertifikats-Principals entzieht den Zugriff auf dein Konto. Fortfahren? ssh_key_deletion_success=Der SSH-Schlüssel wurde entfernt. gpg_key_deletion_success=Der GPG-Schlüssel wurde entfernt. ssh_principal_deletion_success=Die Identität wurde entfernt. @@ -931,7 +931,7 @@ unbind_success=Das soziale Konto wurde erfolgreich entfernt. manage_access_token=Zugriffstokens generate_new_token=Neuen Token erzeugen -tokens_desc=Diese Tokens gewähren vollen Zugriff auf dein Konto via die Forgejo-API. +tokens_desc=Diese Tokens gewähren vollen Zugriff auf dein Konto mit der Forgejo-API. token_name=Token-Name generate_token=Token generieren generate_token_success=Ein neuer Token wurde generiert. Kopiere diesen jetzt, da er nicht erneut angezeigt wird. @@ -970,8 +970,8 @@ save_application=Speichern oauth2_client_id=Client-ID oauth2_client_secret=Client-Geheimnis oauth2_regenerate_secret=Geheimnis neu generieren -oauth2_regenerate_secret_hint=Secret verloren? -oauth2_client_secret_hint=Das Secret wird nach dem Verlassen oder Aktualisieren dieser Seite nicht mehr angezeigt. Bitte stelle sicher, dass du es gespeichert hast. +oauth2_regenerate_secret_hint=Geheimnis verloren? +oauth2_client_secret_hint=Das Geheimnis wird nach dem Verlassen oder Aktualisieren dieser Seite nicht mehr angezeigt. Bitte stelle sicher, dass du es gespeichert hast. oauth2_application_edit=Bearbeiten oauth2_application_create_description=OAuth2-Anwendungen geben deiner Drittanwendung Zugriff auf Benutzeraccounts dieser Forgejo-Instanz. oauth2_application_remove_description=Das Entfernen einer OAuth2-Anwendung hat zur Folge, dass diese nicht mehr auf autorisierte Benutzeraccounts auf dieser Instanz zugreifen kann. Möchtest Du fortfahren? @@ -996,11 +996,11 @@ twofa_disable_desc=Wenn du die Zwei-Faktor-Authentifizierung deaktivierst, wird regenerate_scratch_token_desc=Wenn du deinen Wiederherstellungsschlüssel verlegst oder es bereits benutzt hast, kannst du es hier zurücksetzen. twofa_disabled=Zwei-Faktor-Authentifizierung wurde deaktiviert. scan_this_image=Scanne diese Grafik mit deiner Authentifizierungs-App: -or_enter_secret=Oder gib das Secret ein: %s +or_enter_secret=Oder gib das Geheimnis ein: %s then_enter_passcode=Und gib dann die angezeigte PIN der Anwendung ein: passcode_invalid=Die PIN ist falsch. Probiere es erneut. twofa_enrolled=Die Zwei-Faktor-Authentifizierung wurde für dein Konto aktiviert. Bewahre deinen einmalig verwendbaren Wiederherstellungsschlüssel (%s) an einem sicheren Ort auf, da er nicht wieder angezeigt werden wird. -twofa_failed_get_secret=Fehler beim Abrufen des Secrets. +twofa_failed_get_secret=Fehler beim Abrufen des Geheimnisses. webauthn_desc=Sicherheitsschlüssel sind Geräte, die kryptografische Schlüssel beeinhalten. Diese können für die Zwei-Faktor-Authentifizierung verwendet werden. Der Sicherheitsschlüssel muss den Standard „WebAuthn“ unterstützen. webauthn_register_key=Sicherheitsschlüssel hinzufügen @@ -1093,6 +1093,8 @@ access_token_regeneration = Zugangstoken regenerieren access_token_regeneration_desc = Einen Token zu regenerieren, wird den Zugriff auf deinen Account von Anwendungen, die ihn nutzen, zurückziehen. Dies kann nicht rückgängig gemacht werden. Fortsetzen? regenerate_token = Regenerieren +ssh_token_help_ssh_agent = , oder, falls Sie einen SSH-Agenten benutzen (mit der Variable SSH_AUTH_SOCK gesetzt): + [repo] owner=Besitzer owner_helper=Einige Organisationen könnten in der Dropdown-Liste nicht angezeigt werden, da die Anzahl an Repositorys begrenzt ist. @@ -1185,9 +1187,9 @@ blame.ignore_revs=Revisionen in .git-blame-ignore-revs werden i blame.ignore_revs.failed=Fehler beim Ignorieren der Revisionen in .git-blame-ignore-revs. author_search_tooltip=Zeigt maximal 30 Benutzer -tree_path_not_found_commit=Pfad %[1]s existiert nicht in Commit%[2]s -tree_path_not_found_branch=Pfad %[1]s existiert nicht in Branch %[2]s -tree_path_not_found_tag=Pfad %[1]s existiert nicht in Tag %[2]s +tree_path_not_found_commit=Pfad %[1]s existiert nicht im Commit %[2]s +tree_path_not_found_branch=Pfad %[1]s existiert nicht im Branch %[2]s +tree_path_not_found_tag=Pfad %[1]s existiert nicht im Tag %[2]s transfer.accept=Übertragung akzeptieren transfer.accept_desc=Übertragung nach „%s“ @@ -1248,7 +1250,7 @@ migrate.clone_local_path=oder ein lokaler Serverpfad migrate.permission_denied=Du hast keine Berechtigung zum Importieren lokaler Repositorys. migrate.permission_denied_blocked=Du kannst von keinen nicht erlaubten Hosts importieren. Bitte fragen deinen Administrator, die Einstellungen ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS zu überprüfen. migrate.invalid_local_path=Der lokale Pfad ist ungültig. Er existiert nicht oder ist kein Verzeichnis. -migrate.invalid_lfs_endpoint=Ungültiger LFS Endpunkt. +migrate.invalid_lfs_endpoint=Der LFS-Endpunkt ist nicht gültig. migrate.failed=Fehler bei der Migration: %v migrate.migrate_items_options=Zugangs-Token wird benötigt, um zusätzliche Elemente zu migrieren migrated_from=Migriert von %[2]s @@ -1324,7 +1326,7 @@ commit=Commit release=Release releases=Releases tag=Tag -released_this=hat released +released_this=hat releast tagged_this=hat getaggt file.title=%s an %s file_raw=Originalformat @@ -1448,7 +1450,7 @@ commits.older=Älter commits.newer=Neuer commits.signed_by=Signiert von commits.signed_by_untrusted_user=Signiert von nicht vertrauenswürdigen Benutzern -commits.signed_by_untrusted_user_unmatched=Signiert von nicht vertrauenswürdigen Benutzern, der nicht mit dem Committer übereinstimmt +commits.signed_by_untrusted_user_unmatched=Von einem nicht vertrauenswürdigen Benutzer, der nicht auf den Committer passt, signiert commits.gpg_key_id=GPG-Schlüssel-ID commits.ssh_key_fingerprint=SSH-Schlüssel-Fingerabdruck commits.view_path=An diesem Punkt im Verlauf anzeigen @@ -1459,7 +1461,7 @@ commit.revert-header=Setze zurück: %s commit.revert-content=Branch auswählen, der zurückgesetzt werden soll: commit.cherry-pick=Cherry-Pick commit.cherry-pick-header=Cherry-Picke: %s -commit.cherry-pick-content=Branch auswählen, auf dem Cherry-Picked werden soll: +commit.cherry-pick-content=Branch auswählen, zu dem das Ergebnis des Cherry-Picks angewendet werden soll: commitstatus.error=Fehler commitstatus.failure=Fehler @@ -1515,7 +1517,7 @@ issues.filter_assignees=Verantwortliche filtern issues.filter_milestones=Meilenstein filtern issues.filter_projects=Projekt filtern issues.filter_labels=Label filtern -issues.filter_reviewers=Reviewer filtern +issues.filter_reviewers=Prüfer filtern issues.new=Neues Issue issues.new.title_empty=Der Titel kann nicht leer sein issues.new.labels=Labels @@ -1535,7 +1537,7 @@ issues.new.closed_milestone=Geschlossene Meilensteine issues.new.assignees=Zuständige issues.new.clear_assignees=Zuständige entfernen issues.new.no_assignees=Niemand zuständig -issues.new.no_reviewers=Keine Reviewer +issues.new.no_reviewers=Keine Prüfer issues.choose.get_started=Los geht's issues.choose.open_external_link=Öffnen issues.choose.blank=Standard @@ -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 @@ -1654,7 +1656,7 @@ issues.create_comment=Kommentieren issues.closed_at=`hat dieses Issue %s geschlossen` issues.reopened_at=`hat dieses Issue %s wieder geöffnet` issues.commit_ref_at=`hat dieses Issue %s aus einem Commit referenziert` -issues.ref_issue_from=`hat %[1]s auf dieses Issue verwiesen %[3]s` +issues.ref_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` @@ -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 @@ -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,7 +2768,7 @@ wiki.cancel = Abbrechen settings.wiki_globally_editable = Allen erlauben, das Wiki zu bearbeiten settings.protect_branch_name_pattern_desc = Geschützte Branch-Namens-Patterns. Siehe die Dokumentation für Pattern-Syntax. Beispiele: main, release/** settings.ignore_stale_approvals = Abgestandene Genehmigungen ignorieren -settings.ignore_stale_approvals_desc = Genehmigungen, welche für ältere Commits gemacht wurden (abgestandene Reviews), nicht in die Gesamtzahl der Genehmigung des PRs mitzählen. Irrelevant, falls abgestandene Reviews bereits verworfen werden. +settings.ignore_stale_approvals_desc = Genehmigungen, welche für ältere Commits gemacht wurden (abgestandene Sichtungen), nicht in die Gesamtzahl der Genehmigung des PRs mitzählen. Irrelevant, falls abgestandene Sichtungen bereits verworfen werden. pulls.commit_ref_at = `referenzierte diesen Pull-Request aus einem Commit %s` pulls.fast_forward_only_merge_pull_request = Nur Fast-forward pulls.cmd_instruction_checkout_desc = Checke einen neuen Branch aus deinem Projekt-Repository aus und teste die Änderungen. @@ -2782,7 +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 @@ -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 398a0d9ce4..41c55beb11 100644 --- a/options/locale/locale_el-GR.ini +++ b/options/locale/locale_el-GR.ini @@ -3939,12 +3939,12 @@ submodule=Υπομονάδα [search] code_search_unavailable = Η αναζήτηση κώδικα δεν είναι επί του παÏόντος διαθέσιμη. ΠαÏακαλώ επικοινωνήστε με τον διαχειÏιστή σας. keyword_search_unavailable = Η αναζήτηση με την χÏήση λέξεων-κλειδιών δεν είναι επί του παÏόντος διαθέσιμη. ΠαÏακαλώ επικοινωνήστε με τον διαχειÏιστή σας. -runner_kind = Αναζήτηση runner... +runner_kind = Αναζήτηση runner… code_search_by_git_grep = Για την αναζήτηση κώδικα, χÏησιμοποιείται η εντολή «git grep». Ίσως να παÏουσιαστοÏν καλÏτεÏα αποτελέσματα, αν ο διαχειÏιστής σας ενεÏγοποιήσει ένα ευÏετήÏιο για αποθετήÏια («Repository Indexer»). package_kind = Αναζήτηση πακέτων… -project_kind = Αναζήτηση έÏγων... +project_kind = Αναζήτηση έÏγων… branch_kind = Αναζήτηση κλάδων… -commit_kind = Αναζήτηση commit... +commit_kind = Αναζήτηση commit… no_results = Δεν βÏέθηκαν κατάλληλα αποτελέσματα. search = Αναζήτηση… type_tooltip = Είδος αναζήτησης @@ -3958,8 +3958,8 @@ org_kind = Αναζήτηση οÏγανισμών… team_kind = Αναζήτηση ομαδών… code_kind = Αναζήτηση κώδικα… exact_tooltip = Îα συμπεÏιληφθοÏν μόνο αποτελέσματα που ταιÏιάζουν με τον ÏŒÏο αναζήτησης -issue_kind = Αναζήτηση ζητημάτων... -pull_kind = Αναζήτηση pull... +issue_kind = Αναζήτηση ζητημάτων… +pull_kind = Αναζήτηση pull… exact = ΑκÏιβής milestone_kind = Αναζήτηση οÏόσημων... union = Ένωση diff --git a/options/locale/locale_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 bdafba93b4..c783b1605b 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -740,7 +740,7 @@ avatar=Avatar ssh_gpg_keys=Claves SSH / GPG social=Redes sociales applications=Aplicaciones -orgs=Administrar organizaciones +orgs=Organizaciones repos=Repositorios delete=Eliminar cuenta twofa=Autenticación de dos factores (TOTP) @@ -1075,8 +1075,8 @@ keep_pronouns_private = Mostrar pronombres solo a personas autenticadas storage_overview = Resumen del almacenamiento quota.sizes.assets.artifacts = Artefactos quota.sizes.assets.attachments.releases = Archivos adjuntos del lanzamiento -change_username_redirect_prompt.with_cooldown.few = El antiguo nombre de usuario estará disponible para todos después un periodo de tiempo de espera de %[1]d días, aún puedes reclamar el antiguo nombre de usuario durante el periodo de tiempo de espera. -change_username_redirect_prompt.with_cooldown.one = El antiguo nombre de usuario estará disponible para todos después un periodo de tiempo de espera de %[1]d día, aún puedes reclamar el antiguo nombre de usuario durante el periodo de tiempo de espera. +change_username_redirect_prompt.with_cooldown.few = El antiguo nombre de usuario estará disponible para todos después un periodo de tiempo de espera de %[1]d días. Aún puedes reclamar el antiguo nombre de usuario durante el periodo de tiempo de espera. +change_username_redirect_prompt.with_cooldown.one = El antiguo nombre de usuario estará disponible para todos después un periodo de tiempo de espera de %[1]d día. Aún puedes reclamar el antiguo nombre de usuario durante el periodo de tiempo de espera. quota.rule.exceeded = Excedido quota.rule.no_limit = Ilimitado quota.sizes.assets.all = Activos @@ -1574,7 +1574,7 @@ issues.remove_ref_at=`eliminó la referencia %s %s` issues.add_ref_at=`añadió la referencia %s %s` issues.delete_branch_at=`eliminó la rama %s %s` issues.filter_label=Etiqueta -issues.filter_label_exclude=`Usa alt + clic/enter para excluir etiquetas` +issues.filter_label_exclude=Usa Alt + Click para excluir etiquetas issues.filter_label_no_select=Todas las etiquetas issues.filter_label_select_no_label=Sin etiqueta issues.filter_milestone=Hito @@ -2888,6 +2888,9 @@ summary_card_alt = Tarjeta de resumen del repositorio %s settings.pull_mirror_sync_quota_exceeded = Cuota excedida, no se empujan los cambios. archive.nocomment = No es posible hacer comentarios porque el repositorio está archivado. +sync_fork.branch_behind_one = Esta rama esta %[1]d cambios detrás de %[2]s +sync_fork.branch_behind_few = Esta rama está %[1]d confirmaciones detrás de %[2]s + [graphs] component_loading = Cargando %s… component_loading_failed = No se pudo cargar %s diff --git a/options/locale/locale_et.ini b/options/locale/locale_et.ini index e54ceadbb5..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 dae0695495..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=ÙØ¹Ø§Ù„ شده @@ -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 164a60cc8d..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. @@ -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. diff --git a/options/locale/locale_fil.ini b/options/locale/locale_fil.ini index 8c9badb04b..c28e90c87a 100644 --- a/options/locale/locale_fil.ini +++ b/options/locale/locale_fil.ini @@ -699,7 +699,7 @@ security = Seguridad avatar = Avatar ssh_gpg_keys = Mga SSH / GPG key applications = Mga Aplikasyon -orgs = Ipamahala ang mga organisasyon +orgs = Mga organisasyon repos = Mga Repositoryo delete = Burahin ang account twofa = Authentikasyong two-factor (TOTP) @@ -707,7 +707,7 @@ account_link = Mga naka-link na account uid = UID webauthn = Authentikasyong two-factor (Mga security key) blocked_users = Mga hinarang na user -public_profile = Pampublikong Profile +public_profile = Pampublikong profile location_placeholder = Ibahagi ang iyong tinatayang lokasyon sa iba password_username_disabled = Ang mga di-lokal na gumagamit ay hindi pinapayagan na baguhin ang kanilang username. Mangyaring makipag-ugnayan sa iyong tagapangasiwa ng site para sa higit pang mga detalye. full_name = Buong pangalan @@ -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. diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 1cb7103bc0..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 @@ -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 @@ -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 3bb06e8c21..c8f4d2a72c 100644 --- a/options/locale/locale_ga-IE.ini +++ b/options/locale/locale_ga-IE.ini @@ -132,20 +132,20 @@ fuzzy = Doiléir fuzzy_tooltip = Cuir san áireamh torthaí a mheaitseálann an téarma cuardaigh go dlúth freisin exact = Beacht exact_tooltip = Ní chuir san áireamh ach torthaí a mheaitseálann leis an téarma -repo_kind = Cuardaigh stórtha... -user_kind = Cuardaigh úsáideoirí... -org_kind = Cuardaigh eagraíochtaí... -team_kind = Cuardaigh foirne... -code_kind = Cód cuardaigh... +repo_kind = Cuardaigh stórtha… +user_kind = Cuardaigh úsáideoirí… +org_kind = Cuardaigh eagraíochtaí… +team_kind = Cuardaigh foirne… +code_kind = Cód cuardaigh… code_search_unavailable = Níl cuardach cód ar fáil faoi láthair. Déan teagmháil le riarthóir an láithreáin. -package_kind = Cuardaigh pacáistí... -project_kind = Cuardaigh tionscadail... -branch_kind = Cuardaigh brainsí... -commit_kind = Cuardaigh tiomáintí... -runner_kind = Cuardaigh reathaithe... +package_kind = Cuardaigh pacáistí… +project_kind = Cuardaigh tionscadail… +branch_kind = Cuardaigh brainsí… +commit_kind = Cuardaigh tiomáintí… +runner_kind = Cuardaigh reathaithe… no_results = Níl aon torthaí meaitseála le fáil. -issue_kind = Saincheisteanna cuardaigh... -pull_kind = Cuardaigh iarratais tarraingthe... +issue_kind = Saincheisteanna cuardaigh… +pull_kind = Cuardaigh iarratais tarraingthe… keyword_search_unavailable = Níl cuardach de réir eochairfhocal ar fáil faoi láthair. Déan teagmháil le riarthóir an láithreáin. [aria] @@ -507,12 +507,12 @@ avatar = Abhatár ssh_gpg_keys = Eochracha SSH/GPG applications = Iarratais repos = Stórais -delete = Scrios Cuntas +delete = Scrios cuntas twofa = Fíordheimhniú Dhá Fachtóir (TOTP) organization = Eagraíochtaí uid = UID webauthn = Fíordheimhniú Dhá-Fachtóir (Eochracha Slándála) -public_profile = Próifíl Phoiblí +public_profile = Próifíl phoiblí location_placeholder = Comhroinn do shuíomh thart le daoine eile full_name = Ainm Iomlán website = Láithreán Gréasáin diff --git a/options/locale/locale_gl.ini b/options/locale/locale_gl.ini index 3854b375af..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 3e93ee8ba9..c6eca84ac7 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -330,7 +330,7 @@ code_no_results=Nincs találat a keresési kifejezésedre. code_last_indexed_at=Utoljára indexelve: %s [auth] -create_new_account=Regisztráció +create_new_account=Fiók regisztrálása register_helper_msg=Van már felhasználói fiókja? Jelentkezzen be! social_register_helper_msg=Van már felhasználói fiókja? Csatlakoztassa most! disable_register_prompt=Regisztráció le van tiltva. Kérjük, lépjen kapcsolatba az oldal adminisztrátorával. @@ -532,8 +532,8 @@ password_change_disabled=A nem helyi felhasználók nem frissíthetik jelszavuka emails=E-mail címek manage_emails=E-mail címek kezelése -manage_themes=Válassza ki az alapértelmezett témát -manage_openid=OpenID címek kezelése +manage_themes=Alapértelmezett téma +manage_openid=OpenID címek theme_desc=Ez lesz az alapértelmezett téma az oldalon. primary=ElsÅ‘dleges activated=Aktivált @@ -1779,14 +1779,14 @@ directory = Könyvtár [search] search = Keresés... type_tooltip = Keresés típusa -code_kind = Kód keresése... +code_kind = Kód keresése… code_search_unavailable = A kódban való keresés jelenleg nem elérhetÅ‘. Kérem vegye fel a kapcsolatot az oldal adminisztrátorával. -package_kind = Csomagok keresése... -project_kind = Projektek keresése... -user_kind = Felhasználók keresése... -repo_kind = Tárak keresése... -org_kind = Szervezetek keresése... -team_kind = Csapatok keresése... +package_kind = Csomagok keresése… +project_kind = Projektek keresése… +user_kind = Felhasználók keresése… +repo_kind = Tárak keresése… +org_kind = Szervezetek keresése… +team_kind = Csapatok keresése… exact = Pontos code_search_by_git_grep = A kódkeresés jelenleg a "git grep" parancsot használja. Lehet, hogy jobb találatok is lennének, ha a webhely adminisztrátora bekapcsolja a forráskód indexelését. milestone_kind = Mérföldkövek keresése... @@ -1794,8 +1794,8 @@ fuzzy_tooltip = A keresési kifejezéshez hasonló találatok mutatása fuzzy = Hasonlók union = Kulcsszavakra union_tooltip = A szóközzel elválasztott kulcsszavak bármelyikét tartalmazó találatok mutatása -branch_kind = Ãgak keresése... +branch_kind = Ãgak keresése… no_results = Nincsenek megfelelÅ‘ találatok. -issue_kind = Hibajegyek keresése... +issue_kind = Hibajegyek keresése… exact_tooltip = Csak a keresési kifejezést pontosan tartalmazó találatok mutatása keyword_search_unavailable = A kulcsszó alapú keresés jelenleg nem elérhetÅ‘. Kérlek értesítsd az oldal rendszergazdáját. diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini index f1a392105e..56993bec0d 100644 --- a/options/locale/locale_id-ID.ini +++ b/options/locale/locale_id-ID.ini @@ -206,9 +206,9 @@ email_title = Pengaturan email smtp_from = Kirim Email Sebagai [home] -uname_holder=Nama Pengguna atau Alamat Surel +uname_holder=Nama pengguna atau alamat surel password_holder=Kata Sandi -switch_dashboard_context=Alihkan Dasbor Konteks +switch_dashboard_context=Alihkan dasbor konteks my_repos=Repositori show_more_repos=Tampilkan repositori lainnya… collaborative_repos=Repositori Kolaboratif @@ -236,7 +236,7 @@ org_no_results=Tidak ada organisasi yang cocok ditemukan. code_no_results=Tidak ada kode sumber yang cocok dengan istilah yang anda cari. [auth] -create_new_account=Daftar Akun +create_new_account=Daftar akun register_helper_msg=Sudah memiliki akun? Masuk sekarang! social_register_helper_msg=Sudah memiliki akun? Hubungkan sekarang! disable_register_prompt=Maaf, pendaftaran telah dinonaktifkan. Silakan hubungi administrator situs. @@ -269,11 +269,11 @@ twofa_passcode_incorrect=Kata sandi Anda salah. Jika Anda salah tempatkan perang twofa_scratch_token_incorrect=Kode coretan anda tidak tepat. login_userpass=Masuk tab_openid=OpenID -oauth_signup_tab=Daftar Akun Baru -oauth_signup_submit=Akun Lengkap -oauth_signin_tab=Tautkan ke Akun yang Tersedia -oauth_signin_title=Masuk untuk Izinkan Akun Tertaut -oauth_signin_submit=Taut Akun +oauth_signup_tab=Daftar akun baru +oauth_signup_submit=Akun lengkap +oauth_signin_tab=Tautkan ke akun yang tersedia +oauth_signin_title=Masuk untuk izinkan akun tertaut +oauth_signin_submit=Taut akun openid_connect_submit=Sambungkan openid_connect_title=Sambungkan ke akun yang sudah ada openid_connect_desc=OpenID URI yang dipilih tak dikenal. Asosiasikan dengan akun baru disini. @@ -398,14 +398,14 @@ avatar=Avatar ssh_gpg_keys=Kunci SSH / GPG social=Akun Sosial applications=Aplikasi -orgs=Kelola organisasi +orgs=Organisasi repos=Repositori -delete=Hapus Akun +delete=Hapus akun twofa=Otentikasi Dua-Faktor account_link=Akun Tertaut organization=Organisasi -public_profile=Profil Publik +public_profile=Profil publik password_username_disabled=Pengguna non-lokal tidak diizinkan untuk mengubah nama pengguna mereka. Silakan hubungi administrator sistem anda untuk lebih lanjut. full_name=Nama Lengkap website=Situs Web @@ -438,8 +438,8 @@ password_change_disabled=Pengguna non-lokal tidak dapat mengganti kata sandi mer emails=Alamat Surel manage_emails=Kelola Alamat Surel -manage_themes=Pilih tema default -manage_openid=Kelola alamat OpenID +manage_themes=Tema default +manage_openid=Alamat OpenID theme_desc=Ini akan menjadi tema asal Anda pada keseluruhan situs. primary=Utama activated=Diaktifkan @@ -1484,10 +1484,10 @@ search = Cari... type_tooltip = Tipe pencarian fuzzy_tooltip = Termasuk juga hasil yang mendekati kata pencarian exact_tooltip = Hanya menampilkan hasil yang cocok dengan istilah pencarian -repo_kind = Cari repo... -user_kind = Telusuri pengguna... -org_kind = Cari organisasi... -team_kind = Cari tim... -code_kind = Cari kode... +repo_kind = Cari repo… +user_kind = Telusuri pengguna… +org_kind = Cari organisasi… +team_kind = Cari tim… +code_kind = Cari kode… code_search_unavailable = Pencarian kode saat ini tidak tersedia. Silahkan hubungi administrator. -branch_kind = Cari cabang... +branch_kind = Cari cabang… diff --git a/options/locale/locale_is-IS.ini b/options/locale/locale_is-IS.ini index baf8286923..f3333dbea2 100644 --- a/options/locale/locale_is-IS.ini +++ b/options/locale/locale_is-IS.ini @@ -223,7 +223,7 @@ default_keep_email_private.description=Fela sjálfgefið netföng nýrra notenda no_reply_address_helper=Lén fyrir notendur með falið netfang. Til dæmis notandanafnið „joe“ verður skráð í Git sem „joe@noreply.example.org“ ef falið tölvupóstlén er stillt á „noreply.example.org“. [home] -uname_holder=Notandanafn eða Netfang +uname_holder=Notandanafn eða netfang password_holder=Lykilorð my_repos=Hugbúnaðarsöfn show_more_repos=Sýna fleiri hugbúnaðarsöfn… @@ -255,7 +255,7 @@ org_no_results=Engar samsvarandi stofnanir fundust. code_no_results=Enginn samsvarandi frumkóði fannst eftur þínum leitarorðum. [auth] -create_new_account=Skrá Notanda +create_new_account=Skrá notanda register_helper_msg=Ertu nú þegar með notanda? Skráðu þig inn núna! social_register_helper_msg=Ertu nú þegar með reikning? Tengdu hann núna! manual_activation_only=Hafðu samband við stjórnanda vefsvæðisins til að ljúka virkjun. @@ -276,13 +276,13 @@ verify=Staðfesta scratch_code=Skrapkóði use_scratch_code=Nota skrapkóða twofa_scratch_token_incorrect=Skrapkóði þinn er rangur. -login_userpass=Skrá Inn +login_userpass=Skrá inn tab_openid=OpenID -oauth_signup_tab=Skrá Nýjan Notanda -oauth_signup_title=Klára Nýjum Notanda -oauth_signup_submit=Klára Notanda -oauth_signin_tab=Tengja Núverandi Reikning -oauth_signin_submit=Tengja Notanda +oauth_signup_tab=Skrá nýjan notanda +oauth_signup_title=Klára nýjum notanda +oauth_signup_submit=Klára notanda +oauth_signin_tab=Tengja núverandi reikning +oauth_signin_submit=Tengja notanda openid_connect_submit=Tengjast openid_register_title=Skrá nýjan notanda disable_forgot_password_mail=Endurheimting reiknings er óvirk vegna þess að enginn tölvupóstur er uppsettur. Vinsamlegast hafðu samband við síðustjórann þinn. @@ -434,15 +434,15 @@ avatar=Notandamynd ssh_gpg_keys=SSH og GPG Lyklar social=Félagsreikningar applications=Forrit -orgs=Stjórna Stofnunum +orgs=Stofnanir repos=Hugbúnaðarsöfn -delete=Eyða Reikningi +delete=Eyða reikningi twofa=Tvíþætt Auðkenning account_link=Tengdir Reikningar organization=Stofnanir webauthn=Öryggislyklar -public_profile=Opinber Notandasíða +public_profile=Opinber notandasíða password_username_disabled=Notendum utan staðarins er ekki heimilt að breyta notendanafni sínu. Vinsamlegast hafðu samband við síðustjórann þinn til að fá frekari upplýsingar. full_name=Fullt Nafn website=Vefsíða diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index d46f709cde..50405ed756 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -423,7 +423,7 @@ allow_password_change=Richiede all'utente di cambiare la password (scelta consig reset_password_mail_sent_prompt=Un'e-mail di conferma è stata inviata a %s. Per completare il processo di recupero dell'account, controlla la tua posta in arrivo e clicca sul link entro i prossimi %s secondi. active_your_account=Attiva il tuo account account_activated=L'account è stato attivato -prohibit_login=L'accesso è proibito +prohibit_login=L'account è sospeso resent_limit_prompt=Hai già richiesto un'e-mail d'attivazione recentemente. Si prega di attenere 3 minuti e poi riprovare. has_unconfirmed_mail=Ciao %s, hai un indirizzo di posta elettronica non confermato (%s). Se non hai ricevuto una e-mail di conferma o vuoi riceverla nuovamente, fare clic sul pulsante qui sotto. resend_mail=Clicca qui per inviare nuovamente l'e-mail di attivazione @@ -742,7 +742,7 @@ avatar=Avatar ssh_gpg_keys=Chiavi SSH / GPG social=Account Sociali applications=Applicazioni -orgs=Gestisci le organizzazioni +orgs=Organizzazioni repos=Repositori delete=Elimina account twofa=Verifica in due passaggi @@ -803,8 +803,8 @@ password_change_disabled=Gli utenti non locali non possono cambiare la loro pass emails=Indirizzi email manage_emails=Gestisci indirizzi email -manage_themes=Seleziona il tema predefinito -manage_openid=Gestisci gli indirizzi OpenID +manage_themes=Tema predefinito +manage_openid=Indirizzi OpenID theme_desc=Questo sarà il tuo tema di predefinito in tutto il sito. primary=Primario activated=Attivato @@ -4014,25 +4014,25 @@ type_tooltip = Tipo ricerca search = Cerca… fuzzy = Approssimativa match = Precisa -org_kind = Cerca organizzazioni... -package_kind = Ricerca pacchetti... +org_kind = Cerca organizzazioni… +package_kind = Ricerca pacchetti… code_search_unavailable = La ricerca del codice non è attualmente disponibile. Contatta l'amministratorÉ™ del sito. -code_kind = Cerca nel codice... -team_kind = Cerca team... +code_kind = Cerca nel codice… +team_kind = Cerca team… code_search_by_git_grep = I risultati della ricerca del codice sono forniti da "git grep". Potrebbero esserci risultati migliori se l'amministratore del sito avesse abilitato l'indicizzatore del codice. -project_kind = Ricerca progetti... -commit_kind = Ricerca commit... -branch_kind = Ricerca rami... +project_kind = Ricerca progetti… +commit_kind = Ricerca commit… +branch_kind = Ricerca rami… no_results = Non è stato trovato alcun risultato. keyword_search_unavailable = La ricerca per parole chiave non è attualmente disponibile. Contatta l'amministratore del sito. -runner_kind = Ricerca esecutori... +runner_kind = Ricerca esecutori… match_tooltip = Includi solo risultati che corrispondono precisamente al termine di ricerca fuzzy_tooltip = Includi anche risultati che corrispondono approssimativamente al termine di ricerca -user_kind = Cerca utenti... -repo_kind = Cerca repo... +user_kind = Cerca utenti… +repo_kind = Cerca repo… exact_tooltip = Includi solo i risultati che corrispondono esattamente al termine di ricerca -issue_kind = Cerca segnalazioni... -pull_kind = Cerca richieste... +issue_kind = Cerca segnalazioni… +pull_kind = Cerca richieste… exact = Esatto milestone_kind = Ricerca tappe... regexp_tooltip = Interpreta i termini di ricerca come un'espressione regolare diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index 555f5c6a75..f3a8922f88 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -250,7 +250,7 @@ err_empty_db_path=SQLite3ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ‘スを空ã«ã™ã‚‹ã“ã¨ã¯ã§ no_admin_and_disable_registration=管ç†è€…アカウントを作æˆã›ãšã«ã€ã‚»ãƒ«ãƒ•登録を無効ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 err_empty_admin_password=管ç†è€…パスワードã¯ç©ºã«ã§ãã¾ã›ã‚“。 err_empty_admin_email=管ç†è€…ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ç©ºã«ã§ãã¾ã›ã‚“。 -err_admin_name_is_reserved=管ç†è€…ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åãŒä¸æ­£ã§ã™ã€‚予約済ã¿ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã§ã™ã€‚ +err_admin_name_is_reserved=管ç†è€…ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åãŒä¸æ­£ã§ã™ã€‚予約済ã¿ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã§ã™ err_admin_name_pattern_not_allowed=管ç†è€…ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åãŒä¸æ­£ã§ã™ã€‚ 予約済ã¿ã®ãƒ‘ターンã«ãƒžãƒƒãƒã—ã¦ã„ã¾ã™ err_admin_name_is_invalid=管ç†è€…ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åãŒä¸æ­£ã§ã™ @@ -1048,6 +1048,8 @@ keep_activity_private.description = 公開アクティビティ language.description = ã“ã®è¨€èªžã¯ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ä¿å­˜ã•れã€ãƒ­ã‚°ã‚¤ãƒ³å¾Œã«ãƒ‡ãƒ•ォルトã¨ã—ã¦ä½¿ç”¨ã•れã¾ã™ã€‚ language.localization_project = Forgejo ã‚’ã‚ãªãŸã®è¨€èªžã«ç¿»è¨³ã™ã‚‹ã®ã‚’手ä¼ã£ã¦ãã ã•ã„。詳細ã¯ã“ã¡ã‚‰ã€‚ +quota = クオータ + [repo] new_repo_helper=リãƒã‚¸ãƒˆãƒªã«ã¯ã€ãƒ—ロジェクトã®ã™ã¹ã¦ã®ãƒ•ァイルã¨ãƒªãƒ“ジョン履歴ãŒå…¥ã‚Šã¾ã™ã€‚ ã™ã§ã«ã»ã‹ã®å ´æ‰€ã§ãƒ›ã‚¹ãƒˆã—ã¦ã„ã¾ã™ã‹ï¼Ÿ リãƒã‚¸ãƒˆãƒªã‚’移行 ã‚‚ã©ã†ãžã€‚ owner=オーナー @@ -3903,20 +3905,20 @@ submodule=サブモジュール [search] search = 検索... type_tooltip = 検索タイプ -org_kind = çµ„ç¹”ã®æ¤œç´¢... -code_kind = ã‚³ãƒ¼ãƒ‰ã®æ¤œç´¢... +org_kind = 組織を検索… +code_kind = コードを検索… fuzzy = ã‚ã„ã¾ã„ -repo_kind = リãƒã‚¸ãƒˆãƒªã®æ¤œç´¢... +repo_kind = リãƒã‚¸ãƒˆãƒªã‚’検索… code_search_unavailable = コード検索ã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“。サイト管ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 -branch_kind = ブランãƒã®æ¤œç´¢... -commit_kind = ã‚³ãƒŸãƒƒãƒˆã®æ¤œç´¢... -user_kind = ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®æ¤œç´¢... -team_kind = ãƒãƒ¼ãƒ ã®æ¤œç´¢... +branch_kind = ブランãƒã‚’検索… +commit_kind = コミットを検索… +user_kind = ユーザーを検索… +team_kind = ãƒãƒ¼ãƒ ã‚’検索… code_search_by_git_grep = ç¾åœ¨ã®ã‚³ãƒ¼ãƒ‰æ¤œç´¢çµæžœã¯ã€Œgit grepã€ã«ã‚ˆã£ã¦æä¾›ã•れã¾ã™ã€‚サイト管ç†è€…ãŒã‚³ãƒ¼ãƒ‰ インデクサーを有効ã«ã™ã‚‹ã¨ã€ã‚ˆã‚Šè‰¯ã„çµæžœãŒå¾—られるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ -package_kind = ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã®æ¤œç´¢... -project_kind = ãƒ—ãƒ­ã‚¸ã‚§ã‚¯ãƒˆã®æ¤œç´¢... +package_kind = パッケージを検索… +project_kind = プロジェクトを検索… keyword_search_unavailable = キーワードã«ã‚ˆã‚‹æ¤œç´¢ã¯ç¾åœ¨ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。サイト管ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 -runner_kind = ãƒ©ãƒ³ãƒŠãƒ¼ã®æ¤œç´¢... +runner_kind = ランナーを検索… no_results = 一致ã™ã‚‹çµæžœãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ fuzzy_tooltip = 入力ã•れãŸèªžå¥ã«è¿‘ã„ã‚‚ã®ã‚‚çµæžœã«å«ã‚ã‚‹ match = 一致 @@ -3924,8 +3926,8 @@ match_tooltip = 検索語å¥ã«å޳坆ã«ä¸€è‡´ã™ã‚‹ã‚‚ã®ã®ã¿çµæžœã«å«ã‚ milestone_kind = マイルストーンを検索... union_tooltip = 空白ã§åŒºåˆ‡ã‚‰ã‚ŒãŸã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã®ã„ãšã‚Œã‹ã«ä¸€è‡´ã™ã‚‹çµæžœã‚’å«ã‚ã‚‹ exact_tooltip = 検索語å¥ã¨å®Œå…¨ã«ä¸€è‡´ã™ã‚‹çµæžœã®ã¿ã‚’å«ã‚ã‚‹ -issue_kind = イシューを検索... -pull_kind = プルを検索... +issue_kind = イシューを検索… +pull_kind = プルを検索… exact = 完全一致 regexp_tooltip = 検索語å¥ã‚’æ­£è¦è¡¨ç¾ã¨ã—ã¦è§£é‡ˆã™ã‚‹ regexp = æ­£è¦è¡¨ç¾ diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini index be0400bea4..5e2354f3a8 100644 --- a/options/locale/locale_ko-KR.ini +++ b/options/locale/locale_ko-KR.ini @@ -384,7 +384,7 @@ allow_password_change=사용ìžì—게 비밀번호 ë³€ê²½ì„ ìš”ì²­ (권장ë¨) reset_password_mail_sent_prompt=í™•ì¸ ë©”ì¼ì´ %s로 전송ë˜ì—ˆìŠµë‹ˆë‹¤. ë°›ì€ íŽ¸ì§€í•¨ìœ¼ë¡œ ë„착한 ë©”ì¼ì„ %s ì•ˆì— í™•ì¸í•´ì„œ 비밀번호 찾기 절차를 완료하십시오. active_your_account=계정 활성화 account_activated=ê³„ì •ì´ í™œì„±í™” ë˜ì—ˆìŠµë‹ˆë‹¤ -prohibit_login = +prohibit_login = resent_limit_prompt=활성화를 위한 ì´ë©”ì¼ì„ ì´ë¯¸ 전송했습니다. 3ë¶„ 내로 ì´ë©”ì¼ì„ 받지 못한 경우 재시ë„해주세요. has_unconfirmed_mail=안녕하세요 %s, ì´ë©”ì¼ ì£¼ì†Œ(%s)ê°€ 확ì¸ë˜ì§€ 않았습니다. í™•ì¸ ë©”ì¼ì„ 받으시지 못하겼거나 새로운 í™•ì¸ ë©”ì¼ì´ 필요하다면, 아래 ë²„íŠ¼ì„ í´ë¦­í•´ 재발송하실 수 있습니다. resend_mail=여기를 눌러 í™•ì¸ ë©”ì¼ ìž¬ì „ì†¡ @@ -588,8 +588,8 @@ password_change_disabled=로컬 유저가 아닌 경우 Forgejo 웹 ì¸í„°íŽ˜ì´ emails=ì´ë©”ì¼ ì£¼ì†Œ manage_emails=ì´ë©”ì¼ ì£¼ì†Œ 관리 -manage_themes=기본 테마 ì„ íƒ -manage_openid=OpenID 주소 관리 +manage_themes=기본 테마 +manage_openid=OpenID 주소 theme_desc=ì´ í…Œë§ˆê°€ 사ì´íЏ ì „ì²´ 기본 테마가 ë©ë‹ˆë‹¤. primary=대표 activated=í™œì„±í™”ë¨ @@ -1900,9 +1900,9 @@ runs.commit=커밋 [search] code_search_by_git_grep = 현재 코드 검색 결과는 "git grep"ì— ì˜í•´ 제공ë©ë‹ˆë‹¤.관리ìžê°€ 코드 ì¸ë±ì„œë¥¼ 활성화하면 ë” ë‚˜ì€ ê²°ê³¼ê°€ ì œê³µë  ìˆ˜ 있습니다. -branch_kind = 브랜치 검색... +branch_kind = 브랜치 검색… keyword_search_unavailable = ì§€ê¸ˆì€ í‚¤ì›Œë“œë¡œ ê²€ìƒ‰ì´ ì§€ì›ë˜ì§€ 않습니다. 사ì´íЏ 관리ìžì—게 문ì˜í•˜ì‹­ì‹œì˜¤. -commit_kind = 커밋 검색... +commit_kind = 커밋 검색… no_results = ì¼ì¹˜í•˜ëŠ” 결과를 ì°¾ì„ ìˆ˜ 없습니다. search = 검색… type_tooltip = 검색 타입 @@ -1910,11 +1910,11 @@ fuzzy_tooltip = 검색어와 밀접하게 ì¼ì¹˜í•˜ëŠ” ê²°ê³¼ë„ í¬í•¨ repo_kind = 저장소 검색… user_kind = ì‚¬ìš©ìž ê²€ìƒ‰â€¦ org_kind = ì¡°ì§ ê²€ìƒ‰â€¦ -team_kind = 팀 검색... -code_kind = 코드 검색... +team_kind = 팀 검색… +code_kind = 코드 검색… code_search_unavailable = 코드 ê²€ìƒ‰ì€ í˜„ìž¬ 허용ë˜ì§€ 않았습니다. 사ì´íЏ 관리ìžì™€ ì—°ë½í•˜ì„¸ìš”. -package_kind = 패키지 검색... -project_kind = 프로ì íЏ 검색... +package_kind = 패키지 검색… +project_kind = 프로ì íЏ 검색… exact_tooltip = 검색어와 정확하게 ì¼ì¹˜í•˜ëŠ” 결과만 í¬í•¨ issue_kind = ì´ìŠˆ 검색… pull_kind = í’€ 검색… diff --git a/options/locale/locale_lt.ini b/options/locale/locale_lt.ini index 868e5bff6e..9d1c938379 100644 --- a/options/locale/locale_lt.ini +++ b/options/locale/locale_lt.ini @@ -149,24 +149,24 @@ fuzzy = Tikslintinas union_tooltip = Ä®traukti rezultatus, atitinkanÄius bet kurį iÅ¡ matomÄ… tarpÄ… atskirtų raktažodžių exact = Tiksliai exact_tooltip = Ä®traukti tik tuos rezultatus, kurie atitinka tiksliÄ… paieÅ¡kos frazÄ™ -user_kind = IeÅ¡koti naudotojų... -team_kind = IeÅ¡koti komandų... -code_kind = IeÅ¡koti kodo... +user_kind = IeÅ¡koti naudotojų… +team_kind = IeÅ¡koti komandų… +code_kind = IeÅ¡koti kodo… fuzzy_tooltip = Ä®traukti rezultatus, kurie taip pat labai atitinka paieÅ¡kos terminÄ… -repo_kind = IeÅ¡koti saugyklų... +repo_kind = IeÅ¡koti saugyklų… code_search_unavailable = Kodų paieÅ¡ka Å¡iuo metu nepasiekiama. Kreipkis į svetainÄ—s administratorių. -org_kind = IeÅ¡koti organizacijų... +org_kind = IeÅ¡koti organizacijų… union = Bendrinis code_search_by_git_grep = Dabartiniai kodo paieÅ¡kos rezultatai pateikiami atliekant „git grep“. Rezultatai gali bÅ«ti geresni, jei svetainÄ—s administratorius įjungs kodo indeksuotojÄ…. -package_kind = IeÅ¡koti paketų... -project_kind = IeÅ¡koti projektų... -commit_kind = IeÅ¡koti įsipareigojimų... -runner_kind = IeÅ¡koti vykdyklių... +package_kind = IeÅ¡koti paketų… +project_kind = IeÅ¡koti projektų… +commit_kind = IeÅ¡koti įsipareigojimų… +runner_kind = IeÅ¡koti vykdyklių… no_results = Nerasta atitinkamų rezultatų. -issue_kind = IeÅ¡koti problemų... -branch_kind = IeÅ¡koti Å¡akų... +issue_kind = IeÅ¡koti problemų… +branch_kind = IeÅ¡koti Å¡akų… milestone_kind = IeÅ¡koti gairių... -pull_kind = IeÅ¡koti sujungimų... +pull_kind = IeÅ¡koti sujungimų… keyword_search_unavailable = IeÅ¡koti pagal raktažodį Å¡iuo metu nepasiekiamas. Susisiekite su svetainÄ—s administratoriumi. regexp = Reguliarusis reiÅ¡kinys regexp_tooltip = Interpretuoti paieÅ¡kos terminÄ… kaip reguliariÄ…jÄ… reiÅ¡kinį diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 98baff217b..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 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 68fe899d6e..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 @@ -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. diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index 48442bc39f..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,8 +1556,8 @@ issues.close_comment_issue=Sluit met commentaar issues.reopen_issue=Heropen issues.reopen_comment_issue=Heropen met commentaar issues.create_comment=Reageer -issues.closed_at=`heeft dit probleem gesloten %s` -issues.reopened_at=`heropende dit probleem %s` +issues.closed_at=`heeft deze issue gesloten %s` +issues.reopened_at=`heropende deze issue %s` issues.commit_ref_at=`verwees naar dit probleem vanuit commit %s` issues.ref_issue_from=`refereerde aan dit issue %[3]s %[1]s` issues.ref_pull_from=`refereerde aan deze pull request %[3]s %[1]s` @@ -2915,6 +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 189e663618..a788badb47 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -1043,8 +1043,8 @@ language.title = DomyÅ›lny jÄ™zyk language.localization_project = Pomóż nam przetÅ‚umaczyć Forgejo na twój jÄ™zyk! Dowiedz siÄ™ wiÄ™cej. update_hints = Zaktualizuj wskazówki update_hints_success = Wskazówki zostaÅ‚y zaktualizowane. -change_username_redirect_prompt.with_cooldown.one = Stara nazwa użytkownika bÄ™dzie dostÄ™pna dla każdego po okresie ochronnym wynoszÄ…cym %[1]d dzieÅ„, nadal możesz uzyskać z powrotem starÄ… nazwÄ™ użytkownika podczas okresu ochronnego. -change_username_redirect_prompt.with_cooldown.few = Stara nazwa użytkownika bÄ™dzie dostÄ™pna dla każdego po okresie ochronnym wynoszÄ…cym %[1]d dni, nadal możesz uzyskać z powrotem starÄ… nazwÄ™ użytkownika podczas okresu ochronnego. +change_username_redirect_prompt.with_cooldown.one = Stara nazwa użytkownika bÄ™dzie dostÄ™pna dla każdego po okresie ochronnym wynoszÄ…cym %[1]d dzieÅ„. Nadal możesz uzyskać z powrotem starÄ… nazwÄ™ użytkownika podczas okresu ochronnego. +change_username_redirect_prompt.with_cooldown.few = Stara nazwa użytkownika bÄ™dzie dostÄ™pna dla każdego po okresie ochronnym wynoszÄ…cym %[1]d dni. Nadal możesz uzyskać z powrotem starÄ… nazwÄ™ użytkownika podczas okresu ochronnego. language.description = Ten jÄ™zyk zostanie zapisany na twoim koncie i bÄ™dzie używany jako domyÅ›lny po zalogowaniu. hidden_comment_types_description = Rodzaje komentarzy zaznaczone tutaj nie bÄ™dÄ… wyÅ›wietlaÅ‚y siÄ™ na stronach zgÅ‚oszeÅ„. Zaznaczenie "Etykieta" na przykÅ‚ad usunie wszystkie komentarze " dodaÅ‚/usunÄ…Å‚ ". principal_desc = Te podmioty certyfikatu SSH bÄ™dÄ… powiÄ…zane z twoim kontem i pozwolÄ… na peÅ‚en dostÄ™p do twoich repozytoriów. @@ -3951,29 +3951,29 @@ normal_file = ZwykÅ‚y plik search = Wyszukaj... type_tooltip = Typ wyszukiwania fuzzy = Przybliżone -package_kind = Wyszukaj pakiety... +package_kind = Wyszukaj pakiety… fuzzy_tooltip = UwzglÄ™dnij wyniki, które sÄ… bliskie wyszukiwanemu hasÅ‚u match = Dopasuj match_tooltip = UwzglÄ™dniaj tylko wyniki pasujÄ…ce do wyszukiwanego hasÅ‚a -repo_kind = Wyszukaj repozytoria... -user_kind = Wyszukaj użytkownilków... +repo_kind = Wyszukaj repozytoria… +user_kind = Wyszukaj użytkownilków… code_search_unavailable = Wyszukiwanie kodu jest obecnie niedostÄ™pne. Skontakuj sie z administratorem strony. no_results = Nie znaleziono pasujÄ…cych wyników. -org_kind = Wyszukaj organizacje... -team_kind = Wyszukaj zespoÅ‚y... -code_kind = Wyszukaj kod... +org_kind = Wyszukaj organizacje… +team_kind = Wyszukaj zespoÅ‚y… +code_kind = Wyszukaj kod… code_search_by_git_grep = Obecne wyniki wyszukiwania kodu sÄ… dostarczane przez "git grep". Wyniki mogÄ… być lepsze, jeÅ›li administrator witryny włączy indeksator kodu. -project_kind = Wyszukaj projekty... -branch_kind = Wyszukaj gałęzie... -commit_kind = Wyszukaj commity... -runner_kind = Wyszukaj runnery... +project_kind = Wyszukaj projekty… +branch_kind = Wyszukaj gałęzie… +commit_kind = Wyszukaj commity… +runner_kind = Wyszukaj runnery… keyword_search_unavailable = Wyszukiwanie wedÅ‚ug słów kluczowych jest obecnie niedostÄ™pne. Skontaktuj siÄ™ z administratorem strony. milestone_kind = Wyszukaj kamienie milowe... union_tooltip = UwzglÄ™dnia wyniki pasujÄ…ce do dowolnego sÅ‚owa kluczowego rozdzielonego biaÅ‚ymi znakami exact = DokÅ‚adne exact_tooltip = UwzglÄ™dniaj tylko wyniki pasujÄ…ce do wyszukiwanego hasÅ‚a -issue_kind = Wyszukaj zgÅ‚oszenia... -pull_kind = Wyszukaj pull requesty... +issue_kind = Wyszukaj zgÅ‚oszenia… +pull_kind = Wyszukaj pull requesty… union = Unia regexp = RegExp regexp_tooltip = Interpretuj wyszukiwane hasÅ‚o jako wyrażenie regularne diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 8de0374eb2..4ce186c44e 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -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 @@ -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 @@ -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. @@ -3900,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 @@ -3909,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 0e8f2d485e..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 @@ -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 2ef1b868d4..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=Ðекоторые организации могут не отображатьÑÑ Ð² раÑкрывающемÑÑ ÑпиÑке из-за макÑимального Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтва репозиториев. @@ -1641,9 +1643,9 @@ issues.closed_at=`задача была закрыта %s` issues.reopened_at=`задача была открыта Ñнова %s` issues.commit_ref_at=`упоминание Ñтой задачи в коммите %s` issues.ref_issue_from=`упоминание Ñтой задачи %[3]s %[1]s` -issues.ref_pull_from=`упоминание Ñтого запроÑа ÑлиÑÐ½Ð¸Ñ %[3]s %[1]s` -issues.ref_closing_from=`упоминание из запроÑа на ÑлиÑние %[3]s, который закроет Ñту задачу %[1]s` -issues.ref_reopening_from=`упоминание из запроÑа на ÑлиÑние %[3]s, который повторно откроет Ñту задачу %[1]s` +issues.ref_pull_from=`упомÑнул Ñтот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние %[3]s %[1]s` +issues.ref_closing_from=`упомÑнул Ñту задачу в запроÑе на ÑлиÑние %[3]s, который закроет её %[1]s` +issues.ref_reopening_from=`упомÑнул Ñту задачу в запроÑе на ÑлиÑние %[3]s, который переоткроет Ñту задачу %[1]s` issues.ref_closed_from=`закрыл Ñтот Ð·Ð°Ð¿Ñ€Ð¾Ñ %[4]s %[2]s` issues.ref_reopened_from=`задача была открыта Ñнова %[4]s %[2]s` issues.ref_from=`из %[1]s` @@ -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-хуки Ñтого Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ @@ -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 = Сервер не предоÑтавлÑет ключ Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñи коммита. diff --git a/options/locale/locale_si-LK.ini b/options/locale/locale_si-LK.ini index 54b0b246db..e1e19fa78e 100644 --- a/options/locale/locale_si-LK.ini +++ b/options/locale/locale_si-LK.ini @@ -482,7 +482,7 @@ avatar=අවතà·à¶»à·Š ssh_gpg_keys=SSH/ජීපීජී යතුරු social=සමà·à¶¢ ගිණුම් applications=යෙදුම් -orgs=සංවිධà·à¶± කළමනà·à¶šà¶»à¶«à¶º +orgs=සංවිධà·à¶± repos=à¶šà·à·‚්ඨ delete=ගිණුම මකන්න twofa=ද්වි-à·ƒà·à¶°à¶š සත්යà·à¶´à¶±à¶º @@ -527,8 +527,8 @@ password_change_disabled=දේà·à·“ය නොවන පරිà·à·“ලකය emails=වි-à¶­à·à¶´à·à¶½à·Š ලිපින manage_emails=වි-à¶­à·à¶´à·à¶½à·Š ලිපින කළමනà·à¶šà¶»à¶«à¶º -manage_themes=පෙරනිමි තේමà·à·€ à¶­à·à¶»à¶±à·Šà¶± -manage_openid=OpenID ලිපිනයන් කළමනà·à¶šà¶»à¶«à¶º කරන්න +manage_themes=පෙරනිමි තේමà·à·€ +manage_openid=OpenID ලිපින theme_desc=මෙම වෙබ් අඩවිය හරහ෠ඔබගේ පෙරනිමි තේමà·à·€ වනු ඇත. primary=à¶´à·Šà¶»à·à¶®à¶¸à·’à¶š activated=සක්රිය diff --git a/options/locale/locale_sk-SK.ini b/options/locale/locale_sk-SK.ini index 0c44df326a..aa2f863b14 100644 --- a/options/locale/locale_sk-SK.ini +++ b/options/locale/locale_sk-SK.ini @@ -597,7 +597,7 @@ avatar=Avatar ssh_gpg_keys=SSH / GPG kľúÄe social=Sociálne úÄty applications=Aplikácie -orgs=SpravovaÅ¥ organizácie +orgs=Organizácie repos=Repozitáre delete=ZmazaÅ¥ úÄet twofa=Dvojfaktorové overenie @@ -656,8 +656,8 @@ password_change_disabled=Externe overovaní používatelia nemôžu aktualizova emails=E-mailové adresy manage_emails=Správa e-mailových adries -manage_themes=Nastavenie predvolenej témy -manage_openid=Správa OpenID adries +manage_themes=Predvolená téma +manage_openid=Adresy OpenID theme_desc=Toto bude vaÅ¡a predvolená téma vzhľadu naprieÄ stránkou. primary=Primárny activated=Aktivovaný diff --git a/options/locale/locale_sl.ini b/options/locale/locale_sl.ini index 608e05afa4..07ccaed259 100644 --- a/options/locale/locale_sl.ini +++ b/options/locale/locale_sl.ini @@ -133,7 +133,7 @@ reinstall_confirm_check_3 = Potrjujete, da ste popolnoma prepriÄani, da se ta p require_db_desc = Forgejo zahteva MySQL, PostgreSQL, SQLite3 ali TiDB (protokol MySQL). password_algorithm_helper = Nastavite algoritem za stiskanje gesla. Algoritmi imajo razliÄne zahteve in moÄ. Algoritem argon2 je precej varen, vendar porabi veliko pomnilnika in je lahko neprimeren za majhne sisteme. reinstall_confirm_message = Ponovna namestitev z obstojeÄo zbirko podatkov Forgejo lahko povzroÄi veÄ težav. V veÄini primerov morate za zagon programa Forgejo uporabiti obstojeÄi "app.ini". ÄŒe veste, kaj poÄnete, potrdite naslednje: -err_admin_name_is_reserved = Administrator UporabniÅ¡ko ime je neveljavno, uporabniÅ¡ko ime je rezervirano +err_admin_name_is_reserved = Administrator uporabniÅ¡ko ime je neveljavno, uporabniÅ¡ko ime je rezervirano disable_gravatar.description = OnemogoÄite vire avatarjev Gravatar in avatarje tretjih oseb. Uporabi se privzeti avatar, razen Äe uporabnik lokalno naloži avatar. install = Namestitev title = ZaÄetna nastavitev @@ -367,7 +367,7 @@ delete = Brisanje raÄuna uploaded_avatar_is_too_big = Velikost naložene datoteke (%d KiB) presega najveÄjo velikost (%d KiB). webauthn = Dvofaktorsko preverjanje pristnosti (varnostni kljuÄi) change_username_redirect_prompt = Staro uporabniÅ¡ko ime bo preusmerjeno, dokler ga nekdo ne prevzame. -orgs = Upravljanje organizacij +orgs = Organizacije public_profile = Javni profil gpg_key_verified_long = KljuÄ je bil preverjen z žetonom in ga je mogoÄe uporabiti za preverjanje zavez, ki ustrezajo vsem aktiviranim e-poÅ¡tnim naslovom tega uporabnika, poleg vseh ujemajoÄih se identitet za ta kljuÄ. @@ -495,14 +495,14 @@ tab_openid = Odprta identiteta [home] show_both_archived_unarchived = Prikazovanje arhiviranih in nearhiviranih -switch_dashboard_context = Kontekst stikala Nadzorna ploÅ¡Äa +switch_dashboard_context = Kontekst stikala nadzorna ploÅ¡Äa search_repos = PoiÅ¡Äite skladiÅ¡Äe… filter_by_team_repositories = Filtriranje po skupinskih skladiÅ¡Äih show_archived = Arhivirano collaborative_repos = Sodelovalni repozitoriji my_mirrors = Moja ogledala show_only_public = Prikazovanje samo javnih -uname_holder = UporabniÅ¡ko ime ali E-poÅ¡tovni naslov +uname_holder = UporabniÅ¡ko ime ali e-poÅ¡tni naslov password_holder = Geslo my_repos = Repozitoriji show_more_repos = Prikaži veÄ skladišą diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index 8b43cb29b8..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 @@ -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 c07cefdab9..0bb49a2181 100644 --- a/options/locale/locale_tr-TR.ini +++ b/options/locale/locale_tr-TR.ini @@ -163,8 +163,8 @@ new_repo.link = Yeni depo new_org.link = Yeni organizasyon error413 = Kotanızı doldurdunuz. toggle_menu = Menüyü aç-kapa -new_migrate.title = Yeni geçiÅŸ -new_migrate.link = Yeni geçiÅŸ +new_migrate.title = Yeni göç +new_migrate.link = Yeni göç copy_path = Dizini kopyala confirm_delete_artifact = "%s" adlı öğeyi silmek istediÄŸinizden emin misiniz? @@ -179,8 +179,10 @@ number_of_contributions_in_the_last_12_months=son 12 ayda %s katkı contributions_zero=Katkı yapılmamış less=Daha az more=Daha Fazla -contributions_one = katılım -contributions_few = katılımlar +contributions_one = katkı +contributions_few = katkı + +contributions_format = {day} {month} {year} tarihinde {contributions} katkı [editor] buttons.heading.tooltip=BaÅŸlık ekle @@ -204,6 +206,13 @@ table_modal.placeholder.content = İçerik table_modal.label.rows = Satırlar table_modal.label.columns = Sütunlar +buttons.indent.tooltip = Bir seviye girinti artır +buttons.unindent.tooltip = Bir seviye girinti azalt +link_modal.header = BaÄŸlantı ekle +link_modal.url = Url +link_modal.description = Açıklama +link_modal.paste_reminder = İpucu: Panonuzdaki bir URL'yi doÄŸrudan düzenleyiciye yapıştırarak bir baÄŸlantı oluÅŸturabilirsiniz. + [filter] string.asc=A - Z string.desc=Z - A @@ -227,6 +236,8 @@ lightweight_desc=Forgejo'nın minimal gereksinimleri çok düşüktür ve ucuz b license=Açık Kaynak license_desc=Gidin ve Forgejo'yı edinin! Bu projeyi daha da iyi yapmak için katkıda bulunarak bize katılın. Katkıda bulunmaktan çekinmeyin! +platform_desc = Forgejo'nun Linux ve FreeBSD gibi özgür iÅŸletim sistemlerinde ve farklı CPU mimarilerinde çalıştığı doÄŸrulandı. SevdiÄŸinizi seçin! + [install] install=Kurulum title=BaÅŸlangıç Yapılandırması @@ -252,9 +263,9 @@ err_empty_db_path=SQLite3 veritabanı dosya yolu boÅŸ olamaz. no_admin_and_disable_registration=Bir yönetici hesabı oluÅŸturmadan kullanıcı kaydını kapatamazsınız. err_empty_admin_password=Yönetici parolası boÅŸ olamaz. err_empty_admin_email=Yönetici e-postası boÅŸ olamaz. -err_admin_name_is_reserved=Yönetici Kullanıcı Adı geçersiz, bu kullanıcı adı rezerv edilen bir kelimedir +err_admin_name_is_reserved=Yönetici kullanıcı adı geçersiz, bu kullanıcı adı rezerv edilen bir kelimedir err_admin_name_pattern_not_allowed=Yönetici kullanıcı adı geçersiz, kullanıcı adı ayrılmış bir desenle eÅŸleÅŸiyor -err_admin_name_is_invalid=Yönetici Kullanıcı Adı geçersiz +err_admin_name_is_invalid=Yönetici kullanıcı adı geçersiz general_title=Genel ayarlar app_name=Site BaÅŸlığı @@ -345,6 +356,8 @@ allow_dots_in_usernames = Kullanıcı isimlerinde noktaya izin ver. Var olan kul smtp_from_invalid = `"E-posta Olarak Gönder" adresi geçersiz` +config_location_hint = Bu yapılandırma seçenekleri ÅŸuraya kaydedilecek: + [home] uname_holder=Kullanıcı adı veya e-posta adresi password_holder=Parola @@ -478,6 +491,8 @@ sign_in_openid = OpenID ile giriÅŸ yap hint_login = Mevcut hesabın var mı? Hemen giriÅŸ yap! use_onetime_code = Tek kullanımlık kod kullan +change_unconfirmed_email = Kayıt sırasında yanlış e-posta adresi verdiyseniz, aÅŸağıdan deÄŸiÅŸtirebilirsiniz; yeni adresinize bir onay mesajı gönderilecektir. + [mail] view_it_on=%s üzerinde görüntüle reply=veya doÄŸrudan bu e-postayı yanıtlayın @@ -722,16 +737,16 @@ avatar=Avatar ssh_gpg_keys=SSH / GPG Anahtarları social=Sosyal Medya Hesapları applications=Uygulamalar -orgs=Organizasyonları Yönet +orgs=KuruluÅŸlar repos=Depolar -delete=Hesabı Sil -twofa=İki AÅŸamalı DoÄŸrulama +delete=Hesabı sil +twofa=İki aÅŸamalı doÄŸrulama account_link=BaÄŸlı Hesaplar organization=Organizasyonlar uid=UID webauthn=Güvenlik Anahtarları -public_profile=Herkese Açık Profil +public_profile=Herkese açık profil biography_placeholder=Bize kendiniz hakkında birÅŸeyler söyleyin! (Markdown kullanabilirsiniz) location_placeholder=Yaklaşık konumunuzu baÅŸkalarıyla paylaşın profile_desc=Profilinizin baÅŸkalarına nasıl gösterildiÄŸini yönetin. Ana e-posta adresiniz bildirimler, parola kurtarma ve web tabanlı Git iÅŸlemleri için kullanılacaktır. @@ -796,8 +811,8 @@ password_change_disabled=Yerel olmayan kullanıcılar parolalarını Forgejo web emails=E-Posta Adresleri manage_emails=E-posta Adreslerini Yönet -manage_themes=Varsayılan temayı seç -manage_openid=OpenID Adreslerini Yönet +manage_themes=Varsayılan tema +manage_openid=OpenID adresleri email_desc=Ana e-posta adresiniz bildirimler, parola kurtarma ve gizlenmemiÅŸse eÄŸer web tabanlı Git iÅŸlemleri için kullanılacaktır. theme_desc=Bu, sitedeki varsayılan temanız olacak. primary=Birincil @@ -1166,7 +1181,7 @@ form.name_reserved=Depo adı "%s" rezerve edilmiÅŸ. form.name_pattern_not_allowed=Depo adında "%s" deseni kullanılamaz. need_auth=Yetkilendirme -migrate_options=Göç Seçenekleri +migrate_options=Göç seçenekleri migrate_service=Göç Hizmeti migrate_options_mirror_helper=Bu depo bir yansı olacaktır migrate_options_lfs=LFS dosyalarını taşı @@ -1174,7 +1189,7 @@ migrate_options_lfs_endpoint.label=LFS Uç Noktası migrate_options_lfs_endpoint.description=Taşıma, LFS sunucusunu belirlemek için Git uzak sunucusunu kullanmaya çalışacak. EÄŸer LFS veri deposu baÅŸka yerdeyse özel bir uç nokta da belirtebilirsiniz. migrate_options_lfs_endpoint.description.local=Yerel bir sunucu yolu da destekleniyor. migrate_options_lfs_endpoint.placeholder=BoÅŸ bırakılırsa, uç nokta klon URL'sinden türetilecektir -migrate_items=Göç Öğeleri +migrate_items=Göç öğeleri migrate_items_wiki=Wiki migrate_items_milestones=Kilometre TaÅŸları migrate_items_labels=Etiketler @@ -1215,7 +1230,7 @@ migrate.migrating_labels=Etiketleri Taşıma migrate.migrating_releases=Sürümleri Taşıma migrate.migrating_issues=Konuları Taşıma migrate.migrating_pulls=DeÄŸiÅŸiklik İsteklerini Taşıma -migrate.cancel_migrating_title=Göçü İptal Et +migrate.cancel_migrating_title=Göçü iptal et migrate.cancel_migrating_confirm=Bu göçü iptal etmek istiyor musunuz? mirror_from=ÅŸunun yansıması @@ -1252,7 +1267,7 @@ find_tag=Etiketi bul branches=Dal tags=Etiket issues=Konular -pulls=DeÄŸiÅŸiklik İstekleri +pulls=DeÄŸiÅŸiklik istekleri project_board=Projeler packages=Paketler actions=İşlemler @@ -1443,7 +1458,7 @@ projects.column.set_default=Varsayılanı Ayarla projects.column.set_default_desc=Bu sütunu kategorize edilmemiÅŸ konular ve deÄŸiÅŸiklik istekleri için varsayılan olarak ayarlayın projects.column.unset_default=Varsayılanları Geri Al projects.column.unset_default_desc=Bu sütunu varsayılan olarak geri al -projects.column.delete=Sutün Sil +projects.column.delete=Sütunu sil projects.column.deletion_desc=Bir proje sütununun silinmesi, ilgili tüm konuları 'Kategorize edilmemiÅŸ'e taşır. Devam edilsin mi? projects.column.color=Renk projects.open=Aç @@ -1595,7 +1610,7 @@ issues.reopen_issue=Yeniden aç issues.reopen_comment_issue=Yorum Yap ve Yeniden Aç issues.create_comment=Yorum yap issues.closed_at=`%s konusunu kapattı` -issues.reopened_at=`%s konusunu yeniden açtı` +issues.reopened_at=%s sorununu yeniden açtı issues.commit_ref_at=`%s iÅŸlemesinde bu konuyu iÅŸaret etti` issues.ref_issue_from=`bu konuya referansta bulundu %[3]s %[1]s` issues.ref_pull_from=`bu deÄŸiÅŸiklik isteÄŸine referansta bulundu %[3]s %[1]s` @@ -1647,7 +1662,7 @@ issues.label.filter_sort.alphabetically=Alfabetik issues.label.filter_sort.reverse_alphabetically=Ters alfabetik issues.label.filter_sort.by_size=En küçük boyut issues.label.filter_sort.reverse_by_size=En büyük boyut -issues.num_participants_few=%d Katılımcı +issues.num_participants_few=%d katılımcı issues.attachment.open_tab=`Yeni bir sekmede "%s" görmek için tıkla` issues.attachment.download=`"%s" indirmek için tıkla` issues.subscribe=Abone Ol @@ -1984,7 +1999,7 @@ ext_wiki=Harici Vikiye EriÅŸim ext_wiki.desc=Harici bir wiki'ye baÄŸlantı. wiki=Wiki -wiki.welcome=Wiki'ye HoÅŸgeldiniz. +wiki.welcome=Viki'ye HoÅŸ geldiniz. wiki.welcome_desc=Wiki, katkıcılarla belge yazmanıza ve paylaÅŸmanıza olanak tanır. wiki.desc=Katkıcılarla belgeler yazın ve paylaşın. wiki.create_first_page=İlk sayfayı oluÅŸtur @@ -2140,15 +2155,15 @@ settings.use_external_wiki=Harici Wiki Kullan settings.external_wiki_url=Harici Wiki baÄŸlantısı settings.external_wiki_url_error=Harici wiki URL'si geçerli bir URL deÄŸil. settings.external_wiki_url_desc=Ziyaretçiler, wiki sekmesine tıklandığında harici wiki URL'sine yönlendirilir. -settings.issues_desc=Depo Konu İzleyicisini EtkinleÅŸtir -settings.use_internal_issue_tracker=YerleÅŸik Konu İzleyici Kullan -settings.use_external_issue_tracker=Harici Konu İzleyici Kullan -settings.external_tracker_url=Harici Konu İzleyici URLsi +settings.issues_desc=Depo sorun izleyicisini etkinleÅŸtir +settings.use_internal_issue_tracker=YerleÅŸik sorun izleyici kullan +settings.use_external_issue_tracker=Harici sorun izleyici kullan +settings.external_tracker_url=Harici sorun izleyici URL'si settings.external_tracker_url_error=Harici konu izleyici URL'si geçerli bir URL deÄŸil. settings.external_tracker_url_desc=Ziyaretçiler, konular sekmesine tıkladığında harici konu izleyici URL'sine yönlendirilir. -settings.tracker_url_format=Harici Konu İzleyici URL Biçimi +settings.tracker_url_format=Harici sorun izleyici URL Biçimi settings.tracker_url_format_error=Harici konu izleyici URL biçimi geçerli bir URL deÄŸil. -settings.tracker_issue_style=Harici Konu İzleyici Numara Biçimi +settings.tracker_issue_style=Harici sorun izleyici Numara Biçimi settings.tracker_issue_style.numeric=Sayısal settings.tracker_issue_style.alphanumeric=Alfanumerik settings.tracker_issue_style.regexp=Düzenli ifade @@ -2158,13 +2173,13 @@ settings.tracker_url_format_desc=Kullanıcı adı, depo adı ve yayın dizini i settings.enable_timetracker=Zaman Takibini EtkinleÅŸtir settings.allow_only_contributors_to_track_time=Sadece Katkıcılar İçin Zaman Takibine İzin Ver settings.pulls_desc=DeÄŸiÅŸiklik İsteklerini EtkinleÅŸtir -settings.pulls.ignore_whitespace=Çakışmalar için BoÅŸlukları Gözardı Et +settings.pulls.ignore_whitespace=Çakışmalar için boÅŸlukları gözardı et settings.pulls.enable_autodetect_manual_merge=KendiliÄŸinden algılamalı elle birleÅŸtirmeyi etkinleÅŸtir (Not: Bazı özel durumlarda yanlış kararlar olabilir) settings.pulls.allow_rebase_update=DeÄŸiÅŸiklik isteÄŸi dalının yeniden yapılandırmayla güncellenmesine izin ver settings.pulls.default_delete_branch_after_merge=Varsayılan olarak birleÅŸtirmeden sonra deÄŸiÅŸiklik isteÄŸi dalını sil settings.pulls.default_allow_edits_from_maintainers=Bakımcıların düzenlemelerine izin ver settings.releases_desc=Depo Sürümlerini EtkinleÅŸtir -settings.packages_desc=Depo paket kütüğünü etkinleÅŸtir +settings.packages_desc=Depo paket kayıt defterini etkinleÅŸtir settings.projects_desc=Depo Projelerini EtkinleÅŸtir settings.actions_desc=Depo İşlemlerini EtkinleÅŸtir settings.admin_settings=Yönetici Ayarları @@ -2188,7 +2203,7 @@ settings.convert_fork_desc=Bu çatalı normal bir depoya dönüştürebilirsiniz settings.convert_fork_notices_1=Bu iÅŸlem çatalı normal bir depoya dönüştürür ve geri alınamaz. settings.convert_fork_confirm=Depoyu Dönüştür settings.convert_fork_succeed=Çatal normal bir depoya dönüştürüldü. -settings.transfer.title=SahipliÄŸi Aktar +settings.transfer.title=SahipliÄŸi aktar settings.transfer.rejected=Depo aktarımı reddedildi. settings.transfer.success=Depo aktarımı baÅŸarıyla tamamlandı. settings.transfer_abort=Aktarımı iptal et @@ -2448,7 +2463,7 @@ settings.block_on_official_review_requests_desc=Yeterli onay olsa bile, resmi in settings.block_outdated_branch=DeÄŸiÅŸiklik isteÄŸi güncel deÄŸilse birleÅŸtirmeyi engelle settings.block_outdated_branch_desc=BaÅŸ dal taban dalın arkasındayken birleÅŸtirme mümkün olmayacaktır. settings.default_branch_desc=DeÄŸiÅŸiklik istekleri ve kod iÅŸlemeleri için varsayılan bir depo dalı seçin: -settings.merge_style_desc=Biçimleri BirleÅŸtir +settings.merge_style_desc=BirleÅŸtirme biçemleri settings.default_merge_style_desc=DeÄŸiÅŸiklik istekleri için varsayılan birleÅŸtirme tarzı: settings.choose_branch=Bir dal seç… settings.no_protected_branch=Korumalı dal yok. @@ -2701,7 +2716,7 @@ settings.new_owner_blocked_doer = Yeni sahip sizi engelledi. open_with_editor = %s ile aç object_format = Nesne Biçimi -mirror_sync = eÅŸitlendi +mirror_sync = eÅŸitlenme: stars = Yıldızlar desc.sha256 = SHA256 vendored = SaÄŸlanmış @@ -2722,6 +2737,26 @@ settings.ignore_stale_approvals = EskimiÅŸ onayları yoksay settings.ignore_stale_approvals_desc = Daha eski iÅŸlemelere (eski incelemelere) yapılmış olan onayları, Dİ'nin kaç onayı olduÄŸunu belirlerken sayma. EskimiÅŸ incelemeler atıldıysa bu ilgisizdir. error.broken_git_hook = Bu deponun Git İstemcileri bozuk gibi gözüküyor. Onarmak için lütfen belgelere bakın, daha sonra durumu yenilemek için bazı iÅŸlemeler itin. +mirror_public_key = Ortak SSH anahtarı +mirror_use_ssh.text = SSH yetkilendirme kullan +mirror_use_ssh.helper = Forgejo, bu seçeneÄŸi seçtiÄŸinizde deponuzu SSH üzerinden Git üzerinden yansıtacak ve sizin için bir anahtar çifti oluÅŸturacaktır. OluÅŸturulan ortak anahtarın hedef depoya gönderilmek üzere yetkilendirildiÄŸinden emin olmalısınız. Bunu seçerken parola tabanlı yetkilendirme kullanamazsınız. +mirror_use_ssh.not_available = SSH yetkilendirme kullanılamıyor. +mirror_denied_combination = Ortak anahtar ve parola tabanlı kimlik doÄŸrulama birlikte kullanılamaz. +n_commit_few = %s gönderi +n_branch_one = %s dal +n_branch_few = %s dal +n_tag_few = %s etiket +commits.browse_further = Daha fazlasına göz at +commits.renamed_from = %s adından yeniden adlandırıldı +issues.filter_no_results = Sonuç yok +issues.filter_no_results_placeholder = Arama filtrelerini deÄŸiÅŸtirmeyi deneyin. +issues.num_participants_one = %d katılımcı +settings.units.units = Birimler +settings.units.add_more = Daha fazlasını etkinleÅŸtir +settings.wiki_globally_editable = Vikiyi herkesin düzenlemesine izin ver +settings.default_update_style_desc = Temel dalın ardındaki çekme isteklerini güncellemek için kullanılan varsayılan güncelleme stili. +settings.wiki_rename_branch_main = Viki dal adını normalleÅŸtir + [graphs] component_loading = %s yükleniyor... component_loading_failed = %s yüklenemedi @@ -2736,7 +2771,7 @@ org_name_holder=Organizasyon Adı org_full_name_holder=Organizasyon Tam Adı org_name_helper=Organizasyon adları kısa ve hatırlanabilir olmalıdır. create_org=Organizasyon OluÅŸtur -repo_updated=Güncellendi %s +repo_updated=%s güncellendi members=Üyeler teams=Takımlar code=Kod @@ -2792,7 +2827,7 @@ members.membership_visibility=Üyelik Görünürlüğü: members.public=Görünür members.public_helper=gizle members.private=GizlenmiÅŸ -members.private_helper=görünür yap +members.private_helper=Görünür yap members.member_role=Üye Rolü: members.owner=Sahibi members.member=Üye @@ -3311,7 +3346,7 @@ config.git_max_diff_lines=Maksimum DeÄŸiÅŸiklik Satırı (tek bir dosya için) config.git_max_diff_line_characters=Maksimum DeÄŸiÅŸiklik Karakteri (tek bir satır için) config.git_max_diff_files=Maksimum DeÄŸiÅŸiklik Dosyaları (gösterilecek) config.git_gc_args=GC Argümanları -config.git_migrate_timeout=Göç İşlemi Zaman Aşımı +config.git_migrate_timeout=Göç iÅŸlemi zaman aşımı config.git_mirror_timeout=Yansı Güncelleme Zaman Aşımı config.git_clone_timeout=Klonlama İşlemi Zaman Aşımı config.git_pull_timeout=Çekme İşlemi Zaman Aşımı @@ -3363,7 +3398,7 @@ monitor.queue.settings.maxnumberworkers=En fazla çalışan Sayısı monitor.queue.settings.maxnumberworkers.placeholder=Åžu anda %[1]d monitor.queue.settings.maxnumberworkers.error=En fazla çalışan sayısı bir sayı olmalıdır monitor.queue.settings.submit=Ayarları Güncelle -monitor.queue.settings.changed=Ayarlar Güncellendi +monitor.queue.settings.changed=Ayarlar güncellendi monitor.queue.settings.remove_all_items=Tümünü kaldır monitor.queue.settings.remove_all_items_done=Kuyruktaki tüm öğeler kaldırıldı. @@ -3771,23 +3806,23 @@ submodule=Alt modül [search] -project_kind = Projeleri ara... +project_kind = Projeleri ara… org_kind = Organizasyonları ara… team_kind = Takımları ara… search = Ara… code_kind = Kod ara… type_tooltip = Arama türü -repo_kind = Depoları ara... +repo_kind = Depoları ara… user_kind = Kullanıcıları ara… milestone_kind = Kilometre taÅŸlarını ara... -branch_kind = Dalları ara... -package_kind = Paketleri ara... -commit_kind = Katkıları ara... -runner_kind = Çalıştırıcıları ara... +branch_kind = Dalları ara… +package_kind = Paketleri ara… +commit_kind = Katkıları ara… +runner_kind = Çalıştırıcıları ara… no_results = EÅŸleÅŸen sonuç bulunamadı. code_search_unavailable = Kod araması ÅŸu anda kullanıma açık deÄŸildir. Lütfen site yöneticisi ile iletiÅŸime geçin. -issue_kind = Sorunları ara... -pull_kind = BirleÅŸtirme isteklerini ara... +issue_kind = Sorunları ara… +pull_kind = BirleÅŸtirme isteklerini ara… code_search_by_git_grep = Anlık kod araması sonuçları "git grep" komutu tarafından saÄŸlanmaktadır. Site yöneticisinin kod endekslemesini açması durumunda daha iyi sonuçlar verilmesi mümkün olabilir. keyword_search_unavailable = Anahtar kelime ile arama ÅŸu anda kullanıma açık deÄŸildir. Lütfen site yöneticisi ile iletiÅŸime geçin. fuzzy_tooltip = Arama terimine yakın olan eÅŸleÅŸmeleri dahil et @@ -3795,3 +3830,15 @@ union_tooltip = BoÅŸlukla ayrılmış anahtar kelime eÅŸleÅŸmelerini dahil et exact_tooltip = Sadece arama terimiyle tam uyuÅŸan sonuçları dahit et. fuzzy = Bulanık exact = Tam +union = Anahtar sözcük +regexp = Düzenliİfade +regexp_tooltip = Arama terimini düzenli ifade olarak yorumla + +[munits.data] +b = B +kib = KiB +mib = MiB +gib = GiB +tib = TiB +pib = PiB +eib = EiB diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index faa3f2a56e..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 = Ð”Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача не вÑтановлено пароль. @@ -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=Прибрати виконавців @@ -1504,7 +1509,7 @@ issues.closed_at=`закриває цю задачу %s` issues.reopened_at=`повторно відкриває цю задачу %s` issues.commit_ref_at=`поÑилаєтьÑÑ Ð½Ð° цю задачу в коміті %s` issues.ref_issue_from=`поÑилаєтьÑÑ Ð½Ð° цю задачу %[3]s %[1]s` -issues.ref_pull_from=`поÑилаєтьÑÑ Ð½Ð° цей запит Ð·Ð»Ð¸Ñ‚Ñ‚Ñ %[3]s %[1]s` +issues.ref_pull_from=`поÑилаєтьÑÑ Ð½Ð° цей запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ %[3]s %[1]s` issues.ref_closing_from=`поÑилаєтьÑÑ Ð² запиті на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ %[3]s, Ñкий закриє цю задачу, %[1]s` issues.ref_reopening_from=`поÑилаєтьÑÑ Ð² запиті на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ %[3]s, Ñкий повторно відкриє цю задачу, %[1]s` issues.ref_closed_from=`закрив цю задачу %[4]s %[2]s` @@ -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 було оновлено, поки відбувалоÑÑ Ð¾Ð±'єднаннÑ. Підказка: Ñпробуйте знову. @@ -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,7 +1891,7 @@ settings.collaboration.read=Читати settings.collaboration.owner=ВлаÑник settings.collaboration.undefined=Ðе визначено settings.hooks=Веб-хуки -settings.githooks=Git хуки +settings.githooks=Git-хуки settings.basic_settings=ОÑновні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ settings.mirror_settings=ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð·ÐµÑ€ÐºÐ°Ð»Ð° settings.mirror_settings.mirrored_repository=Віддзеркалений репозиторій @@ -1894,9 +1899,9 @@ 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=ВлаÑні події… @@ -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 = Заголовок Ñторінки @@ -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=Облікові запиÑи кориÑтувачів @@ -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.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 відбуваютьÑÑ Ð¿ÐµÐ²Ð½Ñ– події. Вказані тут вебхуки Ñпрацьовуватимуть Ð´Ð»Ñ Ð²ÑÑ–Ñ… репозиторіїв ÑиÑтеми, тож врахуйте вÑÑ– ймовірні наÑлідки Ð´Ð»Ñ ÑˆÐ²Ð¸Ð´ÐºÐ¾Ð´Ñ–Ñ—. Докладніше — в поÑібнику з вебхуків. @@ -3308,6 +3506,45 @@ auths.invalid_openIdConnectAutoDiscoveryURL = Ðеправильна URL-адр settings = ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтратора +dashboard.cancel_abandoned_jobs = СкаÑувати покинуті Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð´Ñ–Ð¹ +dashboard.start_schedule_tasks = ЗапуÑтити заплановані Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð´Ñ–Ð¹ +config.logger_name_fmt = Журнал: %s +config.access_log_template = Шаблон журналу доÑтупу +config.set_setting_failed = Ðе вдалоÑÑ Ð²Ñтановити параметр %s +monitor.download_diagnosis_report = Завантажити діагноÑтичний звіт + +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 @@ -3410,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 = Група @@ -3525,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 = Видалити Ñекрет @@ -3579,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 = Стан @@ -3633,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 = Проєкт репозиторію @@ -3641,7 +3921,7 @@ deleted.display_name = Видалений проєкт [git.filemode] symbolic_link=Символічне поÑÐ¸Ð»Ð°Ð½Ð½Ñ -directory = Тека +directory = Каталог submodule = Підмодуль normal_file = Звичайний файл executable_file = Виконуваний файл @@ -3698,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 c6c534df9f..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,7 +1062,7 @@ language.description = 此语言将ä¿å­˜åˆ°æ‚¨çš„è´¦å·ä¸­ï¼Œå¹¶åœ¨æ‚¨ç™»å½•åŽ language.localization_project = 帮助我们将 Forgejo ç¿»è¯‘æˆæ‚¨çš„语言ï¼äº†è§£æ›´å¤šã€‚ user_block_yourself = 您ä¸èƒ½å±è”½è‡ªå·±ã€‚ pronouns_custom_label = è‡ªå®šä¹‰ä»£è¯ -change_username_redirect_prompt.with_cooldown.one = 旧用户å将在 %[1]d å¤©çš„ä¿æŠ¤æœŸåŽå¯¹æ‰€æœ‰äººå¯ç”¨ï¼Œæ‚¨ä»å¯ä»¥åœ¨æ­¤æœŸé—´é‡æ–°è®¤é¢†æ—§ç”¨æˆ·å。 +change_username_redirect_prompt.with_cooldown.one = 旧用户å将在 %[1]d å¤©çš„ä¿æŠ¤æœŸåŽå¯¹æ‰€æœ‰äººå¯ç”¨ã€‚您ä»å¯ä»¥åœ¨æ­¤æœŸé—´é‡æ–°è®¤é¢†æ—§ç”¨æˆ·å。 change_username_redirect_prompt.with_cooldown.few = 旧用户å将在 %[1]d å¤©çš„ä¿æŠ¤æœŸåŽå¯¹æ‰€æœ‰äººå¯ç”¨ï¼Œæ‚¨ä»å¯ä»¥åœ¨æ­¤æœŸé—´é‡æ–°è®¤é¢†æ—§ç”¨æˆ·å。 keep_pronouns_private = ä»…å‘已认è¯ç”¨æˆ·æ˜¾ç¤ºä»£è¯ keep_pronouns_private.description = 这将对未登录的访问者éšè—您的代è¯ã€‚ @@ -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=拥有者 diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index fba51a391e..ddc31730d7 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -1062,7 +1062,7 @@ language.localization_project = 幫助我們翻譯 Forgejo 至您的語言ï¼å…¬é–‹æ´»å‹•åªæœ‰ä½ å’Œç«™é»žç®¡ç†å“¡å¯è¦‹ã€‚ quota.rule.exceeded = 已超出 diff --git a/options/locale_next/locale_ar.json b/options/locale_next/locale_ar.json index 3d87c7ee95..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 3847de2b43..df8d8833dc 100644 --- a/options/locale_next/locale_de-DE.json +++ b/options/locale_next/locale_de-DE.json @@ -91,16 +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", "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" + "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 86e9633a5e..34928c30e9 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 884a7b44eb..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": "Every day, I imagine a future where I can be with you. In my hand is a pen that will write a poem of me and you. The ink flows down into a dark puddle... Just move your hand, write the way into his heart. But in this world of infinite choices. What will it take just to find that special day? Have I found everybody a fun assignment to do today? When you're here, everything that we do is fun for them anyway... When I can't even read my own feelings. What good are words when a smile says it all? And if this world won't write me an ending... What will it take just for me to have it all? Does my pen only write bitter words for those who are dear to me? Is it love if I take you, or is it love if I set you free? The ink flows down into a dark puddle... How can I write love into reality? If I can't hear the sound of your heartbeat What do you call love in your reality? And in your reality, if I don't know how to love you... I'll leave you be.", + "meta.last_line": "Every day, I imagine a future where I can be with you. In my hand is a pen that will write a poem of me and you. The ink flows down into a dark puddle... Just move your hand, write the way into his heart. But in this world of infinite choices, what will it take just to find that special day? Have I found everybody a fun assignment to do today? When you're here, everything that we do is fun for them anyway... When I can't even read my own feelings, what good are words when a smile says it all? And if this world won't write me an ending, what will it take just for me to have it all? Does my pen only write bitter words for those who are dear to me? Is it love if I take you, or is it love if I set you free? The ink flows down into a dark puddle... How can I write love into reality? If I can't hear the sound of your heartbeat, what do you call love in your reality? And in your reality, if I don't know how to love you... I'll leave you be.", "mail.actions.successful_run_after_failure": "Na-recover ang workflow na %[1]s sa repositoryong %[2]s", "mail.actions.not_successful_run": "Nabigo ang workflow na %[1]s sa repositoryong %[2]s", "mail.actions.run_info_previous_status": "Nakaraang Status ng Run: %[1]s", @@ -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", @@ -102,5 +102,7 @@ "feed.atom.link": "Atom feed", "keys.ssh.link": "Mga SSH key", "keys.gpg.link": "Mga GPG key", - "profile.actions.tooltip": "Higit pang mga aksyon" + "profile.actions.tooltip": "Higit pang mga aksyon", + "mail.actions.run_info_sha": "Commit: %[1]s", + "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 da26d56107..1fc9bfa4af 100644 --- a/options/locale_next/locale_fr-FR.json +++ b/options/locale_next/locale_fr-FR.json @@ -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_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 24268e2082..25fb212496 100644 --- a/options/locale_next/locale_nds.json +++ b/options/locale_next/locale_nds.json @@ -102,5 +102,7 @@ "keys.ssh.link": "SSH-Slötels", "keys.gpg.link": "GPG-Slötels", "profile.actions.tooltip": "Mehr Aktioonen", - "profile.edit.link": "Profil bewarken" + "profile.edit.link": "Profil bewarken", + "mail.actions.run_info_sha": "Kommitteren: %[1]s", + "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 1a5eca6d34..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", @@ -105,5 +105,12 @@ "avatar.constraints_hint": "Imagem de perfil personalizada não pode exceder %[1]s em tamanho ou ser maior que %[2]dx%[3]d pixels", "settings.visibility.description": "A visibilidade do perfil afeta a habilidade de acessarem seus repositórios não-privados. Saiba mais", "repo.diff.commit.next-short": "Próximo", - "repo.diff.commit.previous-short": "Anterior" + "repo.diff.commit.previous-short": "Anterior", + "profile.actions.tooltip": "Mais Actions", + "profile.edit.link": "Editar perfil", + "feed.atom.link": "Feed Atom", + "keys.ssh.link": "Chaves SSH", + "keys.gpg.link": "Chaves GPG", + "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 922e2612af..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)", @@ -110,5 +110,7 @@ "feed.atom.link": "Atom-лента", "keys.ssh.link": "Ключи SSH", "keys.gpg.link": "Ключи GPG", - "profile.edit.link": "Изменить профиль" + "profile.edit.link": "Изменить профиль", + "mail.actions.run_info_sha": "Коммит: %[1]s", + "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 33cb5a41a3..fa653980da 100644 --- a/options/locale_next/locale_uk-UA.json +++ b/options/locale_next/locale_uk-UA.json @@ -110,5 +110,7 @@ "keys.gpg.link": "Ключі GPG", "profile.edit.link": "Редагувати профіль", "feed.atom.link": "Стрічка Atom", - "profile.actions.tooltip": "Більше дій" + "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 0f408997bf..12ffcf041b 100644 --- a/options/locale_next/locale_zh-CN.json +++ b/options/locale_next/locale_zh-CN.json @@ -71,12 +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": "上个", + "repo.diff.commit.next-short": "下一个", + "repo.diff.commit.previous-short": "上一个", "feed.atom.link": "Atom 订阅æº", - "profile.edit.link": "编辑个人资料" + "profile.edit.link": "编辑个人资料", + "mail.actions.run_info_sha": "æäº¤ï¼š%[1]s", + "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/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/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 9360ff1335..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) { 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/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 4e365f24ea..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 } @@ -1445,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 94b58da502..2fea81a7e3 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 a5bac730be..33ac675fcc 100644 --- a/services/actions/notifier.go +++ b/services/actions/notifier.go @@ -343,7 +343,7 @@ func notifyIssueCommentChange(ctx context.Context, doer *user_model.User, commen newNotifyInputFromIssue(comment.Issue, event). WithDoer(doer). WithPayload(payload). - WithPullRequest(comment.Issue.PullRequest). + WithPullRequestData(comment.Issue.PullRequest). Notify(ctx) return } diff --git a/services/actions/notifier_helper.go b/services/actions/notifier_helper.go index 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/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 fa0d2635f1..a99af823b3 100644 --- a/services/mailer/mail_actions.go +++ b/services/mailer/mail_actions.go @@ -60,7 +60,6 @@ func sendMailActionRun(to *user_model.User, run *actions_model.ActionRun, priorS if len(commitSHA) > 7 { commitSHA = commitSHA[:7] } - branch := run.PrettyRef() data := map[string]any{ "locale": locale, @@ -73,7 +72,6 @@ func sendMailActionRun(to *user_model.User, run *actions_model.ActionRun, priorS "LastRun": lastRun, "PriorStatus": priorStatus, "CommitSHA": commitSHA, - "Branch": branch, "IsSuccess": run.Status.IsSuccess(), } diff --git a/services/mailer/mail_actions_now_done_test.go b/services/mailer/mail_actions_now_done_test.go index f4c597c99c..e84441f460 100644 --- a/services/mailer/mail_actions_now_done_test.go +++ b/services/mailer/mail_actions_now_done_test.go @@ -54,7 +54,7 @@ func getActionsNowDoneTestOrg(t *testing.T, name, email string, owner *user_mode } func assertTranslatedLocaleMailActionsNowDone(t *testing.T, msgBody string) { - AssertTranslatedLocale(t, msgBody, "mail.actions.successful_run_after_failure", "mail.actions.not_successful_run", "mail.actions.run_info_cur_status", "mail.actions.run_info_ref", "mail.actions.run_info_previous_status", "mail.actions.run_info_trigger", "mail.view_it_on") + AssertTranslatedLocale(t, msgBody, "mail.actions.successful_run_after_failure", "mail.actions.not_successful_run", "mail.actions.run_info_cur_status", "mail.actions.run_info_sha", "mail.actions.run_info_previous_status", "mail.actions.run_info_trigger", "mail.view_it_on") } func TestActionRunNowDoneStatusMatrix(t *testing.T) { diff --git a/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Äu v¬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/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}}
- +
diff --git a/templates/repo/commits.tmpl b/templates/repo/commits.tmpl index 86df88f6e3..e6efe1ff54 100644 --- a/templates/repo/commits.tmpl +++ b/templates/repo/commits.tmpl @@ -13,11 +13,6 @@ {{template "repo/commits_table" .}} - {{if .OldFilename}} -
- {{ctx.Locale.Tr "repo.commits.renamed_from" .OldFilename}} ({{ctx.Locale.Tr "repo.commits.browse_further"}}) -
- {{end}} {{template "base/footer" .}} diff --git a/templates/repo/commits_table.tmpl b/templates/repo/commits_table.tmpl index 621fc44bf5..09af3e4229 100644 --- a/templates/repo/commits_table.tmpl +++ b/templates/repo/commits_table.tmpl @@ -37,4 +37,10 @@ {{template "repo/commits_list" .}} {{end}} +{{if .OldFilename}} +
+ {{ctx.Locale.Tr "repo.commits.renamed_from" .OldFilename}} ({{ctx.Locale.Tr "repo.commits.browse_further"}}) +
+{{end}} + {{template "base/paginate" .}} diff --git a/templates/repo/create_init.tmpl b/templates/repo/create_init.tmpl index 729b44c8e6..468d9a9ae5 100644 --- a/templates/repo/create_init.tmpl +++ b/templates/repo/create_init.tmpl @@ -7,7 +7,7 @@